Private
Public Access
1
0

Merge branch 'feature/opaqueid' into develop

This commit is contained in:
Sander Roosendaal
2019-02-14 11:24:29 +01:00
77 changed files with 902 additions and 647 deletions
+3
View File
@@ -192,7 +192,10 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|'):
totaldist = data['distance'] totaldist = data['distance']
totaltime = data['time']/10. totaltime = data['time']/10.
try:
spm = data['stroke_rate'] spm = data['stroke_rate']
except KeyError:
spm = 0
try: try:
resttime = data['rest_time']/10. resttime = data['rest_time']/10.
except KeyError: except KeyError:
+4 -4
View File
@@ -80,7 +80,7 @@ from rowsandall_app.settings import SITE_URL
from rowers.mytypes import otwtypes from rowers.mytypes import otwtypes
from rowers.database import * from rowers.database import *
from rowers.opaque import encoder
# mapping the DB column names to the CSV file column names # mapping the DB column names to the CSV file column names
@@ -1416,7 +1416,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate, setprivate=setprivate,
forceunit='N') forceunit='N')
messages.append(message) messages.append(message)
ids.append(id) ids.append(encoder.encode_hex(id))
if 'keep second' in splitmode: if 'keep second' in splitmode:
data2['cumdist'] = data2['cumdist'] - data2.iloc[ data2['cumdist'] = data2['cumdist'] - data2.iloc[
0, 0,
@@ -1443,7 +1443,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate, setprivate=setprivate,
dt=dt, forceunit='N') dt=dt, forceunit='N')
messages.append(message) messages.append(message)
ids.append(id) ids.append(encoder.encode_hex(id))
if not 'keep original' in splitmode: if not 'keep original' in splitmode:
if 'keep second' in splitmode or 'keep first' in splitmode: if 'keep second' in splitmode or 'keep first' in splitmode:
@@ -1451,7 +1451,7 @@ def split_workout(r, parent, splitsecond, splitmode):
messages.append('Deleted Workout: ' + parent.name) messages.append('Deleted Workout: ' + parent.name)
else: else:
messages.append('That would delete your workout') messages.append('That would delete your workout')
ids.append(parent.id) ids.append(encoder.encode_hex(parent.id))
elif 'originalprivate' in splitmode: elif 'originalprivate' in splitmode:
parent.privacy = 'hidden' parent.privacy = 'hidden'
parent.save() parent.save()
+1 -1
View File
@@ -2230,7 +2230,7 @@ def interactive_chart(id=0,promember=0,intervaldata = {}):
intervaldf['itime'] = intervaldf['itime']*1.e3 intervaldf['itime'] = intervaldf['itime']*1.e3
intervaldf['time'] = intervaldf['itime'].cumsum() intervaldf['time'] = intervaldf['itime'].cumsum()
intervaldf['time'] = intervaldf['time'].shift(1) intervaldf['time'] = intervaldf['time'].shift(1)
intervaldf.ix[0,'time'] = 0 intervaldf.loc[:,'time'].iloc[0] = 0
intervaldf['time_r'] = intervaldf['time'] +intervaldf['itime'] intervaldf['time_r'] = intervaldf['time'] +intervaldf['itime']
intervaldf['value'] = 100 intervaldf['value'] = 100
mask = intervaldf['itype'] == 3 mask = intervaldf['itype'] == 3
+4 -1
View File
@@ -24,9 +24,12 @@ from rowers.mailprocessing import make_new_workout_from_email, send_confirm
import rowers.polarstuff as polarstuff import rowers.polarstuff as polarstuff
import rowers.c2stuff as c2stuff import rowers.c2stuff as c2stuff
import rowers.stravastuff as stravastuff import rowers.stravastuff as stravastuff
from rowers.opaque import encoder
from rowers.models import User,VirtualRace,Workout from rowers.models import User,VirtualRace,Workout
from rowers.plannedsessions import email_submit_race from rowers.plannedsessions import email_submit_race
workoutmailbox = Mailbox.objects.get(name='workouts') workoutmailbox = Mailbox.objects.get(name='workouts')
failedmailbox = Mailbox.objects.get(name='Failed') failedmailbox = Mailbox.objects.get(name='Failed')
@@ -105,7 +108,7 @@ def processattachment(rower, fileobj, title, uploadoptions,testing=False):
link = settings.SITE_URL+reverse( link = settings.SITE_URL+reverse(
therower.defaultlandingpage, therower.defaultlandingpage,
kwargs = { kwargs = {
'id':workoutid[0], 'id':encoder.encode_hex(workoutid[0]),
} }
) )
+59
View File
@@ -0,0 +1,59 @@
import struct
import base64
from rowsandall_app.settings import (
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET,
STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET,
POLAR_CLIENT_ID, POLAR_REDIRECT_URI, POLAR_CLIENT_SECRET,
SPORTTRACKS_CLIENT_ID, SPORTTRACKS_REDIRECT_URI,
SPORTTRACKS_CLIENT_SECRET,
UNDERARMOUR_CLIENT_ID, UNDERARMOUR_REDIRECT_URI,
UNDERARMOUR_CLIENT_SECRET,UNDERARMOUR_CLIENT_KEY,
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET,
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY,
PAYMENT_PROCESSING_ON,OPAQUE_SECRET_KEY
)
class OpaqueEncoder:
"""
Opaque ID encoder.
Translates between 32-bit integers (such as resource IDs) and obfuscated
scrambled values, as a one-to-one mapping. Supports hex and base64 url-safe
string representations. Expects a secret integer key in the constructor.
(c) 2011 Marek Z. @marekweb
"""
def __init__(self, key):
self.key = key
self.extra_chars = b'.-';
def transform(self, i):
"""Produce an integer hash of a 16-bit integer, returning a transformed 16-bit integer."""
i = (self.key ^ i) * 0x9e3b
return i >> (i & 0xf) & 0xffff
def transcode(self, i):
"""Reversibly transcode a 32-bit integer to a scrambled form, returning a new 32-bit integer."""
r = i & 0xffff
l = i >> 16 & 0xffff ^ self.transform(r)
return ((r ^ self.transform(l)) << 16) + l
def encode_hex(self, i):
"""Transcode an integer and return it as an 8-character hex string."""
return "%08x" % self.transcode(i)
def encode_base64(self, i):
"""Transcode an integer and return it as a 6-character base64 string."""
return base64.b64encode(struct.pack('!L', self.transcode(i)), self.extra_chars)[:6]
def decode_hex(self, s):
"""Decode an 8-character hex string, returning the original integer."""
return self.transcode(int(s, 16))
def decode_base64(self, s):
"""Decode a 6-character base64 string, returning the original integer."""
return self.transcode(struct.unpack('!L', base64.b64decode(s + '==', self.extra_chars))[0])
encoder = OpaqueEncoder(OPAQUE_SECRET_KEY)
+14 -14
View File
@@ -23,17 +23,17 @@
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/workflow">Workflow View</a>
</p> </p>
</div> </div>
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/export">Export</a>
</p> </p>
</div> </div>
</div> </div>
@@ -52,7 +52,7 @@
</tr> </tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</table> </table>
</div> </div>
@@ -60,7 +60,7 @@
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/compare/{{ workout.id }}">Compare Workouts</a> <a class="button blue small" href="/rowers/workout/compare/{{ workout.id|encode }}">Compare Workouts</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans/">Compare Workouts*</a> <a class="button blue small" href="/rowers/paidplans/">Compare Workouts*</a>
{% endif %} {% endif %}
@@ -69,7 +69,7 @@
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/flexchart"> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/flexchart">
Flexible Interactive Plot Flexible Interactive Plot
</a> </a>
<p> <p>
@@ -80,7 +80,7 @@
<div class="grid_2 omega tooltip"> <div class="grid_2 omega tooltip">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/editintervals">Edit Intervals</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a> <a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a>
{% endif %} {% endif %}
@@ -96,7 +96,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/adddistanceplot2">Dist Metrics Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/adddistanceplot2">Dist Metrics Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Dist Metrics Plot*</a> <a class="button blue small" href="/rowers/paidplans">Dist Metrics Plot*</a>
{% endif %} {% endif %}
@@ -108,7 +108,7 @@
<div class="grid_2"> <div class="grid_2">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addtimeplot2">Time Metrics Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/addtimeplot2">Time Metrics Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Time Metrics Plot*</a> <a class="button blue small" href="/rowers/paidplans">Time Metrics Plot*</a>
{% endif %} {% endif %}
@@ -120,7 +120,7 @@
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/histo">Power Histogram</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/histo">Power Histogram</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Power Histogram*</a> <a class="button blue small" href="/rowers/paidplans">Power Histogram*</a>
{% endif %} {% endif %}
@@ -147,7 +147,7 @@
<div class="grid_2"> <div class="grid_2">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/fusion/{{ workout.id }}/">Sensor Fusion</a> <a class="button blue small" href="/rowers/workout/fusion/{{ workout.id|encode }}/">Sensor Fusion</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a> <a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a>
{% endif %} {% endif %}
@@ -159,7 +159,7 @@
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/split">Split Workout</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/split">Split Workout</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Split Workout*</a> <a class="button blue small" href="/rowers/paidplans">Split Workout*</a>
{% endif %} {% endif %}
@@ -172,7 +172,7 @@
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveplot">Big Interactive Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/interactiveplot">Big Interactive Plot</a>
</p> </p>
<p> <p>
See (and save) the big interactive plot See (and save) the big interactive plot
@@ -180,7 +180,7 @@
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/instroke">In-Stroke Metrics</a></p> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/instroke">In-Stroke Metrics</a></p>
<p> <p>
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here. If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
</p> </p>
+17 -17
View File
@@ -21,17 +21,17 @@
{% endif %} {% endif %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/workflow">Workflow View</a>
</p> </p>
</div> </div>
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/export">Export</a>
</p> </p>
</div> </div>
@@ -49,7 +49,7 @@
</tr> </tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</table> </table>
</div> </div>
@@ -58,7 +58,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/compare/{{ workout.id }}">Compare Workouts</a> <a class="button blue small" href="/rowers/workout/compare/{{ workout.id|encode }}">Compare Workouts</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Compare Workouts*</a> <a class="button blue small" href="/rowers/paidplans">Compare Workouts*</a>
{% endif %} {% endif %}
@@ -70,7 +70,7 @@
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/flexchart">Flexible Interactive Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/flexchart">Flexible Interactive Plot</a>
</p> </p>
<p> <p>
Flexible Interactive plot. Pick your own X and Y axis parameters. Flexible Interactive plot. Pick your own X and Y axis parameters.
@@ -80,7 +80,7 @@
<div class="grid_2 omega tooltip"> <div class="grid_2 omega tooltip">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/editintervals">Edit Intervals</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a> <a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a>
{% endif %} {% endif %}
@@ -97,7 +97,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small"href="/rowers/workout/{{ workout.id }}/crewnerdsummary">CrewNerd Summary</a> <a class="button blue small"href="/rowers/workout/{{ workout.id|encode }}/crewnerdsummary">CrewNerd Summary</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">CrewNerd Summary*</a> <a class="button blue small" href="/rowers/paidplans">CrewNerd Summary*</a>
{% endif %} {% endif %}
@@ -111,7 +111,7 @@
<div class="grid_2 tooltip"> <div class="grid_2 tooltip">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/forcecurve">Stroke Profile (Empower)</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/forcecurve">Stroke Profile (Empower)</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Stroke Profile (Empower)*</a> <a class="button blue small" href="/rowers/paidplans">Stroke Profile (Empower)*</a>
{% endif %} {% endif %}
@@ -124,7 +124,7 @@
<div class="grid_2 omega tooltip"> <div class="grid_2 omega tooltip">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addotwpowerplot">OTW Power Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/addotwpowerplot">OTW Power Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">OTW Power Plot*</a> <a class="button blue small" href="/rowers/paidplans">OTW Power Plot*</a>
{% endif %} {% endif %}
@@ -144,7 +144,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/geeky">Geeky Stuff</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/geeky">Geeky Stuff</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Geeky Stuff*</a> <a class="button blue small" href="/rowers/paidplans">Geeky Stuff*</a>
{% endif %} {% endif %}
@@ -159,7 +159,7 @@
<div class="grid_2 tooltip"> <div class="grid_2 tooltip">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small"href="/rowers/workout/{{ workout.id }}/smoothenpace">Smooth out Pace Data</a> <a class="button blue small"href="/rowers/workout/{{ workout.id|encode }}/smoothenpace">Smooth out Pace Data</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Smooth out Pace Data*</a> <a class="button blue small" href="/rowers/paidplans">Smooth out Pace Data*</a>
{% endif %} {% endif %}
@@ -176,7 +176,7 @@
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small"href="/rowers/workout/{{ workout.id }}/undosmoothenpace">Raw Data</a> <a class="button blue small"href="/rowers/workout/{{ workout.id|encode }}/undosmoothenpace">Raw Data</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Reset Smoothing*</a> <a class="button blue small" href="/rowers/paidplans">Reset Smoothing*</a>
{% endif %} {% endif %}
@@ -203,7 +203,7 @@
<div class="grid_2"> <div class="grid_2">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/fusion/{{ workout.id }}/">Sensor Fusion</a> <a class="button blue small" href="/rowers/workout/fusion/{{ workout.id|encode }}/">Sensor Fusion</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a> <a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a>
{% endif %} {% endif %}
@@ -215,7 +215,7 @@
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/split">Split Workout</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/split">Split Workout</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/paidplans">Split Workout*</a> <a class="button blue small" href="/rowers/paidplans">Split Workout*</a>
{% endif %} {% endif %}
@@ -229,7 +229,7 @@
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveplot">Big Interactive Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/interactiveplot">Big Interactive Plot</a>
</p> </p>
<p> <p>
See (and save) the big interactive plot See (and save) the big interactive plot
@@ -237,7 +237,7 @@
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/instroke">In-Stroke Metrics</a></p> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/instroke">In-Stroke Metrics</a></p>
<p> <p>
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here. If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
</p> </p>
+2 -2
View File
@@ -42,12 +42,12 @@
{% if user.is_authenticated and mayedit %} {% if user.is_authenticated and mayedit %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
<div class="grid_2 suffix_2 omega"> <div class="grid_2 suffix_2 omega">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/advanced">Advanced Edit</a>
</p> </p>
</div> </div>
+2 -2
View File
@@ -80,7 +80,7 @@
<tr> <tr>
<td> {{ cworkout.date }} </td> <td> {{ cworkout.date }} </td>
<td> {{ cworkout.starttime }} </td> <td> {{ cworkout.starttime }} </td>
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td> <td> <a href="/rowers/workout/{{ workout.id|encode }}/edit">{{ cworkout.name }}</a> </td>
<td> {{ cworkout.workouttype }} </td> <td> {{ cworkout.workouttype }} </td>
<td> {{ cworkout.distance }}m</td> <td> {{ cworkout.distance }}m</td>
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
@@ -89,7 +89,7 @@
{% if id == cworkout.id %} {% if id == cworkout.id %}
<td>&nbsp;</td> <td>&nbsp;</td>
{% else %} {% else %}
<td> <a class="button blue small" href="/rowers/workout/compare/{{ id }}/{{ cworkout.id }}/time/hr">Compare</a> </td> <td> <a class="button blue small" href="/rowers/workout/compare/{{ id }}/{{ cworkout.id|encode }}/time/hr">Compare</a> </td>
{% endif %} {% endif %}
</tr> </tr>
+3 -3
View File
@@ -26,11 +26,11 @@
<tr> <tr>
<td> {{ workout.date }} </td> <td> {{ workout.date }} </td>
<td> {{ workout.starttime }} </td> <td> {{ workout.starttime }} </td>
<td><a href="/rowers/workout/{{workout.id}}/edit"> {{ workout.name }}</a> </td> <td><a href="/rowers/workout/{{workout.id|encode}}/edit"> {{ workout.name }}</a> </td>
<td> {{ workout.workouttype }} </td> <td> {{ workout.workouttype }} </td>
<td> <a href="/rowers/workout/{{ workout.id }}/deleteconfirm">D</td> <td> <a href="/rowers/workout/{{ workout.id|encode }}/deleteconfirm">D</td>
{% if not workout.uploadedtoc2 %} {% if not workout.uploadedtoc2 %}
<td> <a href="/rowers/workout/{{ workout.id }}/c2upload">C2</td> <td> <a href="/rowers/workout/{{ workout.id|encode }}/c2upload">C2</td>
{% else %} {% else %}
<td> &nbsp; </td> <td> &nbsp; </td>
{% endif %} {% endif %}
+12 -12
View File
@@ -12,17 +12,17 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/workflow">Workflow View</a>
</p> </p>
</div> </div>
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/advanced">Advanced Edit</a>
</p> </p>
</div> </div>
@@ -42,7 +42,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1 alpha"> <div class="grid_1 alpha">
<a href="/rowers/workout/{{ workout.id }}/c2uploadw"><img src="/static/img/c2square.jpg" alt="Concept2 icon" width="60" height="60"></a> <a href="/rowers/workout/{{ workout.id|encode }}/c2uploadw"><img src="/static/img/c2square.jpg" alt="Concept2 icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -60,7 +60,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/stravauploadw"><img src="/static/img/stravasquare.png" alt="Strava icon" width="60" height="60"></a> <a href="/rowers/workout/{{ workout.id|encode }}/stravauploadw"><img src="/static/img/stravasquare.png" alt="Strava icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -77,7 +77,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/sporttracksuploadw">
<img src="/static/img/sporttrackssquare.png" alt="SportTracks icon" width="60" height="60"></a> <img src="/static/img/sporttrackssquare.png" alt="SportTracks icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
@@ -88,12 +88,12 @@
</div> </div>
{% endif %} {% endif %}
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/emailtcx"> <a href="/rowers/workout/{{ workout.id|encode }}/emailtcx">
<img src="/static/img/export.png" alt="TCX Export" width="60" height="60"></a> <img src="/static/img/export.png" alt="TCX Export" width="60" height="60"></a>
</div> </div>
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/emailcsv"> <a href="/rowers/workout/{{ workout.id|encode }}/emailcsv">
<img src="/static/img/CSVsquare.png" alt="CSV Export" width="60" height="60"></a> <img src="/static/img/CSVsquare.png" alt="CSV Export" width="60" height="60"></a>
</div> </div>
@@ -106,7 +106,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1 alpha"> <div class="grid_1 alpha">
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw"><img src="/static/img/rksquare.png" alt="Runkeeper icon" width="60" height="60"></a> <a href="/rowers/workout/{{ workout.id|encode }}/runkeeperuploadw"><img src="/static/img/rksquare.png" alt="Runkeeper icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -124,7 +124,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw"><img src="/static/img/uasquare.png" alt="Underarmour icon" width="60" height="60"></a> <a href="/rowers/workout/{{ workout.id|encode }}/underarmouruploadw"><img src="/static/img/uasquare.png" alt="Underarmour icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -142,7 +142,7 @@
</div> </div>
{% else %} {% else %}
<div class="grid_1"> <div class="grid_1">
<a href="/rowers/workout/{{ workout.id }}/tpuploadw"><img src="/static/img/tpicon.png" alt="Tp icon" width="60" height="60"></a> <a href="/rowers/workout/{{ workout.id|encode }}/tpuploadw"><img src="/static/img/tpicon.png" alt="Tp icon" width="60" height="60"></a>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -153,7 +153,7 @@
{% endif %} {% endif %}
<div class="grid_1 omega"> <div class="grid_1 omega">
<a href="/rowers/workout/{{ workout.id }}/emailgpx"> <a href="/rowers/workout/{{ workout.id|encode }}/emailgpx">
<img src="/static/img/gpx.jpg" alt="GPX Export" width="60" height="60"></a> <img src="/static/img/gpx.jpg" alt="GPX Export" width="60" height="60"></a>
</div> </div>
</div> </div>
+2 -2
View File
@@ -115,7 +115,7 @@
<tr> <tr>
<td> {{ cworkout.date }} </td> <td> {{ cworkout.date }} </td>
<td> {{ cworkout.starttime }} </td> <td> {{ cworkout.starttime }} </td>
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td> <td> <a href="/rowers/workout/{{ workout.id|encode }}/edit">{{ cworkout.name }}</a> </td>
<td> {{ cworkout.workouttype }} </td> <td> {{ cworkout.workouttype }} </td>
<td> {{ cworkout.distance }}m</td> <td> {{ cworkout.distance }}m</td>
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
@@ -124,7 +124,7 @@
{% if id == cworkout.id %} {% if id == cworkout.id %}
<td>&nbsp;</td> <td>&nbsp;</td>
{% else %} {% else %}
<td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id }}">Fusion</a> </td> <td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id|encode }}">Fusion</a> </td>
{% endif %} {% endif %}
</tr> </tr>
+1 -1
View File
@@ -171,7 +171,7 @@
$.ajax({ $.ajax({
data: data, data: data,
type: $(this).attr('method'), type: $(this).attr('method'),
url: '/rowers/workout/{{ workout.id }}/image/', url: '/rowers/workout/{{ workout.id|encode }}/image/',
contentType: false, contentType: false,
processData: false, processData: false,
error: function(result) { error: function(result) {
+2 -2
View File
@@ -30,7 +30,7 @@
</tr> </tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}/">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</table> </table>
@@ -42,7 +42,7 @@
{% if instrokemetrics %} {% if instrokemetrics %}
{% for metric in instrokemetrics %} {% for metric in instrokemetrics %}
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/instroke/{{ metric }}/">{{ metric }}</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/instroke/{{ metric }}/">{{ metric }}</a>
</p> </p>
{% endfor %} {% endfor %}
{% else %} {% else %}
+11 -11
View File
@@ -180,11 +180,11 @@
<tr> <tr>
{% endif %} {% endif %}
<td id="mypointer" <td id="mypointer"
class="rankingtoggle" workoutid="{{ workout.id }}"> class="rankingtoggle" workoutid="{{ workout.id|encode }}">
{% if workout.rankingpiece %} {% if workout.rankingpiece %}
<span id="star{{ workout.id }}" class="yellow">&starf;</span> <span id="star{{ workout.id|encode }}" class="yellow">&starf;</span>
{% else %} {% else %}
<span id="star{{ workout.id }}" class="notyellow">&star;</span> <span id="star{{ workout.id|encode }}" class="notyellow">&star;</span>
{% endif %} {% endif %}
</td> </td>
<td> {{ workout.date|date:"Y-m-d" }} </td> <td> {{ workout.date|date:"Y-m-d" }} </td>
@@ -192,20 +192,20 @@
{% if workout.user.user == user or user == team.manager %} {% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}> <a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }} {{ workout.name }}
</a> </a>
</td> </td>
{% else %} {% else %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name <a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td> </a></td>
{% endif %} {% endif %}
{% else %} {% else %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">{{ workout.name }}</a></td>
{% else %} {% else %}
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">No Name</a> </td>
{% endif %} {% endif %}
{% endif %} {% endif %}
<td> {{ workout.workouttype }} </td> <td> {{ workout.workouttype }} </td>
@@ -223,27 +223,27 @@
{% endif %} {% endif %}
<td> <td>
<a class="small" <a class="small"
href="/rowers/workout/{{ workout.id }}/edit/" href="/rowers/workout/{{ workout.id|encode }}/edit/"
title="Edit"> title="Edit">
<i class="fas fa-pencil-alt fa-fw"></i> <i class="fas fa-pencil-alt fa-fw"></i>
</a> </a>
</td> </td>
<td> <td>
<a class="small" <a class="small"
href="/rowers/workout/{{ workout.id }}/flexchart/" href="/rowers/workout/{{ workout.id|encode }}/flexchart/"
title="Flex Chart"> title="Flex Chart">
<i class="fas fa-chart-line fa-fw"></i> <i class="fas fa-chart-line fa-fw"></i>
</a> </a>
</td> </td>
<td> <td>
<a class="small" <a class="small"
href="/rowers/workout/{{ workout.id }}/stats/" href="/rowers/workout/{{ workout.id|encode }}/stats/"
title="Stats"> title="Stats">
<i class="fal fa-table fa-fw"></i> <i class="fal fa-table fa-fw"></i>
</a> </a>
</td> </td>
<td> <td>
<a class="small" href="/rowers/workout/{{ workout.id }}/delete/" <a class="small" href="/rowers/workout/{{ workout.id|encode }}/delete/"
title="Delete"> title="Delete">
<i class="fas fa-trash-alt fa-fw"></i> <i class="fas fa-trash-alt fa-fw"></i>
</a> </a>
+37 -38
View File
@@ -7,53 +7,52 @@
<ul> <ul>
<li id="workout-dashboard"> <li id="workout-dashboard">
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<a href="/rowers/workout/{{ workout.id }}/workflow/"> <a href="/rowers/workout/{{ workout.id|encode }}/workflow/">
<i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View <i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/workflow/"> <a href="/rowers/workout/{{ workout.id|encode }}/workflow/">
<i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View <i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View
</a> </a>
{% endif %} {% endif %}
</li> </li>
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<li id="workout-edit"> <li id="workout-edit">
<a href="/rowers/workout/{{ workout.id }}/edit/"> <a href="/rowers/workout/{{ workout.id|encode }}/edit/">
<i class="fas fa-pencil-alt fa-fw"></i>&nbsp;Edit <i class="fas fa-pencil-alt fa-fw"></i>&nbsp;Edit
</a> </a>
</li> </li>
<li id="workout-intervals"> <a href="/rowers/workout/{{ workout.id|encode }}/editintervals/">
<a href="/rowers/workout/{{ workout.id }}/editintervals/">
<i class="fas fa-pause fa-fw"></i>&nbsp;Intervals <i class="fas fa-pause fa-fw"></i>&nbsp;Intervals
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li id="workout-comments"> <li id="workout-comments">
<a href="/rowers/workout/{{ workout.id }}/comment/"> <a href="/rowers/workout/{{ workout.id|encode }}/comment/">
<i class="fas fa-comments fa-fw"></i>&nbsp;Comments <i class="fas fa-comments fa-fw"></i>&nbsp;Comments
({{ workout|aantalcomments }}) ({{ workout|aantalcomments }})
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li id="workout-stats"> <li id="workout-stats">
<a href="/rowers/workout/{{ workout.id }}/stats/"> <a href="/rowers/workout/{{ workout.id|encode }}/stats/">
<i class="fal fa-table fa-fw"></i>&nbsp;Statistics <i class="fal fa-table fa-fw"></i>&nbsp;Statistics
</a> </a>
</li> </li>
<li id="compare"> <li id="compare">
<a href="/rowers/multi-compare/workout/{{ workout.id }}/"> <a href="/rowers/multi-compare/workout/{{ workout.id|encode }}/">
<i class="fas fa-balance-scale fa-fw"></i>&nbsp;Compare <i class="fas fa-balance-scale fa-fw"></i>&nbsp;Compare
</a> </a>
</li> </li>
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<li id="chart-image"> <li id="chart-image">
<a href="/rowers/workout/{{ workout.id }}/image/"> <a href="/rowers/workout/{{ workout.id|encode }}/image/">
<i class="fas fa-file-image fa-fw"></i>&nbsp;Upload Image <i class="fas fa-file-image fa-fw"></i>&nbsp;Upload Image
</a> </a>
</li> </li>
<li id="workout-delete"> <li id="workout-delete">
<a href="/rowers/workout/{{ workout.id }}/delete/"> <a href="/rowers/workout/{{ workout.id|encode }}/delete/">
<i class="fas fa-trash-alt fa-fw"></i>&nbsp;Delete <i class="fas fa-trash-alt fa-fw"></i>&nbsp;Delete
</a> </a>
</li> </li>
@@ -65,23 +64,23 @@
<label for="group-flexchart">Interactive Charts</label> <label for="group-flexchart">Interactive Charts</label>
<ul> <ul>
<li id="chart-flexchart"> <li id="chart-flexchart">
<a href="/rowers/workout/{{ workout.id }}/flexchart/"> <a href="/rowers/workout/{{ workout.id|encode }}/flexchart/">
<i class="fas fa-chart-line fa-fw"></i>&nbsp;Flex Chart <i class="fas fa-chart-line fa-fw"></i>&nbsp;Flex Chart
</a> </a>
</li> </li>
{% if workout|water %} {% if workout|water %}
<li id="chart-map"> <li id="chart-map">
<a href="/rowers/workout/{{ workout.id }}/map/"> <a href="/rowers/workout/{{ workout.id|encode }}/map/">
<i class="fas fa-map-marked-alt fa-fw"></i>&nbsp;Map <i class="fas fa-map-marked-alt fa-fw"></i>&nbsp;Map
</a> </a>
</li> </li>
<li id="chart-empower"> <li id="chart-empower">
<a href="/rowers/workout/{{ workout.id }}/forcecurve/"> <a href="/rowers/workout/{{ workout.id|encode }}/forcecurve/">
<i class="fas fa-dumbbell fa-fw"></i>&nbsp;Force Curve <i class="fas fa-dumbbell fa-fw"></i>&nbsp;Force Curve
</a> </a>
</li> </li>
<li id="chart-otwpower"> <li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/interactiveotwplot/"> <a href="/rowers/workout/{{ workout.id|encode }}/interactiveotwplot/">
<i class="fal fa-calculator-alt fa-fw"></i>&nbsp;Corrected Pace Plot <i class="fal fa-calculator-alt fa-fw"></i>&nbsp;Corrected Pace Plot
</a> </a>
</li> </li>
@@ -94,28 +93,28 @@
<label for="group-chart">Static Charts</label> <label for="group-chart">Static Charts</label>
<ul> <ul>
<li id="chart-time"> <li id="chart-time">
<a href="/rowers/workout/{{ workout.id }}/addstatic/1/"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/1/">
<i class="fas fa-stopwatch fa-fw"></i>&nbsp;Time <i class="fas fa-stopwatch fa-fw"></i>&nbsp;Time
</a> </a>
</li> </li>
<li id="chart-distance"> <li id="chart-distance">
<a href="/rowers/workout/{{ workout.id }}/addstatic/2/"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/2/">
<i class="fas fa-ruler fa-fw"></i>&nbsp;Distance <i class="fas fa-ruler fa-fw"></i>&nbsp;Distance
</a> </a>
</li> </li>
<li id="chart-powerpie"> <li id="chart-powerpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/13/"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/13/">
<i class="far fa-chart-pie fa-fw"></i>&nbsp;Power (Pie) <i class="far fa-chart-pie fa-fw"></i>&nbsp;Power (Pie)
</a> </a>
</li> </li>
<li id="chart-hrpie"> <li id="chart-hrpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/3/"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/3/">
<i class="fas fa-heartbeat fa-fw"></i>&nbsp;Heart Rate (Pie) <i class="fas fa-heartbeat fa-fw"></i>&nbsp;Heart Rate (Pie)
</a> </a>
</li> </li>
{% if workout|water %} {% if workout|water %}
<li id="chart-otwpower"> <li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/addstatic/9/"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/9/">
<i class="fas fa-chart-area fa-fw"></i>&nbsp;OTW Power <i class="fas fa-chart-area fa-fw"></i>&nbsp;OTW Power
</a> </a>
</li> </li>
@@ -136,7 +135,7 @@
Connect to Concept2 Connect to Concept2
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/c2uploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/c2uploadw/">
Concept2 Concept2
</a> </a>
{% endif %} {% endif %}
@@ -151,7 +150,7 @@
Connect to Strava Connect to Strava
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/stravauploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/stravauploadw/">
Strava Strava
</a> </a>
{% endif %} {% endif %}
@@ -166,7 +165,7 @@
Connect to SportTracks Connect to SportTracks
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/sporttracksuploadw/">
SportTracks SportTracks
</a> </a>
{% endif %} {% endif %}
@@ -181,7 +180,7 @@
Connect to Runkeeper Connect to Runkeeper
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/runkeeperuploadw/">
Runkeeper Runkeeper
</a> </a>
{% endif %} {% endif %}
@@ -196,7 +195,7 @@
Connect to MapMyFitness Connect to MapMyFitness
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/underarmouruploadw/">
MapMyFitness MapMyFitness
</a> </a>
{% endif %} {% endif %}
@@ -211,23 +210,23 @@
Connect to TrainingPeaks Connect to TrainingPeaks
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/tpuploadw/"> <a href="/rowers/workout/{{ workout.id|encode }}/tpuploadw/">
TrainingPeaks TrainingPeaks
</a> </a>
{% endif %} {% endif %}
</li> </li>
<li id="export-csv"> <li id="export-csv">
<a href="/rowers/workout/{{ workout.id }}/emailcsv/"> <a href="/rowers/workout/{{ workout.id|encode }}/emailcsv/">
CSV CSV
</a> </a>
</li> </li>
<li id="export-gpx"> <li id="export-gpx">
<a href="/rowers/workout/{{ workout.id }}/emailgpx/"> <a href="/rowers/workout/{{ workout.id|encode }}/emailgpx/">
GPX GPX
</a> </a>
</li> </li>
<li id="export-tcx"> <li id="export-tcx">
<a href="/rowers/workout/{{ workout.id }}/emailtcx/"> <a href="/rowers/workout/{{ workout.id|encode }}/emailtcx/">
TCX TCX
</a> </a>
</li> </li>
@@ -238,27 +237,27 @@
<label for="group-data">Data</label> <label for="group-data">Data</label>
<ul> <ul>
<li id="data-smoothen"> <li id="data-smoothen">
<a href="/rowers/workout/{{ workout.id }}/smoothenpace/"> <a href="/rowers/workout/{{ workout.id|encode }}/smoothenpace/">
<i class="fas fa-magic fa-fw"></i>&nbsp;Smoothen <i class="fas fa-magic fa-fw"></i>&nbsp;Smoothen
</a> </a>
</li> </li>
<li id="data-raw"> <li id="data-raw">
<a href="/rowers/workout/{{ workout.id }}/undosmoothenpace/"> <a href="/rowers/workout/{{ workout.id|encode }}/undosmoothenpace/">
<i class="fas fa-undo fa-fw"></i>&nbsp;Restore Raw <i class="fas fa-undo fa-fw"></i>&nbsp;Restore Raw
</a> </a>
</li> </li>
<li id="data-fusion"> <li id="data-fusion">
<a href="/rowers/workout/fusion/{{ workout.id }}/"> <a href="/rowers/workout/fusion/{{ workout.id|encode }}/">
<i class="fas fa-blender fa-fw"></i>&nbsp;Sensor Fusion <i class="fas fa-blender fa-fw"></i>&nbsp;Sensor Fusion
</a> </a>
</li> </li>
<li id="data-split"> <li id="data-split">
<a href="/rowers/workout/{{ workout.id }}/split/"> <a href="/rowers/workout/{{ workout.id|encode }}/split/">
<i class="fas fa-cut fa-fw"></i>&nbsp;Split Workout <i class="fas fa-cut fa-fw"></i>&nbsp;Split Workout
</a> </a>
</li> </li>
<li id="data-view"> <li id="data-view">
<a href="/rowers/workout/{{ workout.id }}/data/"> <a href="/rowers/workout/{{ workout.id|encode }}/data/">
<i class="fal fa-table fa-fw"></i>&nbsp;Explore Raw Data <i class="fal fa-table fa-fw"></i>&nbsp;Explore Raw Data
</a> </a>
</ul> </ul>
@@ -269,28 +268,28 @@
<ul> <ul>
{% if workout|water %} {% if workout|water %}
<li id="advanced-wind"> <li id="advanced-wind">
<a href="/rowers/workout/{{ workout.id }}/wind/"> <a href="/rowers/workout/{{ workout.id|encode }}/wind/">
<i class="fas fa-pennant fa-fw"></i>&nbsp;Wind <i class="fas fa-pennant fa-fw"></i>&nbsp;Wind
</a> </a>
</li> </li>
<li id="advanced-stream"> <li id="advanced-stream">
<a href="/rowers/workout/{{ workout.id }}/stream/"> <a href="/rowers/workout/{{ workout.id|encode }}/stream/">
<i class="fas fa-stream fa-fw"></i>&nbsp;Stream <i class="fas fa-stream fa-fw"></i>&nbsp;Stream
</a> </a>
</li> </li>
<li id="advanced-otwpower"> <li id="advanced-otwpower">
<a href="/rowers/workout/{{ workout.id }}/otwsetpower/"> <a href="/rowers/workout/{{ workout.id|encode }}/otwsetpower/">
<i class="fas fa-calculator-alt fa-fw"></i>&nbsp;OTW Power <i class="fas fa-calculator-alt fa-fw"></i>&nbsp;OTW Power
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li id="advanced-instroke"> <li id="advanced-instroke">
<a href="/rowers/workout/{{ workout.id }}/instroke/"> <a href="/rowers/workout/{{ workout.id|encode }}/instroke/">
<i class="fas fa-search-plus fa-fw"></i>&nbsp;In-Stroke Metrics <i class="fas fa-search-plus fa-fw"></i>&nbsp;In-Stroke Metrics
</a> </a>
</li> </li>
<li id="advanced-recalcsummary"> <li id="advanced-recalcsummary">
<a href="/rowers/workout/{{ workout.id }}/recalcsummary/"> <a href="/rowers/workout/{{ workout.id|encode }}/recalcsummary/">
<i class="fas fa-window-restore fa-fw"></i>&nbsp;Update Summary <i class="fas fa-window-restore fa-fw"></i>&nbsp;Update Summary
</a> </a>
</li> </li>
+1 -1
View File
@@ -97,7 +97,7 @@
<td> {{ workout.averagehr }} </td> <td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td> <td> {{ workout.maxhr }} </td>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/edit/">{{ workout.name }}</a> </td> <a href="/rowers/workout/{{ workout.id|encode }}/edit/">{{ workout.name }}</a> </td>
</tr> </tr>
+10 -10
View File
@@ -19,17 +19,17 @@
{% endif %} {% endif %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/advanced">Advanced Edit</a>
</p> </p>
</div> </div>
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/export">Export</a>
</p> </p>
</div> </div>
@@ -48,7 +48,7 @@
</tr> </tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</table> </table>
</div> </div>
@@ -58,7 +58,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/wind">Edit Wind Data</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/wind">Edit Wind Data</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/about">Edit Wind Data</a> <a class="button blue small" href="/rowers/about">Edit Wind Data</a>
{% endif %} {% endif %}
@@ -71,7 +71,7 @@
<div class="grid_2"> <div class="grid_2">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/stream">Edit Stream Data</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/stream">Edit Stream Data</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/about">Edit Stream Data</a> <a class="button blue small" href="/rowers/about">Edit Stream Data</a>
{% endif %} {% endif %}
@@ -84,7 +84,7 @@
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/otwsetpower">OTW Power</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/otwsetpower">OTW Power</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/about">OTW Power</a> <a class="button blue small" href="/rowers/about">OTW Power</a>
{% endif %} {% endif %}
@@ -101,7 +101,7 @@
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user|is_promember %} {% if user|is_promember %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveotwplot">Corrected Pace Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/interactiveotwplot">Corrected Pace Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/about">Corrected Pace Plot</a> <a class="button blue small" href="/rowers/about">Corrected Pace Plot</a>
{% endif %} {% endif %}
@@ -113,7 +113,7 @@
</div> </div>
<div class="grid_2 suffix_2 omega"> <div class="grid_2 suffix_2 omega">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveplot">Big Interactive Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/interactiveplot">Big Interactive Plot</a>
</p> </p>
<p> <p>
See (and save) the big interactive plot See (and save) the big interactive plot
@@ -128,7 +128,7 @@
{% else %} {% else %}
<div class="grid_2"> <div class="grid_2">
{% endif %} {% endif %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/instroke/{{ metric }}">{{ metric }}</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/instroke/{{ metric }}">{{ metric }}</a>
</div> </div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
+2 -2
View File
@@ -91,12 +91,12 @@
<tr> <tr>
<td> {{ workout.distance }} m</td> <td> {{ workout.distance }} m</td>
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
<td> {{ avgpower|lookup:workout.id }} W</td> <td> {{ avgpower|lookup:workout.id|encode }} W</td>
<td> {{ workout.date }} </td> <td> {{ workout.date }} </td>
<td> {{ workout.averagehr }} </td> <td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td> <td> {{ workout.maxhr }} </td>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/edit/">{{ workout.name }}</a> </td> <a href="/rowers/workout/{{ workout.id|encode }}/edit/">{{ workout.name }}</a> </td>
</tr> </tr>
+2 -2
View File
@@ -26,11 +26,11 @@
</p> </p>
<p> <p>
<a href="/rowers/workout/{{ workout.id }}/wind">Set wind strength and direction</a> <a href="/rowers/workout/{{ workout.id|encode }}/wind">Set wind strength and direction</a>
</p> </p>
<p> <p>
<a href="/rowers/workout/{{ workout.id }}/stream"> <a href="/rowers/workout/{{ workout.id|encode }}/stream">
Set river stream strength Set river stream strength
</a> </a>
</p> </p>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/advanced">Advanced</a>
</p> </p>
</div> </div>
+2 -2
View File
@@ -14,12 +14,12 @@
</tr><tr> </tr><tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
</td> </td>
</tr><tr> </tr><tr>
<th>Comments</th> <th>Comments</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a> <a href="/rowers/workout/{{ workout.id|encode }}/comment">Comment ({{ aantalcomments }})</a>
</td> </td>
</tr> </tr>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button red small" href="/rowers/workout/{{ workout.id }}/deleteconfirm">Delete</a> <a class="button red small" href="/rowers/workout/{{ workout.id|encode }}/delete">Delete</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/editintervals">Edit Intervals</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/stream">Edit Stream Data</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/stream">Edit Stream Data</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/wind">Edit Wind Data</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/wind">Edit Wind Data</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export Workout</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/export">Export Workout</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/flexchart">Flex Chart</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/flexchart">Flex Chart</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/map">Map View</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/map">Map View</a>
</p> </p>
</div> </div>
+4 -3
View File
@@ -1,12 +1,13 @@
{% load rowerfilters %}
<p> <p>
<div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-layout="button" data-size="small" data-mobile-iframe="false"> <div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}" data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a> <a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id|encode }}">Share</a>
</div> </div>
</p> </p>
<p> <p>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-url="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</p> </p>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/otwsetpower">OTW Power</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/otwsetpower">OTW Power</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,6 +1,7 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/updatecp"> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/updatecp">
Make Ranking Piece</a> Make Ranking Piece</a>
</p> </p>
</div> </div>
+1 -1
View File
@@ -6,7 +6,7 @@
<tr> <tr>
<th>Comments</th> <th>Comments</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a> <a href="/rowers/workout/{{ workout.id|encode }}/comment">Comment ({{ aantalcomments }})</a>
</td> </td>
</tr> </tr>
+4 -3
View File
@@ -1,13 +1,14 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-layout="button" data-size="small" data-mobile-iframe="false"> <div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}" data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a> <a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id|encode }}">Share</a>
</div> </div>
</div> </div>
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p>&nbsp;</p> <p>&nbsp;</p>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-url="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</div> </div>
+5 -4
View File
@@ -1,23 +1,24 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<h2>Create Charts</h2> <h2>Create Charts</h2>
</div> </div>
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addtimeplot">Add Time Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/addtimeplot">Add Time Plot</a>
</p> </p>
</div> </div>
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/adddistanceplot">Add Distance Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/adddistanceplot">Add Distance Plot</a>
</p> </p>
</div> </div>
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addpiechart">Add HR Pie Chart</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/addpiechart">Add HR Pie Chart</a>
</p> </p>
</div> </div>
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addpowerpiechart">Add Power Pie Chart</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/addpowerpiechart">Add Power Pie Chart</a>
</p> </p>
</div> </div>
+2 -1
View File
@@ -1,3 +1,4 @@
{% load rowerfilters %}
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/stats">Workout Stats</a> <a class="button gray small" href="/rowers/workout/{{ workout.id|encode }}/stats">Workout Stats</a>
</p> </p>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/image">Attach Image</a> <a class="button blue small" href="/rowers/workout/{{ workout.id|encode }}/image">Attach Image</a>
</p> </p>
</div> </div>
+4 -4
View File
@@ -150,20 +150,20 @@
{% if workout.user.user == user or user == team.manager %} {% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}> <a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }} {{ workout.name }}
</a> </a>
</td> </td>
{% else %} {% else %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name <a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td> </a></td>
{% endif %} {% endif %}
{% else %} {% else %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">{{ workout.name }}</a></td>
{% else %} {% else %}
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">No Name</a> </td>
{% endif %} {% endif %}
{% endif %} {% endif %}
<td> {{ workout.workouttype }} </td> <td> {{ workout.workouttype }} </td>
+6 -4
View File
@@ -111,20 +111,21 @@
{% if workout.user.user == user or user == team.manager %} {% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}> <a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }} {{ workout.name }}
</a> </a>
</td> </td>
{% else %} {% else %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name <a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td> </a></td>
{% endif %} {% endif %}
{% else %} {% else %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">{{ workout.name }}</a></td>
{% else %} {% else %}
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">No Name</a> </td>
{% endif %} {% endif %}
{% endif %} {% endif %}
<td> {{ workout.workouttype }} </td> <td> {{ workout.workouttype }} </td>
@@ -138,6 +139,7 @@
</table> </table>
</li> </li>
{% endif %} {% endif %}
+2 -2
View File
@@ -81,7 +81,7 @@
<td> {{ workout.date|date:"Y-m-d" }} </td> <td> {{ workout.date|date:"Y-m-d" }} </td>
<td> <td>
<div class="tooltip"> <div class="tooltip">
<a href="{% url manager.defaultlandingpage id=workout.id %}"> <a href="{% url manager.defaultlandingpage id=workout.id|encode %}">
{{ workout.name }} {{ workout.name }}
</a> </a>
<span class="tooltiptext">{{ workout.notes }}</span> <span class="tooltiptext">{{ workout.notes }}</span>
@@ -90,7 +90,7 @@
<td> {{ workout.distance }}m</td> <td> {{ workout.distance }}m</td>
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
<td> <td>
<a href="/rowers/sessions/{{ psdict.id.1 }}/detach/{{ workout.id }}/">Detach</a> <a href="/rowers/sessions/{{ psdict.id.1 }}/detach/{{ workout.id|encode }}/">Detach</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
+1 -1
View File
@@ -73,7 +73,7 @@
<td> {{ workout.averagehr }} </td> <td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td> <td> {{ workout.maxhr }} </td>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/edit/"> <a href="/rowers/workout/{{ workout.id|encode }}/edit/">
{{ workout.name }} {{ workout.name }}
</a> </a>
</td> </td>
+3 -3
View File
@@ -52,16 +52,16 @@
<li> <li>
{% if user.is_authenticated and user == rower.user %} {% if user.is_authenticated and user == rower.user %}
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ graph.workout.id }}/edit">Edit Workout</a> <a class="button gray small" href="/rowers/workout/{{ graph.workout.id|encode }}/edit">Edit Workout</a>
</p> </p>
{% else %} {% else %}
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ graph.workout.id }}">See Workout</a> <a class="button gray small" href="/rowers/workout/{{ graph.workout.id|encode }}">See Workout</a>
</p> </p>
{% endif %} {% endif %}
{% if user.is_authenticated and user == rower.user %} {% if user.is_authenticated and user == rower.user %}
<p> <p>
<a class="button gray small" href="/rowers/workout/{{ graph.workout.id }}/workflow">Workflow View</a> <a class="button gray small" href="/rowers/workout/{{ graph.workout.id|encode }}/workflow">Workflow View</a>
</p> </p>
{% else %} {% else %}
<p>&nbsp;</p> <p>&nbsp;</p>
+2 -2
View File
@@ -12,7 +12,7 @@
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
<p> <p>
<form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id }}/split/" method="post"> <form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id|encode }}/split/" method="post">
<table width=100%> <table width=100%>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
@@ -42,7 +42,7 @@
</tr><tr> </tr><tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</tr> </tr>
</table> </table>
+6 -6
View File
@@ -30,7 +30,7 @@
</tr><tr> </tr><tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}/">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
<td> <td>
</tr> </tr>
</table> </table>
@@ -38,7 +38,7 @@
<p> <p>
See the how-to <a href="#howto">at the bottom of this page</a> for details on how to use this form. See the how-to <a href="#howto">at the bottom of this page</a> for details on how to use this form.
</p> </p>
<form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id }}/editintervals/" method="post"> <form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id|encode }}/editintervals/" method="post">
<table width=100%> <table width=100%>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
@@ -73,7 +73,7 @@
</li> </li>
<li class="grid_2"> <li class="grid_2">
<h1>Updated Summary</h1> <h1>Updated Summary</h1>
<form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id }}/editintervals/" method="post"> <form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id|encode }}/editintervals/" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="{{ savebutton }}" value="{{ intervalstring }}"> <input type="hidden" name="{{ savebutton }}" value="{{ intervalstring }}">
<input type="hidden" name="nrintervals" value={{ nrintervals }}> <input type="hidden" name="nrintervals" value={{ nrintervals }}>
@@ -84,12 +84,12 @@
{{ field.as_hidden }} {{ field.as_hidden }}
{% endfor %} {% endfor %}
<p> <p>
<input class="button green" type="submit" value="Save"> <input type="submit" value="Save">
</p> </p>
<span> <span>
<a href="">Reset to last saved</a> <a href="">Reset to last saved</a>
&nbsp; &nbsp;
<a href="/rowers/workout/{{ workout.id }}/restore/">Restore Original data</a> <a href="/rowers/workout/{{ workout.id|encode }}/restore/">Restore Original data</a>
</span> </span>
</form> </form>
<p> <p>
@@ -101,7 +101,7 @@
<li class="grid_2"> <li class="grid_2">
<h1>Detailed Summary Edit</h1> <h1>Detailed Summary Edit</h1>
<p>This is still experimental and there are known bugs. Use at your own risk. Nothing is stored permanently until you hit Save in the Updated Summary section. You can use the restore original button to restore the original values.</p> <p>This is still experimental and there are known bugs. Use at your own risk. Nothing is stored permanently until you hit Save in the Updated Summary section. You can use the restore original button to restore the original values.</p>
<form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id }}/editintervals/" method="post"> <form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id|encode }}/editintervals/" method="post">
<table width=100%> <table width=100%>
<thead> <thead>
<tr> <tr>
+1 -1
View File
@@ -64,7 +64,7 @@
{{ inviteform.as_table }} {{ inviteform.as_table }}
</table> </table>
{% csrf_token %} {% csrf_token %}
<input class="button green" type="submit" value="Submit"> <input type="submit" value="Submit">
</form> </form>
{% else %} {% else %}
<p> <p>
+1 -1
View File
@@ -14,7 +14,7 @@
You can read the comment here: You can read the comment here:
</p> </p>
<p> <p>
<a href="{{ siteurl }} {{ commentlink }}"> <a href="{{ siteurl }}{{ commentlink }}">
{{ siteurl }}{{ commentlink }}</a> {{ siteurl }}{{ commentlink }}</a>
</p> </p>
+2 -2
View File
@@ -41,9 +41,9 @@
<li> <li>
<p>Closest Airport Weather: {{ airport }} <p>Closest Airport Weather: {{ airport }}
({{ airportdistance | floatformat:-1 }} km) ({{ airportdistance | floatformat:-1 }} km)
<a class="button green small" href="/rowers/workout/{{ workout.id }}/metar/{{ airport }}/">Airport Data</a></p> <a class="button green small" href="/rowers/workout/{{ workout.id|encode }}/metar/{{ airport }}/">Airport Data</a></p>
<p> <p>
<a class="button green small" href="/rowers/workout/{{ workout.id }}/darkskywind/">Dark Sky Data</a> <a class="button green small" href="/rowers/workout/{{ workout.id|encode }}/darkskywind/">Dark Sky Data</a>
<p> <p>
Download wind speed and bearing from <a href="http://forecast.io/">The Dark Sky</a> Download wind speed and bearing from <a href="http://forecast.io/">The Dark Sky</a>
</p> </p>
+3 -2
View File
@@ -28,12 +28,13 @@
<script> <script>
$(function($) { $(function($) {
console.log('loading script'); console.log('loading script');
var workoutid = {{ workout.id }}; var workoutid = '{{ workout.id|encode }}';
console.log(workoutid);
var shownotes = true; var shownotes = true;
if("{{ rower.showfavoritechartnotes }}" == "False") { if("{{ rower.showfavoritechartnotes }}" == "False") {
shownotes = false; shownotes = false;
} }
$.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/workout/{{ workout.id }}/get-thumbnails/', function(json) { $.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/workout/{{ workout.id|encode }}/get-thumbnails/', function(json) {
var counter=0; var counter=0;
$("#id_sitready").remove(); $("#id_sitready").remove();
$("#id_thumbs").append( $("#id_thumbs").append(
+2 -1
View File
@@ -1,8 +1,9 @@
{% load rowerfilters %}
{% for chart in charts %} {% for chart in charts %}
<div class="grid_3 alpha"> <div class="grid_3 alpha">
<big>{{ forloop.counter }}</big> <big>{{ forloop.counter }}</big>
<div class="grid_3 tooltip"> <div class="grid_3 tooltip">
<a href="/rowers/workout/{{ workout.id }}/flexchart?favoritechart={{ forloop.counter |add:"-1" }}"> <a href="/rowers/workout/{{ workout.id|encode }}/flexchart?favoritechart={{ forloop.counter |add:"-1" }}">
{{ chart.div | safe }} {{ chart.div | safe }}
</a> </a>
{% if rower.showfavoritechartnotes %} {% if rower.showfavoritechartnotes %}
+2 -2
View File
@@ -38,7 +38,7 @@
</tr><tr> </tr><tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/">https://rowsandall.com/rowers/workout/{{ workout.id }}/</a> <a href="/rowers/workout/{{ workout.id|encode }}/">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/</a>
<td> <td>
</tr> </tr>
</table> </table>
@@ -56,7 +56,7 @@
</div> </div>
</p> </p>
{% endfor %} {% endfor %}
<form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id }}/comment/" method="post"> <form enctype="multipart/form-data" action="/rowers/workout/{{ workout.id|encode }}/comment/" method="post">
<table width=100%> <table width=100%>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
+5 -5
View File
@@ -57,15 +57,15 @@ $('#id_workouttype').change();
<li class="grid_4"> <li class="grid_4">
<p> <p>
<div class="fb-share-button" <div class="fb-share-button"
data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}/" data-href="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/"
data-layout="button" data-size="small" data-mobile-iframe="false"> data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a> <a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id|encode }}">Share</a>
</div> </div>
</p> </p>
<p> <p>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-url="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</p> </p>
<table width=100%> <table width=100%>
@@ -86,7 +86,7 @@ $('#id_workouttype').change();
</tr><tr> </tr><tr>
<th>Public link to this workout:</th> <th>Public link to this workout:</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/">https://rowsandall.com/rowers/workout/{{ workout.id }}/</a> <a href="/rowers/workout/{{ workout.id|encode }}/">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/</a>
</td> </td>
</tr> </tr>
</table> </table>
@@ -123,7 +123,7 @@ $('#id_workouttype').change();
<h1>Racing</h1> <h1>Racing</h1>
{% for race in indoorraces %} {% for race in indoorraces %}
<p> <p>
<a href="/rowers/virtualevent/{{ race.id }}/submit/{{ workout.id }}/">Submit this to Indoor Race {{ race.name }}</a> <a href="/rowers/virtualevent/{{ race.id }}/submit/{{ workout.id|encode }}/">Submit this to Indoor Race {{ race.name }}</a>
</p> </p>
{% endfor %} {% endfor %}
</li> </li>
+4 -4
View File
@@ -56,10 +56,10 @@
{% endif %} {% endif %}
<p> <p>
<div class="fb-share-button" <div class="fb-share-button"
data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-href="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-layout="button" data-size="small" data-mobile-iframe="false"> data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" <a class="fb-xfbml-parse-ignore" target="_blank"
href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}"> href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id|encode }}">
Share Share
</a> </a>
</div> </div>
@@ -67,7 +67,7 @@
<p> <p>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-url="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</p> </p>
<table width=100%> <table width=100%>
@@ -94,7 +94,7 @@
<tr> <tr>
<th>Comments</th> <th>Comments</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}/comment/">Comment ({{ aantalcomments }})</a> <a href="/rowers/workout/{{ workout.id|encode }}/comment/">Comment ({{ aantalcomments }})</a>
</td> </td>
</tr> </tr>
{% endif %} {% endif %}
+10 -2
View File
@@ -26,8 +26,12 @@ from rowers.utils import NoTokenError
import rowers.payments as payments import rowers.payments as payments
from rowers.opaque import encoder
import arrow import arrow
def strfdelta(tdelta): def strfdelta(tdelta):
minutes,seconds = divmod(tdelta.seconds,60) minutes,seconds = divmod(tdelta.seconds,60)
tenths = int(tdelta.microseconds/1e5) tenths = int(tdelta.microseconds/1e5)
@@ -81,6 +85,10 @@ def aantalcomments(workout):
return aantalcomments return aantalcomments
@register.filter
def encode(id):
return str(encoder.encode_hex(id))
@register.filter @register.filter
def water(workout): def water(workout):
try: try:
@@ -567,7 +575,7 @@ def nextworkout(workout,user):
return 0 return 0
if ws: if ws:
return ws[0].id return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0
@@ -598,7 +606,7 @@ def previousworkout(workout,user):
if ws: if ws:
return ws[0].id return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0
+3
View File
@@ -1,6 +1,9 @@
import pytest import pytest
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
from rowers.opaque import encoder
encoded1 = str(encoder.encode_hex(1))
encoded2 = str(encoder.encode_hex(2))
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import re import re
+4
View File
@@ -84,6 +84,7 @@ faker = Factory.create()
from rowers.utils import calculate_age from rowers.utils import calculate_age
from rowers.tasks import handle_getagegrouprecords from rowers.tasks import handle_getagegrouprecords
from rowers.opaque import encoder
import inspect import inspect
@@ -211,5 +212,8 @@ def cleanup(request):
pass pass
request.addfinalizer(remove_test_files) request.addfinalizer(remove_test_files)
+3 -2
View File
@@ -37,7 +37,7 @@ class WorkoutCompareTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = '/rowers/team-compare-select/workout/1/team/0/user/1/' url = '/rowers/team-compare-select/workout/'+encoded1+'/team/0/user/1/'
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -299,7 +299,8 @@ class ForcecurveTest(TestCase):
login = self.c.login(username=self.u.username, password = self.password) login = self.c.login(username=self.u.username, password = self.password)
self.assertTrue(login) self.assertTrue(login)
url = '/rowers/workout/1/forcecurve/' encoded1 = str(encoder.encode_hex(1))
url = '/rowers/workout/'+encoded1+'/forcecurve/'
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
+27 -24
View File
@@ -125,7 +125,7 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_forcecurve_view',kwargs={'id':self.wwater.id}) url = reverse('workout_forcecurve_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -186,7 +186,7 @@ class WorkoutViewTest(TestCase):
expected_url = reverse(self.r.defaultlandingpage, expected_url = reverse(self.r.defaultlandingpage,
kwargs = { kwargs = {
'id':12 'id':encoder.encode_hex(12)
}) })
self.assertRedirects(response, self.assertRedirects(response,
@@ -209,7 +209,7 @@ class WorkoutViewTest(TestCase):
response = self.c.get('/') response = self.c.get('/')
url = reverse('multi_compare_view',kwargs={ url = reverse('multi_compare_view',kwargs={
'userid':self.u.id, 'userid':self.u.id,
'id':self.werg1.id, 'id':encoder.encode_hex(self.werg1.id),
}) })
print url print url
@@ -241,13 +241,13 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_view',kwargs={'id':self.wwater.id}) url = reverse('workout_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
url = reverse('workout_downloadmetar_view',kwargs={ url = reverse('workout_downloadmetar_view',kwargs={
'id': self.wwater.id, 'id': encoder.encode_hex(self.wwater.id),
'airportcode': 'LKHO' 'airportcode': 'LKHO'
} }
) )
@@ -256,7 +256,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
url = reverse('workout_downloadwind_view',kwargs={ url = reverse('workout_downloadwind_view',kwargs={
'id': self.wwater.id, 'id': encoder.encode_hex(self.wwater.id),
} }
) )
@@ -270,14 +270,14 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_smoothenpace_view',kwargs={'id':self.wwater.id}) url = reverse('workout_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url,follow=True) response = self.c.get(url,follow=True)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
expected_url = reverse(self.r.defaultlandingpage, expected_url = reverse(self.r.defaultlandingpage,
kwargs = { kwargs = {
'id':self.wwater.id 'id':encoder.encode_hex(self.wwater.id)
} }
) )
@@ -285,14 +285,14 @@ class WorkoutViewTest(TestCase):
expected_url=expected_url, expected_url=expected_url,
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
url = reverse('workout_undo_smoothenpace_view',kwargs={'id':self.wwater.id}) url = reverse('workout_undo_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url,follow=True) response = self.c.get(url,follow=True)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
expected_url = reverse(self.r.defaultlandingpage, expected_url = reverse(self.r.defaultlandingpage,
kwargs = { kwargs = {
'id':self.wwater.id 'id':encoder.encode_hex(self.wwater.id)
} }
) )
@@ -308,7 +308,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_wind_view',kwargs={'id':self.wwater.id}) url = reverse('workout_wind_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -336,7 +336,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_stream_view',kwargs={'id':self.wwater.id}) url = reverse('workout_stream_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -363,7 +363,7 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('instroke_view',kwargs={'id':self.winstroke.id}) url = reverse('instroke_view',kwargs={'id':encoder.encode_hex(self.winstroke.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -380,7 +380,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_otwsetpower_view',kwargs={'id':self.wwater.id}) url = reverse('workout_otwsetpower_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -397,7 +397,7 @@ class WorkoutViewTest(TestCase):
response = self.c.post(url,form_data,follow=True) response = self.c.post(url,form_data,follow=True)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
expected_url = reverse('workout_edit_view',kwargs={'id':self.wwater.id}) expected_url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
self.assertRedirects(response, self.assertRedirects(response,
expected_url=expected_url, expected_url=expected_url,
@@ -410,7 +410,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_comment_view',kwargs={'id':self.wwater.id}) url = reverse('workout_comment_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -425,7 +425,7 @@ class WorkoutViewTest(TestCase):
response = self.c.post(url,form_data,follow=True) response = self.c.post(url,form_data,follow=True)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
url = reverse('workout_unsubscribe_view',kwargs={'id':self.wwater.id}) url = reverse('workout_unsubscribe_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -436,7 +436,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_map_view',kwargs={'id':self.wwater.id}) url = reverse('workout_map_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -448,7 +448,8 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_uploadimage_view',kwargs={'id':self.werg1.id}) url = reverse('workout_uploadimage_view',
kwargs={'id':encoder.encode_hex(self.werg1.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -466,7 +467,8 @@ class WorkoutViewTest(TestCase):
response = self.c.post(url,form_data,format='multipart',follow=True) response = self.c.post(url,form_data,format='multipart',follow=True)
expected_url = reverse(self.r.defaultlandingpage,kwargs={'id':self.werg1.id}) expected_url = reverse(self.r.defaultlandingpage,
kwargs={'id':encoder.encode_hex(self.werg1.id)})
self.assertRedirects(response, self.assertRedirects(response,
expected_url=expected_url, expected_url=expected_url,
@@ -480,7 +482,7 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_split_view',kwargs={'id':self.werg1.id}) url = reverse('workout_split_view',kwargs={'id':encoder.encode_hex(self.werg1.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -505,8 +507,9 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_fusion_view',kwargs={'id1':self.werg2.id, url = reverse('workout_fusion_view',
'id2':self.werg2copy.id}) kwargs={'id1':encoder.encode_hex(self.werg2.id),
'id2':encoder.encode_hex(self.werg2copy.id)})
response = self.c.get(url) response = self.c.get(url)
@@ -534,7 +537,7 @@ class WorkoutViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_summary_edit_view',kwargs={'id':self.wwater.id}) url = reverse('workout_summary_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
+1 -1
View File
@@ -213,7 +213,7 @@ class CPChartTest(TestCase):
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/{id}/edit/'.format( expected_url='/rowers/workout/{id}/edit/'.format(
id=workout_expected_id), id=encoder.encode_hex(workout_expected_id)),
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
# add some tests of complex form data (no hr, no spm, zero spm, etc) # add some tests of complex form data (no hr, no spm, zero spm, etc)
+2 -1
View File
@@ -53,9 +53,10 @@ class EmpowerTest(TestCase):
def test_workflow_map_view(self, mocked_sqlalchemy): def test_workflow_map_view(self, mocked_sqlalchemy):
login = self.c.login(username='john',password='koeinsloot') login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login) self.assertTrue(login)
encodedid = str(encoder.encode_hex(self.wote.id))
url = '/rowers/workout/{id}/workflow/'.format( url = '/rowers/workout/{id}/workflow/'.format(
id = self.wote.id id = encodedid
) )
response = self.c.get(url) response = self.c.get(url)
+6 -4
View File
@@ -103,7 +103,8 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_flexchart3_view',kwargs={'id':self.wwater.id}) url = reverse('workout_flexchart3_view',
kwargs={'id':encoder.encode_hex(self.wwater.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -126,7 +127,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
url = reverse('workout_flexchart3_view',kwargs={ url = reverse('workout_flexchart3_view',kwargs={
'id':self.wwater.id, 'id':encoder.encode_hex(self.wwater.id),
'xparam':'distance', 'xparam':'distance',
'yparam1':'hr', 'yparam1':'hr',
'yparam2':'power' 'yparam2':'power'
@@ -150,7 +151,8 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
url = reverse('workout_flexchart3_view',kwargs={'id':self.werg1.id}) url = reverse('workout_flexchart3_view',
kwargs={'id':encoder.encode_hex(self.werg1.id)})
response = self.c.get(url) response = self.c.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
@@ -168,7 +170,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)
url = reverse('workout_flexchart3_view',kwargs={ url = reverse('workout_flexchart3_view',kwargs={
'id':self.werg1.id, 'id':encoder.encode_hex(self.werg1.id),
'xparam':'distance', 'xparam':'distance',
'yparam1':'hr', 'yparam1':'hr',
'yparam2':'power' 'yparam2':'power'
+27 -21
View File
@@ -2,6 +2,7 @@
from statements import * from statements import *
nu = datetime.datetime.now() nu = datetime.datetime.now()
import rowers import rowers
@pytest.mark.django_db @pytest.mark.django_db
@@ -78,13 +79,13 @@ class C2Objects(DjangoTestCase):
@patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
def test_c2_upload(self, mock_get, mock_post): def test_c2_upload(self, mock_get, mock_post):
response = self.c.get('/rowers/workout/1/c2uploadw/') response = self.c.get('/rowers/workout/'+encoded1+'/c2uploadw/')
self.assertRedirects(response, self.assertRedirects(response,
expected_url = '/rowers/workout/1/edit/', expected_url = '/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.url, '/rowers/workout/1/edit/') self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
@patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
@@ -101,7 +102,7 @@ class C2Objects(DjangoTestCase):
response = self.c.get('/rowers/workout/c2import/12/',follow=True) response = self.c.get('/rowers/workout/c2import/12/',follow=True)
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -307,7 +308,7 @@ class StravaObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/stravaimport/12',follow=True) response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=301,target_status_code=200) status_code=301,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -399,13 +400,13 @@ class STObjects(DjangoTestCase):
@patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests) @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests)
@patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests) @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
def test_sporttracks_upload(self, mock_get, mock_post): def test_sporttracks_upload(self, mock_get, mock_post):
response = self.c.get('/rowers/workout/1/sporttracksuploadw/') response = self.c.get('/rowers/workout/'+encoded1+'/sporttracksuploadw/')
self.assertRedirects(response, self.assertRedirects(response,
expected_url = '/rowers/workout/1/edit/', expected_url = '/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.url, '/rowers/workout/1/edit/') self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
@patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests) @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests)
@@ -420,7 +421,7 @@ class STObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True) response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -430,8 +431,11 @@ class STObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/sporttracksimport/13/',follow=True) response = self.c.get('/rowers/workout/sporttracksimport/13/',follow=True)
expected_url = reverse('workout_edit_view',
kwargs = {'id':encoder.encode_hex(2)})
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url=expected_url,
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -521,13 +525,13 @@ class RunKeeperObjects(DjangoTestCase):
@patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests) @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests)
@patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests) @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
def test_runkeeper_upload(self, mock_get, mock_post): def test_runkeeper_upload(self, mock_get, mock_post):
response = self.c.get('/rowers/workout/1/runkeeperuploadw/') response = self.c.get('/rowers/workout/'+encoded1+'/runkeeperuploadw/')
self.assertRedirects(response, self.assertRedirects(response,
expected_url = '/rowers/workout/1/edit/', expected_url = '/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.url, '/rowers/workout/1/edit/') self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
@patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests) @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests)
@@ -542,7 +546,7 @@ class RunKeeperObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True) response = self.c.get('/rowers/workout/runkeeperimport/12/',follow=True)
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -624,13 +628,13 @@ class UAObjects(DjangoTestCase):
@patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests) @patch('rowers.underarmourstuff.requests.post', side_effect=mocked_requests)
@patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests) @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
def test_underarmour_upload(self, mock_get, mock_post): def test_underarmour_upload(self, mock_get, mock_post):
response = self.c.get('/rowers/workout/1/underarmouruploadw/') response = self.c.get('/rowers/workout/'+encoded1+'/underarmouruploadw/')
self.assertRedirects(response, self.assertRedirects(response,
expected_url = '/rowers/workout/1/edit/', expected_url = '/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.url, '/rowers/workout/1/edit/') self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
@patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests) @patch('rowers.underarmourstuff.requests.get', side_effect=mocked_requests)
@@ -646,7 +650,7 @@ class UAObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True) response = self.c.get('/rowers/workout/underarmourimport/12/',follow=True)
self.assertRedirects(response, self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/', expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -727,13 +731,15 @@ class TPObjects(DjangoTestCase):
@patch('rowers.tpstuff.requests.post', side_effect=mocked_requests) @patch('rowers.tpstuff.requests.post', side_effect=mocked_requests)
@patch('rowers.tpstuff.requests.get', side_effect=mocked_requests) @patch('rowers.tpstuff.requests.get', side_effect=mocked_requests)
def test_tp_upload(self, mock_get, mock_post): def test_tp_upload(self, mock_get, mock_post):
response = self.c.get('/rowers/workout/1/tpuploadw/') url = '/rowers/workout/'+encoded1+'/tpuploadw/'
response = self.c.get(url)
self.assertRedirects(response, self.assertRedirects(response,
expected_url = '/rowers/workout/1/edit/', expected_url = '/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.url, '/rowers/workout/1/edit/') self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
+1 -1
View File
@@ -1575,7 +1575,7 @@ class PlannedSessionsView(TestCase):
url = '/rowers/sessions/{psid}/detach/{id}/'.format( url = '/rowers/sessions/{psid}/detach/{id}/'.format(
psid=self.ps_time.id, psid=self.ps_time.id,
id = self.w1.id, id = encoder.encode_hex(self.w1.id),
) )
response = self.c.get(url,follow=True) response = self.c.get(url,follow=True)
+1 -1
View File
@@ -74,7 +74,7 @@ class SimpleViewTest(TestCase):
def test_getworkout(self): def test_getworkout(self):
with assert_raises(Http404): with assert_raises(Http404):
w = get_workout(123) w = get_workout(encoder.encode_hex(123))
def test_deactivate(self): def test_deactivate(self):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
+30 -28
View File
@@ -56,28 +56,30 @@ class ViewTest(TestCase):
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/edit/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/histo/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/histo/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/', form_data, follow=True)
self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/workflow/',
response = self.c.get('/rowers/workout/'+encoded1+'/workflow/',
follow=True) follow=True)
response = self.c.get('/rowers/workout/1/get-thumbnails/', self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/'+encoded1+'/get-thumbnails/',
follow=True) follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -98,7 +100,7 @@ class ViewTest(TestCase):
} }
form = WorkoutForm(data=form_data) form = WorkoutForm(data=form_data)
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
response = self.c.post('/rowers/workout/1/edit/', form_data, follow=True) response = self.c.post('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -151,12 +153,12 @@ class ViewTest(TestCase):
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -193,7 +195,7 @@ class ViewTest(TestCase):
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -262,7 +264,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -273,7 +275,7 @@ class ViewTest(TestCase):
form_data = {} form_data = {}
form = CNsummaryForm(form_data,file_data) form = CNsummaryForm(form_data,file_data)
response = self.c.post('rowers/workout/1/crewnerdsummary', response = self.c.post('rowers/workout/'+encoded1+'/crewnerdsummary',
form_data, form_data,
follow=True) follow=True)
@@ -312,7 +314,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -349,7 +351,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -388,7 +390,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -424,7 +426,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -461,7 +463,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -500,7 +502,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() f.close()
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -536,7 +538,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -569,7 +571,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -602,7 +604,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -635,7 +637,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -669,7 +671,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -701,7 +703,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -733,7 +735,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -765,7 +767,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
self.assertRedirects(response, expected_url='/rowers/workout/1/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
+59 -55
View File
@@ -1,8 +1,9 @@
from __future__ import print_function #from __future__ import print_function
from statements import * from statements import *
nu = datetime.datetime.now() nu = datetime.datetime.now()
tested = [ tested = [
'/rowers/me/delete/' '/rowers/me/delete/'
] ]
@@ -152,21 +153,21 @@ class URLTests(TestCase):
'/rowers/sessions/2016-01-01/2016-12-31/', '/rowers/sessions/2016-01-01/2016-12-31/',
'/rowers/sessions/2016-01-01/2016-12-31/user/1/', '/rowers/sessions/2016-01-01/2016-12-31/user/1/',
'/rowers/sessions/coach/', '/rowers/sessions/coach/',
'/rowers/sessions/coach/user/1/', # '/rowers/sessions/coach/user/1/',
'/rowers/sessions/create/', '/rowers/sessions/create/',
'/rowers/sessions/create/user/1/', # '/rowers/sessions/create/user/1/',
'/rowers/sessions/manage/', '/rowers/sessions/manage/',
'/rowers/sessions/manage/user/1/', # '/rowers/sessions/manage/user/1/',
'/rowers/sessions/multiclone/', '/rowers/sessions/multiclone/',
'/rowers/sessions/multiclone/user/1/', # '/rowers/sessions/multiclone/user/1/',
'/rowers/sessions/multicreate/', '/rowers/sessions/multicreate/',
'/rowers/sessions/multicreate/user/1/', # '/rowers/sessions/multicreate/user/1/',
'/rowers/sessions/print/', '/rowers/sessions/print/',
'/rowers/sessions/print/user/1/', # '/rowers/sessions/print/user/1/',
'/rowers/sessions/teamcreate/', '/rowers/sessions/teamcreate/',
'/rowers/sessions/user/1/', # '/rowers/sessions/user/1/',
'/rowers/team-compare-select/', '/rowers/team-compare-select/',
'/rowers/team-compare-select/workout/1/', '/rowers/team-compare-select/workout/'+encoded1+'/',
'/rowers/team-compare-select/2016-01-01/2016-12-31/', '/rowers/team-compare-select/2016-01-01/2016-12-31/',
# '/rowers/test-job/2/', # '/rowers/test-job/2/',
# '/rowers/test-job2/2/', # '/rowers/test-job2/2/',
@@ -186,49 +187,48 @@ class URLTests(TestCase):
# '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31/', # '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31/',
# '/rowers/user-multiflex/', # '/rowers/user-multiflex/',
# '/rowers/user-multiflex/user/1/', # '/rowers/user-multiflex/user/1/',
'/rowers/workout/1/', '/rowers/workout/'+encoded1+'/',
'/rowers/workout/1/adddistanceplot/', '/rowers/workout/'+encoded1+'/adddistanceplot/',
'/rowers/workout/1/adddistanceplot2/', '/rowers/workout/'+encoded1+'/adddistanceplot2/',
'/rowers/workout/1/addotwpowerplot/', '/rowers/workout/'+encoded1+'/addotwpowerplot/',
'/rowers/workout/1/addpiechart/', '/rowers/workout/'+encoded1+'/addpiechart/',
'/rowers/workout/1/addpowerpiechart/', '/rowers/workout/'+encoded1+'/addpowerpiechart/',
'/rowers/workout/1/addstatic/', '/rowers/workout/'+encoded1+'/addstatic/',
'/rowers/workout/1/addstatic/3/', '/rowers/workout/'+encoded1+'/addstatic/3/',
'/rowers/workout/1/addtimeplot/', '/rowers/workout/'+encoded1+'/addtimeplot/',
'/rowers/workout/1/addtimeplot2/', '/rowers/workout/'+encoded1+'/addtimeplot2/',
'/rowers/workout/1/comment/', '/rowers/workout/'+encoded1+'/comment/',
'/rowers/workout/1/darkskywind/', '/rowers/workout/'+encoded1+'/darkskywind/',
'/rowers/workout/1/data/', '/rowers/workout/'+encoded1+'/data/',
'/rowers/workout/1/edit/', '/rowers/workout/'+encoded1+'/edit/',
'/rowers/workout/1/editintervals/', '/rowers/workout/'+encoded1+'/editintervals/',
'/rowers/workout/1/flexchart/', '/rowers/workout/'+encoded1+'/flexchart/',
'/rowers/workout/1/forcecurve/', '/rowers/workout/'+encoded1+'/forcecurve/',
'/rowers/workout/1/get-testscript/', '/rowers/workout/'+encoded1+'/get-testscript/',
'/rowers/workout/1/get-thumbnails/', '/rowers/workout/'+encoded1+'/get-thumbnails/',
'/rowers/workout/1/histo/', '/rowers/workout/'+encoded1+'/histo/',
'/rowers/workout/1/image/', '/rowers/workout/'+encoded1+'/image/',
'/rowers/workout/1/instroke/', '/rowers/workout/'+encoded1+'/instroke/',
'/rowers/workout/1/interactiveotwplot/', '/rowers/workout/'+encoded1+'/interactiveotwplot/',
'/rowers/workout/1/map/', '/rowers/workout/'+encoded1+'/map/',
'/rowers/workout/1/otwsetpower/', '/rowers/workout/'+encoded1+'/otwsetpower/',
'/rowers/workout/1/recalcsummary/', '/rowers/workout/'+encoded1+'/recalcsummary/',
'/rowers/workout/1/restore/', '/rowers/workout/'+encoded1+'/restore/',
'/rowers/workout/1/smoothenpace/', '/rowers/workout/'+encoded1+'/smoothenpace/',
'/rowers/workout/1/split/', '/rowers/workout/'+encoded1+'/split/',
'/rowers/workout/1/stats/', '/rowers/workout/'+encoded1+'/stats/',
'/rowers/workout/1/stream/', '/rowers/workout/'+encoded1+'/stream/',
# '/rowers/workout/1/task/', # '/rowers/workout/'+encoded1+'/task/',
'/rowers/workout/1/test_strokedata/', # '/rowers/workout/'+encoded1+'/teststrokedata/',
'/rowers/workout/1/toggle-ranking/', '/rowers/workout/'+encoded1+'/toggle-ranking/',
'/rowers/workout/1/undosmoothenpace/', '/rowers/workout/'+encoded1+'/undosmoothenpace/',
'/rowers/workout/1/unsubscribe/', '/rowers/workout/'+encoded1+'/unsubscribe/',
'/rowers/workout/1/updatecp/', '/rowers/workout/'+encoded1+'/updatecp/',
'/rowers/workout/1/view/', '/rowers/workout/'+encoded1+'/view/',
'/rowers/workout/1/wind/', '/rowers/workout/'+encoded1+'/wind/',
'/rowers/workout/1/workflow/', '/rowers/workout/'+encoded1+'/workflow/',
# '/rowers/workout/compare/1/2016-01-01/2016-12-31/', '/rowers/workout/fusion/'+encoded1+'/',
'/rowers/workout/fusion/1/', '/rowers/workout/fusion/'+encoded1+'/2016-01-01/2016-12-31/',
'/rowers/workout/fusion/1/2016-01-01/2016-12-31/',
'/rowers/workout/upload/', '/rowers/workout/upload/',
'/rowers/workout/upload/team/', '/rowers/workout/upload/team/',
'/rowers/workouts-join/', '/rowers/workouts-join/',
@@ -270,18 +270,22 @@ class URLTests(TestCase):
expected) expected)
html = BeautifulSoup(response.content,'html.parser') html = BeautifulSoup(response.content,'html.parser')
urls = [a['href'] for a in html.find_all('a')] urls = [a['href'] for a in html.find_all('a')]
for u in urls: for u in urls:
if u not in tested and 'rowers' in u and 'http' not in u and 'authorize' not in u and 'import' not in u and 'logout' not in u: if u not in tested and 'rowers' in u and 'http' not in u and 'authorize' not in u and 'import' not in u and 'logout' not in u:
response = self.c.get(u) response2 = self.c.get(u)
if response.status_code not in [200,302]: if response2.status_code not in [200,302]:
print(len(tested)) print(len(tested))
print(response.templates[0].name)
print(url) print(url)
print(u) print(u)
print(response.status_code) print(response.status_code)
tested.append(u) tested.append(u)
self.assertIn(response.status_code, self.assertIn(response2.status_code,
[200,302]) [200,302])
else: else:
tested.append(u) tested.append(u)
Binary file not shown.
Binary file not shown.
+96 -86
View File
@@ -110,7 +110,7 @@ urlpatterns = [
url(r'^', include(router.urls)), url(r'^', include(router.urls)),
url(r'^api-docs/$', views.schema_view,name='schema_view'), url(r'^api-docs/$', views.schema_view,name='schema_view'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api/workouts/(?P<id>\d+)/strokedata/$',views.strokedatajson,name='strokedatajson'), url(r'^api/workouts/(?P<id>\b[0-9A-Fa-f]+\b)/strokedata/$',views.strokedatajson,name='strokedatajson'),
url(r'^500v/$',views.error500_view,name='error500_view'), url(r'^500v/$',views.error500_view,name='error500_view'),
url(r'^502/$', TemplateView.as_view(template_name='502.html'),name='502'), url(r'^502/$', TemplateView.as_view(template_name='502.html'),name='502'),
url(r'^500/$', TemplateView.as_view(template_name='500.html'),name='500'), url(r'^500/$', TemplateView.as_view(template_name='500.html'),name='500'),
@@ -165,36 +165,36 @@ urlpatterns = [
url(r'^virtualevent/(?P<id>\d+)/adddiscipline/$',views.virtualevent_addboat_view,name='virtualevent_addboat_view'), url(r'^virtualevent/(?P<id>\d+)/adddiscipline/$',views.virtualevent_addboat_view,name='virtualevent_addboat_view'),
url(r'^virtualevent/(?P<id>\d+)/withdraw/(?P<recordid>\d+)/$',views.virtualevent_withdraw_view,name='virtualevent_withdraw_view'), url(r'^virtualevent/(?P<id>\d+)/withdraw/(?P<recordid>\d+)/$',views.virtualevent_withdraw_view,name='virtualevent_withdraw_view'),
url(r'^virtualevent/(?P<id>\d+)/withdraw/$',views.virtualevent_withdraw_view,name='virtualevent_withdraw_view'), url(r'^virtualevent/(?P<id>\d+)/withdraw/$',views.virtualevent_withdraw_view,name='virtualevent_withdraw_view'),
url(r'^virtualevent/(?P<id>\d+)/submit/$', url(r'^virtualevent/(?P<id>\b[0-9A-Fa-f]+\b)/submit/$',
views.virtualevent_submit_result_view,name='virtualevent_submit_result_view'), views.virtualevent_submit_result_view,name='virtualevent_submit_result_view'),
url(r'^virtualevent/(?P<id>\d+)/submit/(?P<workoutid>\d+)/$', url(r'^virtualevent/(?P<id>\d+)/submit/(?P<workoutid>\b[0-9A-Fa-f]+\b)/$',
views.virtualevent_submit_result_view,name='virtualevent_submit_result_view'), views.virtualevent_submit_result_view,name='virtualevent_submit_result_view'),
url(r'^virtualevent/(?P<raceid>\d+)/disqualify/(?P<recordid>\d+)/', url(r'^virtualevent/(?P<raceid>\d+)/disqualify/(?P<recordid>\d+)/',
views.virtualevent_disqualify_view,name='virtualevent_submit_disqualify_view'), views.virtualevent_disqualify_view,name='virtualevent_disqualify_view'),
url(r'^list-workouts/$',views.workouts_view, url(r'^list-workouts/$',views.workouts_view,name='workouts_view'),
name='workouts_view'),
url(r'^list-courses/$',views.courses_view,name='courses_view'), url(r'^list-courses/$',views.courses_view,name='courses_view'),
url(r'^courses/upload/$',views.course_upload_view,name='course_upload_view'), url(r'^courses/upload/$',views.course_upload_view,name='course_upload_view'),
url(r'^workout/addmanual/$',views.addmanual_view,name='addmanual_view'), url(r'^workout/addmanual/$',views.addmanual_view,name='addmanual_view'),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/workout/(?P<id>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/team/(?P<teamid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/user/(?P<userid>\d+)/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^team-compare-select/$',views.team_comparison_select,name='team_comparison_select'), url(r'^team-compare-select/$',views.team_comparison_select,name='team_comparison_select'),
url(r'^workouts-join-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workouts_join_select,name='workouts_join_select'), url(r'^workouts-join-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workouts_join_select,
name='workouts_join_select'),
url(r'^workouts-join/$',views.workouts_join_view,name='workouts_join_view'), url(r'^workouts-join/$',views.workouts_join_view,name='workouts_join_view'),
url(r'^workouts-join-select/team/(?P<teamid>\d+)/$',views.workouts_join_select,name='workouts_join_select'), url(r'^workouts-join-select/team/(?P<teamid>\d+)/$',views.workouts_join_select,name='workouts_join_select'),
url(r'^workouts-join-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workouts_join_select,name='workouts_join_select'), url(r'^workouts-join-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workouts_join_select,name='workouts_join_select'),
@@ -251,43 +251,51 @@ urlpatterns = [
url(r'^cumstats/$',views.cumstats,name='cumstats'), url(r'^cumstats/$',views.cumstats,name='cumstats'),
url(r'^graph/(?P<id>\d+)/$',views.graph_show_view,name='graph_show_view'), url(r'^graph/(?P<id>\d+)/$',views.graph_show_view,name='graph_show_view'),
url(r'^graph/(?P<pk>\d+)/delete/$',views.GraphDelete.as_view(),name='graph_delete'), url(r'^graph/(?P<pk>\d+)/delete/$',views.GraphDelete.as_view(),name='graph_delete'),
url(r'^workout/(?P<id>\d+)/get-thumbnails/$',views.get_thumbnails,name='get_thumbnails'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-thumbnails/$',views.get_thumbnails,
url(r'^workout/(?P<id>\d+)/toggle-ranking/$',views.workout_toggle_ranking,name='workout_toggle_ranking'), name='get_thumbnails'),
url(r'^workout/(?P<id>\d+)/get-testscript/$',views.get_testscript), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/toggle-ranking/$',views.workout_toggle_ranking,
name='workout_toggle_ranking'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-testscript/$',views.get_testscript,
name='get_testscript'),
url(r'^workout/upload/team/$',views.team_workout_upload_view,name='team_workout_upload_view'), url(r'^workout/upload/team/$',views.team_workout_upload_view,name='team_workout_upload_view'),
url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'), url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'),
url(r'^workout/(?P<id>\d+)/histo/$',views.workout_histo_view,name='workout_histo_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/histo/$',views.workout_histo_view,
# url(r'^workout/(?P<id>\d+)/task/$',views.workout_test_task_view), name='workout_histo_view'),
url(r'^workout/(?P<id>\d+)/forcecurve/$',views.workout_forcecurve_view,name='workout_forcecurve_view'), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/task/$',views.workout_test_task_view,name='workout_test_task_view'),
url(r'^workout/(?P<id>\d+)/unsubscribe/$',views.workout_unsubscribe_view,name='workout_unsubscribe_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/forcecurve/$',views.workout_forcecurve_view,
# url(r'^workout/(?P<id>\d+)/export/$',views.workout_export_view), name='workout_forcecurve_view'),
url(r'^workout/(?P<id>\d+)/comment/$',views.workout_comment_view,name='workout_comment_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/unsubscribe/$',views.workout_unsubscribe_view,
url(r'^workout/(?P<id>\d+)/emailtcx/$',views.workout_tcxemail_view,name='workout_tcxemail_view'), name='workout_unsubscribe_view'),
url(r'^workout/(?P<id>\d+)/emailgpx/$',views.workout_gpxemail_view,name='workout_gpxemail_view'), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/export/$',views.workout_export_view),
url(r'^workout/(?P<id>\d+)/emailcsv/$',views.workout_csvemail_view,name='workout_csvemail_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/comment/$',views.workout_comment_view,
url(r'^workout/(?P<id>\d+)/csvtoadmin/$',views.workout_csvtoadmin_view,name='workout_csvtoadmin_view'), name='workout_comment_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailtcx/$',views.workout_tcxemail_view,
name='workout_tcxemail_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailgpx/$',views.workout_gpxemail_view,
name='workout_gpxemail_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailcsv/$',views.workout_csvemail_view,
name='workout_csvemail_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/csvtoadmin/$',views.workout_csvtoadmin_view,
name='workout_csvtoadmin_view'),
url(r'^ergcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otecp_toadmin_view,name='otecp_toadmin_view'), url(r'^ergcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otecp_toadmin_view,name='otecp_toadmin_view'),
url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otwcp_toadmin_view,name='otwcp_toadmin_view'), url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otwcp_toadmin_view,name='otwcp_toadmin_view'),
# url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/edit/$',views.workout_edit_view,
# url(r'^workout/compare2/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>\w+.*)/$',views.workout_comparison_view),
# url(r'^workout/compare/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_comparison_list),
url(r'^workout/(?P<id>\d+)/edit/$',views.workout_edit_view,
name='workout_edit_view'), name='workout_edit_view'),
url(r'^workout/(?P<id>\d+)/map/$',views.workout_map_view,name='workout_map_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/map/$',views.workout_map_view,name='workout_map_view'),
# url(r'^workout/(?P<id>\d+)/setprivate/$',views.workout_setprivate_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/setprivate/$',views.workout_setprivate_view),
url(r'^workout/(?P<id>\d+)/updatecp/$',views.workout_update_cp_view,name='workout_update_cp_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/updatecp/$',views.workout_update_cp_view,name='workout_update_cp_view'),
# url(r'^workout/(?P<id>\d+)/makepublic/$',views.workout_makepublic_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/makepublic/$',views.workout_makepublic_view),
# url(r'^workout/(?P<id>\d+)/geeky/$',views.workout_geeky_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/geeky/$',views.workout_geeky_view),
# url(r'^workout/(?P<id>\d+)/advanced/$',views.workout_advanced_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/advanced/$',views.workout_advanced_view),
url(r'^workout/(?P<id>\d+)/instroke/(?P<metric>\w+.*)/$',views.instroke_chart,name='instroke_chart'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/instroke/(?P<metric>\w+.*)/$',views.instroke_chart,name='instroke_chart'),
url(r'^workout/(?P<id>\d+)/instroke/$',views.instroke_view,name='instroke_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/instroke/$',views.instroke_view,name='instroke_view'),
url(r'^workout/(?P<id>\d+)/stats/$',views.workout_stats_view,name='workout_stats_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stats/$',views.workout_stats_view,name='workout_stats_view'),
url(r'^workout/(?P<id>\d+)/data/$',views.workout_data_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/data/$',views.workout_data_view,
name='workout_data_view'), name='workout_data_view'),
url(r'^workout/(?P<id>\d+)/otwsetpower/$',views.workout_otwsetpower_view,name='workout_otwsetpower_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/otwsetpower/$',views.workout_otwsetpower_view,name='workout_otwsetpower_view'),
url(r'^workout/(?P<id>\d+)/interactiveotwplot/$',views.workout_otwpowerplot_view,name='workout_otwpowerplot_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/interactiveotwplot/$',views.workout_otwpowerplot_view,name='workout_otwpowerplot_view'),
url(r'^workout/(?P<id>\d+)/wind/$',views.workout_wind_view,name='workout_wind_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/wind/$',views.workout_wind_view,name='workout_wind_view'),
url(r'^workout/(?P<id>\d+)/image/$',views.workout_uploadimage_view,name='workout_uploadimage_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/image/$',views.workout_uploadimage_view,name='workout_uploadimage_view'),
url(r'^virtualevent/(?P<id>\d+)/compare/$',views.virtualevent_compare_view,name='virtualevent_compare_view'), url(r'^virtualevent/(?P<id>\d+)/compare/$',views.virtualevent_compare_view,name='virtualevent_compare_view'),
url(r'^virtualevent/(?P<id>\d+)/image/$', url(r'^virtualevent/(?P<id>\d+)/image/$',
views.virtualevent_uploadimage_view,name='virtualevent_uploadimage_view'), views.virtualevent_uploadimage_view,name='virtualevent_uploadimage_view'),
@@ -295,56 +303,58 @@ urlpatterns = [
views.virtualevent_setlogo_view,name='virtualevent_setlog_view'), views.virtualevent_setlogo_view,name='virtualevent_setlog_view'),
url(r'^logo/(?P<id>\d+)/delete/$', url(r'^logo/(?P<id>\d+)/delete/$',
views.logo_delete_view,name='logo_delete_view'), views.logo_delete_view,name='logo_delete_view'),
url(r'^workout/(?P<id>\d+)/darkskywind/$',views.workout_downloadwind_view,name='workout_downloadwind_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/darkskywind/$',views.workout_downloadwind_view,name='workout_downloadwind_view'),
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)/$',views.workout_downloadmetar_view,name='workout_downloadmetar_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/metar/(?P<airportcode>\w+)/$',views.workout_downloadmetar_view,name='workout_downloadmetar_view'),
url(r'^workout/(?P<id>\d+)/stream/$',views.workout_stream_view,name='workout_stream_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stream/$',views.workout_stream_view,name='workout_stream_view'),
# url(r'^workout/(?P<id>\d+)/crewnerdsummary/$',views.workout_crewnerd_summary_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/crewnerdsummary/$',views.workout_crewnerd_summary_view),
url(r'^workout/(?P<id>\d+)/editintervals/$',views.workout_summary_edit_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/editintervals/$',views.workout_summary_edit_view,
name='workout_summary_edit_view'), name='workout_summary_edit_view'),
url(r'^workout/(?P<id>\d+)/restore/$',views.workout_summary_restore_view,name='workout_summary_restore_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/restore/$',views.workout_summary_restore_view,name='workout_summary_restore_view'),
url(r'^workout/(?P<id>\d+)/split/$',views.workout_split_view,name='workout_split_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/split/$',views.workout_split_view,name='workout_split_view'),
# url(r'^workout/(?P<id>\d+)/interactiveplot/$',views.workout_biginteractive_view), # url(r'^workout/(?P<id>\d+)/interactiveplot/$',views.workout_biginteractive_view),
url(r'^workout/(?P<id>\d+)/view/$',views.workout_view,name='workout_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/view/$',views.workout_view,name='workout_view'),
url(r'^workout/(?P<id>\d+)/$',views.workout_view,name='workout_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.workout_view,name='workout_view'),
url(r'^workout/fusion/(?P<id1>\d+)/(?P<id2>\d+)/$',views.workout_fusion_view,name='workout_fusion_view'), url(r'^workout/fusion/(?P<id1>\b[0-9A-Fa-f]+\b)/(?P<id2>\b[0-9A-Fa-f]+\b)/$',views.workout_fusion_view,name='workout_fusion_view'),
url(r'^workout/fusion/(?P<id>\d+)/$',views.workout_fusion_list,name='workout_fusion_list'), url(r'^workout/fusion/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.workout_fusion_list,name='workout_fusion_list'),
url(r'^workout/fusion/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_fusion_list,name='workout_fusion_list'), url(r'^workout/fusion/(?P<id>\b[0-9A-Fa-f]+\b)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_fusion_list,name='workout_fusion_list'),
url(r'^help/$',TemplateView.as_view( url(r'^help/$',TemplateView.as_view(
template_name='help.html'),name='help' template_name='help.html'),name='help'
), ),
url(r'^physics/$',TemplateView.as_view(template_name='physics.html'),name='physics'), 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'^partners/$',TemplateView.as_view(template_name='partners.html'),name='partners'),
# keeping the old URLs for retrofit # keeping the old URLs for retrofit
url(r'^workout/(?P<id>\d+)/addtimeplot/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addtimeplot/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'1'},name='workout_add_chart_view'), {'plotnr':'1'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/adddistanceplot/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/adddistanceplot/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'2'},name='workout_add_chart_view'), {'plotnr':'2'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/addpiechart/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addpiechart/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'3'},name='workout_add_chart_view'), {'plotnr':'3'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/adddistanceplot2/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/adddistanceplot2/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'7'},name='workout_add_chart_view'), {'plotnr':'7'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/addtimeplot2/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addtimeplot2/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'8'},name='workout_add_chart_view'), {'plotnr':'8'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/addotwpowerplot/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addotwpowerplot/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'9'},name='workout_add_chart_view'), {'plotnr':'9'},name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/addpowerpiechart/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addpowerpiechart/$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'13'},name='workout_add_chart_view'), {'plotnr':'13'},name='workout_add_chart_view'),
# addstatic is the new URL -> need to update in templates # addstatic is the new URL -> need to update in templates
url(r'^workout/(?P<id>\d+)/addstatic/(?P<plotnr>\d+)/$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addstatic/(?P<plotnr>\d+)/$',
views.workout_add_chart_view,name='workout_add_chart_view'), views.workout_add_chart_view,name='workout_add_chart_view'),
url(r'^workout/(?P<id>\d+)/addstatic/$',views.workout_add_chart_view,name='workout_add_chart_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addstatic/$',views.workout_add_chart_view,name='workout_add_chart_view'),
url(r'^workout/(?P<pk>\d+)/delete/$',login_required( url(r'^workout/(?P<pk>\d+)/delete/$',login_required(
views.WorkoutDelete.as_view()), views.WorkoutDelete.as_view()),
name='workout_delete'), name='workout_delete'),
url(r'^workout/(?P<id>\d+)/smoothenpace/$',views.workout_smoothenpace_view,name='workout_smoothenpace_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/delete/$',login_required(
url(r'^workout/(?P<id>\d+)/undosmoothenpace/$',views.workout_undo_smoothenpace_view,name='workout_undo_smoothenpace_view'), views.workout_code_delete_view),name='workout_code_delete'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/smoothenpace/$',views.workout_smoothenpace_view,name='workout_smoothenpace_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/undosmoothenpace/$',views.workout_undo_smoothenpace_view,name='workout_undo_smoothenpace_view'),
url(r'^workout/c2import/$',views.workout_c2import_view,name='workout_c2import_view'), url(r'^workout/c2import/$',views.workout_c2import_view,name='workout_c2import_view'),
url(r'^workout/c2list/$',views.workout_c2import_view,name='workout_c2import_view'), url(r'^workout/c2list/$',views.workout_c2import_view,name='workout_c2import_view'),
url(r'^workout/c2list/(?P<page>\d+)/$',views.workout_c2import_view,name='workout_c2import_view'), url(r'^workout/c2list/(?P<page>\d+)/$',views.workout_c2import_view,name='workout_c2import_view'),
@@ -365,17 +375,17 @@ urlpatterns = [
url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view,name='workout_runkeeperimport_view'), url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view,name='workout_runkeeperimport_view'),
url(r'^workout/runkeeperimport/user/(?P<userid>\d+)/$',views.workout_runkeeperimport_view,name='workout_runkeeperimport_view'), url(r'^workout/runkeeperimport/user/(?P<userid>\d+)/$',views.workout_runkeeperimport_view,name='workout_runkeeperimport_view'),
url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view,name='workout_underarmourimport_view'), url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view,name='workout_underarmourimport_view'),
# url(r'^workout/(?P<id>\d+)/deleteconfirm/$',views.workout_delete_confirm_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/deleteconfirm/$',views.workout_delete_confirm_view),
url(r'^workout/(?P<id>\d+)/c2uploadw/$',views.workout_c2_upload_view,name='workout_c2_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/c2uploadw/$',views.workout_c2_upload_view,name='workout_c2_upload_view'),
url(r'^workout/(?P<id>\d+)/stravauploadw/$',views.workout_strava_upload_view,name='workout_strava_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stravauploadw/$',views.workout_strava_upload_view,name='workout_strava_upload_view'),
url(r'^workout/(?P<id>\d+)/recalcsummary/$',views.workout_recalcsummary_view,name='workout_recalcsummary_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/recalcsummary/$',views.workout_recalcsummary_view,name='workout_recalcsummary_view'),
url(r'^workout/(?P<id>\d+)/sporttracksuploadw/$',views.workout_sporttracks_upload_view,name='workout_sporttracks_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/sporttracksuploadw/$',views.workout_sporttracks_upload_view,name='workout_sporttracks_upload_view'),
url(r'^workout/(?P<id>\d+)/runkeeperuploadw/$',views.workout_runkeeper_upload_view,name='workout_runkeeper_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/runkeeperuploadw/$',views.workout_runkeeper_upload_view,name='workout_runkeeper_upload_view'),
url(r'^workout/(?P<id>\d+)/underarmouruploadw/$',views.workout_underarmour_upload_view,name='workout_underarmour_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/underarmouruploadw/$',views.workout_underarmour_upload_view,name='workout_underarmour_upload_view'),
url(r'^workout/(?P<id>\d+)/tpuploadw/$',views.workout_tp_upload_view,name='workout_tp_upload_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/tpuploadw/$',views.workout_tp_upload_view,name='workout_tp_upload_view'),
url(r'^multi-compare/workout/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.multi_compare_view, url(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.multi_compare_view,
name='multi_compare_view'), name='multi_compare_view'),
url(r'^multi-compare/workout/(?P<id>\d+)/$',views.multi_compare_view,name='multi_compare_view'), url(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.multi_compare_view,name='multi_compare_view'),
url(r'^multi-compare/$',views.multi_compare_view,name='multi_compare_view'), url(r'^multi-compare/$',views.multi_compare_view,name='multi_compare_view'),
url(r'^user-boxplot/user/(?P<userid>\d+)/$',views.boxplot_view,name='boxplot_view'), url(r'^user-boxplot/user/(?P<userid>\d+)/$',views.boxplot_view,name='boxplot_view'),
url(r'^user-boxplot/$',views.boxplot_view,name='boxplot_view'), url(r'^user-boxplot/$',views.boxplot_view,name='boxplot_view'),
@@ -472,12 +482,12 @@ urlpatterns = [
url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'), url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'),
url(r'^register/$',views.rower_register_view,name='rower_register_view'), url(r'^register/$',views.rower_register_view,name='rower_register_view'),
url(r'^register/thankyou/$', TemplateView.as_view(template_name='registerthankyou.html'), name='registerthankyou'), url(r'^register/thankyou/$', TemplateView.as_view(template_name='registerthankyou.html'), name='registerthankyou'),
url(r'^workout/(?P<id>\d+)/workflow/$',views.workout_workflow_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/workflow/$',views.workout_workflow_view,
name='workout_workflow_view'), name='workout_workflow_view'),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>[\w\ ]+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/flexchart/(?P<xparam>[\w\ ]+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'),
url(r'^workout/(?P<id>\d+)/flexchart/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/flexchart/$',views.workout_flexchart3_view,name='workout_flexchart3_view'),
# url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/(?P<plottype>[\w\ ]+.*)/$',views.workout_comparison_view2), # url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/(?P<plottype>[\w\ ]+.*)/$',views.workout_comparison_view2),
# url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2), # url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2),
url(r'^test\_callback',views.rower_process_testcallback,name='rower_process_testcallback'), url(r'^test\_callback',views.rower_process_testcallback,name='rower_process_testcallback'),
@@ -530,7 +540,7 @@ urlpatterns = [
url(r'^edittarget/(?P<pk>\d+)/$',login_required( url(r'^edittarget/(?P<pk>\d+)/$',login_required(
views.TrainingTargetUpdate.as_view()), views.TrainingTargetUpdate.as_view()),
name='trainingtarget_update_view'), name='trainingtarget_update_view'),
url(r'^workout/(?P<id>\d+)/test\_strokedata/$',views.strokedataform), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/test\_strokedata/$',views.strokedataform),
url(r'^sessions/teamcreate/user/(?P<userid>\d+)/$',views.plannedsession_teamcreate_view, url(r'^sessions/teamcreate/user/(?P<userid>\d+)/$',views.plannedsession_teamcreate_view,
name='plannedsession_teamcreate_view'), name='plannedsession_teamcreate_view'),
url(r'^sessions/teamcreate/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$', url(r'^sessions/teamcreate/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',
@@ -579,8 +589,8 @@ urlpatterns = [
url(r'^sessions/(?P<id>\d+)/edit/user/(?P<userid>\d+)/$',views.plannedsession_edit_view), url(r'^sessions/(?P<id>\d+)/edit/user/(?P<userid>\d+)/$',views.plannedsession_edit_view),
url(r'^sessions/(?P<id>\d+)/clone/user/(?P<userid>\d+)/$',views.plannedsession_clone_view), url(r'^sessions/(?P<id>\d+)/clone/user/(?P<userid>\d+)/$',views.plannedsession_clone_view),
url(r'^sessions/(?P<id>\d+)/clone/$',views.plannedsession_clone_view), url(r'^sessions/(?P<id>\d+)/clone/$',views.plannedsession_clone_view),
url(r'^sessions/(?P<psid>\d+)/detach/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.plannedsession_detach_view), url(r'^sessions/(?P<psid>\d+)/detach/(?P<id>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.plannedsession_detach_view),
url(r'^sessions/(?P<psid>\d+)/detach/(?P<id>\d+)/$',views.plannedsession_detach_view), url(r'^sessions/(?P<psid>\d+)/detach/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.plannedsession_detach_view),
url(r'^sessions/(?P<id>\d+)/$',views.plannedsession_view, url(r'^sessions/(?P<id>\d+)/$',views.plannedsession_view,
name='plannedsession_view'), name='plannedsession_view'),
url(r'^sessions/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.plannedsession_view, url(r'^sessions/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.plannedsession_view,
+26 -25
View File
@@ -51,7 +51,7 @@ def workout_tp_upload_view(request,id=0):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -106,7 +106,7 @@ def workout_strava_upload_view(request,id=0):
pass pass
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
return response return response
@@ -137,14 +137,14 @@ def workout_strava_upload_view(request,id=0):
w.save() w.save()
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
} }
) )
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -156,7 +156,7 @@ def workout_strava_upload_view(request,id=0):
os.remove(tcxfile) os.remove(tcxfile)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -183,7 +183,7 @@ def workout_c2_upload_view(request,id=0):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':int(id) 'id':encoder.encode_hex(w.id)
}) })
@@ -212,7 +212,7 @@ def workout_runkeeper_upload_view(request,id=0):
messages.error(request,message) messages.error(request,message)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':id,
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -235,7 +235,8 @@ def workout_runkeeper_upload_view(request,id=0):
runkeeperid = runkeeperstuff.getidfromresponse(response) runkeeperid = runkeeperstuff.getidfromresponse(response)
w.uploadedtorunkeeper = runkeeperid w.uploadedtorunkeeper = runkeeperid
w.save() w.save()
url = reverse('workout_edit_view', kwargs={'id':w.id}) url = reverse('workout_edit_view',
kwargs={'id':encoder.encode_hex(w.id)})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
@@ -249,7 +250,7 @@ def workout_runkeeper_upload_view(request,id=0):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -275,7 +276,7 @@ def workout_underarmour_upload_view(request,id=0):
messages.error(request,message) messages.error(request,message)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -300,7 +301,7 @@ def workout_underarmour_upload_view(request,id=0):
underarmourid = underarmourstuff.getidfromresponse(response) underarmourid = underarmourstuff.getidfromresponse(response)
w.uploadedtounderarmour = underarmourid w.uploadedtounderarmour = underarmourid
w.save() w.save()
url = reverse('workout_edit_view',kwargs={'id':w.id}) url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
@@ -313,7 +314,7 @@ def workout_underarmour_upload_view(request,id=0):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -340,7 +341,7 @@ def workout_sporttracks_upload_view(request,id=0):
messages.error(request,message) messages.error(request,message)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -367,7 +368,7 @@ def workout_sporttracks_upload_view(request,id=0):
message = "Upload to SportTracks was successful" message = "Upload to SportTracks was successful"
messages.info(request,message) messages.info(request,message)
url = reverse('workout_edit_view',kwargs={'id':w.id}) url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
s = response s = response
@@ -379,7 +380,7 @@ def workout_sporttracks_upload_view(request,id=0):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':str(w.id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -965,7 +966,7 @@ def workout_stravaimport_view(request,message="",userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_stravaimport_view), 'url':reverse('workout_stravaimport_view'),
'name':'Strava' 'name':'Strava'
}, },
] ]
@@ -1021,7 +1022,7 @@ def workout_runkeeperimport_view(request,message="",userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_runkeeperimport_view), 'url':reverse('workout_runkeeperimport_view'),
'name':'Runkeeper' 'name':'Runkeeper'
} }
] ]
@@ -1073,7 +1074,7 @@ def workout_underarmourimport_view(request,message="",userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_c2import_view), 'url':reverse('workout_c2import_view'),
'name':'Concept2' 'name':'Concept2'
}, },
] ]
@@ -1126,7 +1127,7 @@ def workout_polarimport_view(request,userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_polarimport_view), 'url':reverse('workout_polarimport_view'),
'name':'Polar' 'name':'Polar'
}, },
] ]
@@ -1198,7 +1199,7 @@ def workout_sporttracksimport_view(request,message="",userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_sporttracksimport_view), 'url':reverse('workout_sporttracksimport_view'),
'name':'SportTracks' 'name':'SportTracks'
}, },
] ]
@@ -1343,11 +1344,11 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_c2import_view), 'url':reverse('workout_c2import_view'),
'name':'Concept2' 'name':'Concept2'
}, },
{ {
'url':reverse(workout_c2import_view,kwargs={'page':page}), 'url':reverse('workout_c2import_view',kwargs={'page':page}),
'name':'Page '+str(page) 'name':'Page '+str(page)
} }
] ]
@@ -1445,7 +1446,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
messages.info(request,message) messages.info(request,message)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':int(id), 'id':encoder.encode_hex(w.id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -1458,7 +1459,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
source=source, source=source,
workoutsource=source) workoutsource=source)
w = get_workout(id) w = get_workout(encoder.encode_hex(id))
if 'workout' in data: if 'workout' in data:
if 'splits' in data['workout']: if 'splits' in data['workout']:
@@ -1516,7 +1517,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':int(id) 'id':encoder.encode_hex(w.id)
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
+3 -3
View File
@@ -137,11 +137,11 @@ def plannedsession_comment_view(request,id=0,userid=0):
else: else:
breadcrumbs = [ breadcrumbs = [
{ {
'url':reverse('virtualevents_view'), 'url':reverse('plannedsessions_view'),
'name': 'Races' 'name': 'Sessions'
}, },
{ {
'url': reverse('virtualevent_view',kwargs={'id':ps.id}), 'url': reverse('plannedsession_view',kwargs={'id':ps.id}),
'name': ps.name 'name': ps.name
}, },
{ {
+1 -1
View File
@@ -2251,7 +2251,7 @@ def virtualevent_submit_result_view(request,id=0,workoutid=0):
else: else:
if workoutid: if workoutid:
workoutdata['initial'] = workoutid workoutdata['initial'] = encoder.decode_hex(workoutid)
w_form = WorkoutRaceSelectForm(workoutdata,entries) w_form = WorkoutRaceSelectForm(workoutdata,entries)
+6 -4
View File
@@ -30,6 +30,7 @@ import cgi
from icalendar import Calendar, Event from icalendar import Calendar, Event
import rowers.braintreestuff as braintreestuff import rowers.braintreestuff as braintreestuff
import rowers.payments as payments import rowers.payments as payments
from rowers.opaque import encoder
from django.shortcuts import render from django.shortcuts import render
from django.template.loader import render_to_string from django.template.loader import render_to_string
@@ -258,13 +259,13 @@ def getfavorites(r,row):
def get_workout_default_page(request,id): def get_workout_default_page(request,id):
if request.user.is_anonymous(): if request.user.is_anonymous():
return reverse('workout_view',kwargs={'id':str(id)}) return reverse('workout_view',kwargs={'id':id})
else: else:
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
if r.defaultlandingpage == 'workout_edit_view': if r.defaultlandingpage == 'workout_edit_view':
return reverse('workout_edit_view',kwargs={'id':str(id)}) return reverse('workout_edit_view',kwargs={'id':id})
else: else:
return reverse('workout_workflow_view',kwargs={'id':str(id)}) return reverse('workout_workflow_view',kwargs={'id':id})
def getrequestrower(request,rowerid=0,userid=0,notpermanent=False): def getrequestrower(request,rowerid=0,userid=0,notpermanent=False):
@@ -318,6 +319,7 @@ def getrower(user):
def get_workout(id): def get_workout(id):
try: try:
id = encoder.decode_hex(id)
w = Workout.objects.get(id=id) w = Workout.objects.get(id=id)
except Workout.DoesNotExist: except Workout.DoesNotExist:
raise Http404("Workout doesn't exist") raise Http404("Workout doesn't exist")
@@ -709,7 +711,7 @@ def get_thumbnails(request,id):
charts = [] charts = []
charts = thumbnails_set(r,id,favorites) charts = thumbnails_set(r,encoder.decode_hex(id),favorites)
try: try:
if charts[0]['script'] == '': if charts[0]['script'] == '':
charts = [] charts = []
+97 -79
View File
@@ -60,7 +60,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
'the_div':div, 'the_div':div,
'js_res': js_resources, 'js_res': js_resources,
'css_res':css_resources, 'css_res':css_resources,
'id':int(id), 'id':id,
'mayedit':mayedit, 'mayedit':mayedit,
'workstrokesonly': not workstrokesonly, 'workstrokesonly': not workstrokesonly,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
@@ -126,7 +126,7 @@ def workout_histo_view(request,id=0):
'workout':w, 'workout':w,
'rower':r, 'rower':r,
'the_div':div, 'the_div':div,
'id':int(id), 'id':id,
'mayedit':mayedit, 'mayedit':mayedit,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
}) })
@@ -248,7 +248,7 @@ def addmanual_view(request):
url = reverse( url = reverse(
'workout_edit_view', 'workout_edit_view',
kwargs={'id':id} kwargs={'id':encoder.encode_hex(id)}
) )
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
@@ -371,14 +371,14 @@ def workout_recalcsummary_view(request,id=0):
messages.info(request,successmessage) messages.info(request,successmessage)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':int(id), 'id':id,
}) })
else: else:
message = "Something went wrong. Could not update summary" message = "Something went wrong. Could not update summary"
messages.error(request,message) messages.error(request,message)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':int(id), 'id':id,
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -419,7 +419,7 @@ def workouts_join_view(request):
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':int(id), 'id':encoder.encode_hex(id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -740,7 +740,7 @@ def team_comparison_select(request,
if not checkworkoutuser(request.user,firstworkout): if not checkworkoutuser(request.user,firstworkout):
raise PermissionDenied("You are not allowed to sue this workout") raise PermissionDenied("You are not allowed to sue this workout")
firstworkoutquery = Workout.objects.filter(id=id) firstworkoutquery = Workout.objects.filter(id=encoder.decode_hex(id))
workouts = firstworkoutquery | workouts workouts = firstworkoutquery | workouts
else: else:
firstworkout = None firstworkout = None
@@ -856,7 +856,7 @@ def virtualevent_compare_view(request,id=0):
workouts = [] workouts = []
for id in workoutids: for id in workoutids:
try: try:
workouts.append(Workout.objects.get(id=id)) workouts.append(Workout.objects.get(id=encode.decode_hex(id)))
except Workout.DoesNotExist: except Workout.DoesNotExist:
pass pass
@@ -888,7 +888,7 @@ def virtualevent_compare_view(request,id=0):
workouts = [] workouts = []
for id in workoutids: for id in workoutids:
try: try:
workouts.append(Workout.objects.get(id=id)) workouts.append(Workout.objects.get(id=encoded.decode_hex(id)))
except Workout.DoesNotExist: except Workout.DoesNotExist:
pass pass
@@ -989,7 +989,8 @@ def plannedsession_compare_view(request,id=0,userid=0):
request.session['ps'] = ps.id request.session['ps'] = ps.id
if ids: if ids:
url = reverse('multi_compare_view',kwargs={'userid':userid,'id':ids[0]}) url = reverse('multi_compare_view',
kwargs={'userid':userid,'id':encoder.encode_hex(ids[0])})
else: else:
url = reverse('plannedsession_view',kwargs={'id':ps.id}) url = reverse('plannedsession_view',kwargs={'id':ps.id})
@@ -1401,9 +1402,12 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
enddate = startdate enddate = startdate
startdate = s startdate = s
if id:
theid = encoder.decode_hex(id)
workouts = Workout.objects.filter(user=r, workouts = Workout.objects.filter(user=r,
startdatetime__gte=startdate, startdatetime__gte=startdate,
startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=id) startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=theid)
query = request.GET.get('q') query = request.GET.get('q')
if query: if query:
@@ -1438,7 +1442,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(request,row.id), 'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'name': row.name 'name': row.name
}, },
{ {
@@ -1449,7 +1453,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
] ]
return render(request, 'fusion_list.html', return render(request, 'fusion_list.html',
{'id':int(id), {'id':id,
'workout':row, 'workout':row,
'rower':r, 'rower':r,
'searchform':searchform, 'searchform':searchform,
@@ -1474,7 +1478,7 @@ def workout_view(request,id=0):
rower = None rower = None
try: try:
row = Workout.objects.get(id=id) row = Workout.objects.get(id=encoder.decode_hex(id))
except Workout.DoesNotExist: except Workout.DoesNotExist:
raise Http404("Workout doesn't exist") raise Http404("Workout doesn't exist")
@@ -1499,7 +1503,7 @@ def workout_view(request,id=0):
# create interactive plot # create interactive plot
res = interactive_chart(id) res = interactive_chart(encoder.decode_hex(id))
script = res[0] script = res[0]
div = res[1] div = res[1]
@@ -1591,7 +1595,7 @@ def workout_undo_smoothenpace_view(
row.df[' Stroke500mPace (sec/500m)'] = 500./velo row.df[' Stroke500mPace (sec/500m)'] = 500./velo
row.write_csv(filename,gzip=True) row.write_csv(filename,gzip=True)
dataprep.update_strokedata(id,row.df) dataprep.update_strokedata(encoder.decode_hex(id),row.df)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
@@ -1641,7 +1645,7 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
row.df = row.df.fillna(0) row.df = row.df.fillna(0)
row.write_csv(filename,gzip=True) row.write_csv(filename,gzip=True)
dataprep.update_strokedata(id,row.df) dataprep.update_strokedata(encoder.decode_hex(id),row.df)
messages.info(request,'A smoothening filter was applied to your pace data') messages.info(request,'A smoothening filter was applied to your pace data')
@@ -1694,7 +1698,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
messages.info(request,successmessage) messages.info(request,successmessage)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':int(id), 'id':id,
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -1707,7 +1711,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
messages.error(request,message) messages.error(request,message)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':int(id), 'id':id,
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
@@ -1785,7 +1789,7 @@ def workout_downloadwind_view(request,id=0,
messages.info(request,message) messages.info(request,message)
kwargs = { kwargs = {
'id':int(id)} 'id':id}
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -1793,7 +1797,7 @@ def workout_downloadwind_view(request,id=0,
message = "No latitude/longitude data" message = "No latitude/longitude data"
messages.error(request,message) messages.error(request,message)
kwargs = { kwargs = {
'id':int(id) 'id':id
} }
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -1851,7 +1855,7 @@ def workout_downloadmetar_view(request,id=0,
messages.info(request,message) messages.info(request,message)
kwargs = { kwargs = {
'id':int(id)} 'id':id}
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -1859,7 +1863,7 @@ def workout_downloadmetar_view(request,id=0,
message = "No latitude/longitude data" message = "No latitude/longitude data"
messages.error(request,message) messages.error(request,message)
kwargs = { kwargs = {
'id':int(id) 'id':id
} }
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -1963,7 +1967,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
message = "Invalid Form" message = "Invalid Form"
messages.error(request,message) messages.error(request,message)
kwargs = { kwargs = {
'id':int(id) 'id':id
} }
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -1972,7 +1976,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
form = UpdateWindForm() form = UpdateWindForm()
# create interactive plot # create interactive plot
res = interactive_windchart(id,promember=1) res = interactive_windchart(encoder.decode_hex(id),promember=1)
script = res[0] script = res[0]
div = res[1] div = res[1]
@@ -2050,7 +2054,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
message = "Invalid Form" message = "Invalid Form"
messages.error(request,message) messages.error(request,message)
kwargs = { kwargs = {
'id':int(id)} 'id':id}
url = reverse('workout_wind_view',kwargs=kwargs) url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -2058,7 +2062,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
form = UpdateStreamForm() form = UpdateStreamForm()
# create interactive plot # create interactive plot
res = interactive_streamchart(id,promember=1) res = interactive_streamchart(encoder.decode_hex(id),promember=1)
script = res[0] script = res[0]
div = res[1] div = res[1]
@@ -2173,7 +2177,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
successmessage = 'Your calculations have been submitted. You will receive an email when they are done. You can check the status of your calculations <a href="/rowers/jobs-status/" target="_blank">here</a>' successmessage = 'Your calculations have been submitted. You will receive an email when they are done. You can check the status of your calculations <a href="/rowers/jobs-status/" target="_blank">here</a>'
messages.info(request,successmessage) messages.info(request,successmessage)
kwargs = { kwargs = {
'id':int(id)} 'id':id}
try: try:
url = request.session['referer'] url = request.session['referer']
@@ -2187,7 +2191,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
message = "Invalid Form" message = "Invalid Form"
messages.error(request,message) messages.error(request,message)
kwargs = { kwargs = {
'id':int(id)} 'id':id}
url = reverse('workout_otwsetpower_view',kwargs=kwargs) url = reverse('workout_otwsetpower_view',kwargs=kwargs)
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -2366,7 +2370,7 @@ def workout_data_view(request, id=0):
] ]
datadf,row = dataprep.getrowdata_db(id=id) datadf,row = dataprep.getrowdata_db(id=encoder.decode_hex(id))
datadf.sort_values(['ftime'],inplace=True) datadf.sort_values(['ftime'],inplace=True)
@@ -2473,14 +2477,14 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
# prepare data frame # prepare data frame
datadf,row = dataprep.getrowdata_db(id=id) datadf,row = dataprep.getrowdata_db(id=encoder.decode_hex(id))
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
raise PermissionDenied('Access Denied') raise PermissionDenied('Access Denied')
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
if datadf.empty: if datadf.empty:
datadf,row = dataprep.getrowdata_db(id=id) datadf,row = dataprep.getrowdata_db(id=encoder.decode_hex(id))
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=False) datadf = dataprep.clean_df_stats(datadf,workstrokesonly=False)
workstrokesonly=False workstrokesonly=False
if datadf.empty: if datadf.empty:
@@ -2964,7 +2968,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
css_resources, css_resources,
workstrokesonly workstrokesonly
) = interactive_flex_chart2( ) = interactive_flex_chart2(
id,xparam=xparam,yparam1=yparam1, encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
yparam2=yparam2, yparam2=yparam2,
promember=promember,plottype=plottype, promember=promember,plottype=plottype,
workstrokesonly=workstrokesonly workstrokesonly=workstrokesonly
@@ -2977,7 +2981,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
css_resources, css_resources,
workstrokesonly workstrokesonly
) = interactive_flex_chart2( ) = interactive_flex_chart2(
id,xparam=xparam,yparam1=yparam1, encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
yparam2=yparam2, yparam2=yparam2,
promember=promember,plottype=plottype, promember=promember,plottype=plottype,
workstrokesonly=workstrokesonly workstrokesonly=workstrokesonly
@@ -3044,7 +3048,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
flexoptionsform = FlexOptionsForm(initial=initial) flexoptionsform = FlexOptionsForm(initial=initial)
row = Workout.objects.get(id=id) row = Workout.objects.get(id=encoder.decode_hex(id))
breadcrumbs = [ breadcrumbs = [
{ {
@@ -3076,7 +3080,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
'js_res': js_resources, 'js_res': js_resources,
'css_res':css_resources, 'css_res':css_resources,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
'id':int(id), 'id':id,
'xparam':xparam, 'xparam':xparam,
'yparam1':yparam1, 'yparam1':yparam1,
'yparam2':yparam2, 'yparam2':yparam2,
@@ -3135,7 +3139,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
mayedit=1 mayedit=1
# create interactive plot # create interactive plot
res = interactive_otw_advanced_pace_chart(id,promember=promember) res = interactive_otw_advanced_pace_chart(encoder.decode_hex(id),promember=promember)
script = res[0] script = res[0]
div = res[1] div = res[1]
@@ -3213,7 +3217,7 @@ def workout_comment_view(request,id=0):
c.save() c.save()
url = reverse('workout_comment_view', url = reverse('workout_comment_view',
kwargs={ kwargs={
'id':id 'id':id,
}) })
message = '{name} says: <a href="{url}">{comment}</a>'.format( message = '{name} says: <a href="{url}">{comment}</a>'.format(
name = request.user.first_name, name = request.user.first_name,
@@ -3342,20 +3346,20 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
try: try:
boattype = request.POST['boattype'] boattype = request.POST['boattype']
except KeyError: except KeyError:
boattype = Workout.objects.get(id=id).boattype boattype = Workout.objects.get(id=encoder.decode_hex(id)).boattype
try: try:
privacy = request.POST['privacy'] privacy = request.POST['privacy']
except KeyError: except KeyError:
privacy = Workout.objects.get(id=id).privacy privacy = Workout.objects.get(id=row.id).privacy
try: try:
rankingpiece = form.cleaned_data['rankingpiece'] rankingpiece = form.cleaned_data['rankingpiece']
except KeyError: except KeyError:
rankingpiece =- Workout.objects.get(id=id).rankingpiece rankingpiece =- Workout.objects.get(id=row.id).rankingpiece
try: try:
duplicate = form.cleaned_data['duplicate'] duplicate = form.cleaned_data['duplicate']
except KeyError: except KeyError:
duplicate = Workout.objects.get(id=id).duplicate duplicate = Workout.objects.get(id=row.id).duplicate
if private: if private:
privacy = 'private' privacy = 'private'
@@ -3418,7 +3422,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
return HttpResponse("Error: CSV Data File Not Found") return HttpResponse("Error: CSV Data File Not Found")
r.rowdatetime = startdatetime r.rowdatetime = startdatetime
r.write_csv(row.csvfilename,gzip=True) r.write_csv(row.csvfilename,gzip=True)
dataprep.update_strokedata(id,r.df) dataprep.update_strokedata(encoder.decode_hex(id),r.df)
successmessage = "Changes saved" successmessage = "Changes saved"
if rankingpiece: if rankingpiece:
@@ -3427,7 +3431,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
messages.info(request,successmessage) messages.info(request,successmessage)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':str(row.id), 'id':encoder.encode_hex(row.id),
}) })
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
@@ -3486,11 +3490,11 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(request,id), 'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'name': row.name 'name': row.name
}, },
{ {
'url':reverse('workout_edit_view',kwargs={'id':id}), 'url':reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(row.id)}),
'name': 'Edit' 'name': 'Edit'
} }
@@ -3631,7 +3635,7 @@ def workout_uploadimage_view(request,id):
messages.error(request,message) messages.error(request,message)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':int(id), 'id':id,
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -3729,7 +3733,7 @@ def workout_add_chart_view(request,id,plotnr=1):
request.session['async_tasks'] = [(jobid,'make_plot')] request.session['async_tasks'] = [(jobid,'make_plot')]
url = reverse(r.defaultlandingpage,kwargs={'id':str(w.id)}) url = reverse(r.defaultlandingpage,kwargs={'id':encoder.encode_hex(w.id)})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -4004,9 +4008,11 @@ def workout_upload_view(request,
if message: if message:
messages.error(request,message) messages.error(request,message)
w = Workout.objects.get(id=id)
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs = { kwargs = {
'id':int(id), 'id':encoder.encode_hex(w.id),
}) })
if is_ajax: if is_ajax:
@@ -4014,7 +4020,6 @@ def workout_upload_view(request,
else: else:
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id)
r = getrower(request.user) r = getrower(request.user)
if (make_plot): if (make_plot):
@@ -4135,7 +4140,7 @@ def workout_upload_view(request,
if landingpage != 'workout_upload_view': if landingpage != 'workout_upload_view':
url = reverse(landingpage, url = reverse(landingpage,
kwargs = { kwargs = {
'id':w.id, 'id':encoder.encode_hex(w.id),
}) })
else: else:
url = reverse(landingpage) url = reverse(landingpage)
@@ -4326,7 +4331,7 @@ def team_workout_upload_view(request,message="",
url = reverse('team_workout_upload_view') url = reverse('team_workout_upload_view')
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id) w = Workout.objects.get(id=encoder.decode_hex(id))
r = getrower(request.user) r = getrower(request.user)
if (make_plot): if (make_plot):
@@ -4459,12 +4464,7 @@ def graph_show_view(request,id):
# Restore original stroke data and summary # Restore original stroke data and summary
@login_required() @login_required()
def workout_summary_restore_view(request,id,message="",successmessage=""): def workout_summary_restore_view(request,id,message="",successmessage=""):
try: row = get_workout_permitted(request.user,id)
row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False):
raise PermissionDenied("You are not allowed to edit this workout")
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
s = "" s = ""
# still here - this is a workout we may edit # still here - this is a workout we may edit
@@ -4489,14 +4489,14 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
raise Http404("Error: CSV Data File Not Found") raise Http404("Error: CSV Data File Not Found")
rowdata.restoreintervaldata() rowdata.restoreintervaldata()
rowdata.write_csv(f1,gzip=True) rowdata.write_csv(f1,gzip=True)
dataprep.update_strokedata(id,rowdata.df) dataprep.update_strokedata(encoder.decode_hex(id),rowdata.df)
intervalstats = rowdata.allstats() intervalstats = rowdata.allstats()
row.summary = intervalstats row.summary = intervalstats
row.save() row.save()
# create interactive plot # create interactive plot
try: try:
res = interactive_chart(id,promember=1) res = interactive_chart(encoder.decode_hex(id),promember=1)
script = res[0] script = res[0]
div = res[1] div = res[1]
except ValueError: except ValueError:
@@ -4506,14 +4506,14 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
messages.info(request,'Original Interval Data Restored') messages.info(request,'Original Interval Data Restored')
url = reverse('workout_summary_edit_view', url = reverse('workout_summary_edit_view',
kwargs={ kwargs={
'id':int(id), 'id':encoder.encode_hex(row.id),
} }
) )
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
# Split a workout # Split a workout
@user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_split_view(request,id=id): def workout_split_view(request,id=0):
row = get_workout_permitted(request.user,id) row = get_workout_permitted(request.user,id)
r = row.user r = row.user
@@ -4524,11 +4524,11 @@ def workout_split_view(request,id=id):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(request,row.id), 'url':get_workout_default_page(request,id),
'name': row.name 'name': row.name
}, },
{ {
'url':reverse('graph_show_view', 'url':reverse('workout_split_view',
kwargs={'id':id}), kwargs={'id':id}),
'name': 'Chart' 'name': 'Chart'
} }
@@ -4586,7 +4586,7 @@ def workout_split_view(request,id=id):
# create interactive plot # create interactive plot
try: try:
res = interactive_chart(id,promember=1) res = interactive_chart(encoder.decode_hex(id),promember=1)
script = res[0] script = res[0]
div = res[1] div = res[1]
except ValueError: except ValueError:
@@ -4607,6 +4607,12 @@ def workout_split_view(request,id=id):
@user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_fusion_view(request,id1=0,id2=1): def workout_fusion_view(request,id1=0,id2=1):
try:
id1 = encoder.decode_hex(id1)
id2 = encoder.decode_hex(id2)
except:
pass
r = getrower(request.user) r = getrower(request.user)
try: try:
@@ -4645,7 +4651,7 @@ def workout_fusion_view(request,id1=0,id2=1):
url = reverse('workout_edit_view', url = reverse('workout_edit_view',
kwargs={ kwargs={
'id':idnew, 'id':encoder.encode_hex(idnew),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -4658,17 +4664,21 @@ def workout_fusion_view(request,id1=0,id2=1):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(request,w1.id), 'url':get_workout_default_page(request,encoder.encode_hex(w1.id)),
'name': str(w1.id) 'name': encoder.encode_hex(w1.id)
}, },
{ {
'url':reverse('workout_fusion_list',kwargs={'id':id1}), 'url':reverse('workout_fusion_list',
kwargs={'id':encoder.encode_hex(id1)}),
'name': 'Sensor Fusion' 'name': 'Sensor Fusion'
}, },
{ {
'url':reverse('workout_fusion_view', 'url':reverse('workout_fusion_view',
kwargs={'id1':id1,'id2':id2}), kwargs={
'name': str(w2.id) 'id1':encoder.encode_hex(id1),
'id2':encoder.encode_hex(id2)
}),
'name': encoder.encode_hex(w2.id)
} }
] ]
@@ -4697,7 +4707,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(request,row.id), 'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'name': row.name 'name': row.name
}, },
{ {
@@ -4837,7 +4847,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
rowdata.write_csv(f1,gzip=True) rowdata.write_csv(f1,gzip=True)
dataprep.update_strokedata(id,rowdata.df) dataprep.update_strokedata(encoder.decode_hex(id),rowdata.df)
messages.info(request,"Updated interval data saved") messages.info(request,"Updated interval data saved")
data = { data = {
@@ -4881,7 +4891,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
row.save() row.save()
rowdata.write_csv(f1,gzip=True) rowdata.write_csv(f1,gzip=True)
dataprep.update_strokedata(id,rowdata.df) dataprep.update_strokedata(encoder.decode_hex(id),rowdata.df)
messages.info(request,"Updated interval data saved") messages.info(request,"Updated interval data saved")
data = {'intervalstring':s} data = {'intervalstring':s}
form = SummaryStringForm(initial=data) form = SummaryStringForm(initial=data)
@@ -4996,7 +5006,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
row.save() row.save()
rowdata.write_csv(f1,gzip=True) rowdata.write_csv(f1,gzip=True)
dataprep.update_strokedata(id,rowdata.df) dataprep.update_strokedata(encoder.decode_hex(id),rowdata.df)
messages.info(request,"Updated interval data saved") messages.info(request,"Updated interval data saved")
form = SummaryStringForm() form = SummaryStringForm()
@@ -5077,11 +5087,12 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'normp': normp, 'normp': normp,
'normv': normv, 'normv': normv,
} }
res = interactive_chart(id,promember=1,intervaldata=intervaldata) res = interactive_chart(encoder.decode_hex(id),promember=1,intervaldata=intervaldata)
script = res[0] script = res[0]
div = res[1] div = res[1]
except ValueError: except ValueError:
pass script = ''
div = ''
# render page # render page
@@ -5150,6 +5161,13 @@ class GraphDelete(DeleteView):
return obj return obj
def workout_code_delete_view(request,id=0):
pk = encoder.decode_hex(id)
url = reverse('workout_delete',kwargs={'pk':pk})
return HttpResponseRedirect(url)
class WorkoutDelete(DeleteView): class WorkoutDelete(DeleteView):
login_required = True login_required = True
model = Workout model = Workout
@@ -5165,8 +5183,8 @@ class WorkoutDelete(DeleteView):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':get_workout_default_page(self.request,self.object.id), 'url':get_workout_default_page(self.request,encoder.encode_hex(self.object.id)),
'name': str(self.object.id) 'name': encoder.encode_hex(self.object.id)
}, },
{ 'url':reverse('workout_delete',kwargs={'pk':str(self.object.pk)}), { 'url':reverse('workout_delete',kwargs={'pk':str(self.object.pk)}),
'name': 'Delete' 'name': 'Delete'
+210 -110
View File
File diff suppressed because it is too large Load Diff
+6
View File
@@ -461,3 +461,9 @@ try:
PAYMENT_PROCESSING_ON = CFG['payment_processing_on'] PAYMENT_PROCESSING_ON = CFG['payment_processing_on']
except KeyError: except KeyError:
PAYMENT_PROCESSING_ON = False PAYMENT_PROCESSING_ON = False
# ID obfuscation
try:
OPAQUE_SECRET_KEY = CFG['opaque_secret_key']
except KeyError:
OPAQUE_SECRET_KEY = 0xa193443a
+5 -5
View File
@@ -110,7 +110,7 @@
<div class="grid_4 alpha"> <div class="grid_4 alpha">
<div class="grid_1 alpha"> <div class="grid_1 alpha">
<p id="header"> <p id="header">
<a class="button gray small" href="/rowers/videos">Videos</a></p> <a class="button gray small" href="/rowers/videos/">Videos</a></p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p id="header"> <p id="header">
@@ -118,7 +118,7 @@
</div> </div>
<div class="grid_1 omega"> <div class="grid_1 omega">
<p id="header"> <p id="header">
<a class="button gray small" href="/rowers/email">Contact</a> <a class="button gray small" href="/rowers/email/">Contact</a>
</p> </p>
</div> </div>
<div class="grid_4 alpha"> <div class="grid_4 alpha">
@@ -131,9 +131,9 @@
{% if user.is_authenticated %} {% if user.is_authenticated %}
<p> <p>
{% if user.first_name %} {% if user.first_name %}
<a class="button gray small" href="/rowers/me/edit">{{ user.first_name }}</a> <a class="button gray small" href="/rowers/me/edit/">{{ user.first_name }}</a>
{% else %} {% else %}
<a class="button gray small" href="/rowers/me/edit">{{ user }}</a> <a class="button gray small" href="/rowers/me/edit/">{{ user }}</a>
{% endif %} {% endif %}
</p> </p>
<span class="tooltiptext">Edit user account, e.g. heart rate zones, power zones, email, teams</span> <span class="tooltiptext">Edit user account, e.g. heart rate zones, power zones, email, teams</span>
@@ -144,7 +144,7 @@
</div> </div>
<div class="grid_1"> <div class="grid_1">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<p><a class="button gray small" href="{% url 'logout' %}?next=/login">logout</a></p> <p><a class="button gray small" href="{% url 'logout' %}?next=/login/">logout</a></p>
{% else %} {% else %}
<p>&nbsp</p> <p>&nbsp</p>
{% endif %} {% endif %}