Basic functionality is there
This commit is contained in:
@@ -52,6 +52,9 @@ class Crew(models.Model):
|
||||
def save(self, *args, **kwargs):
|
||||
super(Crew, self).save(*args, **kwargs)
|
||||
|
||||
def size(self):
|
||||
return self.athletes.all().count()
|
||||
|
||||
class crewForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Crew
|
||||
@@ -59,12 +62,13 @@ class crewForm(forms.ModelForm):
|
||||
|
||||
class Race(models.Model):
|
||||
name = models.CharField(max_length=200)
|
||||
resulturl = models.URLField(null=True)
|
||||
date = models.DateField(default=current_day)
|
||||
resultlist = models.ManyToManyField(Crew,through='Result')
|
||||
crew_size = models.IntegerField(default=1,verbose_name='Nr of rowers per crew (1, 2, 4, 8)')
|
||||
resulturl = models.URLField(null=True, verbose_name='URL Link to results')
|
||||
date = models.DateField(default=current_day, verbose_name='Race Date')
|
||||
#resultlist = models.ManyToManyField(Result,through='Result')
|
||||
crew_size = models.IntegerField(default=1,verbose_name='Nr of rowers per crew (1, 2, 4, 8)',
|
||||
choices=((1,1),(2,2),(4,4),(8,8)))
|
||||
verified = models.BooleanField(default=False)
|
||||
processed = models.BooleanField(default=True)
|
||||
processed = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('date','name')
|
||||
@@ -93,10 +97,87 @@ class Race(models.Model):
|
||||
|
||||
super(Race, self).save(*args, **kwargs)
|
||||
|
||||
def validate(self):
|
||||
if len(self.results.all()) < 2:
|
||||
self.verified = False
|
||||
self.save()
|
||||
return False
|
||||
|
||||
l = self.results.all()[0].crew.size()
|
||||
for result in self.results.all():
|
||||
if result.crew.size() != l:
|
||||
self.verified = False
|
||||
self.save()
|
||||
return False
|
||||
|
||||
if l not in [1,2,4,8]:
|
||||
self.verified = False
|
||||
self.save()
|
||||
return False
|
||||
|
||||
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)):
|
||||
self.verified = False
|
||||
self.save()
|
||||
return False
|
||||
|
||||
if len(athletes) != len(set(athletes)):
|
||||
self.verified = False
|
||||
self.save()
|
||||
return False
|
||||
|
||||
self.verified = True
|
||||
self.save()
|
||||
|
||||
def process(self):
|
||||
if not self.verified:
|
||||
if not self.validate():
|
||||
return False
|
||||
|
||||
if self.processed:
|
||||
return True
|
||||
|
||||
# validate the race
|
||||
results = self.results.all().order_by('order')
|
||||
crews = []
|
||||
ranks = []
|
||||
|
||||
for result in results:
|
||||
crew = result.crew
|
||||
crewdict = {}
|
||||
for athlete in crew.athletes.all():
|
||||
crewdict[athlete.id] = trueskill.Rating(
|
||||
athlete.trueskill_mu, athlete.trueskill_sigma)
|
||||
crews.append(crewdict)
|
||||
ranks.append(result.order)
|
||||
|
||||
rated_crews = trueskill.rate(crews, ranks)
|
||||
|
||||
for crew in rated_crews:
|
||||
|
||||
for id, rating in crew.items():
|
||||
athlete = Athlete.objects.get(id=id)
|
||||
athlete.trueskill_mu = rating.mu
|
||||
athlete.trueskill_sigma = rating.sigma
|
||||
athlete.save()
|
||||
|
||||
self.processed = True
|
||||
self.save()
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class raceForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Race
|
||||
fields = ['name','date','resulturl','crew_size','resultlist']
|
||||
fields = ['name','date','resulturl','crew_size']
|
||||
|
||||
|
||||
class Result(models.Model):
|
||||
@@ -107,7 +188,14 @@ class Result(models.Model):
|
||||
order = models.PositiveIntegerField()
|
||||
|
||||
class Meta:
|
||||
unique_together = ('crew','race','order')
|
||||
unique_together = ('crew','order')
|
||||
|
||||
def __str__(self):
|
||||
return u'{r}: {o} - {c}'.format(
|
||||
r=self.race,
|
||||
o=self.order,
|
||||
c=self.crew,
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
allresults = self.race.results.all()
|
||||
|
||||
Reference in New Issue
Block a user