First commit of the V2.

New base, new info.
This commit is contained in:
2019-04-18 00:58:13 +02:00
parent 798ddf40e8
commit 698b6dd865
53 changed files with 394 additions and 5723 deletions

View File

@ -1,14 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import *
from .models import Kart, Params, Relay, Driver
# Register your models here.
admin.site.register(Driver)
admin.site.register(Race)
admin.site.register(Relay)
admin.site.register(Rules)
admin.site.register(Team)
admin.site.register(EngagedPilot)
admin.site.register(Params)
admin.site.register(Kart)

View File

@ -1,6 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.apps import AppConfig

View File

@ -1,4 +1,4 @@
# Generated by Django 2.1.5 on 2019-01-15 23:31
# Generated by Django 2.0.3 on 2019-04-15 20:12
from django.db import migrations, models
import django.db.models.deletion
@ -18,27 +18,27 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(blank=True, default=None, max_length=30, null=True)),
('last_name', models.CharField(blank=True, default=None, max_length=30, null=True)),
('ref_time', models.IntegerField()),
],
),
migrations.CreateModel(
name='EngagedPilot',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.IntegerField(blank=True, default=None, null=True)),
('pilot', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pilot', to='timelaps.Driver')),
],
),
migrations.CreateModel(
name='Race',
name='Kart',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, default=None, max_length=30, null=True)),
('start_date', models.DateTimeField(blank=True, default=None, null=True)),
('end_date', models.DateTimeField(blank=True, default=None, null=True)),
('duration', models.IntegerField()),
('autonomy', models.IntegerField()),
('comment', models.CharField(blank=True, default=None, max_length=256, null=True)),
],
),
migrations.CreateModel(
name='Params',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('autonomy', models.IntegerField()),
('default_relay', models.IntegerField()),
('stand_minimum_time', models.IntegerField()),
],
),
migrations.CreateModel(
name='Relay',
fields=[
@ -47,42 +47,14 @@ class Migration(migrations.Migration):
('relay_end', models.DateTimeField(blank=True, default=None, null=True)),
('has_refuel', models.BooleanField(default=False)),
('pilot_chrono', models.IntegerField(blank=True, default=None, null=True)),
('relay_autonomy', models.IntegerField(blank=True, default=None, null=True)),
('comment', models.CharField(blank=True, default=None, max_length=256, null=True)),
('team_pilot', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relays', to='timelaps.EngagedPilot')),
],
),
migrations.CreateModel(
name='Rules',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('min_stand_duration', models.IntegerField(blank=True, default=None, null=True)),
('max_autonomy_dry', models.IntegerField()),
('max_autonomy_wet', models.IntegerField()),
('max_driving_duration', models.IntegerField(blank=True, default=None, null=True)),
('relay_default_duration', models.IntegerField(blank=True, default=None, null=True)),
],
),
migrations.CreateModel(
name='Team',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(blank=True, default=None, max_length=30, null=True)),
('comment', models.CharField(blank=True, default=None, max_length=256, null=True)),
('team_pilot', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='driver_running', to='timelaps.Driver')),
],
),
migrations.AddField(
model_name='race',
name='fk_rules',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='timelaps.Rules'),
),
migrations.AddField(
model_name='engagedpilot',
name='race',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='race', to='timelaps.Race'),
),
migrations.AddField(
model_name='engagedpilot',
name='team',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team', to='timelaps.Team'),
model_name='driver',
name='kart_id',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='timelaps.Kart'),
),
]

View File

