From 04ac613710ec864e99c901c18d820d019539e4e2 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 12:07:37 +0200 Subject: [PATCH 01/12] moved make_plot to uploads --- rowers/uploads.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++ rowers/views.py | 56 +++--------------------------------- 2 files changed, 77 insertions(+), 52 deletions(-) create mode 100644 rowers/uploads.py diff --git a/rowers/uploads.py b/rowers/uploads.py new file mode 100644 index 00000000..7cc20942 --- /dev/null +++ b/rowers/uploads.py @@ -0,0 +1,73 @@ +# for actions related to uploads +from django.conf import settings +from django.utils import timezone,translation +from rowers.tasks import ( + handle_sendemail_unrecognized,handle_sendemailnewcomment, + handle_sendemailnewresponse, handle_updatedps, + handle_makeplot,handle_otwsetpower,handle_sendemailtcx, + handle_sendemailcsv + ) + +from rowers.models import GraphImage + +import numpy as np + +from rowers.utils import ( + geo_distance,serialize_list,deserialize_list,uniqify, + str2bool,range_to_color_hex,absolute + ) + + +def make_plot(r,w,f1,f2,plottype,title): + imagename = f1[:-4]+'.png' + fullpathimagename = 'static/plots/'+imagename + + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + ftp = float(r.ftp) + if w.workouttype in ('water','coastal'): + ftp = ftp*(100.-r.otwslack)/100. + + hrpwrdata = { + 'hrmax':r.max, + 'hrut2':r.ut2, + 'hrut1':r.ut1, + 'hrat':r.at, + 'hrtr':r.tr, + 'hran':r.an, + 'ftp':ftp, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), + } + + # make plot - asynchronous task + plotnrs = { + 'timeplot':1, + 'distanceplot':2, + 'pieplot':3, + } + + plotnr = plotnrs[plottype] + if w.workouttype in ('water','coastal'): + plotnr = plotnr+3 + + + if settings.DEBUG: + res = handle_makeplot.delay(f1,f2,title, + hrpwrdata,plotnr, + imagename) + else: + res = queue.enqueue(handle_makeplot,f1,f2, + title,hrpwrdata, + plotnr,imagename) + + + i = GraphImage(workout=w, + creationdatetime=timezone.now(), + filename=fullpathimagename) + i.save() + + return i.id diff --git a/rowers/views.py b/rowers/views.py index 4e0c38e5..e1cc280d 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -49,6 +49,7 @@ from rowers.models import ( ) from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement from rowers.metrics import rowingmetrics +import rowers.uploads as uploads from django.forms.formsets import formset_factory import StringIO from django.contrib.auth.decorators import login_required,user_passes_test @@ -7772,58 +7773,9 @@ def workout_upload_view(request, response = HttpResponseRedirect(url) w = Workout.objects.get(id=id) - if (make_plot): - imagename = f1[:-4]+'.png' - fullpathimagename = 'static/plots/'+imagename - u = request.user - r = getrower(request.user) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnrs = { - 'timeplot':1, - 'distanceplot':2, - 'pieplot':3, - } - - plotnr = plotnrs[plottype] - if workouttype in ('water','coastal'): - plotnr = plotnr+3 - - - if settings.DEBUG: - res = handle_makeplot.delay(f1,f2,t, - hrpwrdata,plotnr, - imagename) - else: - res = queue.enqueue(handle_makeplot,f1,f2, - t,hrpwrdata, - plotnr,imagename) - - - i = GraphImage(workout=w, - creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() + r = getrower(request.user) + if (make_plot): + id = uploads.make_plot(r,w,f1,f2,plottype,t) # upload to C2 if (upload_to_c2): From fc321ad72f0b0d14ac085d92958641e5bb7b66a9 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 12:28:52 +0200 Subject: [PATCH 02/12] adding other plot views --- rowers/uploads.py | 9 +- rowers/views.py | 210 +++------------------------------------------- 2 files changed, 16 insertions(+), 203 deletions(-) diff --git a/rowers/uploads.py b/rowers/uploads.py index 7cc20942..6261c34a 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -18,8 +18,9 @@ from rowers.utils import ( ) -def make_plot(r,w,f1,f2,plottype,title): - imagename = f1[:-4]+'.png' +def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): + if imagename == '': + imagename = f1[:-4]+'.png' fullpathimagename = 'static/plots/'+imagename powerperc = 100*np.array([r.pw_ut2, @@ -50,7 +51,9 @@ def make_plot(r,w,f1,f2,plottype,title): 'pieplot':3, } - plotnr = plotnrs[plottype] + if plotnr == 0: + plotnr = plotnrs[plottype] + if w.workouttype in ('water','coastal'): plotnr = plotnr+3 diff --git a/rowers/views.py b/rowers/views.py index e1cc280d..07314d08 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6589,12 +6589,6 @@ def workout_edit_view_navionics(request,id=0,message="",successmessage=""): rowdata.df[' longitude'], row.name) - #res = googlemap_chart(rowdata.df[' latitude'], - # rowdata.df[' longitude'], - # row.name) - #gmscript = res[0] - #gmdiv = res[1] - else: mapscript = "" mapdiv = "" @@ -6643,50 +6637,12 @@ def workout_add_otw_powerplot_view(request,id): f1 = w.csvfilename[6:-4] timestr = strftime("%Y%m%d-%H%M%S") imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'timeplot',title,plotnr=9,imagename=imagename) - ftp = r.ftp - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 9 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - -# i = GraphImage(workout=w,creationdatetime=datetime.datetime.now(), -# filename=fullpathimagename) - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() - url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) @@ -6707,46 +6663,8 @@ def workout_add_piechart_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 3 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - -# i = GraphImage(workout=w,creationdatetime=datetime.datetime.now(), -# filename=fullpathimagename) - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'pieplot',title,plotnr=3,imagename=imagename) url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) @@ -6768,44 +6686,8 @@ def workout_add_power_piechart_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 13 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'pieplot',title,plotnr=13,imagename=imagename) url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) @@ -6827,45 +6709,8 @@ def workout_add_timeplot_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 1 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) -# i = GraphImage(workout=w,creationdatetime=datetime.datetime.now(), -# filename=fullpathimagename) - i.save() + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'timeplot',title,plotnr=1,imagename=imagename) url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) @@ -6887,43 +6732,8 @@ def workout_add_distanceplot_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 2 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=2,imagename=imagename) url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) From 00acc232598c46219ebd0a2e93976ddac44f7809 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 13:14:56 +0200 Subject: [PATCH 03/12] added generic static chart routine --- rowers/urls.py | 23 +++++++---- rowers/views.py | 104 +++++++++++++----------------------------------- 2 files changed, 44 insertions(+), 83 deletions(-) diff --git a/rowers/urls.py b/rowers/urls.py index 3f1ed3c6..7142d49f 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -215,13 +215,22 @@ urlpatterns = [ url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'), url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'), url(r'^workout/(?P\d+)/$',views.workout_view), - url(r'^workout/(?P\d+)/addtimeplot$',views.workout_add_timeplot_view), - url(r'^workout/(?P\d+)/addpiechart$',views.workout_add_piechart_view), - url(r'^workout/(?P\d+)/addpowerpiechart$',views.workout_add_power_piechart_view), - url(r'^workout/(?P\d+)/adddistanceplot$',views.workout_add_distanceplot_view), - url(r'^workout/(?P\d+)/adddistanceplot2$',views.workout_add_distanceplot2_view), - url(r'^workout/(?P\d+)/addotwpowerplot$',views.workout_add_otw_powerplot_view), - url(r'^workout/(?P\d+)/addtimeplot2$',views.workout_add_timeplot2_view), + url(r'^workout/(?P\d+)/addtimeplot$',views.workout_add_chart_view, + {'plotnr':'1'}), + url(r'^workout/(?P\d+)/addpiechart$',views.workout_add_chart_view, + {'plotnr':'3'}), + url(r'^workout/(?P\d+)/addpowerpiechart$',views.workout_add_chart_view, + {'plotnr':'13'}), + url(r'^workout/(?P\d+)/adddistanceplot$',views.workout_add_chart_view, + {'plotnr':'2'}), + url(r'^workout/(?P\d+)/adddistanceplot2$',views.workout_add_chart_view, + {'plotnr':'7'}), + url(r'^workout/(?P\d+)/addotwpowerplot$',views.workout_add_chart_view, + {'plotnr':'9'}), + url(r'^workout/(?P\d+)/addtimeplot2$',views.workout_add_chart_view, + {'plotnr':'8'}), + 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.workout_delete_view), url(r'^workout/(?P\d+)/smoothenpace$',views.workout_smoothenpace_view), url(r'^workout/(?P\d+)/undosmoothenpace$',views.workout_undo_smoothenpace_view), diff --git a/rowers/views.py b/rowers/views.py index 07314d08..d2e91f6e 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6621,7 +6621,31 @@ def workout_edit_view_navionics(request,id=0,message="",successmessage=""): return HttpResponseRedirect(url) +# Generic chart creation +@user_passes_test(ispromember,login_url="/",redirect_field_name=None) +def workout_add_chart_view(request,id,plotnr=1): + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + plotnr = int(plotnr) + + if (checkworkoutuser(request.user,w)==False): + raise PermissionDenied("You are not allowed add plots to this workout") + else: + f1 = w.csvfilename[6:-4] + timestr = strftime("%Y%m%d-%H%M%S") + imagename = f1+timestr+'.png' + u = w.user.user + r = getrower(u) + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'timeplot',title,plotnr=plotnr, + imagename=imagename) + + + url = "/rowers/workout/"+str(w.id)+"/edit" + return HttpResponseRedirect(url) # Create the chart image with wind corrected pace (OTW) @user_passes_test(ispromember,login_url="/",redirect_field_name=None) @@ -6755,45 +6779,9 @@ def workout_add_distanceplot2_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 7 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=7,imagename=imagename) - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - - i.save() - url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) @@ -6815,44 +6803,8 @@ def workout_add_timeplot2_view(request,id): fullpathimagename = 'static/plots/'+imagename u = w.user.user r = getrower(u) - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnr = 8 - - if w.workouttype in ('water','coastal'): - plotnr = plotnr+3 - - if settings.DEBUG: - res = handle_makeplot.delay(f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - else: - res = queue.enqueue(handle_makeplot,f1,w.csvfilename, - w.name,hrpwrdata,plotnr,imagename) - - i = GraphImage(workout=w,creationdatetime=timezone.now(), - filename=fullpathimagename) - - i.save() + title = w.name + res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=8,imagename=imagename) url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) From 79b8d7b5e06931b1a842400a4b27010ebd7ef17c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 13:21:13 +0200 Subject: [PATCH 04/12] static charts moved to uploads.py --- rowers/urls.py | 32 ++++++---- rowers/views.py | 161 ------------------------------------------------ 2 files changed, 21 insertions(+), 172 deletions(-) diff --git a/rowers/urls.py b/rowers/urls.py index 7142d49f..3eae317d 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -215,21 +215,31 @@ urlpatterns = [ url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'), url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'), url(r'^workout/(?P\d+)/$',views.workout_view), - url(r'^workout/(?P\d+)/addtimeplot$',views.workout_add_chart_view, + # keeping the old URLs for retrofit + url(r'^workout/(?P\d+)/addtimeplot$', + views.workout_add_chart_view, {'plotnr':'1'}), - url(r'^workout/(?P\d+)/addpiechart$',views.workout_add_chart_view, - {'plotnr':'3'}), - url(r'^workout/(?P\d+)/addpowerpiechart$',views.workout_add_chart_view, - {'plotnr':'13'}), - url(r'^workout/(?P\d+)/adddistanceplot$',views.workout_add_chart_view, + url(r'^workout/(?P\d+)/adddistanceplot$', + views.workout_add_chart_view, {'plotnr':'2'}), - url(r'^workout/(?P\d+)/adddistanceplot2$',views.workout_add_chart_view, + url(r'^workout/(?P\d+)/addpiechart$', + views.workout_add_chart_view, + {'plotnr':'3'}), + url(r'^workout/(?P\d+)/adddistanceplot2$', + views.workout_add_chart_view, {'plotnr':'7'}), - url(r'^workout/(?P\d+)/addotwpowerplot$',views.workout_add_chart_view, - {'plotnr':'9'}), - url(r'^workout/(?P\d+)/addtimeplot2$',views.workout_add_chart_view, + url(r'^workout/(?P\d+)/addtimeplot2$', + views.workout_add_chart_view, {'plotnr':'8'}), - url(r'^workout/(?P\d+)/addstatic/(?P\d+)$',views.workout_add_chart_view), + url(r'^workout/(?P\d+)/addotwpowerplot$', + views.workout_add_chart_view, + {'plotnr':'9'}), + url(r'^workout/(?P\d+)/addpowerpiechart$', + views.workout_add_chart_view, + {'plotnr':'13'}), + # addstatic is the new URL -> need to update in templates + 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.workout_delete_view), url(r'^workout/(?P\d+)/smoothenpace$',views.workout_smoothenpace_view), diff --git a/rowers/views.py b/rowers/views.py index d2e91f6e..9f2dbd82 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6647,167 +6647,6 @@ def workout_add_chart_view(request,id,plotnr=1): url = "/rowers/workout/"+str(w.id)+"/edit" return HttpResponseRedirect(url) -# Create the chart image with wind corrected pace (OTW) -@user_passes_test(ispromember,login_url="/",redirect_field_name=None) -def workout_add_otw_powerplot_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'timeplot',title,plotnr=9,imagename=imagename) - - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - -# Create the Heart rate zone pie chart -@login_required() -def workout_add_piechart_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'pieplot',title,plotnr=3,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - -# Create the Power zone pie chart -@login_required() -def workout_add_power_piechart_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'pieplot',title,plotnr=13,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - -# Create the time based summary chart -@login_required() -def workout_add_timeplot_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'timeplot',title,plotnr=1,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - -# Create the distance based summary chart -@login_required() -def workout_add_distanceplot_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=2,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - -# Create the advanced parameters distance overview chart -@user_passes_test(ispromember,login_url="/",redirect_field_name=None) -def workout_add_distanceplot2_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=7,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) - - -# Create the advanced parameters time based overview chart -@user_passes_test(ispromember,login_url="/",redirect_field_name=None) -def workout_add_timeplot2_view(request,id): - try: - w = Workout.objects.get(id=id) - except Workout.DoesNotExist: - raise Http404("Workout doesn't exist") - - if (checkworkoutuser(request.user,w)==False): - raise PermissionDenied("You are not allowed add plots to this workout") - else: - f1 = w.csvfilename[6:-4] - timestr = strftime("%Y%m%d-%H%M%S") - imagename = f1+timestr+'.png' - fullpathimagename = 'static/plots/'+imagename - u = w.user.user - r = getrower(u) - title = w.name - res = uploads.make_plot(r,w,f1,w.csvfilename,'distanceplot',title,plotnr=8,imagename=imagename) - - url = "/rowers/workout/"+str(w.id)+"/edit" - return HttpResponseRedirect(url) # The page where you select which Strava workout to import @login_required() From 73178a9cd43ba390a11f3af201ab49d2a8ce94ec Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 13:26:42 +0200 Subject: [PATCH 05/12] using uploads.make_plot in team_upload --- rowers/views.py | 53 +++---------------------------------------------- 1 file changed, 3 insertions(+), 50 deletions(-) diff --git a/rowers/views.py b/rowers/views.py index 9f2dbd82..d25412f1 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -7581,56 +7581,9 @@ def team_workout_upload_view(request,message="", response = HttpResponseRedirect(url) w = Workout.objects.get(id=id) - if (make_plot): - imagename = f1[:-4]+'.png' - fullpathimagename = 'static/plots/'+imagename - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - ftp = float(r.ftp) - if w.workouttype in ('water','coastal'): - ftp = ftp*(100.-r.otwslack)/100. - - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - 'ftp':ftp, - 'powerperc':serialize_list(powerperc), - 'powerzones':serialize_list(r.powerzones), - } - - # make plot - asynchronous task - plotnrs = { - 'timeplot':1, - 'distanceplot':2, - 'pieplot':3, - } - - plotnr = plotnrs[plottype] - if workouttype in ('water','coastal'): - plotnr = plotnr+3 - - - if settings.DEBUG: - res = handle_makeplot.delay(f1,f2,t, - hrpwrdata,plotnr, - imagename) - else: - res = queue.enqueue(handle_makeplot,f1,f2, - t,hrpwrdata, - plotnr,imagename) - - - i = GraphImage(workout=w, - creationdatetime=timezone.now(), - filename=fullpathimagename) - i.save() + r = getrower(request.user) + if (make_plot): + id = uploads.make_plot(r,w,f1,f2,plottype,t) From cffb75ff9f494e0b693184c9fe197e19ac4c9e64 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 16:24:57 +0200 Subject: [PATCH 06/12] first attempts parsing yaml from messg body --- rowers/management/commands/processemail.py | 3 ++ rowers/uploads.py | 39 ++++++++++++++++++++++ temp.txt | 4 +++ 3 files changed, 46 insertions(+) create mode 100644 temp.txt diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 6c0d9c00..0533da49 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -30,6 +30,7 @@ from rowingdata import summarydata,get_file_type from scipy.signal import savgol_filter from rowers.mailprocessing import make_new_workout_from_email,send_confirm +import rowers.uploads as uploads def rdata(file,rower=rrower()): try: @@ -50,6 +51,8 @@ class Command(BaseCommand): extension = a.document.name[-3:].lower() donotdelete = 0 m = Message.objects.get(id=a.message_id) + body = m.text + uploadoptions = uploads.upload_options(body) from_address = m.from_address[0].lower() name = m.subject cntr += 1 diff --git a/rowers/uploads.py b/rowers/uploads.py index 6261c34a..51406ff6 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -11,12 +11,51 @@ from rowers.tasks import ( from rowers.models import GraphImage import numpy as np +import yaml +import argparse +import yamllint +from subprocess import call + +try: + from cStringIO import StringIO +except: + from StringIO import StringIO from rowers.utils import ( geo_distance,serialize_list,deserialize_list,uniqify, str2bool,range_to_color_hex,absolute ) +#Configuration for argument parsing +parser = argparse.ArgumentParser() +parser.add_argument("path", help='File/Directory path to be examined', type=str) +args = (parser.parse_args()) + +#The main loop + +#Verify file is in YAML, if so save as dict then end +#ignore = set([]) +#with open(args.path, "r") as f: +# try: +# yml = (yaml.load(f)) +# print yml +# #If not yaml run through yamllint +# except yaml.YAMLError as exc: +# call(["yamllint","-f","parsable",args.path]) + +def upload_options(body): + uploadoptions = {} + # ok, a temp solution - write to temp file + with open('temp.txt','w') as f: + f.write(body) + with open('temp.txt','r') as f: + try: + yml = (yaml.load(f)) + print yml + except yaml.YAMLError as exc: + call(["yamllint","-f","parsable",'temp.txt']) + + return uploadoptions def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): if imagename == '': diff --git a/temp.txt b/temp.txt new file mode 100644 index 00000000..6a80554b --- /dev/null +++ b/temp.txt @@ -0,0 +1,4 @@ +--- +aap: noot +mies: jet +... \ No newline at end of file From 72539ad3917482fbc61b899359ca9d864ffcb710 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 25 Sep 2017 21:07:57 +0200 Subject: [PATCH 07/12] removing some parsing that wasnt used --- rowers/uploads.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/rowers/uploads.py b/rowers/uploads.py index 51406ff6..0776a3ba 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -26,23 +26,6 @@ from rowers.utils import ( str2bool,range_to_color_hex,absolute ) -#Configuration for argument parsing -parser = argparse.ArgumentParser() -parser.add_argument("path", help='File/Directory path to be examined', type=str) -args = (parser.parse_args()) - -#The main loop - -#Verify file is in YAML, if so save as dict then end -#ignore = set([]) -#with open(args.path, "r") as f: -# try: -# yml = (yaml.load(f)) -# print yml -# #If not yaml run through yamllint -# except yaml.YAMLError as exc: -# call(["yamllint","-f","parsable",args.path]) - def upload_options(body): uploadoptions = {} # ok, a temp solution - write to temp file From 4ec43770db073320cdd2b77d0368945127d2a5ac Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Sep 2017 12:08:38 +0200 Subject: [PATCH 08/12] basic processing of upload options from email --- rowers/uploads.py | 82 +++++++++++++++++++++++++++++++++++++++++------ temp.txt | 1 + 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/rowers/uploads.py b/rowers/uploads.py index 0776a3ba..90f66483 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -15,6 +15,7 @@ import yaml import argparse import yamllint from subprocess import call +import re try: from cStringIO import StringIO @@ -26,17 +27,80 @@ from rowers.utils import ( str2bool,range_to_color_hex,absolute ) +def cleanbody(body): + p = re.compile('.*---\n([\s\S]*)...') + m = p.match(body) + if m != None: + body = m.group(1) + + return body + +def getsyncoptions(uploadoptions,values): + try: + value = values.lower() + values = [values] + except AttributeError: + pass + + for v in values: + try: + v = v.lower() + + if v in ['c2','concept2','logbook']: + uploadoptions['upload_to_C2'] = True + if v in ['tp','trainingpeaks']: + uploadoptions['upload_totp'] = True + if v in ['strava']: + uploadoptions['upload_to_Strava'] = True + if v in ['st','sporttracks']: + uploadoptions['upload_to_SportTracks'] = True + if v in ['rk','runkeeper']: + uploadoptions['upload_to_RunKeeper'] = True + if v in ['ua','underarmour','mapmyfitness']: + uploadoptions['upload_to_MapMyFitness'] = True + except AttributeError: + pass + + return uploadoptions + +def getplotoptions(uploadoptions,value): + try: + v = value.lower() + if v in ['pieplot','timeplot','distanceplot']: + uploadoptions['make_plot'] = True + uploadoptions['plottype'] = v + elif 'pie' in v: + uploadoptions['make_plot'] = True + uploadoptions['plottype'] = 'pieplot' + elif 'distance' in v: + uploadoptions['make_plot'] = True + uploadoptions['plottype'] = 'distanceplot' + elif 'time' in v: + uploadoptions['make_plot'] = True + uploadoptions['plottype'] = 'timeplot' + except TypeError: + pass + + return uploadoptions + def upload_options(body): uploadoptions = {} - # ok, a temp solution - write to temp file - with open('temp.txt','w') as f: - f.write(body) - with open('temp.txt','r') as f: - try: - yml = (yaml.load(f)) - print yml - except yaml.YAMLError as exc: - call(["yamllint","-f","parsable",'temp.txt']) + body = cleanbody(body) + try: + yml = (yaml.load(body)) + for key, value in yml.iteritems(): + if key == 'sync' or key == 'synchronization': + uploadoptions = getsyncoptions(uploadoptions,value) + if key == 'chart' or key == 'static' or key == 'plot': + uploadoptions = getplotoptions(uploadoptions,value) + except yaml.YAMLError as exc: + pm = exc.problem_mark + strpm = str(pm) + pbm = "Your email has an issue on line {} at position {}. The error is: ".format( + pm.line+1, + pm.column+1, + )+strpm + return {'error':pbm} return uploadoptions diff --git a/temp.txt b/temp.txt index 6a80554b..5fdc2a13 100644 --- a/temp.txt +++ b/temp.txt @@ -1,4 +1,5 @@ --- aap: noot mies: jet +jet ... \ No newline at end of file From d56a8bb74d9874855e4d0251f9cb67d1660b127e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Sep 2017 12:57:00 +0200 Subject: [PATCH 09/12] implemented make_plot --- rowers/mailprocessing.py | 4 +++- rowers/management/commands/processemail.py | 25 +++++++++++++++++---- rowers/uploads.py | 26 +++++++++++++++++----- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py index f40cebe5..563705f3 100644 --- a/rowers/mailprocessing.py +++ b/rowers/mailprocessing.py @@ -30,13 +30,15 @@ queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('default') # Sends a confirmation with a link to the workout -def send_confirm(u,name,link): +def send_confirm(u,name,link,options): fullemail = u.email subject = 'Workout added: '+name message = 'Dear '+u.first_name+',\n\n' message += "Your workout has been added to Rowsandall.com.\n" message += "Link to workout: "+link+"\n\n" message += "Best Regards, the Rowsandall Team" + if options: + message += "\n\n"+options email = EmailMessage(subject,message, 'Rowsandall ', diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 0533da49..31c88be4 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -72,15 +72,24 @@ class Command(BaseCommand): ] res += wid link = 'http://rowsandall.com/rowers/workout/'+str(wid[0])+'/edit' + if uploadoptions and not 'error' in uploadoptions: + w = Workout.objects.get(wid[0]) + r = w.user + if 'make_plot' in uploadoptions: + plottype = uploadoptions['plottype'] + res = uploads.make_plot(r,w,plottype, + title,f2[6:],f2) try: if wid != 1: - dd = send_confirm(rr.user,title,link) + dd = send_confirm(rr.user,title,link, + uploadoptions) time.sleep(10) except: try: time.sleep(10) if wid != 1: - dd = send_confirm(rr.user,title,link) + dd = send_confirm(rr.user,title,link, + uploadoptions) except: pass @@ -94,7 +103,14 @@ class Command(BaseCommand): ] res += wid link = 'http://rowsandall.com/rowers/workout/'+str(wid[0])+'/edit' - + if uploadoptions: + w = Workout.objects.get(wid[0]) + r = w.user + if 'make_plot' in uploadoptions: + plottype = uploadoptions['plottype'] + res = uploads.make_plot(r,w,plottype, + title,f2[6:],f2) + except: # replace with code to process error res += ['fail: '+name] @@ -102,7 +118,8 @@ class Command(BaseCommand): wid = 1 try: if wid != 1: - dd = send_confirm(rr.user,name,link) + dd = send_confirm(rr.user,name,link, + uploadoptions) time.sleep(10) except: pass diff --git a/rowers/uploads.py b/rowers/uploads.py index 90f66483..245acfe5 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -83,16 +83,32 @@ def getplotoptions(uploadoptions,value): return uploadoptions +def getboolean(uploadoptions,value,key): + b = True + if not value: + b = False + if value in [False,'false','False',None,'no']: + b = False + + uploadoptions[key] = b + + return uploadoptions + def upload_options(body): uploadoptions = {} body = cleanbody(body) try: yml = (yaml.load(body)) - for key, value in yml.iteritems(): - if key == 'sync' or key == 'synchronization': - uploadoptions = getsyncoptions(uploadoptions,value) - if key == 'chart' or key == 'static' or key == 'plot': - uploadoptions = getplotoptions(uploadoptions,value) + try: + for key, value in yml.iteritems(): + if key == 'sync' or key == 'synchronization': + uploadoptions = getsyncoptions(uploadoptions,value) + if key == 'chart' or key == 'static' or key == 'plot': + uploadoptions = getplotoptions(uploadoptions,value) + if 'priva' in key: + uploadoptions = getboolean(uploadoptions,value,'makeprivate') + except AttributeError: + pass except yaml.YAMLError as exc: pm = exc.problem_mark strpm = str(pm) From 2a4d0100d294615c5cc6f8177048f9674830087c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Sep 2017 13:57:11 +0200 Subject: [PATCH 10/12] added sync options --- rowers/management/commands/processemail.py | 13 +++-- rowers/uploads.py | 61 ++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 31c88be4..31d338b9 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -75,10 +75,12 @@ class Command(BaseCommand): if uploadoptions and not 'error' in uploadoptions: w = Workout.objects.get(wid[0]) r = w.user + uploads.do_sync(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] - res = uploads.make_plot(r,w,plottype, - title,f2[6:],f2) + res = uploads.make_plot(r,w,f2[6:], + w.csvfilename, + plottype,title) try: if wid != 1: dd = send_confirm(rr.user,title,link, @@ -106,10 +108,13 @@ class Command(BaseCommand): if uploadoptions: w = Workout.objects.get(wid[0]) r = w.user + uploads.do_sync(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] - res = uploads.make_plot(r,w,plottype, - title,f2[6:],f2) + res = uploads.make_plot(r,w,a.document, + w.csvfilename, + plottype,name) + except: # replace with code to process error diff --git a/rowers/uploads.py b/rowers/uploads.py index 245acfe5..ae4dbf61 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -176,3 +176,64 @@ def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): i.save() return i.id + +import c2stuff,stravastuff,sporttracksstuff,runkeeperstuff +import underarmourstuff,tpstuff + +def do_sync(w,options): + if 'upload_to_C2' in options and options['upload_to_C2']: + try: + message,id = c2stuff.workout_c2_upload(w.user.user,w) + except C2NoTokenError: + id = 0 + message = "Something went wrong with the Concept2 sync" + + if 'upload_to_Strava' in options and options['upload_to_Strava']: + try: + message,id = stravastuff.workout_strava_upload( + w.user.user,w + ) + except StravaNoTokenError: + id = 0 + message = "Please connect to Strava first" + + + if 'upload_to_SportTracks' in options and options['upload_to_SportTracks']: + try: + message,id = sporttracksstuff.workout_sporttracks_upload( + w.user.user,w + ) + except SportTracksNoTokenError: + message = "Please connect to SportTracks first" + id = 0 + + + if 'upload_to_RunKeeper' in options and options['upload_to_RunKeeper']: + try: + message,id = runkeeperstuff.workout_runkeeper_upload( + w.user.user,w + ) + except RunKeeperNoTokenError: + message = "Please connect to Runkeeper first" + id = 0 + + if 'upload_to_MapMyFitness' in options and options['upload_to_MapMyFitness']: + try: + message,id = underarmourstuff.workout_ua_upload( + w.user.user,w + ) + except UnderArmourNoTokenError: + message = "Please connect to MapMyFitness first" + id = 0 + + + if 'upload_to_TrainingPeaks' in options and options['upload_to_TrainingPeaks']: + try: + message,id = tpstuff.workout_tp_upload( + w.user.user,w + ) + except TPNoTokenError: + message = "Please connect to TrainingPeaks first" + id = 0 + + return 1 From 44d9e0648db267b001ec71ebaebb6b7e9df346a1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Sep 2017 14:01:15 +0200 Subject: [PATCH 11/12] added makeprivate to email processing --- rowers/management/commands/processemail.py | 2 ++ rowers/uploads.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 31d338b9..98b57dae 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -76,6 +76,7 @@ class Command(BaseCommand): w = Workout.objects.get(wid[0]) r = w.user uploads.do_sync(w,uploadoptions) + uploads.make_private(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] res = uploads.make_plot(r,w,f2[6:], @@ -109,6 +110,7 @@ class Command(BaseCommand): w = Workout.objects.get(wid[0]) r = w.user uploads.do_sync(w,uploadoptions) + uploads.make_private(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] res = uploads.make_plot(r,w,a.document, diff --git a/rowers/uploads.py b/rowers/uploads.py index ae4dbf61..c6429e64 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -180,6 +180,13 @@ def make_plot(r,w,f1,f2,plottype,title,imagename='',plotnr=0): import c2stuff,stravastuff,sporttracksstuff,runkeeperstuff import underarmourstuff,tpstuff +def make_private(w,options): + if 'makeprivate' in options and options['makeprivate']: + w.privacy = 'hidden' + w.save() + + return 1 + def do_sync(w,options): if 'upload_to_C2' in options and options['upload_to_C2']: try: From 9e0b38c5a286caff4a8ce3bc07aaa3d0f89d1fb3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Sep 2017 19:34:00 +0200 Subject: [PATCH 12/12] email processing working on develop --- rowers/mailprocessing.py | 4 ++- rowers/management/commands/processemail.py | 30 ++++++++++++++-------- rowers/uploads.py | 23 +++++++++-------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py index 563705f3..4eb8212f 100644 --- a/rowers/mailprocessing.py +++ b/rowers/mailprocessing.py @@ -37,8 +37,10 @@ def send_confirm(u,name,link,options): message += "Your workout has been added to Rowsandall.com.\n" message += "Link to workout: "+link+"\n\n" message += "Best Regards, the Rowsandall Team" + if options: - message += "\n\n"+options + message += "\n\n"+str(options) + email = EmailMessage(subject,message, 'Rowsandall ', diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 98b57dae..c15262d1 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -13,6 +13,7 @@ from django.core.management.base import BaseCommand, CommandError from django.conf import settings #from rowers.mailprocessing import processattachments import time +from time import strftime from django.conf import settings from rowers.tasks import handle_sendemail_unrecognized from django_mailbox.models import Mailbox,Message,MessageAttachment @@ -51,7 +52,7 @@ class Command(BaseCommand): extension = a.document.name[-3:].lower() donotdelete = 0 m = Message.objects.get(id=a.message_id) - body = m.text + body = "\n".join(m.text.splitlines()) uploadoptions = uploads.upload_options(body) from_address = m.from_address[0].lower() name = m.subject @@ -73,15 +74,19 @@ class Command(BaseCommand): res += wid link = 'http://rowsandall.com/rowers/workout/'+str(wid[0])+'/edit' if uploadoptions and not 'error' in uploadoptions: - w = Workout.objects.get(wid[0]) + w = Workout.objects.get(id=wid[0]) r = w.user uploads.do_sync(w,uploadoptions) uploads.make_private(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] - res = uploads.make_plot(r,w,f2[6:], - w.csvfilename, - plottype,title) + f1 = w.csvfilename[6:-4] + timestr = strftime("%Y%m%d-%H%M%S") + imagename = f1+timestr+'.png' + resu = uploads.make_plot(r,w,f1, + w.csvfilename, + plottype,name, + imagename=imagename) try: if wid != 1: dd = send_confirm(rr.user,title,link, @@ -107,16 +112,19 @@ class Command(BaseCommand): res += wid link = 'http://rowsandall.com/rowers/workout/'+str(wid[0])+'/edit' if uploadoptions: - w = Workout.objects.get(wid[0]) + w = Workout.objects.get(id=wid[0]) r = w.user uploads.do_sync(w,uploadoptions) uploads.make_private(w,uploadoptions) if 'make_plot' in uploadoptions: plottype = uploadoptions['plottype'] - res = uploads.make_plot(r,w,a.document, - w.csvfilename, - plottype,name) - + f1 = w.csvfilename[6:-4] + timestr = strftime("%Y%m%d-%H%M%S") + imagename = f1+timestr+'.png' + resu = uploads.make_plot(r,w,f1, + w.csvfilename, + plottype,name, + imagename=imagename) except: # replace with code to process error @@ -131,7 +139,7 @@ class Command(BaseCommand): except: pass - # remove attachment + # remove attachment if donotdelete == 0: a.delete() diff --git a/rowers/uploads.py b/rowers/uploads.py index c6429e64..7c29bf2f 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -28,10 +28,13 @@ from rowers.utils import ( ) def cleanbody(body): - p = re.compile('.*---\n([\s\S]*)...') - m = p.match(body) - if m != None: - body = m.group(1) + regex = r".*---\n([\s\S]*?)\.\.\..*" + matches = re.finditer(regex,body) + + for m in matches: + + if m != None: + body = m.group(0) return body @@ -191,7 +194,7 @@ def do_sync(w,options): if 'upload_to_C2' in options and options['upload_to_C2']: try: message,id = c2stuff.workout_c2_upload(w.user.user,w) - except C2NoTokenError: + except c2stuff.C2NoTokenError: id = 0 message = "Something went wrong with the Concept2 sync" @@ -200,7 +203,7 @@ def do_sync(w,options): message,id = stravastuff.workout_strava_upload( w.user.user,w ) - except StravaNoTokenError: + except stravastuff.StravaNoTokenError: id = 0 message = "Please connect to Strava first" @@ -210,7 +213,7 @@ def do_sync(w,options): message,id = sporttracksstuff.workout_sporttracks_upload( w.user.user,w ) - except SportTracksNoTokenError: + except sporttracksstuff.SportTracksNoTokenError: message = "Please connect to SportTracks first" id = 0 @@ -220,7 +223,7 @@ def do_sync(w,options): message,id = runkeeperstuff.workout_runkeeper_upload( w.user.user,w ) - except RunKeeperNoTokenError: + except runkeeperstuff.RunKeeperNoTokenError: message = "Please connect to Runkeeper first" id = 0 @@ -229,7 +232,7 @@ def do_sync(w,options): message,id = underarmourstuff.workout_ua_upload( w.user.user,w ) - except UnderArmourNoTokenError: + except underarmourstuff.UnderArmourNoTokenError: message = "Please connect to MapMyFitness first" id = 0 @@ -239,7 +242,7 @@ def do_sync(w,options): message,id = tpstuff.workout_tp_upload( w.user.user,w ) - except TPNoTokenError: + except tpstuff.TPNoTokenError: message = "Please connect to TrainingPeaks first" id = 0