From 9101a5aca53c71a30d0fb5390c75f2e62804913b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 20 Oct 2017 20:28:03 +0200 Subject: [PATCH 1/5] added links to workflow page --- rowers/interactiveplots.py | 11 +++++++- rowers/templates/advancededit.html | 7 ++++- rowers/templates/advancedotw.html | 7 ++++- rowers/templates/flexchart3otw.html | 7 ++++- rowers/templates/map_view.html | 8 +++++- rowers/templates/otwsetpower.html | 10 +++++-- rowers/templates/panel_map.html | 9 ++++++ rowers/templates/panel_mapview.html | 5 ++++ rowers/templates/streamedit.html | 5 +++- rowers/templates/summary_edit.html | 2 +- rowers/templates/windedit.html | 5 +++- rowers/templates/workout_form.html | 7 ++++- rowers/templates/workoutstats.html | 2 +- rowers/utils.py | 4 ++- rowers/views.py | 44 +++++++++++++++++++++++++++-- 15 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 rowers/templates/panel_map.html create mode 100644 rowers/templates/panel_mapview.html diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 242e6a53..12c0a1ec 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2510,7 +2510,16 @@ def thumbnails_set(r,id,favorites): columns += [f.yparam2 for f in favorites] columns += ['time'] - rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True) + try: + rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True) + except: + return [ + {'script':"", + 'div':"", + 'notes':"" + }] + + rowdata.dropna(axis=1,how='all',inplace=True) if rowdata.empty: diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html index a79ebad3..0df1fff3 100644 --- a/rowers/templates/advancededit.html +++ b/rowers/templates/advancededit.html @@ -24,7 +24,12 @@ Edit Workout

-
+
+

+ Workflow View +

+
+

Export

diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html index 7bd5340b..3c4999fc 100644 --- a/rowers/templates/advancedotw.html +++ b/rowers/templates/advancedotw.html @@ -23,7 +23,12 @@ Edit Workout

-
+
+

+ Workflow View +

+
+

Export

diff --git a/rowers/templates/flexchart3otw.html b/rowers/templates/flexchart3otw.html index 5da6e48c..02e698d3 100644 --- a/rowers/templates/flexchart3otw.html +++ b/rowers/templates/flexchart3otw.html @@ -32,7 +32,12 @@ Edit Workout

-
+
+

+ Workflow View +

+
+

Advanced Edit

diff --git a/rowers/templates/map_view.html b/rowers/templates/map_view.html index e48ec411..cde62d7f 100644 --- a/rowers/templates/map_view.html +++ b/rowers/templates/map_view.html @@ -43,7 +43,13 @@ Edit Workout

-
+
+

+ Workflow View +

+ +
+

Advanced Edit

diff --git a/rowers/templates/otwsetpower.html b/rowers/templates/otwsetpower.html index 30ad309d..51218c6a 100644 --- a/rowers/templates/otwsetpower.html +++ b/rowers/templates/otwsetpower.html @@ -14,7 +14,13 @@ Edit Workout

-
+
+

+ Workflow View +

+ +
+

Advanced Edit

@@ -62,4 +68,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/rowers/templates/panel_map.html b/rowers/templates/panel_map.html new file mode 100644 index 00000000..9fd40d8a --- /dev/null +++ b/rowers/templates/panel_map.html @@ -0,0 +1,9 @@ +
+ {{ mapdiv|safe }} + + + {{ mapscript|safe }} +
+ + + diff --git a/rowers/templates/panel_mapview.html b/rowers/templates/panel_mapview.html new file mode 100644 index 00000000..0d819ffa --- /dev/null +++ b/rowers/templates/panel_mapview.html @@ -0,0 +1,5 @@ +
+

+ Map View +

+
diff --git a/rowers/templates/streamedit.html b/rowers/templates/streamedit.html index 1e4ba1a0..b12def3c 100644 --- a/rowers/templates/streamedit.html +++ b/rowers/templates/streamedit.html @@ -29,7 +29,10 @@
- diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 8c3cf177..2d49567a 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -23,7 +23,7 @@
diff --git a/rowers/templates/windedit.html b/rowers/templates/windedit.html index d49dd272..e0eb56bb 100644 --- a/rowers/templates/windedit.html +++ b/rowers/templates/windedit.html @@ -28,7 +28,10 @@
- diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html index 37cd8956..26edc221 100644 --- a/rowers/templates/workout_form.html +++ b/rowers/templates/workout_form.html @@ -44,7 +44,12 @@
-
+
+

