From 0a259d51e168d1b20be1ea64ecdf9af25c3ab64d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 1 Jun 2018 20:11:16 +0200 Subject: [PATCH 1/5] added mixed as category --- rowers/models.py | 4 ++++ rowers/templates/virtualevent.html | 2 ++ rowers/templates/virtualeventregister.html | 7 +++++++ rowers/views.py | 24 ++++++++++++++++++++-- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index b7497c72..945bbd39 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1645,6 +1645,10 @@ class VirtualRaceResultForm(ModelForm): if boattypes: self.fields['boattype'].choices = boattypes + + self.fields['mix'] = forms.BooleanField(initial=False, + required=False, + label='Mixed Gender') from rowers.metrics import rowingmetrics diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 9d8cacba..071567cd 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -160,6 +160,7 @@ Team Name Boat Age + Gender Weight Category @@ -169,6 +170,7 @@ {{ record.teamname }} {{ record.boattype }} {{ record.age }} + {{ record.sex }} {{ record.weightcategory }} {% if record.userid == rower.id and 'withdrawbutton' in buttons %} diff --git a/rowers/templates/virtualeventregister.html b/rowers/templates/virtualeventregister.html index 79b7ffe1..e7501437 100644 --- a/rowers/templates/virtualeventregister.html +++ b/rowers/templates/virtualeventregister.html @@ -31,6 +31,13 @@ value from your user settings. For other boat types, please fill out crew weight class and average age.

+ +

+ You will register as a crew with the gender of your user settings. If + your user settings have gender "not specified", you will be registered + as a Male crew. Check the "Mixed gender" check box to register as a + mixed gender crew (except for 1x where this check box does nothing). +

{{ form.as_table }} diff --git a/rowers/views.py b/rowers/views.py index 5f1a7ad8..b23d6137 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -13558,9 +13558,19 @@ def virtualevent_addboat_view(request,id=0): boattype = cd['boattype'] weightcategory = cd['weightcategory'] age = cd['age'] + mix = cd['mix'] + + sex = r.sex + if mix: + sex = 'mixed' + if boattype == '1x' and r.birthdate: age = calculate_age(r.birthdate) + sex = r.sex + if sex == 'not specified': + sex = 'male' + if boattype in boattypes: messages.error(request,"You have already registered in that boat type") url = reverse(virtualevent_view, @@ -13583,7 +13593,7 @@ def virtualevent_addboat_view(request,id=0): duration=datetime.time(0,0), boattype=boattype, coursecompleted=False, - sex=r.sex, + sex=sex, age=age ) @@ -13649,8 +13659,18 @@ def virtualevent_register_view(request,id=0): boattype = cd['boattype'] weightcategory = cd['weightcategory'] age = cd['age'] + mix = cd['mix'] + + sex = r.sex + if mix: + sex = 'mixed' + if boattype == '1x' and r.birthdate: age = calculate_age(r.birthdate) + sex = r.sex + + if sex == 'not specified': + sex = 'male' record = VirtualRaceResult( userid=r.id, @@ -13664,7 +13684,7 @@ def virtualevent_register_view(request,id=0): duration=datetime.time(0,0), boattype=boattype, coursecompleted=False, - sex=r.sex, + sex=sex, age=age ) From f83d4f5f1cccf5bd392a99d47211447fc0f4c654 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 1 Jun 2018 20:55:34 +0200 Subject: [PATCH 2/5] results filter on virtual race results --- rowers/forms.py | 38 +++++++++++++++++++- rowers/templates/virtualevent.html | 14 ++++++++ rowers/views.py | 56 +++++++++++++++++++++++++----- 3 files changed, 98 insertions(+), 10 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 7e9fff79..b5dea6d3 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -702,7 +702,43 @@ class WorkoutSessionSelectForm(forms.Form): initial=workoutdata['initial'], widget = forms.CheckboxSelectMultiple, ) - + + + +class RaceResultFilterForm(forms.Form): + sexchoices = ( + ('female','Female'), + ('male','Male'), + ('mixed','Mixed'), + ) + + weightcategories = ( + ('hwt','heavy-weight'), + ('lwt','light-weight'), + ) + + + sex = forms.MultipleChoiceField( + choices=sexchoices, + initial=['male','female','mixed'], + label='Gender', + widget=forms.CheckboxSelectMultiple()) + + boattype = forms.MultipleChoiceField( + choices=boattypes, + label='Boat Type', + initial=['1x','2x','2-','4x','4-','8+'], + widget=forms.CheckboxSelectMultiple()) + + age_min = forms.IntegerField(label='Min Age',initial=16) + age_max = forms.IntegerField(label='Max Age',initial=100) + + weightcategory = forms.MultipleChoiceField( + choices=weightcategories, + label='Weight Category', + initial=['hwt','lwt'], + widget=forms.CheckboxSelectMultiple()) + class WorkoutRaceSelectForm(forms.Form): # evaluate_after = forms.TimeField( # input_formats=['%H:%M:%S.%f', diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 071567cd..808dfde1 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -230,10 +230,24 @@
+

