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']
totaltime = data['time']/10.
try:
spm = data['stroke_rate']
except KeyError:
spm = 0
try:
resttime = data['rest_time']/10.
except KeyError:
+4 -4
View File
@@ -80,7 +80,7 @@ from rowsandall_app.settings import SITE_URL
from rowers.mytypes import otwtypes
from rowers.database import *
from rowers.opaque import encoder
# mapping the DB column names to the CSV file column names
@@ -1416,7 +1416,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate,
forceunit='N')
messages.append(message)
ids.append(id)
ids.append(encoder.encode_hex(id))
if 'keep second' in splitmode:
data2['cumdist'] = data2['cumdist'] - data2.iloc[
0,
@@ -1443,7 +1443,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate,
dt=dt, forceunit='N')
messages.append(message)
ids.append(id)
ids.append(encoder.encode_hex(id))
if not 'keep original' 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)
else:
messages.append('That would delete your workout')
ids.append(parent.id)
ids.append(encoder.encode_hex(parent.id))
elif 'originalprivate' in splitmode:
parent.privacy = 'hidden'
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['time'] = intervaldf['itime'].cumsum()
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['value'] = 100
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.c2stuff as c2stuff
import rowers.stravastuff as stravastuff
from rowers.opaque import encoder
from rowers.models import User,VirtualRace,Workout
from rowers.plannedsessions import email_submit_race
workoutmailbox = Mailbox.objects.get(name='workouts')
failedmailbox = Mailbox.objects.get(name='Failed')
@@ -105,7 +108,7 @@ def processattachment(rower, fileobj, title, uploadoptions,testing=False):
link = settings.SITE_URL+reverse(
therower.defaultlandingpage,
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_2 alpha">
<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>
</div>
<div class="grid_2">
<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>
</div>
<div class="grid_2 omega">
<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>
</div>
</div>
@@ -52,7 +52,7 @@
</tr>
<th>Public link to this workout</th>
<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>
</table>
</div>
@@ -60,7 +60,7 @@
<div class="grid_6 alpha">
<div class="grid_2 alpha">
{% 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 %}
<a class="button blue small" href="/rowers/paidplans/">Compare Workouts*</a>
{% endif %}
@@ -69,7 +69,7 @@
</p>
</div>
<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
</a>
<p>
@@ -80,7 +80,7 @@
<div class="grid_2 omega tooltip">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a>
{% endif %}
@@ -96,7 +96,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Dist Metrics Plot*</a>
{% endif %}
@@ -108,7 +108,7 @@
<div class="grid_2">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Time Metrics Plot*</a>
{% endif %}
@@ -120,7 +120,7 @@
<div class="grid_2 omega">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Power Histogram*</a>
{% endif %}
@@ -147,7 +147,7 @@
<div class="grid_2">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a>
{% endif %}
@@ -159,7 +159,7 @@
<div class="grid_2 omega">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Split Workout*</a>
{% endif %}
@@ -172,7 +172,7 @@
<div class="grid_6 alpha">
<div class="grid_2 alpha">
<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>
See (and save) the big interactive plot
@@ -180,7 +180,7 @@
</div>
<div class="grid_2">
<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>
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
</p>
+17 -17
View File
@@ -21,17 +21,17 @@
{% endif %}
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2">
<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>
</div>
<div class="grid_2 omega">
<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>
</div>
@@ -49,7 +49,7 @@
</tr>
<th>Public link to this workout</th>
<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>
</table>
</div>
@@ -58,7 +58,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Compare Workouts*</a>
{% endif %}
@@ -70,7 +70,7 @@
<div class="grid_2">
<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>
Flexible Interactive plot. Pick your own X and Y axis parameters.
@@ -80,7 +80,7 @@
<div class="grid_2 omega tooltip">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Edit Intervals*</a>
{% endif %}
@@ -97,7 +97,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">CrewNerd Summary*</a>
{% endif %}
@@ -111,7 +111,7 @@
<div class="grid_2 tooltip">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Stroke Profile (Empower)*</a>
{% endif %}
@@ -124,7 +124,7 @@
<div class="grid_2 omega tooltip">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">OTW Power Plot*</a>
{% endif %}
@@ -144,7 +144,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Geeky Stuff*</a>
{% endif %}
@@ -159,7 +159,7 @@
<div class="grid_2 tooltip">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Smooth out Pace Data*</a>
{% endif %}
@@ -176,7 +176,7 @@
<div class="grid_2 omega">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Reset Smoothing*</a>
{% endif %}
@@ -203,7 +203,7 @@
<div class="grid_2">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Sensor Fusion*</a>
{% endif %}
@@ -215,7 +215,7 @@
<div class="grid_2 omega">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/paidplans">Split Workout*</a>
{% endif %}
@@ -229,7 +229,7 @@
<div class="grid_6 alpha">
<div class="grid_2 alpha">
<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>
See (and save) the big interactive plot
@@ -237,7 +237,7 @@
</div>
<div class="grid_2">
<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>
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
</p>
+2 -2
View File
@@ -42,12 +42,12 @@
{% if user.is_authenticated and mayedit %}
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2 suffix_2 omega">
<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>
</div>
+2 -2
View File
@@ -80,7 +80,7 @@
<tr>
<td> {{ cworkout.date }} </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.distance }}m</td>
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
@@ -89,7 +89,7 @@
{% if id == cworkout.id %}
<td>&nbsp;</td>
{% 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 %}
</tr>
+3 -3
View File
@@ -26,11 +26,11 @@
<tr>
<td> {{ workout.date }} </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> <a href="/rowers/workout/{{ workout.id }}/deleteconfirm">D</td>
<td> <a href="/rowers/workout/{{ workout.id|encode }}/deleteconfirm">D</td>
{% 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 %}
<td> &nbsp; </td>
{% endif %}
+12 -12
View File
@@ -12,17 +12,17 @@
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2">
<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>
</div>
<div class="grid_2 omega">
<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>
</div>
@@ -42,7 +42,7 @@
</div>
{% else %}
<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>
{% endif %}
{% else %}
@@ -60,7 +60,7 @@
</div>
{% else %}
<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>
{% endif %}
{% else %}
@@ -77,7 +77,7 @@
</div>
{% else %}
<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>
</div>
{% endif %}
@@ -88,12 +88,12 @@
</div>
{% endif %}
<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>
</div>
<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>
</div>
@@ -106,7 +106,7 @@
</div>
{% else %}
<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>
{% endif %}
{% else %}
@@ -124,7 +124,7 @@
</div>
{% else %}
<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>
{% endif %}
{% else %}
@@ -142,7 +142,7 @@
</div>
{% else %}
<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>
{% endif %}
{% else %}
@@ -153,7 +153,7 @@
{% endif %}
<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>
</div>
</div>
+2 -2
View File
@@ -115,7 +115,7 @@
<tr>
<td> {{ cworkout.date }} </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.distance }}m</td>
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
@@ -124,7 +124,7 @@
{% if id == cworkout.id %}
<td>&nbsp;</td>
{% 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 %}
</tr>
+1 -1
View File
@@ -171,7 +171,7 @@
$.ajax({
data: data,
type: $(this).attr('method'),
url: '/rowers/workout/{{ workout.id }}/image/',
url: '/rowers/workout/{{ workout.id|encode }}/image/',
contentType: false,
processData: false,
error: function(result) {
+2 -2
View File
@@ -30,7 +30,7 @@
</tr>
<th>Public link to this workout</th>
<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>
</table>
@@ -42,7 +42,7 @@
{% if instrokemetrics %}
{% for metric in instrokemetrics %}
<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>
{% endfor %}
{% else %}
+11 -11
View File
@@ -180,11 +180,11 @@
<tr>
{% endif %}
<td id="mypointer"
class="rankingtoggle" workoutid="{{ workout.id }}">
class="rankingtoggle" workoutid="{{ workout.id|encode }}">
{% if workout.rankingpiece %}
<span id="star{{ workout.id }}" class="yellow">&starf;</span>
<span id="star{{ workout.id|encode }}" class="yellow">&starf;</span>
{% else %}
<span id="star{{ workout.id }}" class="notyellow">&star;</span>
<span id="star{{ workout.id|encode }}" class="notyellow">&star;</span>
{% endif %}
</td>
<td> {{ workout.date|date:"Y-m-d" }} </td>
@@ -192,20 +192,20 @@
{% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }}
</a>
</td>
{% else %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td>
{% endif %}
{% else %}
{% 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 %}
<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 %}
<td> {{ workout.workouttype }} </td>
@@ -223,27 +223,27 @@
{% endif %}
<td>
<a class="small"
href="/rowers/workout/{{ workout.id }}/edit/"
href="/rowers/workout/{{ workout.id|encode }}/edit/"
title="Edit">
<i class="fas fa-pencil-alt fa-fw"></i>
</a>
</td>
<td>
<a class="small"
href="/rowers/workout/{{ workout.id }}/flexchart/"
href="/rowers/workout/{{ workout.id|encode }}/flexchart/"
title="Flex Chart">
<i class="fas fa-chart-line fa-fw"></i>
</a>
</td>
<td>
<a class="small"
href="/rowers/workout/{{ workout.id }}/stats/"
href="/rowers/workout/{{ workout.id|encode }}/stats/"
title="Stats">
<i class="fal fa-table fa-fw"></i>
</a>
</td>
<td>
<a class="small" href="/rowers/workout/{{ workout.id }}/delete/"
<a class="small" href="/rowers/workout/{{ workout.id|encode }}/delete/"
title="Delete">
<i class="fas fa-trash-alt fa-fw"></i>
</a>
+37 -38
View File
@@ -7,53 +7,52 @@
<ul>
<li id="workout-dashboard">
{% 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
</a>
{% 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
</a>
{% endif %}
</li>
{% if user.is_authenticated and workout|may_edit:request %}
<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
</a>
</li>
<li id="workout-intervals">
<a href="/rowers/workout/{{ workout.id }}/editintervals/">
<a href="/rowers/workout/{{ workout.id|encode }}/editintervals/">
<i class="fas fa-pause fa-fw"></i>&nbsp;Intervals
</a>
</li>
{% endif %}
{% if user.is_authenticated %}
<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
({{ workout|aantalcomments }})
</a>
</li>
{% endif %}
<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
</a>
</li>
<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
</a>
</li>
{% if user.is_authenticated and workout|may_edit:request %}
<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
</a>
</li>
<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
</a>
</li>
@@ -65,23 +64,23 @@
<label for="group-flexchart">Interactive Charts</label>
<ul>
<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
</a>
</li>
{% if workout|water %}
<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
</a>
</li>
<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
</a>
</li>
<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
</a>
</li>
@@ -94,28 +93,28 @@
<label for="group-chart">Static Charts</label>
<ul>
<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
</a>
</li>
<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
</a>
</li>
<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)
</a>
</li>
<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)
</a>
</li>
{% if workout|water %}
<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
</a>
</li>
@@ -136,7 +135,7 @@
Connect to Concept2
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/c2uploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/c2uploadw/">
Concept2
</a>
{% endif %}
@@ -151,7 +150,7 @@
Connect to Strava
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/stravauploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/stravauploadw/">
Strava
</a>
{% endif %}
@@ -166,7 +165,7 @@
Connect to SportTracks
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/sporttracksuploadw/">
SportTracks
</a>
{% endif %}
@@ -181,7 +180,7 @@
Connect to Runkeeper
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/runkeeperuploadw/">
Runkeeper
</a>
{% endif %}
@@ -196,7 +195,7 @@
Connect to MapMyFitness
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/underarmouruploadw/">
MapMyFitness
</a>
{% endif %}
@@ -211,23 +210,23 @@
Connect to TrainingPeaks
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/tpuploadw/">
<a href="/rowers/workout/{{ workout.id|encode }}/tpuploadw/">
TrainingPeaks
</a>
{% endif %}
</li>
<li id="export-csv">
<a href="/rowers/workout/{{ workout.id }}/emailcsv/">
<a href="/rowers/workout/{{ workout.id|encode }}/emailcsv/">
CSV
</a>
</li>
<li id="export-gpx">
<a href="/rowers/workout/{{ workout.id }}/emailgpx/">
<a href="/rowers/workout/{{ workout.id|encode }}/emailgpx/">
GPX
</a>
</li>
<li id="export-tcx">
<a href="/rowers/workout/{{ workout.id }}/emailtcx/">
<a href="/rowers/workout/{{ workout.id|encode }}/emailtcx/">
TCX
</a>
</li>
@@ -238,27 +237,27 @@
<label for="group-data">Data</label>
<ul>
<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
</a>
</li>
<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
</a>
</li>
<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
</a>
</li>
<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
</a>
</li>
<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
</a>
</ul>
@@ -269,28 +268,28 @@
<ul>
{% if workout|water %}
<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
</a>
</li>
<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
</a>
</li>
<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
</a>
</li>
{% endif %}
<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
</a>
</li>
<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
</a>
</li>
+1 -1
View File
@@ -97,7 +97,7 @@
<td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </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>
+10 -10
View File
@@ -19,17 +19,17 @@
{% endif %}
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2">
<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>
</div>
<div class="grid_2 omega">
<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>
</div>
@@ -48,7 +48,7 @@
</tr>
<th>Public link to this workout</th>
<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>
</table>
</div>
@@ -58,7 +58,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/about">Edit Wind Data</a>
{% endif %}
@@ -71,7 +71,7 @@
<div class="grid_2">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/about">Edit Stream Data</a>
{% endif %}
@@ -84,7 +84,7 @@
<div class="grid_2 omega">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/about">OTW Power</a>
{% endif %}
@@ -101,7 +101,7 @@
<div class="grid_2 alpha">
<p>
{% 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 %}
<a class="button blue small" href="/rowers/about">Corrected Pace Plot</a>
{% endif %}
@@ -113,7 +113,7 @@
</div>
<div class="grid_2 suffix_2 omega">
<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>
See (and save) the big interactive plot
@@ -128,7 +128,7 @@
{% else %}
<div class="grid_2">
{% 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>
{% endfor %}
{% endif %}
+2 -2
View File
@@ -91,12 +91,12 @@
<tr>
<td> {{ workout.distance }} m</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.averagehr }} </td>
<td> {{ workout.maxhr }} </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>
+2 -2
View File
@@ -26,11 +26,11 @@
</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>
<a href="/rowers/workout/{{ workout.id }}/stream">
<a href="/rowers/workout/{{ workout.id|encode }}/stream">
Set river stream strength
</a>
</p>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -2
View File
@@ -14,12 +14,12 @@
</tr><tr>
<th>Public link to this workout</th>
<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>
</tr><tr>
<th>Comments</th>
<td>
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a>
<a href="/rowers/workout/{{ workout.id|encode }}/comment">Comment ({{ aantalcomments }})</a>
</td>
</tr>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+4 -3
View File
@@ -1,12 +1,13 @@
{% load rowerfilters %}
<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">
<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>
<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|encode }}">Share</a>
</div>
</p>
<p>
<a class="twitter-share-button"
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>
</p>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,6 +1,7 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</p>
</div>
+1 -1
View File
@@ -6,7 +6,7 @@
<tr>
<th>Comments</th>
<td>
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a>
<a href="/rowers/workout/{{ workout.id|encode }}/comment">Comment ({{ aantalcomments }})</a>
</td>
</tr>
+4 -3
View File
@@ -1,13 +1,14 @@
{% load rowerfilters %}
<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">
<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>
<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|encode }}">Share</a>
</div>
</div>
<div class="grid_2 alpha">
<p>&nbsp;</p>
<a class="twitter-share-button"
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>
</div>
+5 -4
View File
@@ -1,23 +1,24 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<h2>Create Charts</h2>
</div>
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2 alpha">
<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>
</div>
<div class="grid_2 alpha">
<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>
</div>
+2 -1
View File
@@ -1,3 +1,4 @@
{% load rowerfilters %}
<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>
+2 -1
View File
@@ -1,5 +1,6 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<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>
</div>
+4 -4
View File
@@ -150,20 +150,20 @@
{% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }}
</a>
</td>
{% else %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td>
{% endif %}
{% else %}
{% 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 %}
<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 %}
<td> {{ workout.workouttype }} </td>
+6 -4
View File
@@ -111,20 +111,21 @@
{% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }}
</a>
</td>
{% else %}
<td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td>
{% endif %}
{% else %}
{% 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 %}
<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 %}
<td> {{ workout.workouttype }} </td>
@@ -138,6 +139,7 @@
</table>
</li>
{% endif %}
+2 -2
View File
@@ -81,7 +81,7 @@
<td> {{ workout.date|date:"Y-m-d" }} </td>
<td>
<div class="tooltip">
<a href="{% url manager.defaultlandingpage id=workout.id %}">
<a href="{% url manager.defaultlandingpage id=workout.id|encode %}">
{{ workout.name }}
</a>
<span class="tooltiptext">{{ workout.notes }}</span>
@@ -90,7 +90,7 @@
<td> {{ workout.distance }}m</td>
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </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>
</tr>
{% endfor %}
+1 -1
View File
@@ -73,7 +73,7 @@
<td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td>
<td>
<a href="/rowers/workout/{{ workout.id }}/edit/">
<a href="/rowers/workout/{{ workout.id|encode }}/edit/">
{{ workout.name }}
</a>
</td>
+3 -3
View File
@@ -52,16 +52,16 @@
<li>
{% if user.is_authenticated and user == rower.user %}
<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>
{% else %}
<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>
{% endif %}
{% if user.is_authenticated and user == rower.user %}
<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>
{% else %}
<p>&nbsp;</p>
+2 -2
View File
@@ -12,7 +12,7 @@
<ul class="main-content">
<li class="grid_2">
<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%>
{{ form.as_table }}
</table>
@@ -42,7 +42,7 @@
</tr><tr>
<th>Public link to this workout</th>
<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>
</tr>
</table>
+6 -6
View File
@@ -30,7 +30,7 @@
</tr><tr>
<th>Public link to this workout</th>
<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>
</tr>
</table>
@@ -38,7 +38,7 @@
<p>
See the how-to <a href="#howto">at the bottom of this page</a> for details on how to use this form.
</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%>
{{ form.as_table }}
</table>
@@ -73,7 +73,7 @@
</li>
<li class="grid_2">
<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 %}
<input type="hidden" name="{{ savebutton }}" value="{{ intervalstring }}">
<input type="hidden" name="nrintervals" value={{ nrintervals }}>
@@ -84,12 +84,12 @@
{{ field.as_hidden }}
{% endfor %}
<p>
<input class="button green" type="submit" value="Save">
<input type="submit" value="Save">
</p>
<span>
<a href="">Reset to last saved</a>
&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>
</form>
<p>
@@ -101,7 +101,7 @@
<li class="grid_2">
<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>
<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%>
<thead>
<tr>
+1 -1
View File
@@ -64,7 +64,7 @@
{{ inviteform.as_table }}
</table>
{% csrf_token %}
<input class="button green" type="submit" value="Submit">
<input type="submit" value="Submit">
</form>
{% else %}
<p>
+1 -1
View File
@@ -14,7 +14,7 @@
You can read the comment here:
</p>
<p>
<a href="{{ siteurl }} {{ commentlink }}">
<a href="{{ siteurl }}{{ commentlink }}">
{{ siteurl }}{{ commentlink }}</a>
</p>
+2 -2
View File
@@ -41,9 +41,9 @@
<li>
<p>Closest Airport Weather: {{ airport }}
({{ 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>
<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>
Download wind speed and bearing from <a href="http://forecast.io/">The Dark Sky</a>
</p>
+3 -2
View File
@@ -28,12 +28,13 @@
<script>
$(function($) {
console.log('loading script');
var workoutid = {{ workout.id }};
var workoutid = '{{ workout.id|encode }}';
console.log(workoutid);
var shownotes = true;
if("{{ rower.showfavoritechartnotes }}" == "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;
$("#id_sitready").remove();
$("#id_thumbs").append(
+2 -1
View File
@@ -1,8 +1,9 @@
{% load rowerfilters %}
{% for chart in charts %}
<div class="grid_3 alpha">
<big>{{ forloop.counter }}</big>
<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 }}
</a>
{% if rower.showfavoritechartnotes %}
+2 -2
View File
@@ -38,7 +38,7 @@
</tr><tr>
<th>Public link to this workout</th>
<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>
</tr>
</table>
@@ -56,7 +56,7 @@
</div>
</p>
{% 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%>
{{ form.as_table }}
</table>
+5 -5
View File
@@ -57,15 +57,15 @@ $('#id_workouttype').change();
<li class="grid_4">
<p>
<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">
<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>
</p>
<p>
<a class="twitter-share-button"
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>
</p>
<table width=100%>
@@ -86,7 +86,7 @@ $('#id_workouttype').change();
</tr><tr>
<th>Public link to this workout:</th>
<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>
</tr>
</table>
@@ -123,7 +123,7 @@ $('#id_workouttype').change();
<h1>Racing</h1>
{% for race in indoorraces %}
<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>
{% endfor %}
</li>
+4 -4
View File
@@ -56,10 +56,10 @@
{% endif %}
<p>
<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">
<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
</a>
</div>
@@ -67,7 +67,7 @@
<p>
<a class="twitter-share-button"
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>
</p>
<table width=100%>
@@ -94,7 +94,7 @@
<tr>
<th>Comments</th>
<td>
<a href="/rowers/workout/{{ workout.id }}/comment/">Comment ({{ aantalcomments }})</a>
<a href="/rowers/workout/{{ workout.id|encode }}/comment/">Comment ({{ aantalcomments }})</a>
</td>
</tr>
{% endif %}
+10 -2
View File
@@ -26,8 +26,12 @@ from rowers.utils import NoTokenError
import rowers.payments as payments
from rowers.opaque import encoder
import arrow
def strfdelta(tdelta):
minutes,seconds = divmod(tdelta.seconds,60)
tenths = int(tdelta.microseconds/1e5)
@@ -81,6 +85,10 @@ def aantalcomments(workout):
return aantalcomments
@register.filter
def encode(id):
return str(encoder.encode_hex(id))
@register.filter
def water(workout):
try:
@@ -567,7 +575,7 @@ def nextworkout(workout,user):
return 0
if ws:
return ws[0].id
return encoder.encode_hex(ws[0].id)
else:
return 0
@@ -598,7 +606,7 @@ def previousworkout(workout,user):
if ws:
return ws[0].id
return encoder.encode_hex(ws[0].id)
else:
return 0
+3
View File
@@ -1,6 +1,9 @@
import pytest
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
import re
+4
View File
@@ -84,6 +84,7 @@ faker = Factory.create()
from rowers.utils import calculate_age
from rowers.tasks import handle_getagegrouprecords
from rowers.opaque import encoder
import inspect
@@ -211,5 +212,8 @@ def cleanup(request):
pass
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)
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)
self.assertEqual(response.status_code,200)
@@ -299,7 +299,8 @@ class ForcecurveTest(TestCase):
login = self.c.login(username=self.u.username, password = self.password)
self.assertTrue(login)
url = '/rowers/workout/1/forcecurve/'
encoded1 = str(encoder.encode_hex(1))
url = '/rowers/workout/'+encoded1+'/forcecurve/'
response = self.c.get(url)
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)
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)
self.assertEqual(response.status_code,200)
@@ -186,7 +186,7 @@ class WorkoutViewTest(TestCase):
expected_url = reverse(self.r.defaultlandingpage,
kwargs = {
'id':12
'id':encoder.encode_hex(12)
})
self.assertRedirects(response,
@@ -209,7 +209,7 @@ class WorkoutViewTest(TestCase):
response = self.c.get('/')
url = reverse('multi_compare_view',kwargs={
'userid':self.u.id,
'id':self.werg1.id,
'id':encoder.encode_hex(self.werg1.id),
})
print url
@@ -241,13 +241,13 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
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)
self.assertEqual(response.status_code,200)
url = reverse('workout_downloadmetar_view',kwargs={
'id': self.wwater.id,
'id': encoder.encode_hex(self.wwater.id),
'airportcode': 'LKHO'
}
)
@@ -256,7 +256,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200)
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)
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)
self.assertEqual(response.status_code,200)
expected_url = reverse(self.r.defaultlandingpage,
kwargs = {
'id':self.wwater.id
'id':encoder.encode_hex(self.wwater.id)
}
)
@@ -285,14 +285,14 @@ class WorkoutViewTest(TestCase):
expected_url=expected_url,
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)
self.assertEqual(response.status_code,200)
expected_url = reverse(self.r.defaultlandingpage,
kwargs = {
'id':self.wwater.id
'id':encoder.encode_hex(self.wwater.id)
}
)
@@ -308,7 +308,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
@@ -336,7 +336,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
@@ -363,7 +363,7 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
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)
self.assertEqual(response.status_code,200)
@@ -380,7 +380,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
@@ -397,7 +397,7 @@ class WorkoutViewTest(TestCase):
response = self.c.post(url,form_data,follow=True)
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,
expected_url=expected_url,
@@ -410,7 +410,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
@@ -425,7 +425,7 @@ class WorkoutViewTest(TestCase):
response = self.c.post(url,form_data,follow=True)
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)
self.assertEqual(response.status_code,200)
@@ -436,7 +436,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
@@ -448,7 +448,8 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
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)
self.assertEqual(response.status_code,200)
@@ -466,7 +467,8 @@ class WorkoutViewTest(TestCase):
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,
expected_url=expected_url,
@@ -480,7 +482,7 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
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)
self.assertEqual(response.status_code,200)
@@ -505,8 +507,9 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
url = reverse('workout_fusion_view',kwargs={'id1':self.werg2.id,
'id2':self.werg2copy.id})
url = reverse('workout_fusion_view',
kwargs={'id1':encoder.encode_hex(self.werg2.id),
'id2':encoder.encode_hex(self.werg2copy.id)})
response = self.c.get(url)
@@ -534,7 +537,7 @@ class WorkoutViewTest(TestCase):
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)
self.assertEqual(response.status_code,200)
+1 -1
View File
@@ -213,7 +213,7 @@ class CPChartTest(TestCase):
self.assertRedirects(response,
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)
# 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):
login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login)
encodedid = str(encoder.encode_hex(self.wote.id))
url = '/rowers/workout/{id}/workflow/'.format(
id = self.wote.id
id = encodedid
)
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)
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)
self.assertEqual(response.status_code,200)
@@ -126,7 +127,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200)
url = reverse('workout_flexchart3_view',kwargs={
'id':self.wwater.id,
'id':encoder.encode_hex(self.wwater.id),
'xparam':'distance',
'yparam1':'hr',
'yparam2':'power'
@@ -150,7 +151,8 @@ class WorkoutViewTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
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)
self.assertEqual(response.status_code,200)
@@ -168,7 +170,7 @@ class WorkoutViewTest(TestCase):
self.assertEqual(response.status_code,200)
url = reverse('workout_flexchart3_view',kwargs={
'id':self.werg1.id,
'id':encoder.encode_hex(self.werg1.id),
'xparam':'distance',
'yparam1':'hr',
'yparam2':'power'
+27 -21
View File
@@ -2,6 +2,7 @@
from statements import *
nu = datetime.datetime.now()
import rowers
@pytest.mark.django_db
@@ -78,13 +79,13 @@ class C2Objects(DjangoTestCase):
@patch('rowers.c2stuff.requests.post', side_effect=mocked_requests)
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)
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,
expected_url = '/rowers/workout/1/edit/',
expected_url = '/rowers/workout/'+encoded1+'/edit/',
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)
@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)
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_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)
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=301,target_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.get', side_effect=mocked_requests)
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,
expected_url = '/rowers/workout/1/edit/',
expected_url = '/rowers/workout/'+encoded1+'/edit/',
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)
@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)
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_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)
expected_url = reverse('workout_edit_view',
kwargs = {'id':encoder.encode_hex(2)})
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url=expected_url,
status_code=302,target_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.get', side_effect=mocked_requests)
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,
expected_url = '/rowers/workout/1/edit/',
expected_url = '/rowers/workout/'+encoded1+'/edit/',
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)
@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)
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_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.get', side_effect=mocked_requests)
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,
expected_url = '/rowers/workout/1/edit/',
expected_url = '/rowers/workout/'+encoded1+'/edit/',
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)
@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)
self.assertRedirects(response,
expected_url='/rowers/workout/2/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=302,target_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.get', side_effect=mocked_requests)
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,
expected_url = '/rowers/workout/1/edit/',
expected_url = '/rowers/workout/'+encoded1+'/edit/',
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)
+1 -1
View File
@@ -1575,7 +1575,7 @@ class PlannedSessionsView(TestCase):
url = '/rowers/sessions/{psid}/detach/{id}/'.format(
psid=self.ps_time.id,
id = self.w1.id,
id = encoder.encode_hex(self.w1.id),
)
response = self.c.get(url,follow=True)
+1 -1
View File
@@ -74,7 +74,7 @@ class SimpleViewTest(TestCase):
def test_getworkout(self):
with assert_raises(Http404):
w = get_workout(123)
w = get_workout(encoder.encode_hex(123))
def test_deactivate(self):
login = self.c.login(username=self.u.username, password=self.password)
+30 -28
View File
@@ -56,28 +56,30 @@ class ViewTest(TestCase):
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)
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)
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)
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)
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)
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)
self.assertEqual(response.status_code, 200)
@@ -98,7 +100,7 @@ class ViewTest(TestCase):
}
form = WorkoutForm(data=form_data)
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)
@@ -151,12 +153,12 @@ class ViewTest(TestCase):
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)
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)
@@ -193,7 +195,7 @@ class ViewTest(TestCase):
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)
self.assertEqual(response.status_code, 200)
@@ -262,7 +264,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -273,7 +275,7 @@ class ViewTest(TestCase):
form_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,
follow=True)
@@ -312,7 +314,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -349,7 +351,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -388,7 +390,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -424,7 +426,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -461,7 +463,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -500,7 +502,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
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)
self.assertEqual(response.status_code, 200)
@@ -536,7 +538,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -569,7 +571,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -602,7 +604,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -635,7 +637,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -669,7 +671,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -701,7 +703,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -733,7 +735,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
self.assertEqual(response.status_code, 200)
@@ -765,7 +767,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data)
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)
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 *
nu = datetime.datetime.now()
tested = [
'/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/user/1/',
'/rowers/sessions/coach/',
'/rowers/sessions/coach/user/1/',
# '/rowers/sessions/coach/user/1/',
'/rowers/sessions/create/',
'/rowers/sessions/create/user/1/',
# '/rowers/sessions/create/user/1/',
'/rowers/sessions/manage/',
'/rowers/sessions/manage/user/1/',
# '/rowers/sessions/manage/user/1/',
'/rowers/sessions/multiclone/',
'/rowers/sessions/multiclone/user/1/',
# '/rowers/sessions/multiclone/user/1/',
'/rowers/sessions/multicreate/',
'/rowers/sessions/multicreate/user/1/',
# '/rowers/sessions/multicreate/user/1/',
'/rowers/sessions/print/',
'/rowers/sessions/print/user/1/',
# '/rowers/sessions/print/user/1/',
'/rowers/sessions/teamcreate/',
'/rowers/sessions/user/1/',
# '/rowers/sessions/user/1/',
'/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/test-job/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/',
# '/rowers/user-multiflex/user/1/',
'/rowers/workout/1/',
'/rowers/workout/1/adddistanceplot/',
'/rowers/workout/1/adddistanceplot2/',
'/rowers/workout/1/addotwpowerplot/',
'/rowers/workout/1/addpiechart/',
'/rowers/workout/1/addpowerpiechart/',
'/rowers/workout/1/addstatic/',
'/rowers/workout/1/addstatic/3/',
'/rowers/workout/1/addtimeplot/',
'/rowers/workout/1/addtimeplot2/',
'/rowers/workout/1/comment/',
'/rowers/workout/1/darkskywind/',
'/rowers/workout/1/data/',
'/rowers/workout/1/edit/',
'/rowers/workout/1/editintervals/',
'/rowers/workout/1/flexchart/',
'/rowers/workout/1/forcecurve/',
'/rowers/workout/1/get-testscript/',
'/rowers/workout/1/get-thumbnails/',
'/rowers/workout/1/histo/',
'/rowers/workout/1/image/',
'/rowers/workout/1/instroke/',
'/rowers/workout/1/interactiveotwplot/',
'/rowers/workout/1/map/',
'/rowers/workout/1/otwsetpower/',
'/rowers/workout/1/recalcsummary/',
'/rowers/workout/1/restore/',
'/rowers/workout/1/smoothenpace/',
'/rowers/workout/1/split/',
'/rowers/workout/1/stats/',
'/rowers/workout/1/stream/',
# '/rowers/workout/1/task/',
'/rowers/workout/1/test_strokedata/',
'/rowers/workout/1/toggle-ranking/',
'/rowers/workout/1/undosmoothenpace/',
'/rowers/workout/1/unsubscribe/',
'/rowers/workout/1/updatecp/',
'/rowers/workout/1/view/',
'/rowers/workout/1/wind/',
'/rowers/workout/1/workflow/',
# '/rowers/workout/compare/1/2016-01-01/2016-12-31/',
'/rowers/workout/fusion/1/',
'/rowers/workout/fusion/1/2016-01-01/2016-12-31/',
'/rowers/workout/'+encoded1+'/',
'/rowers/workout/'+encoded1+'/adddistanceplot/',
'/rowers/workout/'+encoded1+'/adddistanceplot2/',
'/rowers/workout/'+encoded1+'/addotwpowerplot/',
'/rowers/workout/'+encoded1+'/addpiechart/',
'/rowers/workout/'+encoded1+'/addpowerpiechart/',
'/rowers/workout/'+encoded1+'/addstatic/',
'/rowers/workout/'+encoded1+'/addstatic/3/',
'/rowers/workout/'+encoded1+'/addtimeplot/',
'/rowers/workout/'+encoded1+'/addtimeplot2/',
'/rowers/workout/'+encoded1+'/comment/',
'/rowers/workout/'+encoded1+'/darkskywind/',
'/rowers/workout/'+encoded1+'/data/',
'/rowers/workout/'+encoded1+'/edit/',
'/rowers/workout/'+encoded1+'/editintervals/',
'/rowers/workout/'+encoded1+'/flexchart/',
'/rowers/workout/'+encoded1+'/forcecurve/',
'/rowers/workout/'+encoded1+'/get-testscript/',
'/rowers/workout/'+encoded1+'/get-thumbnails/',
'/rowers/workout/'+encoded1+'/histo/',
'/rowers/workout/'+encoded1+'/image/',
'/rowers/workout/'+encoded1+'/instroke/',
'/rowers/workout/'+encoded1+'/interactiveotwplot/',
'/rowers/workout/'+encoded1+'/map/',
'/rowers/workout/'+encoded1+'/otwsetpower/',
'/rowers/workout/'+encoded1+'/recalcsummary/',
'/rowers/workout/'+encoded1+'/restore/',
'/rowers/workout/'+encoded1+'/smoothenpace/',
'/rowers/workout/'+encoded1+'/split/',
'/rowers/workout/'+encoded1+'/stats/',
'/rowers/workout/'+encoded1+'/stream/',
# '/rowers/workout/'+encoded1+'/task/',
# '/rowers/workout/'+encoded1+'/teststrokedata/',
'/rowers/workout/'+encoded1+'/toggle-ranking/',
'/rowers/workout/'+encoded1+'/undosmoothenpace/',
'/rowers/workout/'+encoded1+'/unsubscribe/',
'/rowers/workout/'+encoded1+'/updatecp/',
'/rowers/workout/'+encoded1+'/view/',
'/rowers/workout/'+encoded1+'/wind/',
'/rowers/workout/'+encoded1+'/workflow/',
'/rowers/workout/fusion/'+encoded1+'/',
'/rowers/workout/fusion/'+encoded1+'/2016-01-01/2016-12-31/',
'/rowers/workout/upload/',
'/rowers/workout/upload/team/',
'/rowers/workouts-join/',
@@ -270,18 +270,22 @@ class URLTests(TestCase):
expected)
html = BeautifulSoup(response.content,'html.parser')
urls = [a['href'] for a in html.find_all('a')]
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:
response = self.c.get(u)
if response.status_code not in [200,302]:
response2 = self.c.get(u)
if response2.status_code not in [200,302]:
print(len(tested))
print(response.templates[0].name)
print(url)
print(u)
print(response.status_code)
tested.append(u)
self.assertIn(response.status_code,
self.assertIn(response2.status_code,
[200,302])
else:
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'^api-docs/$', views.schema_view,name='schema_view'),
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'^502/$', TemplateView.as_view(template_name='502.html'),name='502'),
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+)/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+)/submit/$',
url(r'^virtualevent/(?P<id>\b[0-9A-Fa-f]+\b)/submit/$',
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'),
url(r'^virtualevent/(?P<raceid>\d+)/disqualify/(?P<recordid>\d+)/',
views.virtualevent_disqualify_view,name='virtualevent_submit_disqualify_view'),
url(r'^list-workouts/$',views.workouts_view,
name='workouts_view'),
views.virtualevent_disqualify_view,name='virtualevent_disqualify_view'),
url(r'^list-workouts/$',views.workouts_view,name='workouts_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'^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/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/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+)/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>\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+)/(?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)/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+)/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+)/$',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+)/$',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/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/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'^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-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'),
@@ -251,43 +251,51 @@ urlpatterns = [
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<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>\d+)/toggle-ranking/$',views.workout_toggle_ranking,name='workout_toggle_ranking'),
url(r'^workout/(?P<id>\d+)/get-testscript/$',views.get_testscript),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-thumbnails/$',views.get_thumbnails,
name='get_thumbnails'),
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/$',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>\d+)/task/$',views.workout_test_task_view),
url(r'^workout/(?P<id>\d+)/forcecurve/$',views.workout_forcecurve_view,name='workout_forcecurve_view'),
url(r'^workout/(?P<id>\d+)/unsubscribe/$',views.workout_unsubscribe_view,name='workout_unsubscribe_view'),
# url(r'^workout/(?P<id>\d+)/export/$',views.workout_export_view),
url(r'^workout/(?P<id>\d+)/comment/$',views.workout_comment_view,name='workout_comment_view'),
url(r'^workout/(?P<id>\d+)/emailtcx/$',views.workout_tcxemail_view,name='workout_tcxemail_view'),
url(r'^workout/(?P<id>\d+)/emailgpx/$',views.workout_gpxemail_view,name='workout_gpxemail_view'),
url(r'^workout/(?P<id>\d+)/emailcsv/$',views.workout_csvemail_view,name='workout_csvemail_view'),
url(r'^workout/(?P<id>\d+)/csvtoadmin/$',views.workout_csvtoadmin_view,name='workout_csvtoadmin_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/histo/$',views.workout_histo_view,
name='workout_histo_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>\b[0-9A-Fa-f]+\b)/forcecurve/$',views.workout_forcecurve_view,
name='workout_forcecurve_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/unsubscribe/$',views.workout_unsubscribe_view,
name='workout_unsubscribe_view'),
# url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/export/$',views.workout_export_view),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/comment/$',views.workout_comment_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'^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/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,
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/edit/$',views.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>\d+)/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>\d+)/makepublic/$',views.workout_makepublic_view),
# url(r'^workout/(?P<id>\d+)/geeky/$',views.workout_geeky_view),
# url(r'^workout/(?P<id>\d+)/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>\d+)/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>\d+)/data/$',views.workout_data_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>\b[0-9A-Fa-f]+\b)/setprivate/$',views.workout_setprivate_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>\b[0-9A-Fa-f]+\b)/makepublic/$',views.workout_makepublic_view),
# url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/geeky/$',views.workout_geeky_view),
# url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/advanced/$',views.workout_advanced_view),
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>\b[0-9A-Fa-f]+\b)/instroke/$',views.instroke_view,name='instroke_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>\b[0-9A-Fa-f]+\b)/data/$',views.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>\d+)/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>\d+)/image/$',views.workout_uploadimage_view,name='workout_uploadimage_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>\b[0-9A-Fa-f]+\b)/interactiveotwplot/$',views.workout_otwpowerplot_view,name='workout_otwpowerplot_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>\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+)/image/$',
views.virtualevent_uploadimage_view,name='virtualevent_uploadimage_view'),
@@ -295,56 +303,58 @@ urlpatterns = [
views.virtualevent_setlogo_view,name='virtualevent_setlog_view'),
url(r'^logo/(?P<id>\d+)/delete/$',
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>\d+)/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>\d+)/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)/darkskywind/$',views.workout_downloadwind_view,name='workout_downloadwind_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>\b[0-9A-Fa-f]+\b)/stream/$',views.workout_stream_view,name='workout_stream_view'),
# url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/crewnerdsummary/$',views.workout_crewnerd_summary_view),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/editintervals/$',views.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>\d+)/split/$',views.workout_split_view,name='workout_split_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>\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+)/view/$',views.workout_view,name='workout_view'),
url(r'^workout/(?P<id>\d+)/$',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<id>\d+)/$',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/(?P<id>\b[0-9A-Fa-f]+\b)/view/$',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>\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>\b[0-9A-Fa-f]+\b)/$',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(
template_name='help.html'),name='help'
),
url(r'^physics/$',TemplateView.as_view(template_name='physics.html'),name='physics'),
url(r'^partners/$',TemplateView.as_view(template_name='partners.html'),name='partners'),
# 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,
{'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,
{'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,
{'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,
{'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,
{'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,
{'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,
{'plotnr':'13'},name='workout_add_chart_view'),
# 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'),
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(
views.WorkoutDelete.as_view()),
name='workout_delete'),
url(r'^workout/(?P<id>\d+)/smoothenpace/$',views.workout_smoothenpace_view,name='workout_smoothenpace_view'),
url(r'^workout/(?P<id>\d+)/undosmoothenpace/$',views.workout_undo_smoothenpace_view,name='workout_undo_smoothenpace_view'),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/delete/$',login_required(
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/c2list/$',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/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/(?P<id>\d+)/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>\d+)/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>\d+)/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>\d+)/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'^multi-compare/workout/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.multi_compare_view,
# url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/deleteconfirm/$',views.workout_delete_confirm_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>\b[0-9A-Fa-f]+\b)/stravauploadw/$',views.workout_strava_upload_view,name='workout_strava_upload_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>\b[0-9A-Fa-f]+\b)/sporttracksuploadw/$',views.workout_sporttracks_upload_view,name='workout_sporttracks_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>\b[0-9A-Fa-f]+\b)/underarmouruploadw/$',views.workout_underarmour_upload_view,name='workout_underarmour_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>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.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'^user-boxplot/user/(?P<userid>\d+)/$',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'^register/$',views.rower_register_view,name='rower_register_view'),
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'),
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>\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>\d+)/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/(?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>\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>\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\ ]+.*)/$',views.workout_comparison_view2),
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(
views.TrainingTargetUpdate.as_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,
name='plannedsession_teamcreate_view'),
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+)/clone/user/(?P<userid>\d+)/$',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>\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>\b[0-9A-Fa-f]+\b)/$',views.plannedsession_detach_view),
url(r'^sessions/(?P<id>\d+)/$',views.plannedsession_view,
name='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,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -106,7 +106,7 @@ def workout_strava_upload_view(request,id=0):
pass
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
response = HttpResponseRedirect(url)
return response
@@ -137,14 +137,14 @@ def workout_strava_upload_view(request,id=0):
w.save()
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
response = HttpResponseRedirect(url)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
}
)
response = HttpResponseRedirect(url)
@@ -156,7 +156,7 @@ def workout_strava_upload_view(request,id=0):
os.remove(tcxfile)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
response = HttpResponseRedirect(url)
@@ -183,7 +183,7 @@ def workout_c2_upload_view(request,id=0):
url = reverse(r.defaultlandingpage,
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)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':id,
})
return HttpResponseRedirect(url)
@@ -235,7 +235,8 @@ def workout_runkeeper_upload_view(request,id=0):
runkeeperid = runkeeperstuff.getidfromresponse(response)
w.uploadedtorunkeeper = runkeeperid
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)
else:
@@ -249,7 +250,7 @@ def workout_runkeeper_upload_view(request,id=0):
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -275,7 +276,7 @@ def workout_underarmour_upload_view(request,id=0):
messages.error(request,message)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -300,7 +301,7 @@ def workout_underarmour_upload_view(request,id=0):
underarmourid = underarmourstuff.getidfromresponse(response)
w.uploadedtounderarmour = underarmourid
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)
else:
@@ -313,7 +314,7 @@ def workout_underarmour_upload_view(request,id=0):
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -340,7 +341,7 @@ def workout_sporttracks_upload_view(request,id=0):
messages.error(request,message)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -367,7 +368,7 @@ def workout_sporttracks_upload_view(request,id=0):
message = "Upload to SportTracks was successful"
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)
else:
s = response
@@ -379,7 +380,7 @@ def workout_sporttracks_upload_view(request,id=0):
url = reverse(r.defaultlandingpage,
kwargs = {
'id':str(w.id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -965,7 +966,7 @@ def workout_stravaimport_view(request,message="",userid=0):
'name':'Workouts'
},
{
'url':reverse(workout_stravaimport_view),
'url':reverse('workout_stravaimport_view'),
'name':'Strava'
},
]
@@ -1021,7 +1022,7 @@ def workout_runkeeperimport_view(request,message="",userid=0):
'name':'Workouts'
},
{
'url':reverse(workout_runkeeperimport_view),
'url':reverse('workout_runkeeperimport_view'),
'name':'Runkeeper'
}
]
@@ -1073,7 +1074,7 @@ def workout_underarmourimport_view(request,message="",userid=0):
'name':'Workouts'
},
{
'url':reverse(workout_c2import_view),
'url':reverse('workout_c2import_view'),
'name':'Concept2'
},
]
@@ -1126,7 +1127,7 @@ def workout_polarimport_view(request,userid=0):
'name':'Workouts'
},
{
'url':reverse(workout_polarimport_view),
'url':reverse('workout_polarimport_view'),
'name':'Polar'
},
]
@@ -1198,7 +1199,7 @@ def workout_sporttracksimport_view(request,message="",userid=0):
'name':'Workouts'
},
{
'url':reverse(workout_sporttracksimport_view),
'url':reverse('workout_sporttracksimport_view'),
'name':'SportTracks'
},
]
@@ -1343,11 +1344,11 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
'name':'Workouts'
},
{
'url':reverse(workout_c2import_view),
'url':reverse('workout_c2import_view'),
'name':'Concept2'
},
{
'url':reverse(workout_c2import_view,kwargs={'page':page}),
'url':reverse('workout_c2import_view',kwargs={'page':page}),
'name':'Page '+str(page)
}
]
@@ -1445,7 +1446,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
messages.info(request,message)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id),
'id':encoder.encode_hex(w.id),
})
return HttpResponseRedirect(url)
@@ -1458,7 +1459,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
source=source,
workoutsource=source)
w = get_workout(id)
w = get_workout(encoder.encode_hex(id))
if 'workout' in data:
if 'splits' in data['workout']:
@@ -1516,7 +1517,7 @@ def workout_getimportview(request,externalid,source = 'c2'):
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id)
'id':encoder.encode_hex(w.id)
})
return HttpResponseRedirect(url)
+3 -3
View File
@@ -137,11 +137,11 @@ def plannedsession_comment_view(request,id=0,userid=0):
else:
breadcrumbs = [
{
'url':reverse('virtualevents_view'),
'name': 'Races'
'url':reverse('plannedsessions_view'),
'name': 'Sessions'
},
{
'url': reverse('virtualevent_view',kwargs={'id':ps.id}),
'url': reverse('plannedsession_view',kwargs={'id':ps.id}),
'name': ps.name
},
{
+1 -1
View File
@@ -2251,7 +2251,7 @@ def virtualevent_submit_result_view(request,id=0,workoutid=0):
else:
if workoutid:
workoutdata['initial'] = workoutid
workoutdata['initial'] = encoder.decode_hex(workoutid)
w_form = WorkoutRaceSelectForm(workoutdata,entries)
+6 -4
View File
@@ -30,6 +30,7 @@ import cgi
from icalendar import Calendar, Event
import rowers.braintreestuff as braintreestuff
import rowers.payments as payments
from rowers.opaque import encoder
from django.shortcuts import render
from django.template.loader import render_to_string
@@ -258,13 +259,13 @@ def getfavorites(r,row):
def get_workout_default_page(request,id):
if request.user.is_anonymous():
return reverse('workout_view',kwargs={'id':str(id)})
return reverse('workout_view',kwargs={'id':id})
else:
r = Rower.objects.get(user=request.user)
if r.defaultlandingpage == 'workout_edit_view':
return reverse('workout_edit_view',kwargs={'id':str(id)})
return reverse('workout_edit_view',kwargs={'id':id})
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):
@@ -318,6 +319,7 @@ def getrower(user):
def get_workout(id):
try:
id = encoder.decode_hex(id)
w = Workout.objects.get(id=id)
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
@@ -709,7 +711,7 @@ def get_thumbnails(request,id):
charts = []
charts = thumbnails_set(r,id,favorites)
charts = thumbnails_set(r,encoder.decode_hex(id),favorites)
try:
if charts[0]['script'] == '':
charts = []
+97 -79
View File
@@ -60,7 +60,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
'the_div':div,
'js_res': js_resources,
'css_res':css_resources,
'id':int(id),
'id':id,
'mayedit':mayedit,
'workstrokesonly': not workstrokesonly,
'teams':get_my_teams(request.user),
@@ -126,7 +126,7 @@ def workout_histo_view(request,id=0):
'workout':w,
'rower':r,
'the_div':div,
'id':int(id),
'id':id,
'mayedit':mayedit,
'teams':get_my_teams(request.user),
})
@@ -248,7 +248,7 @@ def addmanual_view(request):
url = reverse(
'workout_edit_view',
kwargs={'id':id}
kwargs={'id':encoder.encode_hex(id)}
)
return HttpResponseRedirect(url)
else:
@@ -371,14 +371,14 @@ def workout_recalcsummary_view(request,id=0):
messages.info(request,successmessage)
url = reverse('workout_edit_view',
kwargs = {
'id':int(id),
'id':id,
})
else:
message = "Something went wrong. Could not update summary"
messages.error(request,message)
url = reverse('workout_edit_view',
kwargs = {
'id':int(id),
'id':id,
})
return HttpResponseRedirect(url)
@@ -419,7 +419,7 @@ def workouts_join_view(request):
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id),
'id':encoder.encode_hex(id),
})
return HttpResponseRedirect(url)
@@ -740,7 +740,7 @@ def team_comparison_select(request,
if not checkworkoutuser(request.user,firstworkout):
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
else:
firstworkout = None
@@ -856,7 +856,7 @@ def virtualevent_compare_view(request,id=0):
workouts = []
for id in workoutids:
try:
workouts.append(Workout.objects.get(id=id))
workouts.append(Workout.objects.get(id=encode.decode_hex(id)))
except Workout.DoesNotExist:
pass
@@ -888,7 +888,7 @@ def virtualevent_compare_view(request,id=0):
workouts = []
for id in workoutids:
try:
workouts.append(Workout.objects.get(id=id))
workouts.append(Workout.objects.get(id=encoded.decode_hex(id)))
except Workout.DoesNotExist:
pass
@@ -989,7 +989,8 @@ def plannedsession_compare_view(request,id=0,userid=0):
request.session['ps'] = ps.id
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:
url = reverse('plannedsession_view',kwargs={'id':ps.id})
@@ -1401,9 +1402,12 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
enddate = startdate
startdate = s
if id:
theid = encoder.decode_hex(id)
workouts = Workout.objects.filter(user=r,
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')
if query:
@@ -1438,7 +1442,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
'name':'Workouts'
},
{
'url':get_workout_default_page(request,row.id),
'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'name': row.name
},
{
@@ -1449,7 +1453,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
]
return render(request, 'fusion_list.html',
{'id':int(id),
{'id':id,
'workout':row,
'rower':r,
'searchform':searchform,
@@ -1474,7 +1478,7 @@ def workout_view(request,id=0):
rower = None
try:
row = Workout.objects.get(id=id)
row = Workout.objects.get(id=encoder.decode_hex(id))
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
@@ -1499,7 +1503,7 @@ def workout_view(request,id=0):
# create interactive plot
res = interactive_chart(id)
res = interactive_chart(encoder.decode_hex(id))
script = res[0]
div = res[1]
@@ -1591,7 +1595,7 @@ def workout_undo_smoothenpace_view(
row.df[' Stroke500mPace (sec/500m)'] = 500./velo
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,
kwargs = {
@@ -1641,7 +1645,7 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
row.df = row.df.fillna(0)
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')
@@ -1694,7 +1698,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
messages.info(request,successmessage)
url = reverse('workout_edit_view',
kwargs = {
'id':int(id),
'id':id,
})
return HttpResponseRedirect(url)
@@ -1707,7 +1711,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
messages.error(request,message)
url = reverse('workout_edit_view',
kwargs = {
'id':int(id),
'id':id,
})
return HttpResponseRedirect(url)
else:
@@ -1785,7 +1789,7 @@ def workout_downloadwind_view(request,id=0,
messages.info(request,message)
kwargs = {
'id':int(id)}
'id':id}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -1793,7 +1797,7 @@ def workout_downloadwind_view(request,id=0,
message = "No latitude/longitude data"
messages.error(request,message)
kwargs = {
'id':int(id)
'id':id
}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -1851,7 +1855,7 @@ def workout_downloadmetar_view(request,id=0,
messages.info(request,message)
kwargs = {
'id':int(id)}
'id':id}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -1859,7 +1863,7 @@ def workout_downloadmetar_view(request,id=0,
message = "No latitude/longitude data"
messages.error(request,message)
kwargs = {
'id':int(id)
'id':id
}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -1963,7 +1967,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
message = "Invalid Form"
messages.error(request,message)
kwargs = {
'id':int(id)
'id':id
}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -1972,7 +1976,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
form = UpdateWindForm()
# create interactive plot
res = interactive_windchart(id,promember=1)
res = interactive_windchart(encoder.decode_hex(id),promember=1)
script = res[0]
div = res[1]
@@ -2050,7 +2054,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
message = "Invalid Form"
messages.error(request,message)
kwargs = {
'id':int(id)}
'id':id}
url = reverse('workout_wind_view',kwargs=kwargs)
response = HttpResponseRedirect(url)
@@ -2058,7 +2062,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
form = UpdateStreamForm()
# create interactive plot
res = interactive_streamchart(id,promember=1)
res = interactive_streamchart(encoder.decode_hex(id),promember=1)
script = res[0]
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>'
messages.info(request,successmessage)
kwargs = {
'id':int(id)}
'id':id}
try:
url = request.session['referer']
@@ -2187,7 +2191,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
message = "Invalid Form"
messages.error(request,message)
kwargs = {
'id':int(id)}
'id':id}
url = reverse('workout_otwsetpower_view',kwargs=kwargs)
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)
@@ -2473,14 +2477,14 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
# 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):
raise PermissionDenied('Access Denied')
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
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)
workstrokesonly=False
if datadf.empty:
@@ -2964,7 +2968,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
css_resources,
workstrokesonly
) = interactive_flex_chart2(
id,xparam=xparam,yparam1=yparam1,
encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
yparam2=yparam2,
promember=promember,plottype=plottype,
workstrokesonly=workstrokesonly
@@ -2977,7 +2981,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
css_resources,
workstrokesonly
) = interactive_flex_chart2(
id,xparam=xparam,yparam1=yparam1,
encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
yparam2=yparam2,
promember=promember,plottype=plottype,
workstrokesonly=workstrokesonly
@@ -3044,7 +3048,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
flexoptionsform = FlexOptionsForm(initial=initial)
row = Workout.objects.get(id=id)
row = Workout.objects.get(id=encoder.decode_hex(id))
breadcrumbs = [
{
@@ -3076,7 +3080,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
'js_res': js_resources,
'css_res':css_resources,
'teams':get_my_teams(request.user),
'id':int(id),
'id':id,
'xparam':xparam,
'yparam1':yparam1,
'yparam2':yparam2,
@@ -3135,7 +3139,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
mayedit=1
# 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]
div = res[1]
@@ -3213,7 +3217,7 @@ def workout_comment_view(request,id=0):
c.save()
url = reverse('workout_comment_view',
kwargs={
'id':id
'id':id,
})
message = '{name} says: <a href="{url}">{comment}</a>'.format(
name = request.user.first_name,
@@ -3342,20 +3346,20 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
try:
boattype = request.POST['boattype']
except KeyError:
boattype = Workout.objects.get(id=id).boattype
boattype = Workout.objects.get(id=encoder.decode_hex(id)).boattype
try:
privacy = request.POST['privacy']
except KeyError:
privacy = Workout.objects.get(id=id).privacy
privacy = Workout.objects.get(id=row.id).privacy
try:
rankingpiece = form.cleaned_data['rankingpiece']
except KeyError:
rankingpiece =- Workout.objects.get(id=id).rankingpiece
rankingpiece =- Workout.objects.get(id=row.id).rankingpiece
try:
duplicate = form.cleaned_data['duplicate']
except KeyError:
duplicate = Workout.objects.get(id=id).duplicate
duplicate = Workout.objects.get(id=row.id).duplicate
if private:
privacy = 'private'
@@ -3418,7 +3422,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
return HttpResponse("Error: CSV Data File Not Found")
r.rowdatetime = startdatetime
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"
if rankingpiece:
@@ -3427,7 +3431,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
messages.info(request,successmessage)
url = reverse('workout_edit_view',
kwargs = {
'id':str(row.id),
'id':encoder.encode_hex(row.id),
})
response = HttpResponseRedirect(url)
@@ -3486,11 +3490,11 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
'name':'Workouts'
},
{
'url':get_workout_default_page(request,id),
'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'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'
}
@@ -3631,7 +3635,7 @@ def workout_uploadimage_view(request,id):
messages.error(request,message)
url = reverse(r.defaultlandingpage,
kwargs = {
'id':int(id),
'id':id,
})
return HttpResponseRedirect(url)
@@ -3729,7 +3733,7 @@ def workout_add_chart_view(request,id,plotnr=1):
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)
@@ -4004,9 +4008,11 @@ def workout_upload_view(request,
if message:
messages.error(request,message)
w = Workout.objects.get(id=id)
url = reverse('workout_edit_view',
kwargs = {
'id':int(id),
'id':encoder.encode_hex(w.id),
})
if is_ajax:
@@ -4014,7 +4020,6 @@ def workout_upload_view(request,
else:
response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id)
r = getrower(request.user)
if (make_plot):
@@ -4135,7 +4140,7 @@ def workout_upload_view(request,
if landingpage != 'workout_upload_view':
url = reverse(landingpage,
kwargs = {
'id':w.id,
'id':encoder.encode_hex(w.id),
})
else:
url = reverse(landingpage)
@@ -4326,7 +4331,7 @@ def team_workout_upload_view(request,message="",
url = reverse('team_workout_upload_view')
response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id)
w = Workout.objects.get(id=encoder.decode_hex(id))
r = getrower(request.user)
if (make_plot):
@@ -4459,12 +4464,7 @@ def graph_show_view(request,id):
# Restore original stroke data and summary
@login_required()
def workout_summary_restore_view(request,id,message="",successmessage=""):
try:
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")
row = get_workout_permitted(request.user,id)
s = ""
# 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")
rowdata.restoreintervaldata()
rowdata.write_csv(f1,gzip=True)
dataprep.update_strokedata(id,rowdata.df)
dataprep.update_strokedata(encoder.decode_hex(id),rowdata.df)
intervalstats = rowdata.allstats()
row.summary = intervalstats
row.save()
# create interactive plot
try:
res = interactive_chart(id,promember=1)
res = interactive_chart(encoder.decode_hex(id),promember=1)
script = res[0]
div = res[1]
except ValueError:
@@ -4506,14 +4506,14 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
messages.info(request,'Original Interval Data Restored')
url = reverse('workout_summary_edit_view',
kwargs={
'id':int(id),
'id':encoder.encode_hex(row.id),
}
)
return HttpResponseRedirect(url)
# Split a workout
@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)
r = row.user
@@ -4524,11 +4524,11 @@ def workout_split_view(request,id=id):
'name':'Workouts'
},
{
'url':get_workout_default_page(request,row.id),
'url':get_workout_default_page(request,id),
'name': row.name
},
{
'url':reverse('graph_show_view',
'url':reverse('workout_split_view',
kwargs={'id':id}),
'name': 'Chart'
}
@@ -4586,7 +4586,7 @@ def workout_split_view(request,id=id):
# create interactive plot
try:
res = interactive_chart(id,promember=1)
res = interactive_chart(encoder.decode_hex(id),promember=1)
script = res[0]
div = res[1]
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)
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)
try:
@@ -4645,7 +4651,7 @@ def workout_fusion_view(request,id1=0,id2=1):
url = reverse('workout_edit_view',
kwargs={
'id':idnew,
'id':encoder.encode_hex(idnew),
})
return HttpResponseRedirect(url)
@@ -4658,17 +4664,21 @@ def workout_fusion_view(request,id1=0,id2=1):
'name':'Workouts'
},
{
'url':get_workout_default_page(request,w1.id),
'name': str(w1.id)
'url':get_workout_default_page(request,encoder.encode_hex(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'
},
{
'url':reverse('workout_fusion_view',
kwargs={'id1':id1,'id2':id2}),
'name': str(w2.id)
kwargs={
'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'
},
{
'url':get_workout_default_page(request,row.id),
'url':get_workout_default_page(request,encoder.encode_hex(row.id)),
'name': row.name
},
{
@@ -4837,7 +4847,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
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")
data = {
@@ -4881,7 +4891,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
row.save()
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")
data = {'intervalstring':s}
form = SummaryStringForm(initial=data)
@@ -4996,7 +5006,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
row.save()
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")
form = SummaryStringForm()
@@ -5077,11 +5087,12 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'normp': normp,
'normv': normv,
}
res = interactive_chart(id,promember=1,intervaldata=intervaldata)
res = interactive_chart(encoder.decode_hex(id),promember=1,intervaldata=intervaldata)
script = res[0]
div = res[1]
except ValueError:
pass
script = ''
div = ''
# render page
@@ -5150,6 +5161,13 @@ class GraphDelete(DeleteView):
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):
login_required = True
model = Workout
@@ -5165,8 +5183,8 @@ class WorkoutDelete(DeleteView):
'name':'Workouts'
},
{
'url':get_workout_default_page(self.request,self.object.id),
'name': str(self.object.id)
'url':get_workout_default_page(self.request,encoder.encode_hex(self.object.id)),
'name': encoder.encode_hex(self.object.id)
},
{ 'url':reverse('workout_delete',kwargs={'pk':str(self.object.pk)}),
'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']
except KeyError:
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_1 alpha">
<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 class="grid_2">
<p id="header">
@@ -118,7 +118,7 @@
</div>
<div class="grid_1 omega">
<p id="header">
<a class="button gray small" href="/rowers/email">Contact</a>
<a class="button gray small" href="/rowers/email/">Contact</a>
</p>
</div>
<div class="grid_4 alpha">
@@ -131,9 +131,9 @@
{% if user.is_authenticated %}
<p>
{% 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 %}
<a class="button gray small" href="/rowers/me/edit">{{ user }}</a>
<a class="button gray small" href="/rowers/me/edit/">{{ user }}</a>
{% endif %}
</p>
<span class="tooltiptext">Edit user account, e.g. heart rate zones, power zones, email, teams</span>
@@ -144,7 +144,7 @@
</div>
<div class="grid_1">
{% 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 %}
<p>&nbsp</p>
{% endif %}