From e054b0d1a0b04b493cc3b3ce0d81bd59ee7c5235 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 7 Jun 2018 18:08:17 +0200 Subject: [PATCH 1/3] excluding basic users from auto sync --- rowers/polarstuff.py | 4 +++- rowers/templates/imports.html | 5 +++++ rowers/templates/promembership.html | 9 ++++++++- rowers/uploads.py | 14 ++++++++------ rowers/utils.py | 9 +++++++++ rowers/views.py | 23 ++++++++++------------- 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/rowers/polarstuff.py b/rowers/polarstuff.py index 60aad0d8..9b9c0e9e 100644 --- a/rowers/polarstuff.py +++ b/rowers/polarstuff.py @@ -145,6 +145,8 @@ def get_polar_notifications(): return available_data +from rowers.utils import isprorower + def get_all_new_workouts(available_data,testing=False): for record in available_data: if testing: @@ -153,7 +155,7 @@ def get_all_new_workouts(available_data,testing=False): try: r = Rower.objects.get(polaruserid=record['user-id']) u = r.user - if r.polar_auto_import: + if r.polar_auto_import and isprorower(r): exercise_list = get_polar_workouts(u) if testing: print exercise_list diff --git a/rowers/templates/imports.html b/rowers/templates/imports.html index 857802a2..87dbd002 100644 --- a/rowers/templates/imports.html +++ b/rowers/templates/imports.html @@ -103,6 +103,7 @@

Auto Import/Export Settings

+

Use the form below to set your auto import/export settings. As we implement auto import/export for various partner sites, this form will be expanded.

@@ -112,6 +113,9 @@

Auto Export = New workouts uploaded to rowsandall.com will be automatically synchronized to the partner site

+ +

These settings only have effect if you are a user on one + of the paid plans