@ -1,73 +1,55 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Team(models.Model):
class Kart(models.Model):
# Name of the team
name = models.CharField(max_length=30, default=None, blank=True, null=True)
autonomy = models.IntegerField()
comment = models.CharField(max_length=256, default=None, blank=True, null=True)
def __str__(self):
return self.name
class Driver(models.Model):
# Name of the pilot
kart = models.ForeignKey(Kart, related_name='drivers', on_delete=models.CASCADE)
short_name = models.CharField(max_length=10, default=None, blank=True, null=True)
first_name = models.CharField(max_length=30, default=None, blank=True, null=True)
last_name = models.CharField(max_length=30, default=None, blank=True, null=True)
last_name = models.CharField(max_length=30, default=None, blank=True, null=True)
order = models.IntegerField()
ref_time = models.IntegerField()
class Meta:
ordering = ['order']
def __str__(self):
return self.last_name
class Rules(models.Model):
#Minimum time in the pitlane
min_stand_duration = models.IntegerField(default=None, blank=True, null=True)
#Maximum autonomy of the kart in dry condition (In seconds)
max_autonomy_dry = models.IntegerField()
#Maximum autonomy of the kart in wet condition (In seconds)
max_autonomy_wet = models.IntegerField()
#Maximum driving time by driver(In seconds)
max_driving_duration = models.IntegerField(default=None, blank=True, null=True)
#Start and end date of the race
relay_default_duration = models.IntegerField(default=None, blank=True, null=True)
class Race(models.Model):
# Name of the race
name = models.CharField(max_length=30, default=None, blank=True, null=True)
#Start and end date of the race
start_date = models.DateTimeField(default=None, blank=True, null=True)
end_date = models.DateTimeField(default=None, blank=True, null=True)
#Lenth of th race in seconds
duration = models.IntegerField()
#Link to the rules of the race
fk_rules = models.ForeignKey(Rules, on_delete=models.CASCADE)
#Comment the race
comment = models.CharField(max_length=256, default=None, blank=True, null=True)
return '%d: %s' % (self.first_name, self.last_name)
def __str__(self):
return self.name
class EngagedPilot(models.Model):
# Foreign keys to the team pilot and race
team = models.ForeignKey(Team, related_name='team', on_delete=models.CASCADE)
pilot = models.ForeignKey(Driver, related_name='pilot', on_delete=models.CASCADE)
race = models.ForeignKey(Race, related_name='engagedpilots', on_delete=models.CASCADE)
order = models.IntegerField(default=None, blank=True, null=True)
class Params(models.Model):
# Name of the pilot
autonomy = models.IntegerField()
default_relay = models.IntegerField()
stand_minimum_time = models.IntegerField()
class Relay(models.Model):
# Name of the team
team_pilot = models.ForeignKey(EngagedPilot, related_name='relays', on_delete=models.CASCADE)
# Fk driver
driver = models.ForeignKey(Driver, on_delete=models.CASCADE)
# Fk kart
kart = models.ForeignKey(Kart, on_delete=models.CASCADE)
#Starting timestamp for the relay
relay_start = models.DateTimeField()
#ending timestamp for the relay
relay_end = models.DateTimeField(default=None, blank=True, null=True)
#Does the pilot did refuel
#Does the previous pilot refuel
has_refuel = models.BooleanField(default=False)
#Average chrono for the pulot on this relay
pilot_chrono = models.IntegerField(default=None, blank=True, null=True)
driver_chrono = models.IntegerField(default=None, blank=True, null=True)
#ending timestamp for the relay
relay_autonomy = models.IntegerField(default=None, blank=True, null=True)
#comment the relay
comment = models.CharField(max_length=256, default=None, blank=True, null=True)

View File