Course

{{ coursediv|safe }} {{ coursescript|safe }} + +

+

+

Filter Results

+ +
+
+ {{ form.as_table }} +
+ + {% csrf_token %} + +

diff --git a/rowers/views.py b/rowers/views.py index b23d6137..aa83404e 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -36,6 +36,7 @@ from rowers.forms import ( LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm, PlannedSessionTeamForm,PlannedSessionTeamMemberForm, VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm, + RaceResultFilterForm, ) from django.core.urlresolvers import reverse from django.core.exceptions import PermissionDenied @@ -13439,6 +13440,7 @@ def virtualevent_view(request,id=0): else: r = None + try: race = VirtualRace.objects.get(id=id) except VirtualRace.DoesNotExist: @@ -13467,17 +13469,52 @@ def virtualevent_view(request,id=0): if race_can_edit(r,race): buttons += ['editbutton'] - results = VirtualRaceResult.objects.filter( - race=race, - workoutid__isnull=False, - ).order_by("duration") + if request.method == 'POST': + form = RaceResultFilterForm(request.POST) + if form.is_valid(): + cd = form.cleaned_data + sex = cd['sex'] + boattype = cd['boattype'] + age_min = cd['age_min'] + age_max = cd['age_max'] + weightcategory = cd['weightcategory'] - # to-do - add DNS - dns = [] - if timezone.now() > race.evaluation_closure: - dns = VirtualRaceResult.objects.filter( + results = VirtualRaceResult.objects.filter( + race=race, + workoutid__isnull=False, + boattype__in=boattype, + sex__in=sex, + weightcategory__in=weightcategory, + age__gte=age_min, + age__lte=age_max + ).order_by("duration") + + # to-do - add DNS + dns = [] + if timezone.now() > race.evaluation_closure: + dns = VirtualRaceResult.objects.filter( + race=race, + workoutid__isnull=True, + boattype__in=boattype, + sex__in=sex, + weightcategory__in=weightcategory, + age__gte=age_min, + age__lte=age_max + ) + else: + form = RaceResultFilterForm() + + results = VirtualRaceResult.objects.filter( race=race, - workoutid__isnull=True, + workoutid__isnull=False, + ).order_by("duration") + + # to-do - add DNS + dns = [] + if timezone.now() > race.evaluation_closure: + dns = VirtualRaceResult.objects.filter( + race=race, + workoutid__isnull=True, ) @@ -13497,6 +13534,7 @@ def virtualevent_view(request,id=0): 'buttons':buttons, 'dns':dns, 'records':records, + 'form':form, }) @login_required() From 25036ea331cf08c41dfbd92de11b38b9fe5a3d37 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Jun 2018 07:52:14 +0200 Subject: [PATCH 3/5] changes in admin --- rowers/admin.py | 14 ++++++++++++-- rowers/views.py | 3 --- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rowers/admin.py b/rowers/admin.py index b6e9bbbe..f3533ac4 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -6,7 +6,7 @@ from .models import ( Rower, Workout,GraphImage,FavoriteChart,SiteAnnouncement, Team,TeamInvite,TeamRequest, WorkoutComment,C2WorldClassAgePerformance,PlannedSession, - GeoCourse,GeoPolygon,GeoPoint,VirtualRace, + GeoCourse,GeoPolygon,GeoPoint,VirtualRace,VirtualRaceResult, ) # Register your models here so you can use them in the Admin module @@ -18,8 +18,14 @@ class RowerInline(admin.StackedInline): verbose_name_plural = 'rower' filter_horizontal = ('team','friends') -class UserAdmin(UserAdmin): +#class UserAdmin(UserAdmin): +class UserAdmin(admin.ModelAdmin): inlines = (RowerInline,) + list_display = ('username','email','first_name','last_name','rowerplan') + search_fields = ["username","first_name","last_name","email"] + + def rowerplan(self, obj): + return obj.rower.rowerplan class WorkoutAdmin(admin.ModelAdmin): list_display = ('date','user','name','workouttype','boattype') @@ -62,6 +68,9 @@ class GeoCourseAdmin(admin.ModelAdmin): class VirtualRaceAdmin(admin.ModelAdmin): list_display = ('manager','name','startdate','country') + +class VirtualRaceResultAdmin(admin.ModelAdmin): + list_display = ('race','userid','username','boattype','age','weightcategory') admin.site.unregister(User) admin.site.register(User,UserAdmin) @@ -78,3 +87,4 @@ admin.site.register(C2WorldClassAgePerformance, admin.site.register(PlannedSession,PlannedSessionAdmin) admin.site.register(GeoCourse, GeoCourseAdmin) admin.site.register(VirtualRace, VirtualRaceAdmin) +admin.site.register(VirtualRaceResult, VirtualRaceResultAdmin) diff --git a/rowers/views.py b/rowers/views.py index aa83404e..3f6fbef5 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -12874,9 +12874,6 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0): sps = get_sessions(r,startdate=startdate,enddate=enddate) - for ps in sps: - print ps.name,ps.sessiontype - completeness = {} actualvalue = {} completiondate = {} From 2559f235c1017dbac977aba42b62403350762bb0 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Jun 2018 07:58:28 +0200 Subject: [PATCH 4/5] some more search fields in admin --- rowers/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rowers/admin.py b/rowers/admin.py index f3533ac4..f18a3760 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -64,13 +64,16 @@ class GeoPolygonInline(admin.StackedInline): class GeoCourseAdmin(admin.ModelAdmin): list_display = ('manager','name') inlines = (GeoPolygonInline,) + search_fields = ['name'] class VirtualRaceAdmin(admin.ModelAdmin): list_display = ('manager','name','startdate','country') + search_fields = ['name','country'] class VirtualRaceResultAdmin(admin.ModelAdmin): list_display = ('race','userid','username','boattype','age','weightcategory') + search_fields = ['race__name','username'] admin.site.unregister(User) admin.site.register(User,UserAdmin) From aa510f78cb09ec861dba16b27eb97ed064bd5aad Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Jun 2018 08:11:48 +0200 Subject: [PATCH 5/5] removed some obsolete print statements --- rowers/views.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rowers/views.py b/rowers/views.py index 3f6fbef5..78f6c367 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6165,7 +6165,6 @@ def user_boxplot_select(request, 'waterboattype':waterboattype, } request.session['options'] = options - print options startdate = datetime.datetime.combine(startdate,datetime.time()) @@ -9086,7 +9085,6 @@ def workout_edit_view(request,id=0,message="",successmessage=""): startdatetime ) - print startdatetime try: # aware object can be in any timezone out = startdatetime.astimezone(pytz.utc)