+ Workflow View +

+
+

Map View

diff --git a/rowers/templates/workoutstats.html b/rowers/templates/workoutstats.html index 75dc0f8c..3a02f214 100644 --- a/rowers/templates/workoutstats.html +++ b/rowers/templates/workoutstats.html @@ -18,7 +18,7 @@
diff --git a/rowers/utils.py b/rowers/utils.py index 205c74e9..89f181d2 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -9,6 +9,7 @@ workflowmiddlepanel = ( ('panel_statcharts.html','Static Charts'), ('flexthumbnails.html','Flex Charts'), ('panel_summary.html','Summary'), + ('panel_map.html','Map'), ) defaultmiddle = ['panel_statcharts.html', @@ -25,7 +26,8 @@ workflowleftpanel = ( ('panel_geekyheader.html','Geeky Header'), ('panel_editwind.html','Edit Wind Data'), ('panel_editstream.html','Edit Stream Data'), - ('panel_otwpower.html','Run OTW Power Calculations') + ('panel_otwpower.html','Run OTW Power Calculations'), + ('panel_mapview.html','Map'), ) defaultleft = [ diff --git a/rowers/views.py b/rowers/views.py index 0faed633..7cbeaaf6 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -157,6 +157,27 @@ from interactiveplots import * # Define the API documentation schema_view = get_swagger_view(title='Rowsandall API') +# Test if row data include candidates +def rowhascoordinates(row): + # create interactive plot + f1 = row.csvfilename + u = row.user.user + r = getrower(u) + rowdata = rdata(f1) + hascoordinates = 1 + if rowdata != 0: + try: + latitude = rowdata.df[' latitude'] + if not latitude.std(): + hascoordinates = 0 + except KeyError,AttributeError: + hascoordinates = 0 + + else: + hascoordinates = 0 + + return hascoordinates + # Custom error pages with Rowsandall headers def error500_view(request): response = render_to_response('500.html', {}, @@ -5231,7 +5252,11 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""): kwargs = { 'id':int(id)} - url = reverse(workout_advanced_view,kwargs=kwargs) + try: + url = request.session['referer'] + except KeyError: + url = reverse(workout_advanced_view,kwargs=kwargs) + response = HttpResponseRedirect(url) return response @@ -6006,8 +6031,21 @@ def workout_workflow_view(request,id): charts = [] - if favorites: + if favorites and 'flexthumbnails.html' in r.workflowmiddlepanel: charts = thumbnails_set(r,id,favorites) + if charts[0]['script'] == '': + charts = [] + + if 'panel_map.html' in r.workflowmiddlepanel and rowhascoordinates(row): + rowdata = rdata(row.csvfilename) + mapscript,mapdiv = leaflet_chart2(rowdata.df[' latitude'], + rowdata.df[' longitude'], + row.name) + else: + mapscript = '' + mapdiv = '' + + statcharts = GraphImage.objects.filter(workout=row) @@ -6023,6 +6061,8 @@ def workout_workflow_view(request,id): 'leftTemplates':leftTemplates, 'charts':charts, 'workout':row, + 'mapscript':mapscript, + 'mapdiv':mapdiv, 'statcharts':statcharts, }) From a0a3ef9f60bc9b1b84bc82d72a7e06b4f8ea42cc Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 20 Oct 2017 20:38:29 +0200 Subject: [PATCH 2/5] added basic info part to workflow middle panel --- rowers/templates/panel_comments.html | 31 ++++++++++++++++++++++++++++ rowers/utils.py | 1 + 2 files changed, 32 insertions(+) create mode 100644 rowers/templates/panel_comments.html diff --git a/rowers/templates/panel_comments.html b/rowers/templates/panel_comments.html new file mode 100644 index 00000000..99de3bbc --- /dev/null +++ b/rowers/templates/panel_comments.html @@ -0,0 +1,31 @@ +{% load rowerfilters %} +{% load tz %} +
+ + +{% localtime on %} + +{% endlocaltime %} + + + + + + + + + + + + + + +
Date/Time:{{ workout.startdatetime|localtime}}
Distance:{{ workout.distance }}m
Duration:{{ workout.duration |durationprint:"%H:%M:%S.%f" }}
Public link to this workout + https://rowsandall.com/rowers/workout/{{ workout.id }} +
Comments + Comment ({{ aantalcomments }}) +
Public link to interactive chart + https://rowsandall.com/rowers/workout/{{ workout.id }}/interactiveplot + +
+
diff --git a/rowers/utils.py b/rowers/utils.py index 89f181d2..8f2e62a8 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -10,6 +10,7 @@ workflowmiddlepanel = ( ('flexthumbnails.html','Flex Charts'), ('panel_summary.html','Summary'), ('panel_map.html','Map'), + ('panel_comments.html','Basic Info and Links'), ) defaultmiddle = ['panel_statcharts.html', From 157c0373fed1e2aa9c068279be723cca24fc7846 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 20 Oct 2017 21:32:37 +0200 Subject: [PATCH 3/5] implemented most of Mike's suggestions --- rowers/templates/export.html | 7 +++++- rowers/templates/panel_delete.html | 5 +++++ rowers/templates/panel_export.html | 5 +++++ rowers/templates/panel_middlesocial.html | 14 ++++++++++++ rowers/templates/panel_social.html | 14 ++++++++++++ rowers/templates/workflow.html | 1 - rowers/templatetags/do_include_maybe.py | 28 ++++++++++++++++++++++++ rowers/templatetags/include_maybe.py | 28 ++++++++++++++++++++++++ rowers/templatetags/rowerfilters.py | 1 - rowers/utils.py | 4 ++++ rowers/views.py | 20 ++++++++++++++--- 11 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 rowers/templates/panel_delete.html create mode 100644 rowers/templates/panel_export.html create mode 100644 rowers/templates/panel_middlesocial.html create mode 100644 rowers/templates/panel_social.html create mode 100644 rowers/templatetags/do_include_maybe.py create mode 100644 rowers/templatetags/include_maybe.py diff --git a/rowers/templates/export.html b/rowers/templates/export.html index 6ccd0bb6..b01ee514 100644 --- a/rowers/templates/export.html +++ b/rowers/templates/export.html @@ -15,7 +15,12 @@ Edit Workout

-
+
+

+ Workflow View +

+
+

Advanced Edit

diff --git a/rowers/templates/panel_delete.html b/rowers/templates/panel_delete.html new file mode 100644 index 00000000..1668a635 --- /dev/null +++ b/rowers/templates/panel_delete.html @@ -0,0 +1,5 @@ +
+

+ Delete +

+
diff --git a/rowers/templates/panel_export.html b/rowers/templates/panel_export.html new file mode 100644 index 00000000..543df100 --- /dev/null +++ b/rowers/templates/panel_export.html @@ -0,0 +1,5 @@ + diff --git a/rowers/templates/panel_middlesocial.html b/rowers/templates/panel_middlesocial.html new file mode 100644 index 00000000..b1c917d2 --- /dev/null +++ b/rowers/templates/panel_middlesocial.html @@ -0,0 +1,14 @@ +
+
+
+ Share +
+
+
+ +
+ + diff --git a/rowers/templates/panel_social.html b/rowers/templates/panel_social.html new file mode 100644 index 00000000..a1c993de --- /dev/null +++ b/rowers/templates/panel_social.html @@ -0,0 +1,14 @@ +
+
+ Share +
+
+
+

 

+ +
+ + diff --git a/rowers/templates/workflow.html b/rowers/templates/workflow.html index 01a0d55c..1a632bae 100644 --- a/rowers/templates/workflow.html +++ b/rowers/templates/workflow.html @@ -3,7 +3,6 @@ {% load rowerfilters %} {% load tz %} - {% get_current_timezone as TIME_ZONE %} {% block title %}{{ workout.name }}{% endblock %} diff --git a/rowers/templatetags/do_include_maybe.py b/rowers/templatetags/do_include_maybe.py new file mode 100644 index 00000000..d6c0a39e --- /dev/null +++ b/rowers/templatetags/do_include_maybe.py @@ -0,0 +1,28 @@ +from django import template +from django.template.loader_tags import do_include +from django.template.defaulttags import CommentNode +register = template.Library() + +@register.tag('do_include_maybe') +def do_include_maybe(parser, token): + "Source: http://stackoverflow.com/a/18951166/15690" + bits = token.split_contents() + if len(bits) < 2: + raise template.TemplateSyntaxError( + "%r tag takes at least one argument: " + "the name of the template to be included." % bits[0]) + + try: + silent_node = do_include(parser, token) + except template.TemplateDoesNotExist: + # Django < 1.7 + return CommentNode() + + _orig_render = silent_node.render + def wrapped_render(*args, **kwargs): + try: + return _orig_render(*args, **kwargs) + except template.TemplateDoesNotExist: + return CommentNode() + silent_node.render = wrapped_render + return silent_node diff --git a/rowers/templatetags/include_maybe.py b/rowers/templatetags/include_maybe.py new file mode 100644 index 00000000..3e3d2e9b --- /dev/null +++ b/rowers/templatetags/include_maybe.py @@ -0,0 +1,28 @@ +from django import template +from django.template.loader_tags import do_include +from django.template.defaulttags import CommentNode +register = template.Library() + +@register.tag('include_maybe') +def do_include_maybe(parser, token): + "Source: http://stackoverflow.com/a/18951166/15690" + bits = token.split_contents() + if len(bits) < 2: + raise template.TemplateSyntaxError( + "%r tag takes at least one argument: " + "the name of the template to be included." % bits[0]) + + try: + silent_node = do_include(parser, token) + except template.TemplateDoesNotExist: + # Django < 1.7 + return CommentNode() + + _orig_render = silent_node.render + def wrapped_render(*args, **kwargs): + try: + return _orig_render(*args, **kwargs) + except template.TemplateDoesNotExist: + return CommentNode() + silent_node.render = wrapped_render + return silent_node diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index 12cd75b1..123faa9e 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -118,7 +118,6 @@ def user_teams(user): return teams - @register.filter def has_teams(user): try: diff --git a/rowers/utils.py b/rowers/utils.py index 8f2e62a8..46ce0af2 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -11,6 +11,7 @@ workflowmiddlepanel = ( ('panel_summary.html','Summary'), ('panel_map.html','Map'), ('panel_comments.html','Basic Info and Links'), + ('panel_middlesocial.html','Social Media Share Buttons'), ) defaultmiddle = ['panel_statcharts.html', @@ -20,6 +21,9 @@ defaultmiddle = ['panel_statcharts.html', workflowleftpanel = ( ('panel_navigationheader.html','Navigation Header'), ('panel_editbuttons.html','Edit Workout Button'), + ('panel_delete.html','Delete Workout Button'), + ('panel_export.html','Export Workout Button'), + ('panel_social.html','Social Media Share Buttons'), ('panel_advancededit.html','Advanced Workout Edit Button'), ('panel_editintervals.html','Edit Intervals Button'), ('panel_stats.html','Workout Statistics Button'), diff --git a/rowers/views.py b/rowers/views.py index 7cbeaaf6..09238cbc 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -12,6 +12,7 @@ from PIL import Image from numbers import Number from django.views.generic.base import TemplateView from django.db.models import Q +from django import template from django.db import IntegrityError, transaction from django.shortcuts import render from django.http import ( @@ -6049,11 +6050,24 @@ def workout_workflow_view(request,id): statcharts = GraphImage.objects.filter(workout=row) - # This will be user configurable in the future - middleTemplates = r.workflowmiddlepanel - leftTemplates = r.workflowleftpanel + middleTemplates = [] + for t in r.workflowmiddlepanel: + try: + template.loader.get_template(t) + middleTemplates.append(t) + except template.TemplateDoesNotExist: + pass + leftTemplates = [] + for t in r.workflowleftpanel: + try: + template.loader.get_template(t) + leftTemplates.append(t) + except template.TemplateDoesNotExist: + pass + + return render(request, 'workflow.html', { From aa01ed6221c4e1c12a1a57f0d78ee1619d480a02 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 20 Oct 2017 21:38:22 +0200 Subject: [PATCH 4/5] added some explanation --- rowers/templates/flexthumbnails.html | 1 + rowers/templates/workflow.html | 3 --- rowers/utils.py | 6 ++++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rowers/templates/flexthumbnails.html b/rowers/templates/flexthumbnails.html index 24d88ffc..e036ad44 100644 --- a/rowers/templates/flexthumbnails.html +++ b/rowers/templates/flexthumbnails.html @@ -1,5 +1,6 @@ {% if charts %}

Flex Charts

+

Click on the thumbnails to view the full chart.

{% for chart in charts %}
{{ forloop.counter }} diff --git a/rowers/templates/workflow.html b/rowers/templates/workflow.html index 1a632bae..87bae1e9 100644 --- a/rowers/templates/workflow.html +++ b/rowers/templates/workflow.html @@ -39,9 +39,6 @@ {% include templateName %} {% endfor %} {% endblock %} -
-

Click on the thumbnails to view the full chart

-
{% block middle_panel %} diff --git a/rowers/utils.py b/rowers/utils.py index 46ce0af2..23a04080 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -14,9 +14,11 @@ workflowmiddlepanel = ( ('panel_middlesocial.html','Social Media Share Buttons'), ) -defaultmiddle = ['panel_statcharts.html', +defaultmiddle = ['panel_middlesocial.html', + 'panel_statcharts.html', 'flexthumbnails.html', - 'panel_summary.html'] + 'panel_summary.html', + 'panel_map.html'] workflowleftpanel = ( ('panel_navigationheader.html','Navigation Header'), From c1626d8252772eaa1619d18362ddcdea620762bf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 20 Oct 2017 21:39:08 +0200 Subject: [PATCH 5/5] removed 2 unused files --- rowers/templatetags/do_include_maybe.py | 28 ------------------------- rowers/templatetags/include_maybe.py | 28 ------------------------- 2 files changed, 56 deletions(-) delete mode 100644 rowers/templatetags/do_include_maybe.py delete mode 100644 rowers/templatetags/include_maybe.py diff --git a/rowers/templatetags/do_include_maybe.py b/rowers/templatetags/do_include_maybe.py deleted file mode 100644 index d6c0a39e..00000000 --- a/rowers/templatetags/do_include_maybe.py +++ /dev/null @@ -1,28 +0,0 @@ -from django import template -from django.template.loader_tags import do_include -from django.template.defaulttags import CommentNode -register = template.Library() - -@register.tag('do_include_maybe') -def do_include_maybe(parser, token): - "Source: http://stackoverflow.com/a/18951166/15690" - bits = token.split_contents() - if len(bits) < 2: - raise template.TemplateSyntaxError( - "%r tag takes at least one argument: " - "the name of the template to be included." % bits[0]) - - try: - silent_node = do_include(parser, token) - except template.TemplateDoesNotExist: - # Django < 1.7 - return CommentNode() - - _orig_render = silent_node.render - def wrapped_render(*args, **kwargs): - try: - return _orig_render(*args, **kwargs) - except template.TemplateDoesNotExist: - return CommentNode() - silent_node.render = wrapped_render - return silent_node diff --git a/rowers/templatetags/include_maybe.py b/rowers/templatetags/include_maybe.py deleted file mode 100644 index 3e3d2e9b..00000000 --- a/rowers/templatetags/include_maybe.py +++ /dev/null @@ -1,28 +0,0 @@ -from django import template -from django.template.loader_tags import do_include -from django.template.defaulttags import CommentNode -register = template.Library() - -@register.tag('include_maybe') -def do_include_maybe(parser, token): - "Source: http://stackoverflow.com/a/18951166/15690" - bits = token.split_contents() - if len(bits) < 2: - raise template.TemplateSyntaxError( - "%r tag takes at least one argument: " - "the name of the template to be included." % bits[0]) - - try: - silent_node = do_include(parser, token) - except template.TemplateDoesNotExist: - # Django < 1.7 - return CommentNode() - - _orig_render = silent_node.render - def wrapped_render(*args, **kwargs): - try: - return _orig_render(*args, **kwargs) - except template.TemplateDoesNotExist: - return CommentNode() - silent_node.render = wrapped_render - return silent_node