add
This commit is contained in:
18
boatmovers/migrations/0014_athlete_dummy.py
Normal file
18
boatmovers/migrations/0014_athlete_dummy.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 3.2.12 on 2022-06-29 15:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('boatmovers', '0013_alter_crew_athletes'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='athlete',
|
||||||
|
name='dummy',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
||||||
17
boatmovers/migrations/0015_alter_athlete_unique_together.py
Normal file
17
boatmovers/migrations/0015_alter_athlete_unique_together.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 3.2.12 on 2022-06-29 17:44
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('boatmovers', '0014_athlete_dummy'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='athlete',
|
||||||
|
unique_together={('first_name', 'last_name', 'birth_year', 'gender')},
|
||||||
|
),
|
||||||
|
]
|
||||||
18
boatmovers/migrations/0016_race_gender.py
Normal file
18
boatmovers/migrations/0016_race_gender.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 3.2.12 on 2022-06-29 18:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('boatmovers', '0015_alter_athlete_unique_together'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='race',
|
||||||
|
name='gender',
|
||||||
|
field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -25,16 +25,20 @@ class Athlete(models.Model):
|
|||||||
trueskill_exposed = models.FloatField(default=0)
|
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')))
|
||||||
|
dummy = models.BooleanField(default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('first_name','last_name','birth_year')
|
unique_together = ('first_name','last_name','birth_year','gender')
|
||||||
|
|
||||||
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):
|
def save(self, *args, **kwargs):
|
||||||
name = '{f} {l}'.format(f = self.first_name, l = self.last_name)
|
name = '{f} {l}'.format(f = self.first_name, l = self.last_name)
|
||||||
for a in Athlete.objects.filter(gender=self.gender):
|
athletes = Athlete.objects.filter(gender=self.gender)
|
||||||
|
if self.pk is not None:
|
||||||
|
athletes = athletes.exclude(pk=self.pk)
|
||||||
|
for a in athletes:
|
||||||
aname = '{f} {l}'.format(f = a.first_name, l = a.last_name)
|
aname = '{f} {l}'.format(f = a.first_name, l = a.last_name)
|
||||||
if name == aname:
|
if name == aname:
|
||||||
raise ValidationError("Duplicate:{id}".format(id=a.id))
|
raise ValidationError("Duplicate:{id}".format(id=a.id))
|
||||||
@@ -78,6 +82,7 @@ class Race(models.Model):
|
|||||||
choices=((1,1),(2,2),(4,4),(8,8)))
|
choices=((1,1),(2,2),(4,4),(8,8)))
|
||||||
verified = models.BooleanField(default=False)
|
verified = models.BooleanField(default=False)
|
||||||
processed = models.BooleanField(default=False)
|
processed = models.BooleanField(default=False)
|
||||||
|
gender = models.CharField(max_length=200,choices=(('m','M'),('f','F')),default='m')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('date','name')
|
unique_together = ('date','name')
|
||||||
@@ -106,8 +111,10 @@ class Race(models.Model):
|
|||||||
|
|
||||||
super(Race, self).save(*args, **kwargs)
|
super(Race, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self, verbose=False):
|
||||||
if len(self.results.all()) < 2:
|
if len(self.results.all()) < 2:
|
||||||
|
if verbose:
|
||||||
|
print('False: Less than 2 results')
|
||||||
self.verified = False
|
self.verified = False
|
||||||
self.save()
|
self.save()
|
||||||
return False
|
return False
|
||||||
@@ -115,11 +122,15 @@ class Race(models.Model):
|
|||||||
l = self.results.all()[0].crew.size()
|
l = self.results.all()[0].crew.size()
|
||||||
for result in self.results.all():
|
for result in self.results.all():
|
||||||
if result.crew.size() != l:
|
if result.crew.size() != l:
|
||||||
|
if verbose:
|
||||||
|
print('False: crew {c} has different crew size'.format(c=result.crew))
|
||||||
self.verified = False
|
self.verified = False
|
||||||
self.save()
|
self.save()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if l not in [1,2,4,8]:
|
if l not in [1,2,4,8]:
|
||||||
|
if verbose:
|
||||||
|
print('False: Crew size not in 1, 2, 4, or 8')
|
||||||
self.verified = False
|
self.verified = False
|
||||||
self.save()
|
self.save()
|
||||||
return False
|
return False
|
||||||
@@ -130,14 +141,19 @@ class Race(models.Model):
|
|||||||
for result in results:
|
for result in results:
|
||||||
crews.append(result.crew.id)
|
crews.append(result.crew.id)
|
||||||
for athlete in result.crew.athletes.all():
|
for athlete in result.crew.athletes.all():
|
||||||
athletes.append(athlete.id)
|
if not athlete.dummy:
|
||||||
|
athletes.append(athlete.id)
|
||||||
|
|
||||||
if len(crews) != len(set(crews)):
|
if len(crews) != len(set(crews)):
|
||||||
|
if verbose:
|
||||||
|
print('False: Same crew competing twice')
|
||||||
self.verified = False
|
self.verified = False
|
||||||
self.save()
|
self.save()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if len(athletes) != len(set(athletes)):
|
if len(athletes) != len(set(athletes)):
|
||||||
|
if verbose:
|
||||||
|
print('False: Duplicate athletes')
|
||||||
self.verified = False
|
self.verified = False
|
||||||
self.save()
|
self.save()
|
||||||
return False
|
return False
|
||||||
@@ -196,7 +212,7 @@ class Race(models.Model):
|
|||||||
class raceForm(forms.ModelForm):
|
class raceForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Race
|
model = Race
|
||||||
fields = ['name','date','resulturl','crew_size']
|
fields = ['name','date','resulturl','crew_size','gender']
|
||||||
|
|
||||||
|
|
||||||
class Result(models.Model):
|
class Result(models.Model):
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ from django.core.exceptions import ValidationError
|
|||||||
url_heineken = ''
|
url_heineken = ''
|
||||||
|
|
||||||
|
|
||||||
def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',gender='m'):
|
def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',gender='m',
|
||||||
|
startorder=1):
|
||||||
race = Race.objects.get(id=raceid)
|
race = Race.objects.get(id=raceid)
|
||||||
nr = race.crew_size
|
nr = race.crew_size
|
||||||
|
|
||||||
@@ -26,13 +27,16 @@ def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',ge
|
|||||||
naam = row[df.columns.get_loc(bankjes[i])+1].split(' ')
|
naam = row[df.columns.get_loc(bankjes[i])+1].split(' ')
|
||||||
first_name = ' '.join(naam[:-1])
|
first_name = ' '.join(naam[:-1])
|
||||||
last_name = naam[-1]
|
last_name = naam[-1]
|
||||||
|
dummy = False
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
try:
|
try:
|
||||||
first_name = str(row.Slag)
|
first_name = str(row.Slag)
|
||||||
last_name = ''
|
last_name = ''
|
||||||
|
dummy=False
|
||||||
except TypeError:
|
except TypeError:
|
||||||
first_name = 'Unknown'
|
first_name = 'Unknown'
|
||||||
last_name = 'Athlete'
|
last_name = 'Athlete'
|
||||||
|
dummy=True
|
||||||
athletes = Athlete.objects.filter(first_name = first_name,
|
athletes = Athlete.objects.filter(first_name = first_name,
|
||||||
last_name = last_name,
|
last_name = last_name,
|
||||||
gender=gender)
|
gender=gender)
|
||||||
@@ -42,7 +46,8 @@ def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',ge
|
|||||||
athlete = Athlete(first_name=first_name,
|
athlete = Athlete(first_name=first_name,
|
||||||
last_name=last_name,
|
last_name=last_name,
|
||||||
club = crewname,
|
club = crewname,
|
||||||
gender=gender)
|
gender=gender,
|
||||||
|
dummy=dummy)
|
||||||
try:
|
try:
|
||||||
athlete.save()
|
athlete.save()
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
@@ -59,12 +64,15 @@ def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',ge
|
|||||||
order = order
|
order = order
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
result.save()
|
if order>=startorder:
|
||||||
|
result.save()
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
|
print(' ')
|
||||||
|
|
||||||
def time_team_scraper(url,raceid,gender='m'):
|
|
||||||
|
def time_team_scraper(url,raceid,gender='m',startorder=1):
|
||||||
race = Race.objects.get(id=raceid)
|
race = Race.objects.get(id=raceid)
|
||||||
nr = race.crew_size
|
nr = race.crew_size
|
||||||
r = requests.get(url)
|
r = requests.get(url)
|
||||||
@@ -99,13 +107,16 @@ def time_team_scraper(url,raceid,gender='m'):
|
|||||||
names = df['naam'][i].split(' ')
|
names = df['naam'][i].split(' ')
|
||||||
first_name = ' '.join(names[:-1])
|
first_name = ' '.join(names[:-1])
|
||||||
last_name = names[-1]
|
last_name = names[-1]
|
||||||
|
dummy=False
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
try:
|
try:
|
||||||
first_name = str(df['naam'][i])
|
first_name = str(df['naam'][i])
|
||||||
last_name = ''
|
last_name = ''
|
||||||
|
dummy=False
|
||||||
except TypeError:
|
except TypeError:
|
||||||
first_name = 'Unknown'
|
first_name = 'Unknown'
|
||||||
last_name = 'Athlete'
|
last_name = 'Athlete'
|
||||||
|
dummy=True
|
||||||
athletes = Athlete.objects.filter(first_name = first_name,
|
athletes = Athlete.objects.filter(first_name = first_name,
|
||||||
last_name = last_name)
|
last_name = last_name)
|
||||||
if len(athletes) >= 1:
|
if len(athletes) >= 1:
|
||||||
@@ -114,7 +125,8 @@ def time_team_scraper(url,raceid,gender='m'):
|
|||||||
athlete = Athlete(first_name=first_name,
|
athlete = Athlete(first_name=first_name,
|
||||||
last_name=last_name,
|
last_name=last_name,
|
||||||
club = name,
|
club = name,
|
||||||
gender=gender)
|
gender=gender,
|
||||||
|
dummy=dummy)
|
||||||
try:
|
try:
|
||||||
athlete.save()
|
athlete.save()
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
@@ -130,10 +142,11 @@ def time_team_scraper(url,raceid,gender='m'):
|
|||||||
race = race,
|
race = race,
|
||||||
order = order
|
order = order
|
||||||
)
|
)
|
||||||
try:
|
if order >= startorder:
|
||||||
result.save()
|
try:
|
||||||
except ValidationError as e:
|
result.save()
|
||||||
print(e)
|
except ValidationError as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
order += 1
|
order += 1
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,11 @@
|
|||||||
<h1>
|
<h1>
|
||||||
Boat Movers Ranking
|
Boat Movers Ranking
|
||||||
</h1>
|
</h1>
|
||||||
|
<div>
|
||||||
|
<a href="/boatmovers/?filter=f">Women</a>
|
||||||
|
<a href="/boatmovers/?filter=m">Men</a>
|
||||||
|
<a href="/boatmovers/">All</a>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -13,5 +13,6 @@ urlpatterns = [
|
|||||||
url(r'race/(?P<id>\d+)/verify/$',views.race_verify,name='race_verify'),
|
url(r'race/(?P<id>\d+)/verify/$',views.race_verify,name='race_verify'),
|
||||||
url(r'race/(?P<id>\d+)/process/$',views.race_process,name='race_process'),
|
url(r'race/(?P<id>\d+)/process/$',views.race_process,name='race_process'),
|
||||||
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
|
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
|
||||||
url(r'^$',views.boatmovers_view,name='boatmovers')
|
url(r'^$',views.boatmovers_view,name='boatmovers'),
|
||||||
|
#url(r'(?P<filter>\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers')
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -56,7 +56,15 @@ class ResultCreateView(CreateView):
|
|||||||
success_url = '/boatmovers/'
|
success_url = '/boatmovers/'
|
||||||
|
|
||||||
def boatmovers_view(request):
|
def boatmovers_view(request):
|
||||||
athletes = Athlete.objects.filter(trueskill_exposed__gt=0).order_by('-trueskill_exposed','-birth_year','last_name','first_name')
|
athletes = Athlete.objects.filter(trueskill_exposed__gt=0,
|
||||||
|
dummy=False).order_by('-trueskill_exposed','-birth_year','last_name','first_name')
|
||||||
|
|
||||||
|
filter = request.GET.get('filter','all')
|
||||||
|
|
||||||
|
if filter == 'm':
|
||||||
|
athletes = athletes.exclude(gender='f')
|
||||||
|
elif filter == 'f':
|
||||||
|
athletes = athletes.exclude(gender='m')
|
||||||
|
|
||||||
races = Race.objects.filter(verified=True,processed=True).order_by('-date')
|
races = Race.objects.filter(verified=True,processed=True).order_by('-date')
|
||||||
new_races = Race.objects.filter(processed=False).order_by('date')
|
new_races = Race.objects.filter(processed=False).order_by('date')
|
||||||
|
|||||||
Reference in New Issue
Block a user