diff --git a/rowers/dataprep.py b/rowers/dataprep.py index b8b054a4..61116cea 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -759,9 +759,11 @@ def create_row_df(r,distance,duration,startdatetime, totalseconds += duration.second totalseconds += duration.microsecond/1.e6 - - spm = 60.*nr_strokes/totalseconds - + try: + spm = 60.*nr_strokes/totalseconds + except ZeroDivisionError: + spm = 20. + step = totalseconds/float(nr_strokes) elapsed = np.arange(nr_strokes)*totalseconds/(float(nr_strokes-1)) @@ -775,7 +777,10 @@ def create_row_df(r,distance,duration,startdatetime, pace = 500.*totalseconds/distance if workouttype in ['rower','slides','dynamic']: - velo = distance/totalseconds + try: + velo = distance/totalseconds + except ZeroDivisionError: + velo = 2.4 power = 2.8*velo**3 else: power = 0 diff --git a/rowers/models.py b/rowers/models.py index 14b5fc86..b8c70042 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1233,7 +1233,7 @@ class Workout(models.Model): max_length=100) distance = models.IntegerField(default=0,blank=True) duration = models.TimeField(default=1,blank=True) - weightcategory = models.CharField(default="hwt",max_length=10) + weightcategory = models.CharField(default="hwt",max_length=10,choices=weightcategories) weightvalue = models.FloatField(default=80.0,blank=True,verbose_name = 'Average Crew Weight (kg)') csvfilename = models.CharField(blank=True,max_length=150) uploadedtoc2 = models.IntegerField(default=0) @@ -1478,10 +1478,10 @@ def auto_delete_image_on_delete(sender,instance, **kwargs): # Form to update Workout data class WorkoutForm(ModelForm): - duration = forms.TimeInput(format='%H:%M:%S.%f') +# duration = forms.TimeInput(format='%H:%M:%S.%f') class Meta: model = Workout - fields = ['name','date','starttime','timezone','duration','distance','workouttype','notes','privacy','rankingpiece','boattype'] + fields = ['name','date','starttime','timezone','duration','distance','workouttype','weightcategory','notes','privacy','rankingpiece','boattype'] widgets = { 'date': AdminDateWidget(), 'notes': forms.Textarea, @@ -1492,11 +1492,6 @@ class WorkoutForm(ModelForm): super(WorkoutForm, self).__init__(*args, **kwargs) # this line to be removed del self.fields['privacy'] -# self.fields['timezone'] = forms.ChoiceField(choices=[ -# (x,x) for x in pytz.common_timezones -# ], -# initial='UTC', -# label='Time Zone') if self.instance.workouttype != 'water': del self.fields['boattype'] @@ -1509,6 +1504,7 @@ class WorkoutForm(ModelForm): 'duration', 'distance', 'workouttype', + 'weightcategory', 'notes', 'rankingpiece', 'boattype' diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html index d8ecb60b..8ace4c3a 100644 --- a/rowers/templates/plannedsessionview.html +++ b/rowers/templates/plannedsessionview.html @@ -16,7 +16,7 @@
{% if user.is_authenticated and psdict.id.1|is_session_manager:user %} - + Edit Session {% else %}   diff --git a/rowers/templates/racelist.html b/rowers/templates/racelist.html index 898d8a17..b2f391b1 100644 --- a/rowers/templates/racelist.html +++ b/rowers/templates/racelist.html @@ -8,7 +8,7 @@ Event Country Course - Action + Click for Details diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 04610edf..dc5b7a25 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -99,10 +99,8 @@     Boat - Raw Time - In Class - Corrected Time - Corrected Place + Time + Details @@ -112,12 +110,15 @@ {{ result.username }} - {{ result.teamname }} + {{ result.teamname }} {{ result.age }} {{ result.sex }} {{ result.weightcategory }} {{ result.boattype }} {{ result.duration |durationprint:"%H:%M:%S.%f" }} + + + Details {% endfor %} {% for result in dns %} diff --git a/rowers/templates/virtualevents.html b/rowers/templates/virtualevents.html index a83a396f..5f7c92f7 100644 --- a/rowers/templates/virtualevents.html +++ b/rowers/templates/virtualevents.html @@ -85,6 +85,10 @@
+

Click on the event name or on the Details button to see the event + details (and manage your participation and results). Click on the + course name to see the course details. +

{% include 'racelist.html' %}
diff --git a/rowers/tests.py b/rowers/tests.py index c465447d..8eef0ab1 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -448,6 +448,7 @@ class DataTest(TestCase): 'duration':'0:55:00.1', 'distance':8000, 'notes':'Aap noot \n mies', + 'weightcategory':'lwt', 'workouttype':'water', } form = WorkoutForm(data=form_data) @@ -675,6 +676,7 @@ class ViewTest(TestCase): 'timezone':'Europe/Berlin', 'duration':'1:00:00.5', 'distance':'15000', + 'weightcategory':'hwt', 'workouttype':'rower', 'notes':'noot mies', } diff --git a/rowers/urls.py b/rowers/urls.py index a5000cd0..d37bf26b 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -254,7 +254,6 @@ urlpatterns = [ url(r'^workout/compare/(?P\d+)/(?P\d+-\d+-\d+)/(?P\w+.*)$',views.workout_comparison_list), url(r'^workout/(?P\d+)/edit$',views.workout_edit_view, name='workout_edit_view'), - url(r'^workout/(?P\d+)/navionics$',views.workout_edit_view_navionics), url(r'^workout/(?P\d+)/map$',views.workout_map_view), url(r'^workout/(?P\d+)/setprivate$',views.workout_setprivate_view), url(r'^workout/(?P\d+)/updatecp$',views.workout_update_cp_view), diff --git a/rowers/views.py b/rowers/views.py index a944b2a8..ccb2b10c 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -181,8 +181,36 @@ class JSONResponse(HttpResponse): kwargs['content_type'] = 'application/json' super(JSONResponse, self).__init__(content, **kwargs) +def getrequestrower(request,rowerid=0,userid=0,notpermanent=False): + if notpermanent == False: + if rowerid == 0 and 'rowerid' in request.session: + rowerid = request.session['rowerid'] + + if userid != 0: + rowerid = 0 + + try: + + if rowerid != 0: + r = Rower.objects.get(id=rowerid) + elif userid != 0: + u = User.objects.get(id=userid) + r = getrower(u) + else: + r = getrower(request.user) + + except Rower.DoesNotExist: + raise Http404("Rower doesn't exist") + if not checkaccessuser(request.user,r): + raise PermissionDenied("You have no access to this user") + + if notpermanent == False: + request.session['rowerid'] = r.id + + return r + def getrower(user): try: @@ -1062,8 +1090,8 @@ def start_plantrial_view(request): messages.info(request,'We have started your 14 day trial period') - subject2 = "User started Pro Trial" - message2 = "User Started Pro Trial.\n" + subject2 = "User started Plan Trial" + message2 = "User Started Plan Trial.\n" message2 += request.user.email + "\n" message2 += "User name: "+request.user.username @@ -2952,7 +2980,15 @@ def cum_flex(request,theuser=0, promember=0 if theuser == 0: - theuser = request.user.id + if 'rowerid' in request.session: + try: + r = Rower.objects.get(id=request.session['rowerid']) + theuser = r.user.id + except Rower.DoesNotExist: + theuser = request.user.id + else: + theuser = request.user.id + if not request.user.is_anonymous(): r = getrower(request.user) @@ -3105,11 +3141,9 @@ def cum_flex(request,theuser=0, def fitnessmetric_view(request,id=0,mode='rower', startdate=timezone.now()-timezone.timedelta(days=365), enddate=timezone.now()): - if id==0: - id = request.user.id - theuser = User.objects.get(id=id) - therower = Rower.objects.get(user=theuser) + therower = getrequestrower(request,userid=id) + theuser = therower.user if request.method == 'POST': @@ -3275,8 +3309,9 @@ def histo(request,theuser=0, startdate = s promember=0 - if theuser == 0: - theuser = request.user.id + r = getrequestrower(request,userid=theuser) + theuser = r.user.id + if not request.user.is_anonymous(): r = getrower(request.user) @@ -3431,6 +3466,7 @@ def addmanual_view(request): starttime = form.cleaned_data['starttime'] workouttype = form.cleaned_data['workouttype'] duration = form.cleaned_data['duration'] + weightcategory = form.cleaned_data['weightcategory'] distance = form.cleaned_data['distance'] notes = form.cleaned_data['notes'] thetimezone = form.cleaned_data['timezone'] @@ -3458,6 +3494,7 @@ def addmanual_view(request): id,message = dataprep.create_row_df(r, distance, + weightcategory, duration,startdatetime, title = name, notes=notes, @@ -4346,7 +4383,14 @@ def otwrankings_view(request,theuser=0, startdate = s if theuser == 0: - theuser = request.user.id + if 'rowerid' in request.session: + try: + r = Rower.objects.get(id=request.session['rowerid']) + theuser = r.user.id + except Rower.DoesNotExist: + theuser = request.user.id + else: + theuser = request.user.id promember=0 if not request.user.is_anonymous(): @@ -4400,6 +4444,7 @@ def otwrankings_view(request,theuser=0, # get all 2k (if any) - this rower, in date range try: r = Rower.objects.get(user=theuser) + request.session['rowerid'] = r.id except Rower.DoesNotExist: raise Http404("Rower doesn't exist") @@ -4622,7 +4667,15 @@ def oterankings_view(request,theuser=0, startdate = s if theuser == 0: - theuser = request.user.id + if 'rowerid' in request.session: + try: + r = Rower.objects.get(id=request.session['rowerid']) + theuser = r.user.id + except Rower.DoesNotExist: + theuser = request.user.id + else: + theuser = request.user.id + promember=0 if not request.user.is_anonymous(): @@ -4676,6 +4729,7 @@ def oterankings_view(request,theuser=0, # get all 2k (if any) - this rower, in date range try: r = Rower.objects.get(user=theuser) + request.session['rowerid'] = r.id except Rower.DoesNotExist: allergworkouts = [] raise Http404("Rower doesn't exist") @@ -5493,13 +5547,8 @@ def user_multiflex_select(request, enddate=timezone.now(), userid=0): - if userid == 0: - user = request.user - else: - user = User.objects.get(id=userid) - - - r = getrower(user) + r = getrequestrower(request,userid=userid) + user = r.user if 'options' in request.session: options = request.session['options'] @@ -6032,13 +6081,8 @@ def user_boxplot_select(request, }, userid=0): - if userid == 0: - user = request.user - else: - user = User.objects.get(id=userid) - - - r = getrower(user) + r = getrequestrower(request,userid=userid) + user = r.user if 'options' in request.session: options = request.session['options'] @@ -6423,17 +6467,7 @@ def workouts_view(request,message='',successmessage='', teamid=0,rankingonly=False,rowerid=0,userid=0): request.session['referer'] = absolute(request)['PATH'] - try: - if rowerid != 0: - r = Rower.objects.get(id=rowerid) - elif userid != 0: - u = User.objects.get(id=userid) - r = getrower(u) - else: - r = getrower(request.user) - - except Rower.DoesNotExist: - raise Http404("Rower doesn't exist") + r = getrequestrower(request,rowerid=rowerid,userid=userid) # check if access is allowed if not checkaccessuser(request.user,r): @@ -7572,7 +7606,15 @@ def cumstats(request,theuser=0, promember=0 if theuser == 0: - theuser = request.user.id + if 'rowerid' in request.session: + try: + r = Rower.objects.get(id=request.session['rowerid']) + theuser = r.user.id + except Rower.DoesNotExist: + theuser = request.user.id + else: + theuser = request.user.id + if not request.user.is_anonymous(): r = getrower(request.user) @@ -7696,7 +7738,8 @@ def cumstats(request,theuser=0, datadf,extracols = dataprep.read_cols_df_sql(ids,fieldlist) datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) - + + request.session['rowerid'] = r.id if datadf.empty: stats = {} @@ -9011,6 +9054,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): date = form.cleaned_data['date'] starttime = form.cleaned_data['starttime'] workouttype = form.cleaned_data['workouttype'] + weightcategory = form.cleaned_data['weightcategory'] duration = form.cleaned_data['duration'] distance = form.cleaned_data['distance'] notes = form.cleaned_data['notes'] @@ -9049,6 +9093,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): row.starttime = starttime row.startdatetime = startdatetime row.workouttype = workouttype + row.weightcategory = weightcategory row.notes = notes row.duration = duration row.distance = distance @@ -9223,166 +9268,6 @@ def workout_map_view(request,id=0): 'mayedit':mayedit, }) -# The basic edit page -@login_required() -def workout_edit_view_navionics(request,id=0,message="",successmessage=""): - request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE - request.session['referer'] = absolute(request)['PATH'] - - row = get_workout(id) - form = WorkoutForm(instance=row) - - if request.method == 'POST': - # Form was submitted - form = WorkoutForm(request.POST) - if form.is_valid(): - # Get values from form - name = form.cleaned_data['name'] - date = form.cleaned_data['date'] - starttime = form.cleaned_data['starttime'] - workouttype = form.cleaned_data['workouttype'] - duration = form.cleaned_data['duration'] - distance = form.cleaned_data['distance'] - notes = form.cleaned_data['notes'] - thetimezone = form.cleaned_data['timezone'] - try: - boattype = request.POST['boattype'] - except KeyError: - boattype = Workout.objects.get(id=id).boattype - try: - privacy = request.POST['privacy'] - except KeyError: - privacy = Workout.objects.get(id=id).privacy - try: - rankingpiece = form.cleaned_data['rankingpiece'] - except KeyError: - rankingpiece =- Workout.objects.get(id=id).rankingpiece - - startdatetime = (str(date) + ' ' + str(starttime)) - startdatetime = datetime.datetime.strptime(startdatetime, - "%Y-%m-%d %H:%M:%S") - startdatetime = timezone.make_aware(startdatetime) - startdatetime = startdatetime.astimezone(pytz.timezone(thetimezone)) - - - # check if user is owner of this workout - if checkworkoutuser(request.user,row): - row.name = name - row.date = date - row.starttime = starttime - row.startdatetime = startdatetime - row.workouttype = workouttype - row.notes = notes - row.duration = duration - row.distance = distance - row.boattype = boattype - row.privacy = privacy - row.rankingpiece = rankingpiece - row.timezone = thetimezone - try: - row.save() - except IntegrityError: - pass - # change data in csv file - - r = rdata(row.csvfilename) - if r == 0: - return HttpResponse("Error: CSV Data File Not Found") - r.rowdatetime = startdatetime - r.write_csv(row.csvfilename,gzip=True) - dataprep.update_strokedata(id,r.df) - successmessage = "Changes saved" - messages.info(request,successmessage) - url = reverse(workout_edit_view, - kwargs = { - 'id':str(row.id), - }) - response = HttpResponseRedirect(url) - else: - message = "You are not allowed to change this workout" - messages.error(request,message) - url = reverse(workouts_view) - - response = HttpResponseRedirect(url) - - #else: # form not POSTed - form = WorkoutForm(instance=row) - - row = get_workout(id) - - g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") - for i in g: - try: - width,height = Image.open(i.filename).size - i.width = width - i.height = height - i.save() - except: - pass - - # check if user is owner of this workout - - comments = WorkoutComment.objects.filter(workout=row) - - aantalcomments = len(comments) - - if (checkworkoutuser(request.user,row)==False): - raise PermissionDenied("Access denied") - - # create interactive plot - f1 = row.csvfilename - u = row.user.user - r = getrower(u) - rowdata = rdata(f1) - hascoordinates = 1 - if rowdata != 0: - try: - latitude = rowdata.df[' latitude'] - if not latitude.std(): - hascoordinates = 0 - except KeyError,AttributeError: - hascoordinates = 0 - - else: - hascoordinates = 0 - - - if hascoordinates: - mapscript,mapdiv = leaflet_chart2(rowdata.df[' latitude'], - rowdata.df[' longitude'], - row.name) - - else: - mapscript = "" - mapdiv = "" - - - # render page - if (len(g)<=3): - return render(request, 'workout_form.html', - {'form':form, - 'workout':row, - 'teams':get_my_teams(request.user), - 'graphs1':g[0:3], - 'mapscript':mapscript, - 'aantalcomments':aantalcomments, - 'mapdiv':mapdiv, - }) - - else: - return render(request, 'workout_form.html', - {'form':form, - 'teams':get_my_teams(request.user), - 'workout':row, - 'graphs1':g[0:3], - 'graphs2':g[3:6], - 'mapscript':mapscript, - 'aantalcomments':aantalcomments, - 'mapdiv':mapdiv, - }) - - - return HttpResponseRedirect(url) # Image upload @login_required() @@ -11346,12 +11231,7 @@ def rower_exportsettings_view(request): # Add email address to form so user can change his email address @login_required() def rower_edit_view(request,rowerid=0,message=""): - if rowerid==0: - r = getrower(request.user) - else: - r = Rower.objects.get(id=rowerid) - if not checkaccessuser(request.user,r): - raise PermissionDenied("You have no access to these user settings") + r = getrequestrower(request,rowerid=rowerid,notpermanent=True) rowerid = r.id @@ -12297,16 +12177,8 @@ def plannedsession_multiclone_view( rowerid=0, startdate=timezone.now()-datetime.timedelta(days=30), enddate=timezone.now()): - - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + + r = getrequestrower(request,rowerid=rowerid) if 'startdate' in request.session: startdate = iso8601.parse_date(request.session['startdate']) @@ -12402,15 +12274,8 @@ def plannedsession_multiclone_view( @user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", redirect_field_name=None) def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0): - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + + r = getrequestrower(request,rowerid=rowerid) if request.method == 'POST': sessioncreateform = PlannedSessionForm(request.POST) @@ -12505,15 +12370,7 @@ def plannedsession_multicreate_view(request,timeperiod='thisweek', extrasessions=int(extrasessions) - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod) sps = get_sessions(r,startdate=startdate,enddate=enddate) @@ -12876,15 +12733,7 @@ def plannedsessions_coach_view(request,timeperiod='thisweek', @login_required() def plannedsessions_view(request,timeperiod='thisweek',rowerid=0): - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod) @@ -12921,15 +12770,7 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0): @login_required() def plannedsessions_print_view(request,timeperiod='thisweek',rowerid=0): - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod) @@ -12958,15 +12799,7 @@ def plannedsessions_manage_view(request,timeperiod='thisweek',rowerid=0, if request.is_ajax(): is_ajax = True - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod) @@ -13084,15 +12917,8 @@ def plannedsessions_manage_view(request,timeperiod='thisweek',rowerid=0, redirect_field_name=None) def plannedsession_clone_view(request,id=0,rowerid=0, timeperiod='thisweek'): - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod) @@ -13137,16 +12963,8 @@ def plannedsession_clone_view(request,id=0,rowerid=0, @user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", redirect_field_name=None) def plannedsession_edit_view(request,id=0,timeperiod='thisweek',rowerid=0): - - if rowerid==0: - r = getrower(request.user) - else: - try: - r = Rower.objects.get(id=rowerid) - except Rower.DoesNotExist: - raise Http404("This rower doesn't exist") - if not checkaccessuser(request.user,r): - raise PermissionDenied("You don't have access to this plan") + + r = getrequestrower(request,rowerid=rowerid) startdate,enddate = get_dates_timeperiod(timeperiod)