@@ -124,6 +128,7 @@
+ diff --git a/rowers/templates/promembership.html b/rowers/templates/promembership.html index f1094c22..c3422175 100644 --- a/rowers/templates/promembership.html +++ b/rowers/templates/promembership.html @@ -39,12 +39,19 @@ ✔ - Import, Export, Synchronization and download of all your data + Manual Import, Export, Synchronization and download of all your data ✔ ✔ ✔ ✔ + + Automatic Synchronization with other fitness sites +   + ✔ + ✔ + ✔ + Heart rate and power zones ✔ diff --git a/rowers/uploads.py b/rowers/uploads.py index c5cc9619..07b5cdce 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -373,15 +373,17 @@ def make_private(w,options): return 1 +from rowers.utils import isprorower + def do_sync(w,options): - if ('upload_to_C2' in options and options['upload_to_C2']) or w.user.c2_auto_export: + if ('upload_to_C2' in options and options['upload_to_C2']) or (w.user.c2_auto_export and isprorower(w.user)): try: message,id = c2stuff.workout_c2_upload(w.user.user,w) except c2stuff.C2NoTokenError: id = 0 message = "Something went wrong with the Concept2 sync" - if ('upload_to_Strava' in options and options['upload_to_Strava']) or w.user.strava_auto_export: + if ('upload_to_Strava' in options and options['upload_to_Strava']) or (w.user.strava_auto_export and isprorower(w.user)): try: message,id = stravastuff.workout_strava_upload( w.user.user,w @@ -391,7 +393,7 @@ def do_sync(w,options): message = "Please connect to Strava first" - if ('upload_to_SportTracks' in options and options['upload_to_SportTracks']) or w.user.sporttracks_auto_export: + if ('upload_to_SportTracks' in options and options['upload_to_SportTracks']) or (w.user.sporttracks_auto_export and isprorower(w.user)): try: message,id = sporttracksstuff.workout_sporttracks_upload( w.user.user,w @@ -401,7 +403,7 @@ def do_sync(w,options): id = 0 - if ('upload_to_RunKeeper' in options and options['upload_to_RunKeeper']) or w.user.runkeeper_auto_export: + if ('upload_to_RunKeeper' in options and options['upload_to_RunKeeper']) or (w.user.runkeeper_auto_export and isprorower(w.user)): try: message,id = runkeeperstuff.workout_runkeeper_upload( w.user.user,w @@ -410,7 +412,7 @@ def do_sync(w,options): message = "Please connect to Runkeeper first" id = 0 - if ('upload_to_MapMyFitness' in options and options['upload_to_MapMyFitness']) or w.user.mapmyfitness_auto_export: + if ('upload_to_MapMyFitness' in options and options['upload_to_MapMyFitness']) or (w.user.mapmyfitness_auto_export and isprorower(w.user)): try: message,id = underarmourstuff.workout_ua_upload( w.user.user,w @@ -420,7 +422,7 @@ def do_sync(w,options): id = 0 - if ('upload_to_TrainingPeaks' in options and options['upload_to_TrainingPeaks']) or w.user.trainingpeaks_auto_export: + if ('upload_to_TrainingPeaks' in options and options['upload_to_TrainingPeaks']) or (w.user.trainingpeaks_auto_export and isprorower(w.user)): try: message,id = tpstuff.workout_tp_upload( w.user.user,w diff --git a/rowers/utils.py b/rowers/utils.py index d9c7ec54..635d255a 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -369,3 +369,12 @@ def totaltime_sec_to_string(totaltime): duration = "%s:%s:%s.%s" % (hours, minutes, seconds, tenths) return duration + +def isprorower(r): + result = False + result = r.rowerplan in ['pro','coach','plan'] + if not result and r.protrialexpires: + result = r.rowerplan is 'basic' and r.protrialexpires >= datetime.date.today() + + return result + diff --git a/rowers/views.py b/rowers/views.py index 7d0cf662..0f36576f 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -926,6 +926,8 @@ def hasplannedsessions(user): return result +from rowers.utils import isprorower + # Check if a user is a Pro member def ispromember(user): if not user.is_anonymous(): @@ -934,10 +936,8 @@ def ispromember(user): except Rower.DoesNotExists: r = Rower(user=user) r.save() - - result = user.is_authenticated() and (r.rowerplan=='pro' or r.rowerplan=='coach' or r.rowerplan=='plan') - if not result and r.protrialexpires: - result = user.is_authenticated() and r.rowerplan=='basic' and r.protrialexpires >= datetime.date.today() + + result = user.is_authenticated() and isprorower(r) else: result = False return result @@ -2684,9 +2684,6 @@ def imports_view(request): r.save() - # polar_auto_import = cd['polar_auto_import'] - # r.polar_auto_import = polar_auto_import - # r.save() else: form = RowerImportExportForm(instance=r) @@ -10516,7 +10513,7 @@ def workout_upload_view(request, request.session['async_tasks'] = [(jobid,'make_plot')] # upload to C2 - if (upload_to_c2) or (w.user.c2_auto_export): + if (upload_to_c2) or (w.user.c2_auto_export and isprorower(w.user)): try: message,id = c2stuff.workout_c2_upload(request.user,w) except C2NoTokenError: @@ -10527,7 +10524,7 @@ def workout_upload_view(request, else: messages.error(request,message) - if (upload_to_strava) or (w.user.strava_auto_export): + if (upload_to_strava) or (w.user.strava_auto_export and isprorower(w.user)): try: message,id = stravastuff.workout_strava_upload( request.user,w @@ -10540,7 +10537,7 @@ def workout_upload_view(request, else: messages.error(request,message) - if (upload_to_st) or (w.user.sporttracks_auto_export): + if (upload_to_st) or (w.user.sporttracks_auto_export and isprorower(w.user)): try: message,id = sporttracksstuff.workout_sporttracks_upload( request.user,w @@ -10553,7 +10550,7 @@ def workout_upload_view(request, else: messages.error(request,message) - if (upload_to_rk) or (w.user.runkeeper_auto_export): + if (upload_to_rk) or (w.user.runkeeper_auto_export and isprorower(w.user)): try: message,id = runkeeperstuff.workout_runkeeper_upload( request.user,w @@ -10568,7 +10565,7 @@ def workout_upload_view(request, messages.error(request,message) - if (upload_to_ua) or (w.user.mapmyfitness_auto_export): + if (upload_to_ua) or (w.user.mapmyfitness_auto_export and isprorower(w.user)): try: message,id = underarmourstuff.workout_ua_upload( request.user,w @@ -10583,7 +10580,7 @@ def workout_upload_view(request, messages.error(request,message) - if (upload_to_tp) or (w.user.trainingpeaks_auto_export): + if (upload_to_tp) or (w.user.trainingpeaks_auto_export and isprorower(w.user)): try: message,id = tpstuff.workout_tp_upload( request.user,w From a329b8b94ef0f97ff72f3072e309509ddaa55e93 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 7 Jun 2018 20:32:03 +0200 Subject: [PATCH 2/3] improved workout edit form --- rowers/models.py | 13 +++++++++---- rowers/types.py | 2 +- rowers/views.py | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index a096c2a5..737dd97b 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1495,7 +1495,8 @@ class Workout(models.Model): plannedsession = models.ForeignKey(PlannedSession, blank=True,null=True) name = models.CharField(max_length=150) date = models.DateField() - workouttype = models.CharField(choices=workouttypes,max_length=50) + workouttype = models.CharField(choices=workouttypes,max_length=50, + verbose_name='Exercise/Boat Class') workoutsource = models.CharField(max_length=100, default='unknown') boattype = models.CharField(choices=boattypes,max_length=50, @@ -1508,7 +1509,11 @@ 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,choices=weightcategories) + weightcategory = models.CharField( + default="hwt", + max_length=10, + choices=weightcategories, + verbose_name='Weight Category') 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) @@ -1794,7 +1799,7 @@ class WorkoutForm(ModelForm): # duration = forms.TimeInput(format='%H:%M:%S.%f') class Meta: model = Workout - fields = ['name','date','starttime','timezone','duration','distance','workouttype','weightcategory','notes','privacy','rankingpiece','boattype'] + fields = ['name','date','starttime','timezone','duration','distance','workouttype','boattype','weightcategory','notes','privacy','rankingpiece'] widgets = { 'date': AdminDateWidget(), 'notes': forms.Textarea, @@ -1806,7 +1811,7 @@ class WorkoutForm(ModelForm): # this line to be removed del self.fields['privacy'] - if self.instance.workouttype != 'water': + if self.instance.workouttype not in types.otwtypes: del self.fields['boattype'] fieldorder = ( diff --git a/rowers/types.py b/rowers/types.py index 5d3ec0af..a1781393 100644 --- a/rowers/types.py +++ b/rowers/types.py @@ -1,5 +1,5 @@ workouttypes = ( - ('water','On-water - Olympic'), + ('water','Standard Racing Shell'), ('rower','Indoor Rower'), ('skierg','Ski Erg'), ('dynamic','Dynamic Indoor Rower'), diff --git a/rowers/views.py b/rowers/views.py index 0f36576f..cdcee2fb 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -9192,6 +9192,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): distance = form.cleaned_data['distance'] notes = form.cleaned_data['notes'] thetimezone = form.cleaned_data['timezone'] + try: boattype = request.POST['boattype'] except KeyError: From e08456360d7f72aca2cb45a816d04e3492b13396 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 7 Jun 2018 21:22:29 +0200 Subject: [PATCH 3/3] javascript in documentsform --- rowers/templates/document_form.html | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 8ca2c488..6c899e79 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -78,6 +78,28 @@ {% block scripts %} + +