add crew view
This commit is contained in:
23
boatmovers/migrations/0006_auto_20220624_0811.py
Normal file
23
boatmovers/migrations/0006_auto_20220624_0811.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 3.2.12 on 2022-06-24 08:11
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('boatmovers', '0005_athlete_gender'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='athlete',
|
||||||
|
name='trueskill_exposed',
|
||||||
|
field=models.FloatField(default=0),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='athlete',
|
||||||
|
name='trueskill_sigma',
|
||||||
|
field=models.FloatField(default=8.333333333333334),
|
||||||
|
),
|
||||||
|
]
|
||||||
24
boatmovers/migrations/0007_auto_20220624_0820.py
Normal file
24
boatmovers/migrations/0007_auto_20220624_0820.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 3.2.12 on 2022-06-24 08:20
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('boatmovers', '0006_auto_20220624_0811'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='result',
|
||||||
|
name='crew',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.crew'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='result',
|
||||||
|
name='race',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.race'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
import trueskill
|
||||||
|
|
||||||
def current_day(ttz=None):
|
def current_day(ttz=None):
|
||||||
if ttz is None:
|
if ttz is None:
|
||||||
@@ -14,7 +17,8 @@ class Athlete(models.Model):
|
|||||||
last_name = models.CharField(max_length=200)
|
last_name = models.CharField(max_length=200)
|
||||||
club = models.CharField(max_length=200)
|
club = models.CharField(max_length=200)
|
||||||
trueskill_mu = models.FloatField(default=25.)
|
trueskill_mu = models.FloatField(default=25.)
|
||||||
trueskill_sigma = models.FloatField(default=8.333)
|
trueskill_sigma = models.FloatField(default=25./3.)
|
||||||
|
trueskill_exposed = models.FloatField(default=0)
|
||||||
birth_year = models.IntegerField(default=1972)
|
birth_year = models.IntegerField(default=1972)
|
||||||
gender = models.CharField(max_length=200, choices=(('m','M'),('f','F')))
|
gender = models.CharField(max_length=200, choices=(('m','M'),('f','F')))
|
||||||
|
|
||||||
@@ -24,6 +28,12 @@ class Athlete(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return u'{f} {l}'.format(f = self.first_name, l=self.last_name)
|
return u'{f} {l}'.format(f = self.first_name, l=self.last_name)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
rating = trueskill.Rating(self.trueskill_mu, self.trueskill_sigma)
|
||||||
|
self.trueskill_exposed = trueskill.expose(rating)
|
||||||
|
|
||||||
|
super(Athlete, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "/boatmovers/athlete/%i/" % self.id
|
return "/boatmovers/athlete/%i/" % self.id
|
||||||
|
|
||||||
@@ -39,13 +49,22 @@ class Crew(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return u'{n}'.format(n=self.name)
|
return u'{n}'.format(n=self.name)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
super(Crew, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
class crewForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Crew
|
||||||
|
fields = ['name', 'athletes']
|
||||||
|
|
||||||
class Race(models.Model):
|
class Race(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
resulturl = models.URLField(null=True)
|
resulturl = models.URLField(null=True)
|
||||||
date = models.DateField(default=current_day)
|
date = models.DateField(default=current_day)
|
||||||
resultlist = models.ManyToManyField(Crew,through='Result')
|
resultlist = models.ManyToManyField(Crew,through='Result')
|
||||||
crew_size = models.IntegerField(default=1)
|
crew_size = models.IntegerField(default=1,verbose_name='Nr of rowers per crew (1, 2, 4, 8)')
|
||||||
verified = models.BooleanField(default=False)
|
verified = models.BooleanField(default=False)
|
||||||
|
processed = models.BooleanField(default=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('date','name')
|
unique_together = ('date','name')
|
||||||
@@ -53,10 +72,61 @@ class Race(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
results = self.results.all()
|
||||||
|
crews = []
|
||||||
|
athletes = []
|
||||||
|
for result in results:
|
||||||
|
crews.append(result.crew.id)
|
||||||
|
for athlete in result.crew.athletes.all():
|
||||||
|
athletes.append(athlete.id)
|
||||||
|
|
||||||
|
if len(crews) != len(set(crews)):
|
||||||
|
raise ValidationError(
|
||||||
|
"Cannot have the same crew more than one time in a race"
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(athletes) != len(set(athletes)):
|
||||||
|
raise ValidationError(
|
||||||
|
"Cannot have the same athlete in different crews in a race"
|
||||||
|
)
|
||||||
|
|
||||||
|
super(Race, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
class raceForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Race
|
||||||
|
fields = ['name','date','resulturl','crew_size','resultlist']
|
||||||
|
|
||||||
|
|
||||||
class Result(models.Model):
|
class Result(models.Model):
|
||||||
crew = models.ForeignKey(Crew, on_delete=models.CASCADE)
|
crew = models.ForeignKey(Crew, on_delete=models.CASCADE,
|
||||||
race = models.ForeignKey(Race, on_delete=models.CASCADE)
|
related_name='results')
|
||||||
|
race = models.ForeignKey(Race, on_delete=models.CASCADE,
|
||||||
|
related_name='results')
|
||||||
order = models.PositiveIntegerField()
|
order = models.PositiveIntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('crew','race','order')
|
unique_together = ('crew','race','order')
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
allresults = self.race.results.all()
|
||||||
|
athletes = []
|
||||||
|
for result in allresults:
|
||||||
|
for athlete in result.crew.athletes.all():
|
||||||
|
athletes.append(athlete.id)
|
||||||
|
if result.crew.id == self.crew.id:
|
||||||
|
raise ValidationError(
|
||||||
|
"Cannot have the same crew more than one time in a race"
|
||||||
|
)
|
||||||
|
if len(athletes) != len(set(athletes)):
|
||||||
|
raise ValidationError(
|
||||||
|
"Cannot have the same athlete in different crews in a race"
|
||||||
|
)
|
||||||
|
|
||||||
|
super(Result,self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
class resultForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Result
|
||||||
|
fields = ['crew','race','order']
|
||||||
|
|||||||
4
boatmovers/templates/boatmovers/crew_form.html
Normal file
4
boatmovers/templates/boatmovers/crew_form.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<form action="" method="post">{% csrf_token %}
|
||||||
|
{{ form.as_p }}
|
||||||
|
<input type="submit" value="Create" />
|
||||||
|
</form>
|
||||||
@@ -6,4 +6,6 @@ import boatmovers.views as views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'athlete/add/$',views.AthleteCreateView.as_view(),name='athlete_add'),
|
url(r'athlete/add/$',views.AthleteCreateView.as_view(),name='athlete_add'),
|
||||||
|
url(r'crew/add/$',views.CrewCreateView.as_view(),name='crew_add'),
|
||||||
|
url(r'^$',views.boatmovers_view,name='boatmovers')
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.http import HttpResponse
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from django.views.generic.edit import CreateView
|
from django.views.generic.edit import CreateView
|
||||||
from boatmovers.models import Athlete
|
from boatmovers.models import Athlete, Crew
|
||||||
|
|
||||||
class AthleteCreateView(CreateView):
|
class AthleteCreateView(CreateView):
|
||||||
model = Athlete
|
model = Athlete
|
||||||
@@ -13,3 +14,16 @@ class AthleteCreateView(CreateView):
|
|||||||
'gender',
|
'gender',
|
||||||
'club',
|
'club',
|
||||||
]
|
]
|
||||||
|
success_url = '/boatmovers/'
|
||||||
|
|
||||||
|
class CrewCreateView(CreateView):
|
||||||
|
model = Crew
|
||||||
|
fields = [
|
||||||
|
'name',
|
||||||
|
'athletes'
|
||||||
|
]
|
||||||
|
|
||||||
|
success_url = '/boatmovers/'
|
||||||
|
|
||||||
|
def boatmovers_view(request):
|
||||||
|
return HttpResponse("1")
|
||||||
|
|||||||
Reference in New Issue
Block a user