@ -1,45 +1,80 @@
from rest_framework import serializers
from .models import *
from django.contrib.auth.models import User
from .models import Driver, Kart, Params, Relay
class DriverSerializer(serializers.ModelSerializer):
class Meta:
model = Driver
fields = ('first_name','last_name')
fields = ('id', 'first_name', 'last_name', 'order', 'ref_time')
def update(self, instance, validated_data):
instance.first_name = validated_data.get("first_name", instance.first_name)
instance.last_name = validated_data.get("last_name", instance.last_name)
instance.order = validated_data.get("order", instance.order)
instance.ref_time = validated_data.get("ref_time", instance.ref_time)
instance.save()
return instance
def create(self, validated_data):
return Driver.objects.create(**validated_data)
class KartSerializer(serializers.ModelSerializer):
drivers = DriverSerializer(many=True, read_only=True)
class RaceSerializer(serializers.ModelSerializer):
class Meta:
model = Race
fields = ('name','start_date','end_date','duration', 'comment','fk_rules')
model = Kart
fields = ('id', 'name', 'autonomy', 'drivers')
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.autonomy = validated_data.get("autonomy", instance.autonomy)
instance.comment = validated_data.get("comment", instance.comment)
instance.save()
return instance
def create(self, validated_data):
return Kart.objects.create(**validated_data)
class RelaySerializer(serializers.ModelSerializer):
class Meta:
model = Relay
fields = ('relay_start','relay_end','has_refuel','pilot_chrono','pilot_chrono', 'comment','team_pilot')
fields = ('id', 'relay_start', 'relay_end', 'has_refuel', 'driver_chrono', 'relay_autonomy', 'comment',
'kart_id', 'driver_id')
class RulesSerializer(serializers.ModelSerializer):
class Meta:
model = Rules
fields = ('min_stand_duration', 'max_autonomy_dry', 'max_autonomy_wet', 'max_driving_duration', 'relay_default_duration')
def update(self, instance, validated_data):
instance.relay_start = validated_data.get("relay_start", instance.relay_start)
instance.relay_end = validated_data.get("relay_end", instance.relay_end)
instance.has_refuel = validated_data.get("has_refuel", instance.has_refuel)
instance.driver_chrono = validated_data.get("driver_chrono", instance.driver_chrono)
instance.relay_autonomy = validated_data.get("relay_autonomy", instance.relay_autonomy)
instance.comment = validated_data.get("comment", instance.comment)
instance.kart_id = validated_data.get("kart_id", instance.kart_id)
instance.driver_id = validated_data.get("driver_id", instance.driver_id)
instance.save()
return instance
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
fields = ('name', 'comment')
def create(self, validated_data):
return Relay.objects.create(**validated_data)
class EngagedPilotSerializer(serializers.ModelSerializer):
class Meta:
model = EngagedPilot
fields = ('order','team','pilot','race')
class EngagedPilotsSerializer(serializers.ModelSerializer):
relays = RelaySerializer(many=True)
class ParamSerializer(serializers.ModelSerializer):
class Meta:
model = EngagedPilot
fields = ('order','team','pilot','race', 'relays')
model = Params
fields = ('id', 'default_relay', 'autonomy', 'stand_minimum_time')
def update(self, instance, validated_data):
instance.default_relay = validated_data.get("default_relay", instance.default_relay)
instance.autonomy = validated_data.get("autonomy", instance.autonomy)
instance.stand_minimum_time = validated_data.get("stand_minimum_time", instance.stand_minimum_time)
instance.save()
return instance
def create(self, validated_data):
return Params.objects.create(**validated_data)
class ListRelaysByRaceAndTeamSerializer(serializers.ModelSerializer):
engagedpilots = EngagedPilotsSerializer(many=True)
class Meta:
model = Race
fields = ('name','start_date','end_date','duration', 'comment','fk_rules', 'engagedpilots')

View File

@ -1,48 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.test import TestCase
# Create your tests here.
from django.urls import reverse
from rest_framework.test import APITestCase, APIClient
from rest_framework.views import status
from .models import *
from .serializers import DriverSerializer
"""
# tests for views
class BaseViewTest(APITestCase):
client = APIClient()
@staticmethod
def create_song(title="", artist=""):
if title != "" and artist != "":
Songs.objects.create(title=title, artist=artist)
def setUp(self):
# add test data
self.create_song("like glue", "sean paul")
self.create_song("simple song", "konshens")
self.create_song("love is wicked", "brick and lace")
self.create_song("jam rock", "damien marley")
class GetAllSongsTest(BaseViewTest):
def test_get_all_songs(self):
#This test ensures that all songs added in the setUp method
#exist when we make a GET request to the songs/ endpoint
# hit the API endpoint
response = self.client.get(
reverse("songs-all", kwargs={"version": "v1"})
)
# fetch the data from db
expected = Songs.objects.all()
serialized = SongsSerializer(expected, many=True)
self.assertEqual(response.data, serialized.data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
"""

