From d0ff742ba591823e2af2308409aca229c5b43f1f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 25 Apr 2018 08:48:07 +0200 Subject: [PATCH 1/2] improvements for basic users --- rowers/templates/advancededit.html | 20 +++++++++----------- rowers/templates/advancedotw.html | 27 ++++++++++++++------------- rowers/templates/compatibility.html | 5 ++++- rowers/templates/document_form.html | 2 +- rowers/templates/list_workouts.html | 4 ++++ 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html index e8a7e2e0..d0d4feaf 100644 --- a/rowers/templates/advancededit.html +++ b/rowers/templates/advancededit.html @@ -15,8 +15,7 @@

{{ workout.name }} - Advanced

{% if user.rower.rowerplan == 'basic' %} -

This is a preview of the page with advanced functionality for Pro users. - See +

Functionality marked with an asterisk (*) is limited to the paid plans. See the page about Pro membership for more information and to sign up for Pro Membership

{% endif %} @@ -63,7 +62,7 @@ {% if user|is_promember %} Compare Workouts {% else %} - Compare Workouts + Compare Workouts* {% endif %}

Compare this workout to other workouts. Plot HR, SPM, or pace vs time or distance for the two workouts. @@ -83,7 +82,7 @@ {% if user|is_promember %} Edit Intervals {% else %} - Edit Intervals + Edit Intervals* {% endif %}

Enter or change the interval and summary data for your workout @@ -94,13 +93,12 @@
-

{% if user|is_promember %} Dist Metrics Plot {% else %} - Dist Metrics Plot + Dist Metrics Plot* {% endif %}

@@ -112,7 +110,7 @@ {% if user|is_promember %} Time Metrics Plot {% else %} - Time Metrics Plot + Time Metrics Plot* {% endif %}

@@ -124,7 +122,7 @@ {% if user|is_promember %} Power Histogram {% else %} - Power Histogram + Power Histogram* {% endif %}

@@ -138,7 +136,7 @@ {% if user|is_promember %} Glue {% else %} - Glue + Glue* {% endif %}

@@ -151,7 +149,7 @@ {% if user|is_promember %} Sensor Fusion {% else %} - Sensor Fusion + Sensor Fusion* {% endif %}

@@ -163,7 +161,7 @@ {% if user|is_promember %} Split Workout {% else %} - Split Workout + Split Workout* {% endif %}

diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html index f22a9a44..4e8c0924 100644 --- a/rowers/templates/advancedotw.html +++ b/rowers/templates/advancedotw.html @@ -15,8 +15,9 @@

{{ workout.name }} - Advanced OTW

{% if user.rower.rowerplan == 'basic' %} -

This is a preview of the page with advanced functionality for Pro users. - See the page about Pro membership for more information and to sign up for Pro Membership +

Functionality marked with an asterisk (*) is limited to the paid plans. See + the page about Pro membership + for more information and to sign up for Pro Membership

{% endif %}

@@ -59,7 +60,7 @@ {% if user|is_promember %} Compare Workouts {% else %} - Compare Workouts + Compare Workouts* {% endif %}

@@ -81,7 +82,7 @@ {% if user|is_promember %} Edit Intervals {% else %} - Edit Intervals + Edit Intervals* {% endif %}

Enter or change the interval and summary data for your workout @@ -98,7 +99,7 @@ {% if user|is_promember %} CrewNerd Summary {% else %} - CrewNerd Summary + CrewNerd Summary* {% endif %}

@@ -112,7 +113,7 @@ {% if user|is_promember %} Stroke Profile (Empower) {% else %} - Stroke Profile (Empower) + Stroke Profile (Empower)* {% endif %}

Analyze your stroke force profile (need Empower Oarlock data)

@@ -125,7 +126,7 @@ {% if user|is_promember %} OTW Power Plot {% else %} - OTW Power Plot + OTW Power Plot* {% endif %}

Note: You must run the OTW calculations under Geeky Stuff first. Otherwise the plot will be empty @@ -145,7 +146,7 @@ {% if user|is_promember %} Geeky Stuff {% else %} - Geeky Stuff + Geeky Stuff* {% endif %}

