diff --git a/rowers/models.py b/rowers/models.py index 991889c2..25749a58 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -427,14 +427,14 @@ sexcategories = ( ('female','female'), ('not specified','not specified'), ) +weightcategories = ( + ('hwt','heavy-weight'), + ('lwt','light-weight'), +) + # Extension of User with rowing specific data class Rower(models.Model): - weightcategories = ( - ('hwt','heavy-weight'), - ('lwt','light-weight'), - ) - stravatypes = ( ('Ride','Ride'), @@ -1327,11 +1327,15 @@ def auto_delete_strokedata_on_delete(sender, instance, **kwargs): # Virtual Race results (for keeping results when workouts are deleted) class VirtualRaceResult(models.Model): user = models.ForeignKey(Rower) + teamname = models.CharField(max_length=20,verbose_name = 'Team Name', + blank=True,null=True) username = models.CharField(max_length=150) - workout = models.ForeignKey(Workout) - weightcategory = models.CharField(default="hwt",max_length=10) + workout = models.ForeignKey(Workout,blank=True,null=True) + weightcategory = models.CharField(default="hwt",max_length=10, + choices=weightcategories, + verbose_name='Weight Category') race = models.ForeignKey(VirtualRace) - duration = models.TimeField(default=3600) + duration = models.TimeField(default=datetime.time(1,0)) boattype = models.CharField(choices=boattypes,max_length=40, default='1x', verbose_name = 'Boat Type' @@ -1344,7 +1348,12 @@ class VirtualRaceResult(models.Model): age = models.IntegerField(null=True) - +class VirtualRaceResultForm(ModelForm): + class Meta: + model = VirtualRaceResult + fields = ['teamname','weightcategory','boattype','age'] + + from rowers.metrics import rowingmetrics strokedatafields = { diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 5740f53a..c5b69c77 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -612,6 +612,13 @@ def add_rower_race(r,race): def remove_rower_race(r,race): race.rower.remove(r) + records = VirtualRaceResult.objects.filter(user=r, + workout__isnull=True, + race=race) + + for r in records: + r.delete() + return 1 # Low Level functions - to be called by higher level methods diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 5c4aad0f..ff6a5463 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -87,12 +87,13 @@

Results

- {% if results %} + {% if results or dns %} + @@ -109,7 +110,8 @@ + {{ result.username }} + @@ -120,9 +122,8 @@ {% for result in dns %} - + + @@ -137,6 +138,30 @@ {% endif %}

+
+ {% if records %} +

Registered Competitors

+
  NameTeam Name      {{ forloop.counter }} - {{ result.username }}{{ result.teamname }} {{ result.age }} {{ result.sex }} {{ result.weightcategory }}
  - - {{ result.username }}{{ result.username }}{{ result.teamname }} {{ result.age }} {{ result.sex }} {{ result.weightcategory }}
+ + + + + + + + + {% for record in records %} + + + + + + {% endfor %} + +
NameTeam NameAgeWeight Category
{{ record.username }} + {{ record.teamname }}{{ record.weightcategory }}{{ record.age }}
+ {% endif %} +

Rules

diff --git a/rowers/templates/virtualeventregister.html b/rowers/templates/virtualeventregister.html new file mode 100644 index 00000000..79b7ffe1 --- /dev/null +++ b/rowers/templates/virtualeventregister.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block title %}Register for a Virtual Race{% endblock %} + +{% block meta %} + + + +{% endblock %} + + +{% block content %} +

+
+

Register for {{ race.name }}

+
+ +
+ +
+
+

If you are participating in a single, we will take the age and weight + value from your user settings. For other boat types, please fill out + crew weight class and average age. +

+
+ + {{ form.as_table }} +
+
+
+
+ {% csrf_token %} + +
+ + +
+{% endblock %} + +{% block scripts %} +{% endblock %} diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index a86e248e..2ded5642 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -5,6 +5,7 @@ import dateutil.parser import json import datetime register = template.Library() +from rowers.utils import calculate_age def strfdelta(tdelta): minutes,seconds = divmod(tdelta.seconds,60) @@ -136,6 +137,11 @@ from rowers.views import hasplannedsessions def is_planmember(user): return hasplannedsessions(user) +@register.filter +def get_age(r): + return calculate_age(r.birthdate) + + @register.filter def user_teams(user): try: @@ -196,6 +202,7 @@ def team_rowers(user): return [] + @register.filter def verbosetimeperiod(timeperiod): table = { diff --git a/rowers/views.py b/rowers/views.py index a6a112d8..447a8ffa 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -67,7 +67,7 @@ from rowers.models import ( WorkoutComment,WorkoutCommentForm,RowerExportForm, CalcAgePerformance,PowerTimeFitnessMetric,PlannedSessionForm, PlannedSessionFormSmall,GeoCourseEditForm,VirtualRace, - VirtualRaceForm, + VirtualRaceForm,VirtualRaceResultForm, ) from rowers.models import ( FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet @@ -13406,14 +13406,25 @@ def virtualevent_view(request,id=0): buttons += ['editbutton'] results = VirtualRaceResult.objects.filter( - race=race + race=race, + workout__isnull=False, ).order_by("duration") # to-do - add DNS dns = [] - - # to-do - add registered - registered = [] + if timezone.now() > race.evaluation_closure: + print "aap" + dns = VirtualRaceResult.objects.filter( + race=race, + workout__isnull=True, + ) + print dns[0].username,"noot" + + + records = VirtualRaceResult.objects.filter( + race=race + ) + return render(request,'virtualevent.html', { @@ -13424,6 +13435,7 @@ def virtualevent_view(request,id=0): 'results':results, 'buttons':buttons, 'dns':dns, + 'records':records, }) @login_required() @@ -13456,19 +13468,80 @@ def virtualevent_register_view(request,id=0): except VirtualRace.DoesNotExist: raise Http404("Virtual Race does not exist") - if race_can_register(r,race): - add_rower_race(r,race) - messages.info(request, - "You have successfully registered for this race. Good luck!") - else: + if not race_can_register(r,race): messages.error(request,"You cannot register for this race") - url = reverse(virtualevent_view, - kwargs = { - 'id':race.id + url = reverse(virtualevent_view, + kwargs = { + 'id':race.id }) - return HttpResponseRedirect(url) + return HttpResponseRedirect(url) + + # we're still here + if request.method == 'POST': + # process form + form = VirtualRaceResultForm(request.POST) + if form.is_valid(): + cd = form.cleaned_data + teamname = cd['teamname'] + boattype = cd['boattype'] + if not boattype == '1x': + weightcategory = cd['weightcategory'] + age = cd['age'] + else: + weightcategory = r.weightcategory + age = calculate_age(r.birthdate) + + record = VirtualRaceResult( + user=r, + teamname=teamname, + race=race, + username = u'{f} {l}'.format( + f = r.user.first_name, + l = r.user.last_name + ), + weightcategory=weightcategory, + duration=datetime.time(0,0), + boattype=boattype, + coursecompleted=False, + sex=r.sex, + age=age + ) + + record.save() + + add_rower_race(r,race) + + + + messages.info( + request, + "You have successfully registered for this race. Good luck!" + ) + + url = reverse(virtualevent_view, + kwargs = { + 'id':race.id + }) + + return HttpResponseRedirect(url) + + else: + initial = { + 'age': calculate_age(r.birthdate), + 'weightcategory': r.weightcategory, + } + + form = VirtualRaceResultForm(initial=initial) + + return render(request,'virtualeventregister.html', + { + 'form':form, + 'race':race, + 'rower':r, + + }) @login_required() def virtualevent_create_view(request):