View File

@ -1,13 +1,18 @@
from django.urls import path
from django.conf.urls import url
from .views import *
from .views import ListCreateDriversView, DriversDetailView, KartsDetailView, ListCreateKartsView#, ListCreateRulesView, RulesDetailView, \
#ListCreateKartsView, KartsDetailView, ListCreateRelaysView, RelaysDetailView, ListCreateRacesView, \
#RacesDetailView
urlpatterns = [
path('drivers/', ListDriverView.as_view()),
path('races/', ListRaceView.as_view()),
path('relays/', ListRelayView.as_view()),
path('rules/', ListRulesView.as_view()),
path('teams/', ListTeamView.as_view()),
path('engagedpilots/', ListEngagedPilotView.as_view()),
url('race/(?P<raceid>\d+)', ListRelaysByRaceAndTeamView.as_view()),
]
path('drivers/', ListCreateDriversView.as_view(), name="drivers-list-create"),
path('drivers/<int:pk>/', DriversDetailView.as_view(), name="drivers-detail"),
path('karts/', ListCreateKartsView.as_view(), name="karts-list-create"),
path('karts/<int:pk>/', KartsDetailView.as_view(), name="drivers-detail"),
# path('karts/<int:pk>/', KartsDetailView.as_view(), name="karts-detail"),
# path('rules/', ListCreateRulesView.as_view(), name="rules-list-create"),
# path('rules/<int:pk>/', RulesDetailView.as_view(), name="rules-detail"),
# path('relays/', ListCreateRelaysView.as_view(), name="relays-list-create"),
# path('relays/<int:pk>/', RelaysDetailView.as_view(), name="relays-detail"),
# path('races/', ListCreateRacesView.as_view(), name="races-list-create"),
# path('races/<int:pk>/', RacesDetailView.as_view(), name="races-detail"),
]

View File

