From bc715d14fe7ecfdda07e76745854fdf866c1afd7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 12 Oct 2021 21:15:46 +0200 Subject: [PATCH 1/8] adding some privacy --- rowers/models.py | 4 ++++ rowers/templates/course_view.html | 7 +++++++ rowers/templates/summary_edit.html | 9 +++++++++ rowers/views/racesviews.py | 17 +++++++++++++++++ rowers/views/userviews.py | 11 +++++++++++ 5 files changed, 48 insertions(+) diff --git a/rowers/models.py b/rowers/models.py index cef1bece..e338b52e 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -904,6 +904,9 @@ class Rower(models.Model): getimportantemails = models.BooleanField(default=True, verbose_name='Get Important Emails') + share_course_results = models.BooleanField(default=True, + verbose_name = 'Share Course Results') + sex = models.CharField(default="not specified", max_length=30, @@ -4259,6 +4262,7 @@ class AccountRowerForm(ModelForm): 'adaptiveclass', 'getemailnotifications', 'getimportantemails', + 'share_course_results', 'defaulttimezone','showfavoritechartnotes', 'fav_analysis', 'usersmooth', diff --git a/rowers/templates/course_view.html b/rowers/templates/course_view.html index 7105c21a..b3e5252a 100644 --- a/rowers/templates/course_view.html +++ b/rowers/templates/course_view.html @@ -95,6 +95,13 @@

Filter Results

+

+ {% if onlyme %} + All Results + {% else %} + Only My Results + {% endif %} +

diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 5b9a473a..5fe8d68d 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -190,6 +190,15 @@ The summary will be updated to show time on course, and you can compare this with other attempts.

+

+ {% if rower.share_course_results %} + You are currently sharing your course results with all Rowsandall users. + Click here to hide your course results. + {% else %} + You are currently hiding your course results (except for your participation in online challenges). + Click here to hide your course results. + {% endif %} +

{{ courseselectform.as_table }} diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py index c5222860..7ff47875 100644 --- a/rowers/views/racesviews.py +++ b/rowers/views/racesviews.py @@ -232,6 +232,22 @@ def course_view(request,id=0): workoutid__isnull=False, coursecompleted=True).order_by("duration","-distance") + notsharing = Rower.objects.filter(share_course_results=False).exclude(id=r.id) + notsharing_ids = [o.user.id for o in notsharing] + + records = records.exclude(userid__in=notsharing_ids) + + if 'onlyme' in request.GET: + onlyme = request.GET.get('onlyme',False) + if onlyme == 'true': + onlyme = True + + if onlyme: + records = records.filter(userid=r.user.id) + else: + onlyme=False + + form = RaceResultFilterForm(records=records,groups=False) if request.method == 'POST': form = RaceResultFilterForm(request.POST,records=records,groups=False) @@ -305,6 +321,7 @@ def course_view(request,id=0): 'records':records, 'rower':r, 'form':form, + 'onlyme':onlyme, } ) diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index ad995206..8cf39c7c 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -396,6 +396,15 @@ def rower_exportsettings_view(request,userid=0): def rower_edit_view(request,rowerid=0,userid=0,message=""): r = getrequestrowercoachee(request,rowerid=rowerid,userid=userid,notpermanent=True) + if 'courseshare' in request.GET: + courseshare = request.GET.get('courseshare',"ok") + if courseshare == 'true': + r.share_course_results = True + r.save() + elif courseshare == 'false': + r.share_course_results = False + r.save() + rowerid = r.id breadcrumbs = [ @@ -435,6 +444,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): showfavoritechartnotes = cd['showfavoritechartnotes'] getemailnotifications = cd['getemailnotifications'] getimportantemails = cd['getimportantemails'] + share_course_results = cd['share_course_results'] defaulttimezone=cd['defaulttimezone'] fav_analysis = cd['fav_analysis'] usersmooth = cd['usersmooth'] @@ -461,6 +471,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): r.offercoaching = offercoaching r.defaultlandingpage = defaultlandingpage r.showfavoritechartnotes = showfavoritechartnotes + r.share_course_results = share_course_results r.sex = sex r.birthdate = birthdate r.autojoin = autojoin From c59e951033116840b6de6e5ae0509b47f0b1e2bc Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 13 Oct 2021 19:45:48 +0200 Subject: [PATCH 2/8] adding email conf --- rowers/tasks.py | 39 +++++++++++++++++++- rowers/templates/trajectorysuccessemail.html | 18 +++++++++ rowers/views/workoutviews.py | 3 +- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 rowers/templates/trajectorysuccessemail.html diff --git a/rowers/tasks.py b/rowers/tasks.py index e48830c6..dd10c722 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -515,7 +515,6 @@ def handle_check_race_course(self, logfile = 'courselog_{workoutid}_{courseid}.log'.format(workoutid=workoutid,courseid=courseid) - if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: @@ -544,6 +543,10 @@ def handle_check_race_course(self, if 'summary' in kwargs: summary = kwargs['summary'] + successemail = False + if 'successemail' in kwargs: + successemail = kwargs['successemail'] + columns = ['time',' latitude',' longitude','cum_dist'] try: @@ -742,7 +745,6 @@ def handle_check_race_course(self, result = conn.execute(query) if summary: - try: row = rdata(csvfile=f1) except IOError: # pragma: no cover @@ -771,6 +773,11 @@ def handle_check_race_course(self, conn.close() engine.dispose() + if successemail: + handle_sendemail_coursesucceed( + useremail, userfirstname, logfile, workoutid + ) + os.remove(logfile) return 1 @@ -825,6 +832,8 @@ def handle_check_race_course(self, return 2 + + return 0 # pragma: no cover @@ -1463,6 +1472,32 @@ def handle_sendemail_raceregistration( return 1 +def handle_sendemail_coursesucceed( + useremail, username, logfile, workoutid, **kwargs +): + if 'debug' in kwargs: # pragma: no cover + debug = kwargs['debug'] + else: + debug = True + + subject = "The validation of your course has succeeded" + + from_email = 'Rowsandall ' + + d = { + 'username':username, + 'workoutid':encoder.encode_hex(workoutid), + } + + res = send_template_email(from_email,[useremail], + subject, + 'trajectorysuccessemail.html', + d, + attach_file=logfile, + **kwargs) + + return 1 + def handle_sendemail_coursefail( useremail, username, logfile, **kwargs): diff --git a/rowers/templates/trajectorysuccessemail.html b/rowers/templates/trajectorysuccessemail.html new file mode 100644 index 00000000..f6384bab --- /dev/null +++ b/rowers/templates/trajectorysuccessemail.html @@ -0,0 +1,18 @@ +{% extends "emailbase.html" %} +{% block body %} +

Dear {{ username }},

+ +

+ We have successfully validated the course for your + workout. +

+ + +

+ The attachment contains the validation log. +

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index a01fecb4..06b7e6d5 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -6218,7 +6218,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" record.save() job = myqueue( - queue, + queuehigh, handle_check_race_course, row.csvfilename, row.id, @@ -6227,6 +6227,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" r.user.email, r.user.first_name, summary=True, + successemail=True, ) messages.info(request,'We are checking your time on the course in the background') From 283c7cb996e1b6402ac6e9e4ac5f2088df044132 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 13 Oct 2021 21:24:56 +0200 Subject: [PATCH 3/8] expansion to workout_course page --- rowers/templates/menu_workout.html | 12 ++++ rowers/templates/workout_courses.html | 79 +++++++++++++++++++++++++++ rowers/urls.py | 2 + rowers/views/workoutviews.py | 48 ++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 rowers/templates/workout_courses.html diff --git a/rowers/templates/menu_workout.html b/rowers/templates/menu_workout.html index 1a10cc85..b46f79c2 100644 --- a/rowers/templates/menu_workout.html +++ b/rowers/templates/menu_workout.html @@ -26,6 +26,18 @@  Intervals + {% if workout|water %} +
  • + +  Measured Courses + +
  • + {% endif %} +
  • + +  Intervals + +
  • {% endif %} {% if user.is_authenticated %}
  • diff --git a/rowers/templates/workout_courses.html b/rowers/templates/workout_courses.html new file mode 100644 index 00000000..1a177d37 --- /dev/null +++ b/rowers/templates/workout_courses.html @@ -0,0 +1,79 @@ +{% extends "newbase.html" %} +{% load static %} +{% load rowerfilters %} +{% load leaflet_tags %} + +{% block meta %} +{% leaflet_js %} +{% leaflet_css %} +{% endblock %} + +{% block scripts %} + +{% endblock %} + +{% block title %}{{ workout.name }} {% endblock %} +{% block og_title %}{{ workout.name }} {% endblock %} +{% block description %}{{ workout.name }} +{{ workout.date }} - {{ workout.distance }}m - {{ workout.duration |durationprint:"%H:%M:%S.%f" }}{% endblock %} +{% block og_description %}{{ workout.name }} +{{ workout.date }} - {{ workout.distance }}m - {{ workout.duration |durationprint:"%H:%M:%S.%f" }}{% endblock %} + + + +{% block main %} + +

    {{ workout.name }}

    +
      +
    • + {% if records %} +
    • +

      Course Results

      +
  • + + + + + + + + + {% for record in records %} + + + + + {% endfor %} + +
    CourseTimeDistance
    {{ record.course.name }}{{ record.duration |durationprint:"%H:%M:%S.%f" }}{{ record.distance }} m
    + + {% endif %} + + + + + + + + + + + + + + + + + + + + +
    Rower:{{ first_name }} {{ last_name }}
    Name:{{ workout.name }}
    Date:{{ workout.date }}
    Time:{{ workout.starttime }}
    Distance:{{ workout.distance }}m
    Duration:{{ workout.duration |durationprint:"%H:%M:%S.%f" }}
    Type:{{ workout.workouttype }}
    Weight Category:{{ workout.weightcategory }}
    + + + +{% endblock %} + +{% block sidebar %} +{% include 'menu_workout.html' %} +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 2a30043a..7e07eeb3 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -650,6 +650,8 @@ urlpatterns = [ re_path(r'^register/thankyou/$', TemplateView.as_view(template_name='registerthankyou.html'), name='registerthankyou'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/workflow/$',views.workout_workflow_view, name='workout_workflow_view'), + re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/courses/$',views.workout_course_view, + name='workout_course_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchart/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/(?P\w+)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchart/(?P\w+.*)/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/(?P\w+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchart/(?P\w+.*)/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 06b7e6d5..3d43e00f 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -6058,6 +6058,54 @@ def workout_fusion_view(request,id1=0,id2=1): 'workout2':w2, }) +# See attached courses +@login_required() +@permission_required('workout.change_workout',fn=get_workout_by_opaqueid, raise_exception=True) +def workout_course_view(request, id): + row = get_workout_by_opaqueid(request,id) + r = getrower(request.user) + breadcrumbs = [ + { + 'url':'/rowers/list-workouts/', + 'name':'Workouts' + }, + { + 'url':get_workout_default_page(request,encoder.encode_hex(row.id)), + 'name': row.name + }, + { + 'url':reverse('workout_course_view',kwargs={'id':id}), + 'name': 'Measured Courses' + } + + ] + + courses = [] + courseselecform = CourseSelectForm() + has_latlon,lat_mean,lon_mean = dataprep.workout_has_latlon(row.id) + if has_latlon: + courses = getnearestcourses([lat_mean,lon_mean],GeoCourse.objects.all(),whatisnear=25, + strict=True) + courseselectform = CourseSelectForm(choices=courses) + + # get results + records = VirtualRaceResult.objects.filter( + course__isnull=False, + workoutid=row.id, + coursecompleted=True).order_by("duration","-distance") + + + return render(request, 'workout_courses.html', + {'workout':row, + 'rower':r, + 'breadcrumbs':breadcrumbs, + 'active':'nav-workouts', + 'teams':get_my_teams(request.user), + 'courses':courses, + 'courseselectform':courseselectform, + 'records':records, + }) + # Edit the splits/summary @login_required() From db7b289209dc83cbec2ac980ca6bcd05458bc8c4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Oct 2021 07:55:25 +0200 Subject: [PATCH 4/8] bug fix --- rowers/views/workoutviews.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 3d43e00f..66a982cf 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -6081,7 +6081,7 @@ def workout_course_view(request, id): ] courses = [] - courseselecform = CourseSelectForm() + courseselectform = CourseSelectForm() has_latlon,lat_mean,lon_mean = dataprep.workout_has_latlon(row.id) if has_latlon: courses = getnearestcourses([lat_mean,lon_mean],GeoCourse.objects.all(),whatisnear=25, From eb86364434899b6aebe1415ab51b22e0d498a4a3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Oct 2021 08:33:23 +0200 Subject: [PATCH 5/8] checking race course message linking to job status --- rowers/templates/workout_courses.html | 30 +++++++++++++- rowers/views/statements.py | 1 + rowers/views/workoutviews.py | 60 ++++++++++++++++++++++++++- 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/rowers/templates/workout_courses.html b/rowers/templates/workout_courses.html index 1a177d37..1d0d46f0 100644 --- a/rowers/templates/workout_courses.html +++ b/rowers/templates/workout_courses.html @@ -9,7 +9,7 @@ {% endblock %} {% block scripts %} - +{% include "monitorjobs.html" %} {% endblock %} {% block title %}{{ workout.name }} {% endblock %} @@ -25,7 +25,6 @@

    {{ workout.name }}

      -
    • {% if records %}
    • Course Results

      @@ -48,6 +47,33 @@
    • {% endif %} + {% if courses %} +
    • +

      Interval by Course

      +

      + This functionality allows you to record a time on a set course that you've rowed during the workout. + The summary will be updated to show time on course, and you can compare this with other + attempts. +

      +

      + {% if rower.share_course_results %} + You are currently sharing your course results with all Rowsandall users. + Click here to hide your course results. + {% else %} + You are currently hiding your course results (except for your participation in online challenges). + Click here to hide your course results. + {% endif %} +

      + + + {{ courseselectform.as_table }} +
      + {% csrf_token %} + +
    • + + {% endif %} +
    • diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 367e5b6f..d386d6a9 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -765,6 +765,7 @@ verbose_job_status = { 'long_test_task2': 'Long Test Task 2', 'update_empower': 'Correct Empower Inflated Power Bug', 'submit_race': 'Checking Race Course Result', + 'check_race_course': 'Checking Course Result', } def get_job_status(jobid): # pragma: no cover diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 66a982cf..f88f8938 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -6088,13 +6088,63 @@ def workout_course_view(request, id): strict=True) courseselectform = CourseSelectForm(choices=courses) + + + if request.method == 'POST': + courseselectform = CourseSelectForm(request.POST,choices=courses) + if courseselectform.is_valid(): + course = courseselectform.cleaned_data['course'] + # get or create a record + records = VirtualRaceResult.objects.filter( + userid=r.id, + course=course, + workoutid=row.id + ) + if records: + record = records[0] + else: + # create record + record = VirtualRaceResult( + userid = r.id, + username = r.user.first_name+' '+r.user.last_name, + workoutid = row.id, + weightcategory = r.weightcategory, + adaptiveclass = r.adaptiveclass, + course = course, + distance = course.distance, + boatclass = row.workouttype, + boattype = row.boattype, + sex = r.sex, + age = calculate_age(r.birthdate), + ) + record.save() + + job = myqueue( + queuehigh, + handle_check_race_course, + row.csvfilename, + row.id, + course.id, + record.id, + r.user.email, + r.user.first_name, + summary=True, + successemail=True, + ) + + try: + request.session['async_tasks'] += [(job.id,'check_race_course')] + except KeyError: + request.session['async_tasks'] = [(job.id,'check_race_course')] + + messages.info(request,'We are checking your time on the course in the background. You will receive an email when the check is complete. You can check the status here') + # get results records = VirtualRaceResult.objects.filter( course__isnull=False, workoutid=row.id, coursecompleted=True).order_by("duration","-distance") - return render(request, 'workout_courses.html', {'workout':row, 'rower':r, @@ -6277,7 +6327,13 @@ def workout_summary_edit_view(request,id,message="",successmessage="" summary=True, successemail=True, ) - messages.info(request,'We are checking your time on the course in the background') + + try: + request.session['async_tasks'] += [(job.id,'check_race_course')] + except KeyError: + request.session['async_tasks'] = [(job.id,'check_race_course')] + + messages.info(request,'We are checking your time on the course in the background. You will receive an email when the check is complete. You can check the status here') vals = None # feeling lucky / ruptures From a08f7ff12240d1587e9ab717828b5da9c5463c97 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Oct 2021 08:40:54 +0200 Subject: [PATCH 6/8] design of new page --- rowers/templates/workout_courses.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rowers/templates/workout_courses.html b/rowers/templates/workout_courses.html index 1d0d46f0..98a79928 100644 --- a/rowers/templates/workout_courses.html +++ b/rowers/templates/workout_courses.html @@ -48,8 +48,8 @@ {% endif %} {% if courses %} -
    • -

      Interval by Course

      +
    • +

      Add a course

      This functionality allows you to record a time on a set course that you've rowed during the workout. The summary will be updated to show time on course, and you can compare this with other @@ -74,6 +74,7 @@

    • {% endif %}
    • +

      Workout Summary

    • Rower:{{ first_name }} {{ last_name }}
      From f7d3585bb9a33383459e0a9695627e23e4a997e3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Oct 2021 08:43:24 +0200 Subject: [PATCH 7/8] removing reload --- rowers/templates/workout_courses.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/templates/workout_courses.html b/rowers/templates/workout_courses.html index 98a79928..3417d21a 100644 --- a/rowers/templates/workout_courses.html +++ b/rowers/templates/workout_courses.html @@ -9,7 +9,7 @@ {% endblock %} {% block scripts %} -{% include "monitorjobs.html" %} + {% endblock %} {% block title %}{{ workout.name }} {% endblock %} From 806d34b2d2662e5a9d3acdbfca4cc58051a80027 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Oct 2021 12:49:19 +0200 Subject: [PATCH 8/8] fix --- rowers/management/commands/processemail.py | 55 +++++++++++++++------- rowers/rp3stuff.py | 3 +- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index b091a19e..5371e3d1 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -9,6 +9,7 @@ import zipfile from zipfile import BadZipFile import re import time +import traceback from time import strftime import requests @@ -192,26 +193,48 @@ class Command(BaseCommand): failedmailbox = Mailbox.objects.get(name='Failed') # Polar - polar_available = polarstuff.get_polar_notifications() - res = polarstuff.get_all_new_workouts(polar_available) + try: + polar_available = polarstuff.get_polar_notifications() + res = polarstuff.get_all_new_workouts(polar_available) + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + dologging('processemail.log',''.join('!! ' + line for line in lines)) # Concept2 - rowers = Rower.objects.filter(c2_auto_import=True) - for r in rowers: # pragma: no cover - if user_is_not_basic(r.user): - c2stuff.get_c2_workouts(r) + try: + rowers = Rower.objects.filter(c2_auto_import=True) + for r in rowers: # pragma: no cover + if user_is_not_basic(r.user): + c2stuff.get_c2_workouts(r) + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + dologging('processemail.log',''.join('!! ' + line for line in lines)) - rowers = Rower.objects.filter(rp3_auto_import=True) - for r in rowers: # pragma: no cover - if user_is_not_basic(r.user): - res = rp3stuff.get_rp3_workouts(r) - rowers = Rower.objects.filter(nk_auto_import=True) - for r in rowers: # pragma: no cover - if user_is_not_basic(r.user): - s = 'Starting NK Auto Import for user {id}'.format(id=r.user.id) - dologging('nklog.log',s) - res = nkstuff.get_nk_workouts(r) + try: + rowers = Rower.objects.filter(rp3_auto_import=True) + for r in rowers: # pragma: no cover + if user_is_not_basic(r.user): + res = rp3stuff.get_rp3_workouts(r) + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + dologging('processemail.log',''.join('!! ' + line for line in lines)) + + try: + rowers = Rower.objects.filter(nk_auto_import=True) + for r in rowers: # pragma: no cover + if user_is_not_basic(r.user): + s = 'Starting NK Auto Import for user {id}'.format(id=r.user.id) + dologging('nklog.log',s) + res = nkstuff.get_nk_workouts(r) + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + dologging('processemail.log',''.join('!! ' + line for line in lines)) + messages = Message.objects.filter(mailbox_id = workoutmailbox.id) message_ids = [m.id for m in messages] diff --git a/rowers/rp3stuff.py b/rowers/rp3stuff.py index 57cb8387..492220ce 100644 --- a/rowers/rp3stuff.py +++ b/rowers/rp3stuff.py @@ -137,7 +137,8 @@ def get_rp3_workouts(rower,do_async=True): # pragma: no cover if (res.status_code != 200): return 0 - dologging('rp3_import.log',res.json()) + s = '{d}'.format(d=res.json()) + dologging('rp3_import.log',s) workouts_list = pd.json_normalize(res.json()['data']['workouts']) try: rp3ids = workouts_list['id'].values
      Rower:{{ first_name }} {{ last_name }}