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 @@
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