diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 7cb8dc4a..c1df31d8 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -36,6 +36,8 @@ from requests import Request, Session from utils import myqueue +from rowers.types import otwtypes + from rowsandall_app.settings import C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET from rowers.tasks import handle_c2_import_stroke_data @@ -340,7 +342,7 @@ def createc2workoutdata_as_splits(w): newnotes = 'from '+w.workoutsource+' via rowsandall.com' wtype = w.workouttype - if wtype in ('other','coastal'): + if wtype in otwtypes: wtype = 'water' data = { @@ -404,7 +406,7 @@ def createc2workoutdata(w): durationstr = datetime.strptime(str(w.duration),"%H:%M:%S") workouttype = w.workouttype - if workouttype in ('coastal','other'): + if workouttype in otwtypes: workouttype = 'water' data = { diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 2ee60615..b00136ab 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -68,7 +68,7 @@ queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('default') from rowsandall_app.settings import SITE_URL - +from rowers.types import otwtypes user = settings.DATABASES['default']['USER'] password = settings.DATABASES['default']['PASSWORD'] @@ -2355,7 +2355,7 @@ def workout_rscore(w): normp = (pwr4mean)**(0.25) if not np.isnan(normp): ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): + if w.workouttype in otwtypes: ftp = ftp*(100.-r.otwslack)/100. intensityfactor = pwrmean/float(ftp) diff --git a/rowers/forms.py b/rowers/forms.py index b5dea6d3..77b118a9 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -521,7 +521,7 @@ class TrendFlexModalForm(forms.Form): initial='all') waterboattype = forms.MultipleChoiceField(choices=boattypes, label='Water Boat Type', - initial = ['1x','2x','2-','4x','4-','8+']) + initial = types.waterboattype) # This form sets options for the summary stats page @@ -531,15 +531,21 @@ class StatsOptionsForm(forms.Form): waterboattype = forms.MultipleChoiceField(choices=boattypes, label='Water Boat Type', widget=forms.CheckboxSelectMultiple(), - initial = ['1x','2x','2-','4x','4-','8+']) - rower = forms.BooleanField(initial=True,required=False) - dynamic = forms.BooleanField(initial=True,required=False) - slides = forms.BooleanField(initial=True,required=False) - skierg = forms.BooleanField(initial=False,required=False) - paddle = forms.BooleanField(initial=False,required=False) - snow = forms.BooleanField(initial=False,required=False) - coastal = forms.BooleanField(initial=False,required=False) - other = forms.BooleanField(initial=False,required=False) + initial = types.waterboattype) + def __init__(self, *args, **kwargs): + super(StatsOptionsForm, self).__init__(*args,**kwargs) + + for type in types.checktypes: + self.fields[type] = forms.BooleanField(initial=True,required=False) + +# rower = forms.BooleanField(initial=True,required=False) +# dynamic = forms.BooleanField(initial=True,required=False) +# slides = forms.BooleanField(initial=True,required=False) +# skierg = forms.BooleanField(initial=False,required=False) +# paddle = forms.BooleanField(initial=False,required=False) +# snow = forms.BooleanField(initial=False,required=False) +# coastal = forms.BooleanField(initial=False,required=False) +# other = forms.BooleanField(initial=False,required=False) class CourseSelectForm(forms.Form): course = forms.ModelChoiceField(queryset=GeoCourse.objects.all()) @@ -706,6 +712,8 @@ class WorkoutSessionSelectForm(forms.Form): class RaceResultFilterForm(forms.Form): + boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes) + boatclassinitial = [t for t in types.otwtypes] sexchoices = ( ('female','Female'), ('male','Male'), @@ -723,11 +731,17 @@ class RaceResultFilterForm(forms.Form): initial=['male','female','mixed'], label='Gender', widget=forms.CheckboxSelectMultiple()) + + boatclass = forms.MultipleChoiceField( + choices=boatclasses, + initial=boatclassinitial, + label='Boat Class', + widget=forms.CheckboxSelectMultiple()) boattype = forms.MultipleChoiceField( choices=boattypes, label='Boat Type', - initial=['1x','2x','2-','4x','4-','8+'], + initial=types.waterboattype, widget=forms.CheckboxSelectMultiple()) age_min = forms.IntegerField(label='Min Age',initial=16) diff --git a/rowers/middleware.py b/rowers/middleware.py index c87c6c44..a211f21e 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -5,6 +5,7 @@ from utils import myqueue import django_rq queue = django_rq.get_queue('default') from rowers.tasks import handle_updatefitnessmetric +from rowers.types import otwtypes def getrower(user): try: @@ -45,7 +46,7 @@ def do_update(user,mode='rower',days=42): else: workouts = Workout.objects.filter( user=r, - workouttype__in=['water','coastal'], + workouttype__in=otwtypes, startdatetime__gte=startdate) theids = [int(w.id) for w in workouts] diff --git a/rowers/models.py b/rowers/models.py index 5649595a..a096c2a5 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1602,6 +1602,7 @@ def auto_delete_strokedata_on_delete(sender, instance, **kwargs): # Virtual Race results (for keeping results when workouts are deleted) class VirtualRaceResult(models.Model): + boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes) userid = models.IntegerField(default=0) teamname = models.CharField(max_length=80,verbose_name = 'Team Name', blank=True,null=True) @@ -1613,6 +1614,10 @@ class VirtualRaceResult(models.Model): race = models.ForeignKey(VirtualRace) duration = models.TimeField(default=datetime.time(1,0)) distance = models.IntegerField(default=0) + boatclass = models.CharField(choices=boatclasses, + max_length=40, + default='water', + verbose_name = 'Boat Class') boattype = models.CharField(choices=boattypes,max_length=40, default='1x', verbose_name = 'Boat Type' @@ -1649,7 +1654,7 @@ class CourseTestResult(models.Model): class VirtualRaceResultForm(ModelForm): class Meta: model = VirtualRaceResult - fields = ['teamname','weightcategory','boattype','age'] + fields = ['teamname','weightcategory','boatclass','boattype','age'] def __init__(self, *args, **kwargs): diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 808dfde1..8968233f 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -106,6 +106,7 @@       + Class Boat Time Distance @@ -123,6 +124,7 @@ {{ result.age }} {{ result.sex }} {{ result.weightcategory }} + {{ result.boatclass }} {{ result.boattype }} {{ result.duration |durationprint:"%H:%M:%S.%f" }} {{ result.distance }} m @@ -139,6 +141,7 @@ {{ result.age }} {{ result.sex }} {{ result.weightcategory }} + {{ result.boatclass }} {{ result.boattype }} DNS @@ -158,6 +161,7 @@ Name Team Name + Class Boat Age Gender @@ -168,6 +172,7 @@ {{ record.username }} {{ record.teamname }} + {{ record.boatclass }} {{ record.boattype }} {{ record.age }} {{ record.sex }} diff --git a/rowers/types.py b/rowers/types.py index 6298014f..5d3ec0af 100644 --- a/rowers/types.py +++ b/rowers/types.py @@ -1,5 +1,5 @@ workouttypes = ( - ('water','On-water'), + ('water','On-water - Olympic'), ('rower','Indoor Rower'), ('skierg','Ski Erg'), ('dynamic','Dynamic Indoor Rower'), @@ -7,9 +7,20 @@ workouttypes = ( ('paddle','Paddle Adapter'), ('snow','On-snow'), ('coastal','Coastal'), + ('c-boat','Dutch C boat'), + ('churchboat','Finnish Church boat'), ('other','Other'), ) +otwtypes = ( + 'water', + 'coastal', + 'c-boat', + 'churchboat' + ) + +checktypes = [i[0] for i in workouttypes] + workoutsources = ( ('strava','strava'), ('concept2','concept2'), @@ -36,12 +47,20 @@ workoutsources = ( boattypes = ( ('1x', '1x (single)'), ('2x', '2x (double)'), + ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), + ('2+', '2+ (coxed pair)'), + ('3x+','3x+ (coxed triple)'), ('4x', '4x (quad)'), + ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), + ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), + ('8x+', '8x+ (octuple scull)'), ) +waterboattype = [i[0] for i in boattypes] + privacychoices = ( ('private','Private'), ('visible','Visible'), diff --git a/rowers/uploads.py b/rowers/uploads.py index a667e200..c5cc9619 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -27,7 +27,7 @@ queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low') -from types import workouttypes,boattypes +from types import workouttypes,boattypes,otwtypes try: from cStringIO import StringIO @@ -297,7 +297,7 @@ def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): r.pw_tr,r.pw_an])/r.ftp ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): + if w.workouttype in otwtypes: ftp = ftp*(100.-r.otwslack)/100. hrpwrdata = { @@ -322,7 +322,7 @@ def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): if plotnr == 0: plotnr = plotnrs[plottype] - if w.workouttype in ('water','coastal'): + if w.workouttype in otwtypes: plotnr = plotnr+3 diff --git a/rowers/views.py b/rowers/views.py index 2d7be89f..7d0cf662 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -606,7 +606,7 @@ def get_thumbnails(request,id): aantalcomments = len(comments) workouttype = 'ote' - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: workouttype = 'otw' try: @@ -1330,7 +1330,7 @@ def add_workout_from_runkeeperdata(user,importid,data): times_location = times_distance latcoord = np.zeros(len(times_distance)) loncoord = np.zeros(len(times_distance)) - if workouttype in ('water','coastal'): + if workouttype in types.otwtypes: workouttype = 'rower' try: @@ -1511,7 +1511,7 @@ def add_workout_from_stdata(user,importid,data): times_location = times_distance latcoord = np.zeros(len(times_distance)) loncoord = np.zeros(len(times_distance)) - if workouttype in ('water','coastal'): + if workouttype in types.otwtypes: workouttype = 'rower' try: @@ -1682,7 +1682,7 @@ def add_workout_from_underarmourdata(user,importid,data): times_location = times_distance latcoord = np.zeros(len(times_distance)) loncoord = np.zeros(len(times_distance)) - if workouttype in ('water','coastal'): + if workouttype in types.otwtypes: workouttype = 'rower' try: @@ -2886,8 +2886,8 @@ def histo_all(request,theuser=0, enddatestring="", options={ 'includereststrokes':False, - 'workouttypes':['rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'] + 'workouttypes':[i[0] for i in types.workouttypes], + 'waterboattype':types.waterboattype }): if 'options' in request.session: @@ -2899,8 +2899,8 @@ def histo_all(request,theuser=0, workstrokesonly = not includereststrokes - checktypes = ['water','rower','dynamic','slides','skierg', - 'paddle','snow','coastal','other'] +# checktypes = ['water','rower','dynamic','slides','skierg', +# 'paddle','snow','coastal','other'] if deltadays>0: @@ -2972,8 +2972,8 @@ def cum_flex_data( request, options={ 'includereststrokes':False, - 'workouttypes':['rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'], + 'workouttypes':[i[0] for i in types.workouttypes], + 'waterboattype':types.waterboattype, 'theuser':0, 'xparam':'spm', 'yparam1':'power', @@ -3072,8 +3072,8 @@ def cum_flex(request,theuser=0, enddatestring="", options={ 'includereststrokes':False, - 'workouttypes':['rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'] + 'workouttypes':[i[0] for i in types.workouttypes], + 'waterboattype':types.waterboattype }): if 'options' in request.session: @@ -3082,7 +3082,7 @@ def cum_flex(request,theuser=0, try: workouttypes = options['workouttypes'] except KeyError: - workouttypes = ['rower','dynamic','slides'] + workouttypes = [i[0] for i in types.workouttypes] try: includereststrokes = options['includereststrokes'] @@ -3092,13 +3092,13 @@ def cum_flex(request,theuser=0, try: waterboattype = options['waterboattype'] except KeyError: - waterboattype = ['1x','2x','2-','4x','4-','8+'] + waterboattype = types.waterboattype workstrokesonly = not includereststrokes - checktypes = ['water','rower','dynamic','slides','skierg', - 'paddle','snow','coastal','other'] +# checktypes = ['water','rower','dynamic','slides','skierg', +# 'paddle','snow','coastal','other'] if deltadays>0: @@ -3176,7 +3176,7 @@ def cum_flex(request,theuser=0, workstrokesonly = not includereststrokes waterboattype = optionsform.cleaned_data['waterboattype'] workouttypes = [] - for type in checktypes: + for type in types.checktypes: if optionsform.cleaned_data[type]: workouttypes.append(type) @@ -3222,7 +3222,7 @@ def cum_flex(request,theuser=0, initial['waterboattype'] = waterboattype - for wtype in checktypes: + for wtype in types.checktypes: if wtype in workouttypes: initial[wtype] = True else: @@ -3409,8 +3409,8 @@ def histo(request,theuser=0, enddatestring="", options={ 'includereststrokes':False, - 'workouttypes':['water','rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'] + 'workouttypes':[i[0] for i in types.workouttypes], + 'waterboattype':types.waterboattype }): if 'options' in request.session: @@ -3421,15 +3421,15 @@ def histo(request,theuser=0, includereststrokes = options['includereststrokes'] waterboattype = options['waterboattype'] except KeyError: - workouttypes = ['water','rower','dynamic','slides'] - waterboattype = ['1x','2x','2-','4x','4-','8+'] + workouttypes = [i[0] for i in types.workouttypes] + waterboattype = types.waterboattype includereststrokes = False workstrokesonly = not includereststrokes - checktypes = ['water','rower','dynamic','slides','skierg', - 'paddle','snow','coastal','other'] +# checktypes = ['water','rower','dynamic','slides','skierg', +# 'paddle','snow','coastal','other'] if deltadays>0: startdate = enddate-datetime.timedelta(days=int(deltadays)) @@ -3499,7 +3499,7 @@ def histo(request,theuser=0, workstrokesonly = not includereststrokes waterboattype = optionsform.cleaned_data['waterboattype'] workouttypes = [] - for type in checktypes: + for type in types.checktypes: if optionsform.cleaned_data[type]: workouttypes.append(type) @@ -3564,7 +3564,7 @@ def histo(request,theuser=0, initial['waterboattype'] = waterboattype - for wtype in checktypes: + for wtype in types.checktypes: if wtype in workouttypes: initial[wtype] = True else: @@ -4476,7 +4476,7 @@ def workout_update_cp_view(request,id=0): dataprep.runcpupdate(r) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: url = reverse(otwrankings_view) else: url = reverse(oterankings_view) @@ -5297,7 +5297,7 @@ def workouts_join_select(request, if 'waterboattype' in request.session: waterboattype = request.session['waterboattype'] else: - waterboattype = ['1x','2x','2-','4x','4-','8+'] + waterboattype = types.waterboattype if 'modalities' in request.session: @@ -5456,7 +5456,7 @@ def team_comparison_select(request, if 'waterboattype' in request.session: waterboattype = request.session['waterboattype'] else: - waterboattype = ['1x','2x','2-','4x','4-','8+'] + waterboattype = types.waterboattype if 'modalities' in request.session: @@ -5720,7 +5720,7 @@ def user_multiflex_select(request, if 'waterboattype' in request.session: waterboattype = request.session['waterboattype'] else: - waterboattype = ['1x','2x','2-','4x','4-','8+'] + waterboattype = types.waterboattype if 'modalities' in request.session: @@ -6214,7 +6214,7 @@ def user_boxplot_select(request, options={ 'includereststrokes':False, 'workouttypes':['rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'] + 'waterboattype':types.waterboattype }, userid=0): @@ -6238,9 +6238,9 @@ def user_boxplot_select(request, workstrokesonly = not includereststrokes - checktypes = ['water','rower','dynamic','slides','skierg', - 'paddle','snow','other','coastal'] - waterboattype = ['1x','2x','2-','4x','4-','8+'] +# checktypes = ['water','rower','dynamic','slides','skierg', +# 'paddle','snow','other','coastal'] + waterboattype = types.waterboattype if 'startdate' in request.session: startdate = iso8601.parse_date(request.session['startdate']) @@ -6287,7 +6287,7 @@ def user_boxplot_select(request, if optionsform.is_valid(): workouttypes = [] waterboattype = optionsform.cleaned_data['waterboattype'] - for type in checktypes: + for type in types.checktypes: if optionsform.cleaned_data[type]: workouttypes.append(type) @@ -6361,7 +6361,7 @@ def user_boxplot_select(request, initial = {} initial['waterboattype'] = waterboattype - for wtype in checktypes: + for wtype in types.checktypes: if wtype in workouttypes: initial[wtype] = True else: @@ -7617,7 +7617,7 @@ def workout_geeky_view(request,id=0,message="",successmessage=""): messages.error(request,message) messages.info(request,successmessage) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: return render(request, 'otwgeeky.html', {'workout':row, @@ -7702,7 +7702,7 @@ def cumstats(request,theuser=0, options={ 'includereststrokes':False, 'workouttypes':['rower','dynamic','slides'], - 'waterboattype':['1x','2x','2-','4x','4-','8+'] + 'waterboattype':types.waterboattype }): if 'options' in request.session: @@ -7722,9 +7722,9 @@ def cumstats(request,theuser=0, workstrokesonly = not includereststrokes - checktypes = ['water','rower','dynamic','slides','skierg', - 'paddle','snow','other','coastal'] - waterboattype = ['1x','2x','2-','4x','4-','8+'] +# checktypes = ['water','rower','dynamic','slides','skierg', +# 'paddle','snow','other','coastal'] + waterboattype = types.waterboattype if deltadays>0: startdate = enddate-datetime.timedelta(days=int(deltadays)) @@ -7800,7 +7800,7 @@ def cumstats(request,theuser=0, workstrokesonly = not includereststrokes workouttypes = [] waterboattype = optionsform.cleaned_data['waterboattype'] - for type in checktypes: + for type in types.checktypes: if optionsform.cleaned_data[type]: workouttypes.append(type) @@ -7952,7 +7952,7 @@ def cumstats(request,theuser=0, initial['includereststrokes'] = includereststrokes initial['waterboattype'] = waterboattype - for wtype in checktypes: + for wtype in types.checktypes: if wtype in workouttypes: initial[wtype] = True else: @@ -8172,7 +8172,7 @@ def workout_advanced_view(request,id=0,message="",successmessage=""): messages.info(request,successmessage) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: return render(request, 'advancedotw.html', {'workout':row, @@ -8436,7 +8436,7 @@ def workout_workflow_view(request,id): aantalcomments = len(comments) workouttype = 'ote' - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: workouttype = 'otw' try: @@ -8528,7 +8528,7 @@ def workout_flexchart3_view(request,*args,**kwargs): mayedit=1 workouttype = 'ote' - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: workouttype = 'otw' try: @@ -8686,7 +8686,7 @@ def workout_flexchart3_view(request,*args,**kwargs): noylist = ["time","distance"] axchoicesbasic.pop("cumdist") - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: for name,d in rowingmetrics: if d['mode'] == 'erg': axchoicespro.pop(name) @@ -10961,7 +10961,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""): r.pw_tr,r.pw_an])/r.ftp ftp = float(r.ftp) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: ftp = ftp*(100.-r.otwslack)/100. rr = rrower(hrmax=r.max,hrut2=r.ut2, @@ -11147,7 +11147,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" r.pw_tr,r.pw_an])/r.ftp ftp = float(r.ftp) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: ftp = ftp*(100.-r.otwslack)/100. rr = rrower(hrmax=r.max,hrut2=r.ut2, @@ -11907,7 +11907,7 @@ def strokedatajson(request,id): r.pw_tr,r.pw_an])/r.ftp ftp = float(r.ftp) - if row.workouttype in ('water','coastal'): + if row.workouttype in types.otwtypes: ftp = ftp*(100.-r.otwslack)/100. rr = rrower(hrmax=r.max,hrut2=r.ut2, @@ -13644,6 +13644,7 @@ def virtualevent_view(request,id=0): cd = form.cleaned_data sex = cd['sex'] boattype = cd['boattype'] + boatclass = cd['boatclass'] age_min = cd['age_min'] age_max = cd['age_max'] weightcategory = cd['weightcategory'] @@ -13651,6 +13652,7 @@ def virtualevent_view(request,id=0): results = VirtualRaceResult.objects.filter( race=race, workoutid__isnull=False, + boatclass__in=boatclass, boattype__in=boattype, sex__in=sex, weightcategory__in=weightcategory, @@ -13664,6 +13666,7 @@ def virtualevent_view(request,id=0): dns = VirtualRaceResult.objects.filter( race=race, workoutid__isnull=True, + boatclass__in=boatclass, boattype__in=boattype, sex__in=sex, weightcategory__in=weightcategory, @@ -13752,6 +13755,7 @@ def virtualevent_addboat_view(request,id=0): ) boattypes = [record.boattype for record in records] + boatclasses = [record.boatclass for record in records] allowedboats = tuple([ type for type in types.boattypes if type[0] not in boattypes] ) @@ -13763,6 +13767,7 @@ def virtualevent_addboat_view(request,id=0): cd = form.cleaned_data teamname = cd['teamname'] boattype = cd['boattype'] + boatclass = cd['boatclass'] weightcategory = cd['weightcategory'] age = cd['age'] mix = cd['mix'] @@ -13778,8 +13783,8 @@ def virtualevent_addboat_view(request,id=0): if sex == 'not specified': sex = 'male' - if boattype in boattypes: - messages.error(request,"You have already registered in that boat type") + if boattype in boattypes and boatclass in boatclasses: + messages.error(request,"You have already registered in that boat class/type") url = reverse(virtualevent_view, kwargs = { 'id': race.id @@ -13799,6 +13804,7 @@ def virtualevent_addboat_view(request,id=0): weightcategory=weightcategory, duration=datetime.time(0,0), boattype=boattype, + boatclass=boatclass, coursecompleted=False, sex=sex, age=age @@ -13828,7 +13834,7 @@ def virtualevent_addboat_view(request,id=0): 'weightcategory': r.weightcategory, } - form = VirtualRaceResultForm(initial=initial,boattypes=allowedboats) + form = VirtualRaceResultForm(initial=initial) return render(request,'virtualeventregister.html', { @@ -13864,6 +13870,7 @@ def virtualevent_register_view(request,id=0): cd = form.cleaned_data teamname = cd['teamname'] boattype = cd['boattype'] + boatclass = cd['boatclass'] weightcategory = cd['weightcategory'] age = cd['age'] mix = cd['mix'] @@ -13889,6 +13896,7 @@ def virtualevent_register_view(request,id=0): ), weightcategory=weightcategory, duration=datetime.time(0,0), + boatclass=boatclass, boattype=boattype, coursecompleted=False, sex=sex,