From 53f2462f7b8e7ff9becc515e27a65e4d4cc94e09 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 15 Nov 2018 16:38:35 +0100 Subject: [PATCH 1/5] easy link to detach workouts --- rowers/templates/plannedsessionview.html | 5 ++++- rowers/urls.py | 2 ++ rowers/views.py | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html index 662063eb..dc96de68 100644 --- a/rowers/templates/plannedsessionview.html +++ b/rowers/templates/plannedsessionview.html @@ -88,7 +88,10 @@ {{ workout.distance }}m - {{ workout.duration |durationprint:"%H:%M:%S.%f" }} + {{ workout.duration |durationprint:"%H:%M:%S.%f" }} + + Detach + {% endfor %} diff --git a/rowers/urls.py b/rowers/urls.py index 8b00c5fb..c46a3ae1 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -492,6 +492,8 @@ urlpatterns = [ url(r'^sessions/(?P\d+)/edit/user/(?P\d+)/$',views.plannedsession_edit_view), url(r'^sessions/(?P\d+)/clone/user/(?P\d+)/$',views.plannedsession_clone_view), url(r'^sessions/(?P\d+)/clone/$',views.plannedsession_clone_view), + url(r'^sessions/(?P\d+)/detach/(?P\d+)/user/(?P\d+)/$',views.plannedsession_detach_view), + url(r'^sessions/(?P\d+)/detach/(?P\d+)/$',views.plannedsession_detach_view), url(r'^sessions/(?P\d+)/$',views.plannedsession_view, name='plannedsession_view'), url(r'^sessions/(?P\d+)/user/(?P\d+)/$',views.plannedsession_view, diff --git a/rowers/views.py b/rowers/views.py index 4530f252..e288989c 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -15410,6 +15410,26 @@ def plannedsession_edit_view(request,id=0,userid=0): }) +@login_required() +def plannedsession_detach_view(request,id=0,psid=0): + + r = getrequestrower(request) + + try: + ps = PlannedSession.objects.get(id=psid) + except PlannedSession.DoesNotExist: + raise Http404("Planned Session does not exist") + + w = get_workout(id) + + if (checkworkoutuser(request.user,w)==False): + return HttpResponseForbidden("Permission Error") + + remove_workout_plannedsession(w,ps) + + url = reverse(plannedsession_view,kwargs={'id':psid}) + + return HttpResponseRedirect(url) @login_required() def plannedsession_view(request,id=0,userid=0): From 2add7b52a20682de8aaab5bfa8a2a6c3fe73376c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 15 Nov 2018 16:51:59 +0100 Subject: [PATCH 2/5] removing some sports --- rowers/mytypes.py | 113 ++++++---------------------------------------- 1 file changed, 15 insertions(+), 98 deletions(-) diff --git a/rowers/mytypes.py b/rowers/mytypes.py index 7eb07b6a..45a8cdd8 100644 --- a/rowers/mytypes.py +++ b/rowers/mytypes.py @@ -11,33 +11,33 @@ workouttypes = ( ('c-boat','Dutch C boat'), ('churchboat','Finnish Church boat'), ('Ride','Ride'), - ('Kitesurf','Kitesurf'), +# ('Kitesurf','Kitesurf'), ('Run','Run'), ('NordicSki','NordicSki'), ('Swim','Swim'), - ('RockClimbing','RockClimbing'), +# ('RockClimbing','RockClimbing'), ('Hike','Hike'), - ('RollerSki','RollerSki'), +# ('RollerSki','RollerSki'), ('Walk','Walk'), - ('AlpineSki','AlpineSki'), - ('Snowboard','Snowboard'), - ('BackcountrySki','BackcountrySki'), - ('Snowshoe','Snowshoe'), +# ('AlpineSki','AlpineSki'), +# ('Snowboard','Snowboard'), +# ('BackcountrySki','BackcountrySki'), +# ('Snowshoe','Snowshoe'), ('Canoeing','Canoeing'), - ('StairStepper','StairStepper'), +# ('StairStepper','StairStepper'), ('Crossfit','Crossfit'), ('StandUpPaddling','StandUpPaddling'), - ('EBikeRide','EBikeRide'), - ('Surfing','Surfing'), - ('Elliptical','Elliptical'), - ('VirtualRide','VirtualRide'), +# ('EBikeRide','EBikeRide'), +# ('Surfing','Surfing'), +# ('Elliptical','Elliptical'), +# ('VirtualRide','VirtualRide'), ('IceSkate','IceSkate'), ('WeightTraining','WeightTraining'), ('InlineSkate','InlineSkate'), - ('Windsurf','Windsurf'), +# ('Windsurf','Windsurf'), ('Kayaking','Kayaking'), ('Workout','Workout'), - ('Yoga','Yoga'), +# ('Yoga','Yoga'), ('other','Other'), ) @@ -54,33 +54,19 @@ stravamapping = { 'c-boat':'Rowing', 'churchboat':'Rowing', 'Ride':'Ride', - 'Kitesurf':'Kitesurf', + 'Kitesurf':'other', 'Run':'Run', - 'NordicSki':'NordicSki', 'Swim':'Swim', - 'RockClimbing':'RockClimbing', 'Hike':'Hike', - 'RollerSki':'RollerSki', 'Walk':'Walk', - 'AlpineSki':'AlpineSki', - 'Snowboard':'Snowboard', - 'BackcountrySki':'BackcountrySki', - 'Snowshoe':'Snowshoe', 'Canoeing':'Canoeing', - 'StairStepper':'StairStepper', 'Crossfit':'Crossfit', 'StandUpPaddling':'StandUpPaddling', - 'EBikeRide':'EBikeRide', - 'Surfing':'Surfing', - 'Elliptical':'Elliptical', - 'VirtualRide':'VirtualRide', 'IceSkate':'IceSkate', 'WeightTraining':'WeightTraining', 'InlineSkate':'InlineSkate', - 'Windsurf':'Windsurf', 'Kayaking':'Kayaking', 'Workout':'Workout', - 'Yoga':'Yoga', 'other':'Workout', } @@ -98,33 +84,20 @@ stmapping = { 'c-boat':'Rowing', 'churchboat':'Rowing', 'Ride':'Cycling', - 'Kitesurf':'Other:Kitesurf', 'Run':'Running', 'NordicSki':'Skiing:Nordic', 'Swim':'Swimming', - 'RockClimbing':'Other:RockClimbing', 'Hike':'Hiking', 'RollerSki':'Other:RollerSki', 'Walk':'Other:Walk', - 'AlpineSki':'Skiing:AlpineSki', - 'Snowboard':'Other:Snowboard', - 'BackcountrySki':'Skiing:BackcountrySki', - 'Snowshoe':'Other:Snowshoe', 'Canoeing':'Other:Canoeing', - 'StairStepper':'Other:StairStepper', 'Crossfit':'Other:Crossfit', 'StandUpPaddling':'Other:StandUpPaddling', - 'EBikeRide':'Cycling:EBikeRide', - 'Surfing':'Other:Surfing', - 'Elliptical':'Other:Elliptical', - 'VirtualRide':'Cycling:VirtualRide', 'IceSkate':'Skating', 'WeightTraining':'Other:WeightTraining', 'InlineSkate':'Skating:InlineSkate', - 'Windsurf':'Other:Windsurf', 'Kayaking':'Other:Kayaking', 'Workout':'Other:Workout', - 'Yoga':'Other:Yoga', 'other':'Other', } @@ -142,33 +115,19 @@ rkmapping = { 'c-boat':'Rowing', 'churchboat':'Rowing', 'Ride':'Cycling', - 'Kitesurf':'Other', 'Run':'Running', 'NordicSki':'Cross-Country Skiing', 'Swim':'Swimming', - 'RockClimbing':'Other', 'Hike':'Hiking', - 'RollerSki':'Other:RollerSki', 'Walk':'Walking', - 'AlpineSki':'Downhill Skiing', - 'Snowboard':'Snowboarding', - 'BackcountrySki':'Downhill Skiing', - 'Snowshoe':'Other', 'Canoeing':'Other', - 'StairStepper':'Stairmaster', 'Crossfit':'CrossFit', 'StandUpPaddling':'Other', - 'EBikeRide':'Cycling', - 'Surfing':'Other', - 'Elliptical':'Elliptical', - 'VirtualRide':'Cycling', 'IceSkate':'Skating', 'WeightTraining':'Other', 'InlineSkate':'Skating', - 'Windsurf':'Other', 'Kayaking':'Other', 'Workout':'Other', - 'Yoga':'Yoga', 'other':'Other', } @@ -186,33 +145,19 @@ polarmapping = { 'c-boat':'Rowing', 'churchboat':'Rowing', 'Ride':'Cycling', - 'Kitesurf':'Kitesurfing', 'Run':'Running', 'NordicSki':'Skiing', 'Swim':'Swimming', - 'RockClimbing':'Other Outdoor', 'Hike':'Hiking', - 'RollerSki':'Other Outdoor', 'Walk':'Walking', - 'AlpineSki':'Downhill skiing', - 'Snowboard':'Snowboarding', - 'BackcountrySki':'Downhill skiing', - 'Snowshoe':'Snowshoe trekking', 'Canoeing':'Canoeing', - 'StairStepper':'Other Indoor', 'Crossfit':'Crossfit', 'StandUpPaddling':'Other Outdoor', - 'EBikeRide':'Cycling', - 'Surfing':'Surfing', - 'Elliptical':'Other Indoor', - 'VirtualRide':'Cycling', 'IceSkate':'Skating', 'WeightTraining':'Strength training', 'InlineSkate':'Skating', - 'Windsurf':'Windsurfing', 'Kayaking':'Kayaking', 'Workout':'Other Indoor', - 'Yoga':'Yoga', 'other':'Other Indoor', } @@ -230,33 +175,19 @@ tpmapping = { 'c-boat':'rowing', 'churchboat':'rowing', 'Ride':'cycling', - 'Kitesurf':'other', 'Run':'run', 'NordicSki':'xc-ski', 'Swim':'swim', - 'RockClimbing':'other', 'Hike':'other', - 'RollerSki':'other', 'Walk':'walk', - 'AlpineSki':'other', - 'Snowboard':'other', - 'BackcountrySki':'other', - 'Snowshoe':'other', 'Canoeing':'other', - 'StairStepper':'other', 'Crossfit':'other', 'StandUpPaddling':'other', - 'EBikeRide':'other', - 'Surfing':'other', - 'Elliptical':'other', - 'VirtualRide':'bike', 'IceSkate':'other', 'WeightTraining':'strength', 'InlineSkate':'other', - 'Windsurf':'other', 'Kayaking':'other', 'Workout':'other', - 'Yoga':'other', 'other':'other', } @@ -274,33 +205,19 @@ c2mapping = { 'c-boat':'water', 'churchboat':'water', 'Ride':'bike', - 'Kitesurf':None, 'Run':None, 'NordicSki':'snow', 'Swim':None, - 'RockClimbing':None, 'Hike':None, - 'RollerSki':'snow', 'Walk':None, - 'AlpineSki':None, - 'Snowboard':None, - 'BackcountrySki':'snow', - 'Snowshoe':'snow', 'Canoeing':'paddle', - 'StairStepper':None, 'Crossfit':None, 'StandUpPaddling':None, - 'EBikeRide':None, - 'Surfing':None, - 'Elliptical':None, - 'VirtualRide':None, 'IceSkate':None, 'WeightTraining':None, 'InlineSkate':None, - 'Windsurf':None, 'Kayaking':None, 'Workout':None, - 'Yoga':None, 'other':None, } From a92232adf1af3179934f9e25116e048b537ed3d9 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 15 Nov 2018 17:00:14 +0100 Subject: [PATCH 3/5] bug fix --- rowers/mytypes.py | 16 +--------------- rowers/stravastuff.py | 4 ++-- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/rowers/mytypes.py b/rowers/mytypes.py index 45a8cdd8..e0b9fa7a 100644 --- a/rowers/mytypes.py +++ b/rowers/mytypes.py @@ -11,33 +11,19 @@ workouttypes = ( ('c-boat','Dutch C boat'), ('churchboat','Finnish Church boat'), ('Ride','Ride'), -# ('Kitesurf','Kitesurf'), ('Run','Run'), ('NordicSki','NordicSki'), ('Swim','Swim'), -# ('RockClimbing','RockClimbing'), ('Hike','Hike'), -# ('RollerSki','RollerSki'), ('Walk','Walk'), -# ('AlpineSki','AlpineSki'), -# ('Snowboard','Snowboard'), -# ('BackcountrySki','BackcountrySki'), -# ('Snowshoe','Snowshoe'), ('Canoeing','Canoeing'), -# ('StairStepper','StairStepper'), ('Crossfit','Crossfit'), ('StandUpPaddling','StandUpPaddling'), -# ('EBikeRide','EBikeRide'), -# ('Surfing','Surfing'), -# ('Elliptical','Elliptical'), -# ('VirtualRide','VirtualRide'), ('IceSkate','IceSkate'), ('WeightTraining','WeightTraining'), ('InlineSkate','InlineSkate'), -# ('Windsurf','Windsurf'), ('Kayaking','Kayaking'), ('Workout','Workout'), -# ('Yoga','Yoga'), ('other','Other'), ) @@ -54,8 +40,8 @@ stravamapping = { 'c-boat':'Rowing', 'churchboat':'Rowing', 'Ride':'Ride', - 'Kitesurf':'other', 'Run':'Run', + 'NordicSki':'NordicSki', 'Swim':'Swim', 'Hike':'Hike', 'Walk':'Walk', diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index 6703e827..fdad80f4 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -165,7 +165,7 @@ def create_async_workout(alldata,user,stravaid,debug=False): try: workouttype = mytypes.stravamappinginv[data['type']] except: - workouttype = 'rower' + workouttype = 'other' if workouttype.lower() == 'rowing': workouttype = 'rower' @@ -446,7 +446,7 @@ def add_workout_from_data(user,importid,data,strokedata, try: workouttype = mytypes.stravamappinginv[data['type']] except KeyError: - workouttype = 'rower' + workouttype = 'other' if workouttype.lower() == 'rowing': workouttype = 'rower' From b47f587b994f7bef79fc50a31011cf73404f956b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 16 Nov 2018 09:48:59 +0100 Subject: [PATCH 4/5] bug fixes --- rowers/urls.py | 42 ++++++++++++++++++++++++++++-------------- rowers/views.py | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/rowers/urls.py b/rowers/urls.py index c46a3ae1..f5f9f183 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -1,7 +1,7 @@ from django.conf import settings from django.conf.urls import url, include from django.contrib.auth.models import User - +from django.contrib.auth.decorators import login_required, permission_required from models import Workout,Rower,StrokeData,FavoriteChart from rest_framework import routers, serializers, viewsets,permissions @@ -311,7 +311,9 @@ urlpatterns = [ url(r'^workout/(?P\d+)/addstatic/(?P\d+)$', views.workout_add_chart_view), url(r'^workout/(?P\d+)/addstatic$',views.workout_add_chart_view), - url(r'^workout/(?P\d+)/delete$',views.WorkoutDelete.as_view(),name='workout_delete'), + url(r'^workout/(?P\d+)/delete$',login_required( + views.WorkoutDelete.as_view()), + name='workout_delete'), url(r'^workout/(?P\d+)/smoothenpace$',views.workout_smoothenpace_view), url(r'^workout/(?P\d+)/undosmoothenpace$',views.workout_undo_smoothenpace_view), url(r'^workout/c2import/$',views.workout_c2import_view), @@ -434,10 +436,14 @@ urlpatterns = [ url(r'^test\_callback',views.rower_process_testcallback), url(r'^createplan/$',views.rower_create_trainingplan), url(r'^createplan/user/(?P\d+)/$',views.rower_create_trainingplan), - url(r'^deleteplan/(?P\d+)$',views.TrainingPlanDelete.as_view()), - url(r'^deletemicrocycle/(?P\d+)/$',views.MicroCycleDelete.as_view()), - url(r'^deletemesocycle/(?P\d+)/$',views.MesoCycleDelete.as_view()), - url(r'^deletemacrocycle/(?P\d+)/$',views.MacroCycleDelete.as_view()), + url(r'^deleteplan/(?P\d+)$',login_required( + views.TrainingPlanDelete.as_view())), + url(r'^deletemicrocycle/(?P\d+)/$',login_required( + views.MicroCycleDelete.as_view())), + url(r'^deletemesocycle/(?P\d+)/$',login_required( + views.MesoCycleDelete.as_view())), + url(r'^deletemacrocycle/(?P\d+)/$',login_required( + views.MacroCycleDelete.as_view())), # url(r'^deleteplan/(?P\d+)$',views.rower_delete_trainingplan), url(r'^plan/(?P\d+)/$',views.rower_trainingplan_view), url(r'^plan/(?P\d+)/user/(?P\d+)/$',views.rower_trainingplan_view), @@ -447,20 +453,26 @@ urlpatterns = [ url(r'^plan/(?P\d+)/meso/(?P\d+)/user/(?P\d+)/$',views.rower_trainingplan_view), url(r'^plan/(?P\d+)/macro/(?P\d+)/$',views.rower_trainingplan_view), url(r'^plan/(?P\d+)/macro/(?P\d+)/user/(?P\d+)/$',views.rower_trainingplan_view), - url(r'^macrocycle/(?P\d+)/$',views.TrainingMacroCycleUpdate.as_view(), + url(r'^macrocycle/(?P\d+)/$',login_required( + views.TrainingMacroCycleUpdate.as_view()), name='macrocycle_update_view'), - url(r'^mesocycle/(?P\d+)/$',views.TrainingMesoCycleUpdate.as_view(), + url(r'^mesocycle/(?P\d+)/$',login_required( + views.TrainingMesoCycleUpdate.as_view()), name='mesocycle_update_view'), - url(r'^macrocycle/(?P\d+)/planbymonths/$',views.planmacrocyclebymonth), + url(r'^macrocycle/(?P\d+)/planbymonths/$',login_required( + views.planmacrocyclebymonth)), url(r'^macrocycle/(?P\d+)/planbymonths/user/(?P\d+)/$',views.planmacrocyclebymonth), url(r'^mesocycle/(?P\d+)/planbyweeks/$',views.planmesocyclebyweek), url(r'^mesocycle/(?P\d+)/planbyweeks/user/(?P\d+)/$',views.planmesocyclebyweek), - url(r'^microcycle/(?P\d+)/$',views.TrainingMicroCycleUpdate.as_view(), + url(r'^microcycle/(?P\d+)/$',login_required( + views.TrainingMicroCycleUpdate.as_view()), name='microcycle_update_view'), url(r'^deletetarget/(?P\d+)/$',views.rower_delete_trainingtarget), - url(r'^editplan/(?P\d+)$',views.TrainingPlanUpdate.as_view(), + url(r'^editplan/(?P\d+)$',login_required( + views.TrainingPlanUpdate.as_view()), name='trainingplan_update_view'), - url(r'^edittarget/(?P\d+)/$',views.TrainingTargetUpdate.as_view(), + url(r'^edittarget/(?P\d+)/$',login_required( + views.TrainingTargetUpdate.as_view()), name='trainingtarget_update_view'), url(r'^workout/(?P\d+)/test\_strokedata$',views.strokedataform), url(r'^sessions/teamcreate/user/(?P\d+)/$',views.plannedsession_teamcreate_view), @@ -498,8 +510,10 @@ urlpatterns = [ name='plannedsession_view'), url(r'^sessions/(?P\d+)/user/(?P\d+)/$',views.plannedsession_view, name='plannedsession_view'), - url(r'^sessions/(?P\d+)/deleteconfirm$',views.PlannedSessionDelete.as_view()), - url(r'^sessions/(?P\d+)/delete$',views.PlannedSessionDelete.as_view(), + url(r'^sessions/(?P\d+)/deleteconfirm$',login_required( + views.PlannedSessionDelete.as_view())), + url(r'^sessions/(?P\d+)/delete$',login_required( + views.PlannedSessionDelete.as_view()), name='plannedsession_delete_view'), url(r'^sessions/manage/session/(?P\d+)/$', views.plannedsessions_manage_view), diff --git a/rowers/views.py b/rowers/views.py index e288989c..a1454f3e 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -5630,7 +5630,12 @@ def multi_compare_view(request,id=0,userid=0): teamid = chartform.cleaned_data['teamid'] ids = request.session['ids'] request.session['ids'] = ids - workouts = [Workout.objects.get(id=id) for id in ids] + workouts = [] + for id in ids: + try: + workouts.append(Workout.objects.get(id=id)) + except Workout.DoesNotExist: + pass labeldict = { int(w.id): w.__unicode__() for w in workouts @@ -5641,7 +5646,13 @@ def multi_compare_view(request,id=0,userid=0): plottype = request.session['plottype'] teamid = 0 ids = request.session['ids'] - workouts = [Workout.objects.get(id=id) for id in ids] + workouts = [] + for id in ids: + try: + workouts.append(Workout.objects.get(id=id)) + except Workout.DoesNotExist: + pass + labeldict = { int(w.id): w.__unicode__() for w in workouts } @@ -5988,8 +5999,15 @@ def multiflex_data(request,userid=0, workmin = options['workmin'] workmax = options['workmax'] ids = options['ids'] - - workouts = [Workout.objects.get(id=id) for id in ids] + + workouts = [] + + for id in ids: + try: + workouts.append(Workout.objects.get(id=id)) + except Workout.DoesNotExist: + pass + labeldict = { int(w.id): w.__unicode__() for w in workouts } @@ -6581,7 +6599,15 @@ def boxplot_view_data(request,userid=0, if userid==0: userid = request.user.id - workouts = [Workout.objects.get(id=id) for id in ids] + workouts = [] + + + for id in ids: + try: + workouts.append(Workout.objects.get(id=id)) + except Workout.DoesNotExist: + pass + labeldict = { int(w.id): w.__unicode__() for w in workouts } @@ -16879,6 +16905,9 @@ class MacroCycleDelete(DeleteView): return obj +@user_passes_test(hasplannedsessions,login_url="/rowers/promembership", + message="This functionality requires a Coach or Self-Coach plan", + redirect_field_name=None) def rower_trainingplan_view(request, id=0, userid=0, From bd2c6a21b93d2ed272a97a34f8e6caa9996c63a4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Nov 2018 11:04:07 +0100 Subject: [PATCH 5/5] small bug fix --- rowers/views.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rowers/views.py b/rowers/views.py index a1454f3e..3c62bafd 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -12485,9 +12485,12 @@ def workout_summary_edit_view(request,id,message="",successmessage="" initial = {} for i in xrange(nrintervals): - initial['intervald_%s' % i] = idist[i] - initial['intervalt_%s' % i] = get_time(itime[i]) - initial['type_%s' % i] = itype[i] + try: + initial['intervald_%s' % i] = idist[i] + initial['intervalt_%s' % i] = get_time(itime[i]) + initial['type_%s' % i] = itype[i] + except IndexError: + pass detailform = IntervalUpdateForm(aantal=nrintervals,initial=initial)