@ -1,63 +1,164 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from rest_framework import generics
from .models import *
from .serializers import *
# Create your views here.
from rest_framework import generics
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import status
class ListDriverView(generics.ListAPIView):
from .decorators import validate_request_driver_data
from .models import Driver, Kart, Params, Relay
from .serializers import DriverSerializer, RelaySerializer, ParamSerializer, KartSerializer
import logging
logger = logging.getLogger(__name__)
class DriversDetailView(generics.ListAPIView):
"""
Provides a get method handler.
"""
"""
queryset = Driver.objects.all()
serializer_class = DriverSerializer
#permission_classes = (permissions.IsAuthenticated,)
class ListRaceView(generics.ListAPIView):
queryset = Race.objects.all()
serializer_class = RaceSerializer
def get(self, request, *args, **kwargs):
try:
a_song = self.queryset.get(pk=kwargs["pk"])
return Response(DriverSerializer(a_song).data)
except Driver.DoesNotExist:
return Response(
data={
"message": "Driver with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
class ListRelayView(generics.ListAPIView):
queryset = Relay.objects.all()
serializer_class = RelaySerializer
class ListRulesView(generics.ListAPIView):
queryset = Rules.objects.all()
serializer_class = RulesSerializer
#@validate_request_driver_data
def put(self, request, *args, **kwargs):
try:
a_driver = self.queryset.get(pk=kwargs["pk"])
serializer = DriverSerializer(instance=a_driver, data=request.data, partial=True)
updated_driver = serializer.update(a_driver, request.data)
return Response(DriverSerializer(updated_driver).data)
except Driver.DoesNotExist:
return Response(
data={
"message": "Driver with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
class ListTeamView(generics.ListAPIView):
queryset = Team.objects.all()
serializer_class = TeamSerializer
def delete(self, request, *args, **kwargs):
try:
a_driver = self.queryset.get(pk=kwargs["pk"])
a_driver.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except Driver.DoesNotExist:
return Response(
data={
"message": "Driver with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
class ListEngagedPilotView(generics.ListAPIView):
queryset = EngagedPilot.objects.all()
serializer_class = EngagedPilotSerializer
class ListRelaysByRaceAndTeamView(generics.ListAPIView):
serializer_class = ListRelaysByRaceAndTeamSerializer
def get_queryset(self):
raceid = self.kwargs['raceid']
return Race.objects.filter(id=raceid)
class KartsDetailView(generics.ListAPIView):
"""
Provides a get method handler.
"""
queryset = Kart.objects.all()
serializer_class = KartSerializer
#permission_classes = (permissions.IsAuthenticated,)
"""
def get_queryset(self):
raceid = self.kwargs['raceid']
teamid = self.kwargs['teamid']
return Relay.objects.filter(team_pilot__team=teamid).filter(team_pilot__race=raceid)
def get(self, request, *args, **kwargs):
try:
a_song = self.queryset.get(pk=kwargs["pk"])
return Response(KartSerializer(a_song).data)
except Kart.DoesNotExist:
return Response(
data={
"message": "Kart with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
class ListRelaysByRaceAndTeamView(generics.ListAPIView):
#Getting the params from the url with the "self.kwargs.get"
#and filter with thoses in the relays relation
serializer_class = RelayPilotSerializer
lookup_url_raceid = "raceid"
lookup_url_teamid = "teamid"
#@validate_request_driver_data
def put(self, request, *args, **kwargs):
try:
a_driver = self.queryset.get(pk=kwargs["pk"])
serializer = KartSerializer(instance=a_driver, data=request.data, partial=True)
updated_driver = serializer.update(a_driver, request.data)
return Response(KartSerializer(updated_driver).data)
except Kart.DoesNotExist:
return Response(
data={
"message": "Kart with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
def delete(self, request, *args, **kwargs):
try:
a_driver = self.queryset.get(pk=kwargs["pk"])
a_driver.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except Kart.DoesNotExist:
return Response(
data={
"message": "Kart with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
class ListCreateDriversView(generics.ListCreateAPIView):
"""
GET songs/
POST songs/
"""
queryset = Driver.objects.all()
serializer_class = DriverSerializer
#permission_classes = (permissions.IsAuthenticated,)
#@validate_request_driver_data
def post(self, request, *args, **kwargs):
logger.error('ListCreateDriversView => post')
a_song = Driver.objects.create(
first_name=request.data["first_name"],
last_name=request.data["last_name"],
order=request.data["order"],
ref_time=request.data["ref_time"],
kart_id=request.data["kart_id"]
)
return Response(
data=DriverSerializer(a_song).data,
status=status.HTTP_201_CREATED
)
class ListCreateKartsView(generics.ListCreateAPIView):
"""
GET songs/
POST songs/
"""
queryset = Kart.objects.all()
serializer_class = KartSerializer
#permission_classes = (permissions.IsAuthenticated,)
#@validate_request_driver_data
def post(self, request, *args, **kwargs):
logger.error('ListCreateKartsView => post')
a_song = Kart.objects.create(
first_name=request.data["first_name"],
last_name=request.data["last_name"],
order=request.data["order"],
ref_time=request.data["ref_time"],
kart_id=request.data["kart_id"]
)
return Response(
data=DriverSerializer(a_song).data,
status=status.HTTP_201_CREATED
)
def get_queryset(self):
raceid = self.kwargs.get(self.lookup_url_raceid)
teamid = self.kwargs.get(self.lookup_url_teamid)
relays = Relay.objects.filter(team_pilot__team=teamid).filter(team_pilot__race=raceid)
return relays
"""