diff --git a/rowers/templates/menu_other.html b/rowers/templates/menu_other.html
index 71789d84..f56facfa 100644
--- a/rowers/templates/menu_other.html
+++ b/rowers/templates/menu_other.html
@@ -10,9 +10,11 @@
{% if team %}
- Compare
+
+ Compare
{% else %}
- Compare
+
+ Compare
{% endif %}
diff --git a/rowers/templates/menu_workouts.html b/rowers/templates/menu_workouts.html
index 93b4d31a..24c0bc8f 100644
--- a/rowers/templates/menu_workouts.html
+++ b/rowers/templates/menu_workouts.html
@@ -10,10 +10,10 @@
{% if team %}
-
+
Compare
{% else %}
-
+
Compare
{% endif %}
diff --git a/rowers/templates/team_compare_select.html b/rowers/templates/team_compare_select.html
deleted file mode 100644
index 19140d18..00000000
--- a/rowers/templates/team_compare_select.html
+++ /dev/null
@@ -1,144 +0,0 @@
-{% extends "newbase.html" %}
-{% load static %}
-{% load rowerfilters %}
-
-{% block title %}Workouts{% endblock %}
-
-{% block main %}
-
-
-
-
-
-{{ team.name }} Compare Workouts
-
-
-
- -
-
Select two or more workouts on the left, set your plot settings,
- and press submit
-
- You can use the date and search forms to search through all
- workouts from this team.
-
-
- TIP: Agree with your team members to put tags (e.g. '8x500m')
- in the notes section of
- your workouts. That makes it easy to search.
-
-
- -
-
-
- -
-
-
- -
- {% if workouts %}
-
- -
-
- {% csrf_token %}
-
- {{ chartform.as_table }}
-
-
-
-
-
-
-
-
-
-{% endblock %}
-
-{% block sidebar %}
-{% include 'menu_workouts.html' %}
-{% endblock %}
diff --git a/rowers/templates/teambuttons.html b/rowers/templates/teambuttons.html
index e45b807e..828d1769 100644
--- a/rowers/templates/teambuttons.html
+++ b/rowers/templates/teambuttons.html
@@ -6,7 +6,7 @@
diff --git a/rowers/tests/test_plans.py b/rowers/tests/test_plans.py
index f6f5b73f..cc5de299 100644
--- a/rowers/tests/test_plans.py
+++ b/rowers/tests/test_plans.py
@@ -16,6 +16,7 @@ from django.db import transaction
import json
from rowers.views.workoutviews import plannedsession_compare_view
+from rowers.views.analysisviews import analysis_new
from rowers.views.otherviews import download_fit
from rowers.opaque import encoder
from django.utils.crypto import get_random_string
@@ -443,7 +444,11 @@ class SessionLinkTest(TestCase):
url = reverse(plannedsession_compare_view,kwargs={'id':ps.id,'userid':self.u.id})
response = self.c.get(url,follow=True)
- expected_url = reverse('multi_compare_view',kwargs={'userid':self.u.id,'id':encoder.encode_hex(w.id)})
+ expected_url = reverse('analysis_new',
+ kwargs={'function':'compare',
+ 'id':encoder.encode_hex(w.id),
+ 'session':ps.id,
+ })
self.assertRedirects(response,expected_url=expected_url,
status_code=302,target_status_code=200)
@@ -473,7 +478,7 @@ class SessionLinkTest(TestCase):
session.save()
request.user = self.u
- response = multi_compare_view(request,id=str(w.id))
+ response = analysis_new(request,id=encoder.encode_hex(w.id))
self.assertEqual(response.status_code,200)
# and adding a get
@@ -491,7 +496,7 @@ class SessionLinkTest(TestCase):
session.save()
request.user = self.u
- response = multi_compare_view(request,id=str(w.id))
+ response = analysis_new(request,id=encoder.encode_hex(w.id))
self.assertEqual(response.status_code,200)
diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz
index 168c1261..d0b9235f 100644
Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ
diff --git a/rowers/urls.py b/rowers/urls.py
index 6f55af06..cffc7775 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -316,9 +316,12 @@ urlpatterns = [
re_path(r'^workouts-join/user/(?P\d+)$',views.workouts_join_view,name='workouts_join_view'),
re_path(r'^workouts-join-select/$',views.workouts_join_select,name='workouts_join_select'),
re_path(r'^workouts-join-select/user/(?P\d+)/$',views.workouts_join_select,name='workouts_join_select'),
+ re_path(r'^user-analysis-select/(?P\w.*)/team/(?P\d+)/workout/(?P\b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'),
+ re_path(r'^user-analysis-select/(?P\w.*)/session/(?P\d+)/workout/(?P\b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/(?P\w.*)/workout/(?P\b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/(?P\w.*)/user/(?P\d+)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/(?P\w.*)/team/(?P\d+)/$',views.analysis_new,name='analysis_new'),
+ re_path(r'^user-analysis-select/team/(?P\d+)/workout/(?P\b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/user/(?P\d+)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/team/(?P\d+)/$',views.analysis_new,name='analysis_new'),
re_path(r'^user-analysis-select/(?P\w.*)/$',views.analysis_new,name='analysis_new'),
diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py
index 9f62d9bf..03af6174 100644
--- a/rowers/views/analysisviews.py
+++ b/rowers/views/analysisviews.py
@@ -8,6 +8,7 @@ from rowers.views.statements import *
import collections
import simplejson
from jinja2 import Template,Environment,FileSystemLoader
+from rowers.rower_rules import can_view_session
def floatformat(x,prec=2): # pragma: no cover
return '{x}'.format(x=round(x,prec))
@@ -35,7 +36,7 @@ defaultoptions = {
message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality",
redirect_field_name=None)
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
-def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''):
+def analysis_new(request,userid=0,function='boxplot',teamid=0,id='',session=0):
r = getrequestrower(request, userid=userid)
user = r.user
userid = user.id
@@ -53,6 +54,13 @@ def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''):
except Team.DoesNotExist:
theteam = None
+ try:
+ thesession = PlannedSession.objects.get(id=session)
+ if not can_view_session(user,thesession):
+ raise PermissionDenied("you cannot view this session")
+ except PlannedSession.DoesNotExist:
+ thesession = None
+
if 'options' in request.session:
options = request.session['options']
@@ -211,6 +219,8 @@ def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''):
startdatetime__lte=enddate,
workouttype__in=modalities,
)
+ elif thesession is not None:
+ workouts = get_workouts_session(r,thesession)
else:
workouts = Workout.objects.filter(user=r,
startdatetime__gte=startdate,
diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py
index 2a8b783d..5bdc17ef 100644
--- a/rowers/views/workoutviews.py
+++ b/rowers/views/workoutviews.py
@@ -2047,9 +2047,14 @@ def plannedsession_compare_view(request,id=0,userid=0):
request.session['plottype'] = plottype
request.session['ps'] = ps.id
+ teams = ps.team.all()
+
if ids:
- url = reverse('multi_compare_view',
- kwargs={'userid':userid,'id':encoder.encode_hex(ids[0])})
+ url = reverse('analysis_new',
+ kwargs={
+ 'session':ps.id,
+ 'id':encoder.encode_hex(ids[0]),
+ 'function':'compare'})
else:
url = reverse('plannedsession_view',kwargs={'id':ps.id})