diff --git a/rowers/admin.py b/rowers/admin.py index b6e9bbbe..f18a3760 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') @@ -58,10 +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) @@ -78,3 +90,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/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/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..808dfde1 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 %} @@ -228,10 +230,24 @@
+

Course

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

+

+

Filter Results

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

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..78f6c367 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 @@ -6164,7 +6165,6 @@ def user_boxplot_select(request, 'waterboattype':waterboattype, } request.session['options'] = options - print options startdate = datetime.datetime.combine(startdate,datetime.time()) @@ -9085,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) @@ -12873,9 +12872,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 = {} @@ -13439,6 +13435,7 @@ def virtualevent_view(request,id=0): else: r = None + try: race = VirtualRace.objects.get(id=id) except VirtualRace.DoesNotExist: @@ -13467,17 +13464,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 +13529,7 @@ def virtualevent_view(request,id=0): 'buttons':buttons, 'dns':dns, 'records':records, + 'form':form, }) @login_required() @@ -13558,9 +13591,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 +13626,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 +13692,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 +13717,7 @@ def virtualevent_register_view(request,id=0): duration=datetime.time(0,0), boattype=boattype, coursecompleted=False, - sex=r.sex, + sex=sex, age=age )