@@ -160,7 +161,7 @@ {% if user|is_promember %} Smooth out Pace Data {% else %} - Smooth out Pace Data + Smooth out Pace Data* {% endif %}

@@ -177,7 +178,7 @@ {% if user|is_promember %} Raw Data {% else %} - Reset Smoothing + Reset Smoothing* {% endif %}

@@ -192,7 +193,7 @@ {% if user|is_promember %} Glue {% else %} - Glue + Glue* {% endif %}

@@ -204,7 +205,7 @@ {% if user|is_promember %} Sensor Fusion {% else %} - Sensor Fusion + Sensor Fusion* {% endif %}

@@ -216,7 +217,7 @@ {% if user|is_promember %} Split Workout {% else %} - Split Workout + Split Workout* {% endif %}

diff --git a/rowers/templates/compatibility.html b/rowers/templates/compatibility.html index c23ce1f2..a1bc1297 100644 --- a/rowers/templates/compatibility.html +++ b/rowers/templates/compatibility.html @@ -39,7 +39,10 @@

  • Concept2 Logbook: Exports stroke by stroke data for erg and OTW rowing
  • Strava
  • SportTracks
  • -
  • email (TCX or CSV format)
  • +
  • Runkeeper
  • +
  • MapMyFitness
  • +
  • TrainingPeaks
  • +
  • email (TCX, GPX or CSV format)
  • {% endblock content %} diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index bc3b8a98..08d6431a 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -141,7 +141,7 @@ var istcx = false; var isgzip = false; var size1 = 10485760; - var size2 = 1048576; + var size2 = 2097152; if ((/\.(tcx|TCX)/i).test(f.name)) { istcx = true; console.log('tcx'); diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html index 891a33fa..93c148e1 100644 --- a/rowers/templates/list_workouts.html +++ b/rowers/templates/list_workouts.html @@ -275,7 +275,11 @@
    {% endif %}
    + {% if user|is_promember %} Glue Workouts + {% else %} + Glue + {% endif %}

     

    {% if team %} From 53659d8b72f85d58786c6ea5e38d7791b37e059e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 25 Apr 2018 14:58:12 +0200 Subject: [PATCH 2/2] course update functionality --- rowers/courses.py | 12 ++++- rowers/forms.py | 5 ++- rowers/templates/course_edit_view.html | 3 +- rowers/templates/course_replace.html | 51 +++++++++++++++++++++ rowers/templates/coursemap.html | 7 +++ rowers/urls.py | 2 + rowers/views.py | 62 +++++++++++++++++++++++++- 7 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 rowers/templates/course_replace.html create mode 100644 rowers/templates/coursemap.html diff --git a/rowers/courses.py b/rowers/courses.py index 2cd1280d..495deee0 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -28,7 +28,7 @@ from rowers.models import ( Rower, Workout, GeoPoint,GeoPolygon, GeoCourse, course_length,course_coord_center,course_coord_maxmin, - polygon_coord_center + polygon_coord_center,PlannedSession ) # low level methods @@ -307,3 +307,13 @@ def get_time_course(ws,course): coursemeters = coursemeters-coursemetersfirst return coursetimeseconds,coursemeters,coursecompleted + +def replacecourse(course1,course2): + ps = PlannedSession.objects.filter(course=course1) + for p in ps: + p.course = course2 + p.save() + + course1.delete() + + return 1 diff --git a/rowers/forms.py b/rowers/forms.py index f4d4e457..1231a1d7 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -1,6 +1,6 @@ from django import forms from django.contrib.admin.widgets import FilteredSelectMultiple -from rowers.models import Workout,Rower,Team,PlannedSession +from rowers.models import Workout,Rower,Team,PlannedSession,GeoCourse from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension,validate_kml from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User @@ -536,6 +536,9 @@ class StatsOptionsForm(forms.Form): coastal = forms.BooleanField(initial=False,required=False) other = forms.BooleanField(initial=False,required=False) +class CourseSelectForm(forms.Form): + course = forms.ModelChoiceField(queryset=GeoCourse.objects.all()) + class WorkoutMultipleCompareForm(forms.Form): workouts = forms.ModelMultipleChoiceField(queryset=Workout.objects.all(), widget=forms.CheckboxSelectMultiple()) diff --git a/rowers/templates/course_edit_view.html b/rowers/templates/course_edit_view.html index 64c46e59..50668820 100644 --- a/rowers/templates/course_edit_view.html +++ b/rowers/templates/course_edit_view.html @@ -13,7 +13,8 @@ {% if nosessions %} Delete {% else %} -   + + Update {% endif %}
    diff --git a/rowers/templates/course_replace.html b/rowers/templates/course_replace.html new file mode 100644 index 00000000..c1420323 --- /dev/null +++ b/rowers/templates/course_replace.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} +{% block scripts %} +{% include "monitorjobs.html" %} +{% endblock %} + +{% block title %}{{ course.name }} {% endblock %} +{% block og_title %}{{ course.name }} {% endblock %} +{% block content %} +
    +
    + {% if course.manager == rower %} + View Course + {% else %} +   + {% endif %} +
    +
    + Courses +
    +
    +
    + +

    Replace {{ course.name }}

    + +
    +

    + This replaces the course {{ course.name }} with the course you select below for all + planned sessions and virtual races, and then deletes this course. +

    +
    + + {{ form.as_table }} +
    + {% csrf_token %} +
    + +
    +
    +
    +
    + {{ mapdiv|safe }} + + + {{ mapscript|safe }} +
    + +
    + +{% endblock %} diff --git a/rowers/templates/coursemap.html b/rowers/templates/coursemap.html new file mode 100644 index 00000000..f1ac2f9a --- /dev/null +++ b/rowers/templates/coursemap.html @@ -0,0 +1,7 @@ +
    + {{ mapscript|safe }} + {{ mapdiv|safe }} +
    + + + diff --git a/rowers/urls.py b/rowers/urls.py index 21618817..a5000cd0 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -513,7 +513,9 @@ urlpatterns = [ url(r'^courses/(?P\d+)/edit$',views.course_edit_view, name='course_edit_view'), url(r'^courses/(?P\d+)/delete$',views.course_delete_view), + url(r'^courses/(?P\d+)/replace$',views.course_replace_view), url(r'^courses/(?P\d+)$',views.course_view), + url(r'^courses/(?P\d+)/map$',views.course_map_view), ] if settings.DEBUG: diff --git a/rowers/views.py b/rowers/views.py index c1bb84d1..113c8a1b 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -34,7 +34,7 @@ from rowers.forms import ( WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement, LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm, PlannedSessionTeamForm,PlannedSessionTeamMemberForm, - VirtualRaceSelectForm,WorkoutRaceSelectForm, + VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm, ) from django.core.urlresolvers import reverse from django.core.exceptions import PermissionDenied @@ -8841,6 +8841,66 @@ def workout_comment_view(request,id=0): 'form':form, }) +# for ajax calls +def course_map_view(request,id=0): + if id != 0: + try: + course = GeoCourse.objects.get(id=id) + except GeoCourse.DoesNotExist: + return Http404("Course doesn't exist") + + script,div = course_map(course) + + return render(request, + 'coursemap.html', + { + 'mapdiv':div, + 'mapscript':script + }) + + else: + return "" + +@login_required() +def course_replace_view(request,id=0): + try: + course = GeoCourse.objects.get(id=id) + except GeoCourse.DoesNotExist: + return Http404("Course doesn't exist") + + r = getrower(request.user) + + if course.manager != r: + raise PermissionDenied("Access denied") + + thecourses = GeoCourse.objects.filter(manager=r).exclude(id=id) + + if request.method == 'POST': + form = CourseSelectForm(request.POST) + if form.is_valid(): + course2 = form.cleaned_data['course'] + res = courses.replacecourse(course,course2) + + url = reverse(course_view, + kwargs = { + 'id':course2.id + }) + + return HttpResponseRedirect(url) + else: + + form = CourseSelectForm() + form.fields["course"].queryset = thecourses + + script,div = course_map(course) + + return render(request, + 'course_replace.html', + {'course':course, + 'mapdiv':div, + 'mapscript':script, + 'form':form}) + @login_required() def course_delete_view(request,id=0): try: