From 76dec8d3acdbe9ce4254b2efd10e544810002f30 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 29 Jun 2022 20:24:18 +0200 Subject: [PATCH] add --- boatmovers/migrations/0014_athlete_dummy.py | 18 +++++++++++ .../0015_alter_athlete_unique_together.py | 17 ++++++++++ boatmovers/migrations/0016_race_gender.py | 18 +++++++++++ boatmovers/models.py | 26 +++++++++++++--- boatmovers/scrapers.py | 31 +++++++++++++------ boatmovers/templates/boatmovers.html | 5 +++ boatmovers/urls.py | 3 +- boatmovers/views.py | 10 +++++- 8 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 boatmovers/migrations/0014_athlete_dummy.py create mode 100644 boatmovers/migrations/0015_alter_athlete_unique_together.py create mode 100644 boatmovers/migrations/0016_race_gender.py diff --git a/boatmovers/migrations/0014_athlete_dummy.py b/boatmovers/migrations/0014_athlete_dummy.py new file mode 100644 index 00000000..f3aec5e7 --- /dev/null +++ b/boatmovers/migrations/0014_athlete_dummy.py @@ -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), + ), + ] diff --git a/boatmovers/migrations/0015_alter_athlete_unique_together.py b/boatmovers/migrations/0015_alter_athlete_unique_together.py new file mode 100644 index 00000000..ee5e6ac1 --- /dev/null +++ b/boatmovers/migrations/0015_alter_athlete_unique_together.py @@ -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')}, + ), + ] diff --git a/boatmovers/migrations/0016_race_gender.py b/boatmovers/migrations/0016_race_gender.py new file mode 100644 index 00000000..ffedd044 --- /dev/null +++ b/boatmovers/migrations/0016_race_gender.py @@ -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), + ), + ] diff --git a/boatmovers/models.py b/boatmovers/models.py index fa119fad..34fd7a6c 100644 --- a/boatmovers/models.py +++ b/boatmovers/models.py @@ -25,16 +25,20 @@ class Athlete(models.Model): trueskill_exposed = models.FloatField(default=0) birth_year = models.IntegerField(default=1972) gender = models.CharField(max_length=200, choices=(('m','M'),('f','F'))) + dummy = models.BooleanField(default=False) class Meta: - unique_together = ('first_name','last_name','birth_year') + unique_together = ('first_name','last_name','birth_year','gender') def __str__(self): return u'{f} {l}'.format(f = self.first_name, l=self.last_name) def save(self, *args, **kwargs): 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) if name == aname: 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))) verified = models.BooleanField(default=False) processed = models.BooleanField(default=False) + gender = models.CharField(max_length=200,choices=(('m','M'),('f','F')),default='m') class Meta: unique_together = ('date','name') @@ -106,8 +111,10 @@ class Race(models.Model): super(Race, self).save(*args, **kwargs) - def validate(self): + def validate(self, verbose=False): if len(self.results.all()) < 2: + if verbose: + print('False: Less than 2 results') self.verified = False self.save() return False @@ -115,11 +122,15 @@ class Race(models.Model): l = self.results.all()[0].crew.size() for result in self.results.all(): if result.crew.size() != l: + if verbose: + print('False: crew {c} has different crew size'.format(c=result.crew)) self.verified = False self.save() return False 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.save() return False @@ -130,14 +141,19 @@ class Race(models.Model): for result in results: crews.append(result.crew.id) 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 verbose: + print('False: Same crew competing twice') self.verified = False self.save() return False if len(athletes) != len(set(athletes)): + if verbose: + print('False: Duplicate athletes') self.verified = False self.save() return False @@ -196,7 +212,7 @@ class Race(models.Model): class raceForm(forms.ModelForm): class Meta: model = Race - fields = ['name','date','resulturl','crew_size'] + fields = ['name','date','resulturl','crew_size','gender'] class Result(models.Model): diff --git a/boatmovers/scrapers.py b/boatmovers/scrapers.py index 44f469c1..d67e2fea 100644 --- a/boatmovers/scrapers.py +++ b/boatmovers/scrapers.py @@ -8,7 +8,8 @@ from django.core.exceptions import ValidationError 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) 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(' ') first_name = ' '.join(naam[:-1]) last_name = naam[-1] + dummy = False except AttributeError: try: first_name = str(row.Slag) last_name = '' + dummy=False except TypeError: first_name = 'Unknown' last_name = 'Athlete' + dummy=True athletes = Athlete.objects.filter(first_name = first_name, last_name = last_name, gender=gender) @@ -42,7 +46,8 @@ def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',ge athlete = Athlete(first_name=first_name, last_name=last_name, club = crewname, - gender=gender) + gender=gender, + dummy=dummy) try: athlete.save() except ValidationError as e: @@ -59,12 +64,15 @@ def csv_reader(filename,raceid,clubcol='Ploeg',bankjes=['Slag'],uitslag='Pos',ge order = order ) try: - result.save() + if order>=startorder: + result.save() except ValidationError as 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) nr = race.crew_size r = requests.get(url) @@ -99,13 +107,16 @@ def time_team_scraper(url,raceid,gender='m'): names = df['naam'][i].split(' ') first_name = ' '.join(names[:-1]) last_name = names[-1] + dummy=False except AttributeError: try: first_name = str(df['naam'][i]) last_name = '' + dummy=False except TypeError: first_name = 'Unknown' last_name = 'Athlete' + dummy=True athletes = Athlete.objects.filter(first_name = first_name, last_name = last_name) if len(athletes) >= 1: @@ -114,7 +125,8 @@ def time_team_scraper(url,raceid,gender='m'): athlete = Athlete(first_name=first_name, last_name=last_name, club = name, - gender=gender) + gender=gender, + dummy=dummy) try: athlete.save() except ValidationError as e: @@ -130,10 +142,11 @@ def time_team_scraper(url,raceid,gender='m'): race = race, order = order ) - try: - result.save() - except ValidationError as e: - print(e) + if order >= startorder: + try: + result.save() + except ValidationError as e: + print(e) order += 1 diff --git a/boatmovers/templates/boatmovers.html b/boatmovers/templates/boatmovers.html index 0a08e1db..b33d4823 100644 --- a/boatmovers/templates/boatmovers.html +++ b/boatmovers/templates/boatmovers.html @@ -17,6 +17,11 @@

Boat Movers Ranking

+
+ Women + Men + All +

diff --git a/boatmovers/urls.py b/boatmovers/urls.py index 1ce9ca38..a2933262 100644 --- a/boatmovers/urls.py +++ b/boatmovers/urls.py @@ -13,5 +13,6 @@ urlpatterns = [ url(r'race/(?P\d+)/verify/$',views.race_verify,name='race_verify'), url(r'race/(?P\d+)/process/$',views.race_process,name='race_process'), url(r'crew/(?P\d+)/$',views.crew_view,name='crew_view'), - url(r'^$',views.boatmovers_view,name='boatmovers') + url(r'^$',views.boatmovers_view,name='boatmovers'), + #url(r'(?P\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers') ] diff --git a/boatmovers/views.py b/boatmovers/views.py index 97c937f7..5ff1700c 100644 --- a/boatmovers/views.py +++ b/boatmovers/views.py @@ -56,7 +56,15 @@ class ResultCreateView(CreateView): success_url = '/boatmovers/' 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') new_races = Race.objects.filter(processed=False).order_by('date')