Private
Public Access
1
0

opaquification part 1

This commit is contained in:
Sander Roosendaal
2019-01-03 20:50:36 +01:00
parent e42583d4f9
commit f901258b9b
11 changed files with 314 additions and 175 deletions

View File

@@ -77,7 +77,7 @@ from rowsandall_app.settings import SITE_URL
from rowers.mytypes import otwtypes from rowers.mytypes import otwtypes
from rowers.database import * from rowers.database import *
from rowers.opaque import encoder
# mapping the DB column names to the CSV file column names # mapping the DB column names to the CSV file column names
@@ -1139,7 +1139,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
btvalues=btvalues.to_json()) btvalues=btvalues.to_json())
return (w.id, message) return (encoder.encode_hex(w.id), message)
parsers = { parsers = {
'kinomap': KinoMapParser, 'kinomap': KinoMapParser,
@@ -1404,7 +1404,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate, setprivate=setprivate,
forceunit='N') forceunit='N')
messages.append(message) messages.append(message)
ids.append(id) ids.append(encoder.encode_hex(id))
if 'keep second' in splitmode: if 'keep second' in splitmode:
data2['cumdist'] = data2['cumdist'] - data2.iloc[ data2['cumdist'] = data2['cumdist'] - data2.iloc[
0, 0,
@@ -1431,7 +1431,7 @@ def split_workout(r, parent, splitsecond, splitmode):
setprivate=setprivate, setprivate=setprivate,
dt=dt, forceunit='N') dt=dt, forceunit='N')
messages.append(message) messages.append(message)
ids.append(id) ids.append(encoder.encode_hex(id))
if not 'keep original' in splitmode: if not 'keep original' in splitmode:
if 'keep second' in splitmode or 'keep first' in splitmode: if 'keep second' in splitmode or 'keep first' in splitmode:
@@ -1439,7 +1439,7 @@ def split_workout(r, parent, splitsecond, splitmode):
messages.append('Deleted Workout: ' + parent.name) messages.append('Deleted Workout: ' + parent.name)
else: else:
messages.append('That would delete your workout') messages.append('That would delete your workout')
ids.append(parent.id) ids.append(encoder.encode_hex(parent.id))
elif 'originalprivate' in splitmode: elif 'originalprivate' in splitmode:
parent.privacy = 'hidden' parent.privacy = 'hidden'
parent.save() parent.save()

59
rowers/opaque.py Normal file
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)

View File

@@ -171,7 +171,7 @@
$.ajax({ $.ajax({
data: data, data: data,
type: $(this).attr('method'), type: $(this).attr('method'),
url: '/rowers/workout/{{ workout.id }}/image', url: '/rowers/workout/{{ workout.id|encode }}/image',
contentType: false, contentType: false,
processData: false, processData: false,
error: function(result) { error: function(result) {

View File

@@ -180,11 +180,11 @@
<tr> <tr>
{% endif %} {% endif %}
<td id="mypointer" <td id="mypointer"
class="rankingtoggle" workoutid="{{ workout.id }}"> class="rankingtoggle" workoutid="{{ workout.id|encode }}">
{% if workout.rankingpiece %} {% if workout.rankingpiece %}
<span id="star{{ workout.id }}" class="yellow">&starf;</span> <span id="star{{ workout.id|encode }}" class="yellow">&starf;</span>
{% else %} {% else %}
<span id="star{{ workout.id }}" class="notyellow">&star;</span> <span id="star{{ workout.id|encode }}" class="notyellow">&star;</span>
{% endif %} {% endif %}
</td> </td>
<td> {{ workout.date|date:"Y-m-d" }} </td> <td> {{ workout.date|date:"Y-m-d" }} </td>
@@ -192,20 +192,20 @@
{% if workout.user.user == user or user == team.manager %} {% if workout.user.user == user or user == team.manager %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}> <a href={% url rower.defaultlandingpage id=workout.id|encode %}>
{{ workout.name }} {{ workout.name }}
</a> </a>
</td> </td>
{% else %} {% else %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name <a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td> </a></td>
{% endif %} {% endif %}
{% else %} {% else %}
{% if workout.name != '' %} {% if workout.name != '' %}
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">{{ workout.name }}</a></td>
{% else %} {% else %}
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td> <td><a href="/rowers/workout/{{ workout.id|encode }}/">No Name</a> </td>
{% endif %} {% endif %}
{% endif %} {% endif %}
<td> {{ workout.workouttype }} </td> <td> {{ workout.workouttype }} </td>
@@ -221,7 +221,7 @@
</a> </a>
</td> </td>
{% endif %} {% endif %}
<td> <a class="small" href="/rowers/workout/{{ workout.id }}/flexchart">Flex</a> </td> <td> <a class="small" href="/rowers/workout/{{ workout.id|encode }}/flexchart">Flex</a> </td>
<td> <td>
<a class="small" href="/rowers/workout/{{ workout.id }}/delete">Delete <a class="small" href="/rowers/workout/{{ workout.id }}/delete">Delete
</td> </td>

View File

@@ -7,48 +7,48 @@
<ul> <ul>
<li id="workout-dashboard"> <li id="workout-dashboard">
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<a href="/rowers/workout/{{ workout.id }}/workflow"> <a href="/rowers/workout/{{ workout.id|encode }}/workflow">
<i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View <i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/workflow"> <a href="/rowers/workout/{{ workout.id|encode }}/workflow">
<i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View <i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View
</a> </a>
{% endif %} {% endif %}
</li> </li>
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<li id="workout-edit"> <li id="workout-edit">
<a href="/rowers/workout/{{ workout.id }}/edit"> <a href="/rowers/workout/{{ workout.id|encode }}/edit">
<i class="fas fa-pencil-alt fa-fw"></i>&nbsp;Edit <i class="fas fa-pencil-alt fa-fw"></i>&nbsp;Edit
</a> </a>
</li> </li>
<li id="workout-intervals"> <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 <i class="fas fa-pause fa-fw"></i>&nbsp;Intervals
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li id="workout-comments"> <li id="workout-comments">
<a href="/rowers/workout/{{ workout.id }}/comment"> <a href="/rowers/workout/{{ workout.id|encode }}/comment">
<i class="fas fa-comments fa-fw"></i>&nbsp;Comments <i class="fas fa-comments fa-fw"></i>&nbsp;Comments
({{ workout|aantalcomments }}) ({{ workout|aantalcomments }})
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li id="workout-stats"> <li id="workout-stats">
<a href="/rowers/workout/{{ workout.id }}/stats"> <a href="/rowers/workout/{{ workout.id|encode }}/stats">
<i class="fal fa-table fa-fw"></i>&nbsp;Statistics <i class="fal fa-table fa-fw"></i>&nbsp;Statistics
</a> </a>
</li> </li>
<li id="compare"> <li id="compare">
<a href="/rowers/multi-compare/workout/{{ workout.id }}"> <a href="/rowers/multi-compare/workout/{{ workout.id|encode }}">
<i class="fas fa-balance-scale fa-fw"></i>&nbsp;Compare <i class="fas fa-balance-scale fa-fw"></i>&nbsp;Compare
</a> </a>
</li> </li>
{% if user.is_authenticated and workout|may_edit:request %} {% if user.is_authenticated and workout|may_edit:request %}
<li id="chart-image"> <li id="chart-image">
<a href="/rowers/workout/{{ workout.id }}/image"> <a href="/rowers/workout/{{ workout.id|encode }}/image">
<i class="fas fa-file-image fa-fw"></i>&nbsp;Upload Image <i class="fas fa-file-image fa-fw"></i>&nbsp;Upload Image
</a> </a>
</li> </li>
@@ -65,23 +65,23 @@
<label for="group-flexchart">Interactive Charts</label> <label for="group-flexchart">Interactive Charts</label>
<ul> <ul>
<li id="chart-flexchart"> <li id="chart-flexchart">
<a href="/rowers/workout/{{ workout.id }}/flexchart"> <a href="/rowers/workout/{{ workout.id|encode }}/flexchart">
<i class="fas fa-chart-line fa-fw"></i>&nbsp;Flex Chart <i class="fas fa-chart-line fa-fw"></i>&nbsp;Flex Chart
</a> </a>
</li> </li>
{% if workout|water %} {% if workout|water %}
<li id="chart-map"> <li id="chart-map">
<a href="/rowers/workout/{{ workout.id }}/map"> <a href="/rowers/workout/{{ workout.id|encode }}/map">
<i class="fas fa-map-marked-alt fa-fw"></i>&nbsp;Map <i class="fas fa-map-marked-alt fa-fw"></i>&nbsp;Map
</a> </a>
</li> </li>
<li id="chart-empower"> <li id="chart-empower">
<a href="/rowers/workout/{{ workout.id }}/forcecurve"> <a href="/rowers/workout/{{ workout.id|encode }}/forcecurve">
<i class="fas fa-dumbbell fa-fw"></i>&nbsp;Force Curve <i class="fas fa-dumbbell fa-fw"></i>&nbsp;Force Curve
</a> </a>
</li> </li>
<li id="chart-otwpower"> <li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/interactiveotwplot"> <a href="/rowers/workout/{{ workout.id|encode }}/interactiveotwplot">
<i class="fal fa-calculator-alt fa-fw"></i>&nbsp;Corrected Pace Plot <i class="fal fa-calculator-alt fa-fw"></i>&nbsp;Corrected Pace Plot
</a> </a>
</li> </li>
@@ -94,28 +94,28 @@
<label for="group-chart">Static Charts</label> <label for="group-chart">Static Charts</label>
<ul> <ul>
<li id="chart-time"> <li id="chart-time">
<a href="/rowers/workout/{{ workout.id }}/addstatic/1"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/1">
<i class="fas fa-stopwatch fa-fw"></i>&nbsp;Time <i class="fas fa-stopwatch fa-fw"></i>&nbsp;Time
</a> </a>
</li> </li>
<li id="chart-distance"> <li id="chart-distance">
<a href="/rowers/workout/{{ workout.id }}/addstatic/2"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/2">
<i class="fas fa-ruler fa-fw"></i>&nbsp;Distance <i class="fas fa-ruler fa-fw"></i>&nbsp;Distance
</a> </a>
</li> </li>
<li id="chart-powerpie"> <li id="chart-powerpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/13"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/13">
<i class="far fa-chart-pie fa-fw"></i>&nbsp;Power (Pie) <i class="far fa-chart-pie fa-fw"></i>&nbsp;Power (Pie)
</a> </a>
</li> </li>
<li id="chart-hrpie"> <li id="chart-hrpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/3"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/3">
<i class="fas fa-heartbeat fa-fw"></i>&nbsp;Heart Rate (Pie) <i class="fas fa-heartbeat fa-fw"></i>&nbsp;Heart Rate (Pie)
</a> </a>
</li> </li>
{% if workout|water %} {% if workout|water %}
<li id="chart-otwpower"> <li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/addstatic/9"> <a href="/rowers/workout/{{ workout.id|encode }}/addstatic/9">
<i class="fas fa-chart-area fa-fw"></i>&nbsp;OTW Power <i class="fas fa-chart-area fa-fw"></i>&nbsp;OTW Power
</a> </a>
</li> </li>
@@ -136,7 +136,7 @@
Connect to Concept2 Connect to Concept2
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/c2uploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/c2uploadw">
Concept2 Concept2
</a> </a>
{% endif %} {% endif %}
@@ -151,7 +151,7 @@
Connect to Strava Connect to Strava
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/stravauploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/stravauploadw">
Strava Strava
</a> </a>
{% endif %} {% endif %}
@@ -166,7 +166,7 @@
Connect to SportTracks Connect to SportTracks
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/sporttracksuploadw">
SportTracks SportTracks
</a> </a>
{% endif %} {% endif %}
@@ -181,7 +181,7 @@
Connect to Runkeeper Connect to Runkeeper
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/runkeeperuploadw">
Runkeeper Runkeeper
</a> </a>
{% endif %} {% endif %}
@@ -196,7 +196,7 @@
Connect to MapMyFitness Connect to MapMyFitness
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/underarmouruploadw">
MapMyFitness MapMyFitness
</a> </a>
{% endif %} {% endif %}
@@ -211,23 +211,23 @@
Connect to TrainingPeaks Connect to TrainingPeaks
</a> </a>
{% else %} {% else %}
<a href="/rowers/workout/{{ workout.id }}/tpuploadw"> <a href="/rowers/workout/{{ workout.id|encode }}/tpuploadw">
TrainingPeaks TrainingPeaks
</a> </a>
{% endif %} {% endif %}
</li> </li>
<li id="export-csv"> <li id="export-csv">
<a href="/rowers/workout/{{ workout.id }}/emailcsv"> <a href="/rowers/workout/{{ workout.id|encode }}/emailcsv">
CSV CSV
</a> </a>
</li> </li>
<li id="export-gpx"> <li id="export-gpx">
<a href="/rowers/workout/{{ workout.id }}/emailgpx"> <a href="/rowers/workout/{{ workout.id|encode }}/emailgpx">
GPX GPX
</a> </a>
</li> </li>
<li id="export-tcx"> <li id="export-tcx">
<a href="/rowers/workout/{{ workout.id }}/emailtcx"> <a href="/rowers/workout/{{ workout.id|encode }}/emailtcx">
TCX TCX
</a> </a>
</li> </li>
@@ -238,27 +238,27 @@
<label for="group-data">Data</label> <label for="group-data">Data</label>
<ul> <ul>
<li id="data-smoothen"> <li id="data-smoothen">
<a href="/rowers/workout/{{ workout.id }}/smoothenpace"> <a href="/rowers/workout/{{ workout.id|encode }}/smoothenpace">
<i class="fas fa-magic fa-fw"></i>&nbsp;Smoothen <i class="fas fa-magic fa-fw"></i>&nbsp;Smoothen
</a> </a>
</li> </li>
<li id="data-raw"> <li id="data-raw">
<a href="/rowers/workout/{{ workout.id }}/undosmoothenpace"> <a href="/rowers/workout/{{ workout.id|encode }}/undosmoothenpace">
<i class="fas fa-undo fa-fw"></i>&nbsp;Restore Raw <i class="fas fa-undo fa-fw"></i>&nbsp;Restore Raw
</a> </a>
</li> </li>
<li id="data-fusion"> <li id="data-fusion">
<a href="/rowers/workout/fusion/{{ workout.id }}/"> <a href="/rowers/workout/fusion/{{ workout.id|encode }}/">
<i class="fas fa-blender fa-fw"></i>&nbsp;Sensor Fusion <i class="fas fa-blender fa-fw"></i>&nbsp;Sensor Fusion
</a> </a>
</li> </li>
<li id="data-split"> <li id="data-split">
<a href="/rowers/workout/{{ workout.id }}/split"> <a href="/rowers/workout/{{ workout.id|encode }}/split">
<i class="fas fa-cut fa-fw"></i>&nbsp;Split Workout <i class="fas fa-cut fa-fw"></i>&nbsp;Split Workout
</a> </a>
</li> </li>
<li id="data-view"> <li id="data-view">
<a href="/rowers/workout/{{ workout.id }}/data"> <a href="/rowers/workout/{{ workout.id|encode }}/data">
<i class="fal fa-table fa-fw"></i>&nbsp;Explore Raw Data <i class="fal fa-table fa-fw"></i>&nbsp;Explore Raw Data
</a> </a>
</ul> </ul>
@@ -269,28 +269,28 @@
<ul> <ul>
{% if workout|water %} {% if workout|water %}
<li id="advanced-wind"> <li id="advanced-wind">
<a href="/rowers/workout/{{ workout.id }}/wind"> <a href="/rowers/workout/{{ workout.id|encode }}/wind">
<i class="fas fa-pennant fa-fw"></i>&nbsp;Wind <i class="fas fa-pennant fa-fw"></i>&nbsp;Wind
</a> </a>
</li> </li>
<li id="advanced-stream"> <li id="advanced-stream">
<a href="/rowers/workout/{{ workout.id }}/stream"> <a href="/rowers/workout/{{ workout.id|encode }}/stream">
<i class="fas fa-stream fa-fw"></i>&nbsp;Stream <i class="fas fa-stream fa-fw"></i>&nbsp;Stream
</a> </a>
</li> </li>
<li id="advanced-otwpower"> <li id="advanced-otwpower">
<a href="/rowers/workout/{{ workout.id }}/otwsetpower"> <a href="/rowers/workout/{{ workout.id|encode }}/otwsetpower">
<i class="fas fa-calculator-alt fa-fw"></i>&nbsp;OTW Power <i class="fas fa-calculator-alt fa-fw"></i>&nbsp;OTW Power
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li id="advanced-instroke"> <li id="advanced-instroke">
<a href="/rowers/workout/{{ workout.id }}/instroke"> <a href="/rowers/workout/{{ workout.id|encode }}/instroke">
<i class="fas fa-search-plus fa-fw"></i>&nbsp;In-Stroke Metrics <i class="fas fa-search-plus fa-fw"></i>&nbsp;In-Stroke Metrics
</a> </a>
</li> </li>
<li id="advanced-recalcsummary"> <li id="advanced-recalcsummary">
<a href="/rowers/workout/{{ workout.id }}/recalcsummary"> <a href="/rowers/workout/{{ workout.id|encode }}/recalcsummary">
<i class="fas fa-window-restore fa-fw"></i>&nbsp;Update Summary <i class="fas fa-window-restore fa-fw"></i>&nbsp;Update Summary
</a> </a>
</li> </li>

View File

@@ -28,12 +28,13 @@
<script> <script>
$(function($) { $(function($) {
console.log('loading script'); console.log('loading script');
var workoutid = {{ workout.id }}; var workoutid = '{{ workout.id|encode }}';
console.log(workoutid);
var shownotes = true; var shownotes = true;
if("{{ rower.showfavoritechartnotes }}" == "False") { if("{{ rower.showfavoritechartnotes }}" == "False") {
shownotes = false; shownotes = false;
} }
$.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/workout/{{ workout.id }}/get-thumbnails', function(json) { $.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/workout/{{ workout.id|encode }}/get-thumbnails', function(json) {
var counter=0; var counter=0;
$("#id_sitready").remove(); $("#id_sitready").remove();
$("#id_thumbs").append( $("#id_thumbs").append(

View File

@@ -57,7 +57,7 @@ $('#id_workouttype').change();
<li class="grid_4"> <li class="grid_4">
<p> <p>
<div class="fb-share-button" <div class="fb-share-button"
data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-href="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-layout="button" data-size="small" data-mobile-iframe="false"> data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a> <a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a>
</div> </div>
@@ -65,7 +65,7 @@ $('#id_workouttype').change();
<p> <p>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-url="https://rowsandall.com/rowers/workout/{{ workout.id|encode }}"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</p> </p>
<table width=100%> <table width=100%>
@@ -86,7 +86,7 @@ $('#id_workouttype').change();
</tr><tr> </tr><tr>
<th>Public link to this workout:</th> <th>Public link to this workout:</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
</td> </td>
</tr> </tr>
</table> </table>

View File

@@ -26,6 +26,8 @@ from rowers.utils import NoTokenError
import rowers.payments as payments import rowers.payments as payments
from rowers.opaque import encoder
def strfdelta(tdelta): def strfdelta(tdelta):
minutes,seconds = divmod(tdelta.seconds,60) minutes,seconds = divmod(tdelta.seconds,60)
tenths = int(tdelta.microseconds/1e5) tenths = int(tdelta.microseconds/1e5)
@@ -79,6 +81,10 @@ def aantalcomments(workout):
return aantalcomments return aantalcomments
@register.filter
def encode(id):
return str(encoder.encode_hex(id))
@register.filter @register.filter
def water(workout): def water(workout):
try: try:
@@ -509,7 +515,7 @@ def nextworkout(workout,user):
if ws: if ws:
return ws[0].id return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0
@@ -534,7 +540,7 @@ def previousworkout(workout,user):
if ws: if ws:
return ws[0].id return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0

View File

@@ -110,7 +110,7 @@ urlpatterns = [
url(r'^', include(router.urls)), url(r'^', include(router.urls)),
url(r'^api-docs$', views.schema_view), url(r'^api-docs$', views.schema_view),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api/workouts/(?P<id>\d+)/strokedata$',views.strokedatajson), url(r'^api/workouts/(?P<id>\b[0-9A-Fa-f]+\b)/strokedata$',views.strokedatajson),
url(r'^500v/$',views.error500_view), url(r'^500v/$',views.error500_view),
url(r'^502/$', TemplateView.as_view(template_name='502.html'),name='502'), url(r'^502/$', TemplateView.as_view(template_name='502.html'),name='502'),
url(r'^500/$', TemplateView.as_view(template_name='500.html'),name='500'), url(r'^500/$', TemplateView.as_view(template_name='500.html'),name='500'),
@@ -169,18 +169,18 @@ urlpatterns = [
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select), url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.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), 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),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.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),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/$',views.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),
url(r'^team-compare-select/team/(?P<teamid>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.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),
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), 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),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/$',views.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),
url(r'^team-compare-select/workout/(?P<id>\d+)/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.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),
url(r'^team-compare-select/workout/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.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),
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), 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),
url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.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),
url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.team_comparison_select), url(r'^team-compare-select/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.team_comparison_select),
url(r'^team-compare-select/workout/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.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),
url(r'^team-compare-select/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select), url(r'^team-compare-select/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select),
url(r'^team-compare-select/workout/(?P<id>\d+)/$',views.team_comparison_select), url(r'^team-compare-select/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.team_comparison_select),
url(r'^team-compare-select/team/(?P<teamid>\d+)/$',views.team_comparison_select), url(r'^team-compare-select/team/(?P<teamid>\d+)/$',views.team_comparison_select),
url(r'^team-compare-select/user/(?P<userid>\d+)/$',views.team_comparison_select), url(r'^team-compare-select/user/(?P<userid>\d+)/$',views.team_comparison_select),
url(r'^team-compare-select/$',views.team_comparison_select), url(r'^team-compare-select/$',views.team_comparison_select),
@@ -241,43 +241,43 @@ urlpatterns = [
url(r'^cumstats/$',views.cumstats), url(r'^cumstats/$',views.cumstats),
url(r'^graph/(?P<id>\d+)/$',views.graph_show_view), url(r'^graph/(?P<id>\d+)/$',views.graph_show_view),
url(r'^graph/(?P<pk>\d+)/delete$',views.GraphDelete.as_view(),name='graph_delete'), url(r'^graph/(?P<pk>\d+)/delete$',views.GraphDelete.as_view(),name='graph_delete'),
url(r'^workout/(?P<id>\d+)/get-thumbnails$',views.get_thumbnails), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-thumbnails$',views.get_thumbnails),
url(r'^workout/(?P<id>\d+)/toggle-ranking$',views.workout_toggle_ranking), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/toggle-ranking$',views.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-testscript$',views.get_testscript),
url(r'^workout/upload/team/$',views.team_workout_upload_view), url(r'^workout/upload/team/$',views.team_workout_upload_view),
url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'), url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'),
url(r'^workout/(?P<id>\d+)/histo$',views.workout_histo_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/histo$',views.workout_histo_view),
url(r'^workout/(?P<id>\d+)/task$',views.workout_test_task_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/task$',views.workout_test_task_view),
url(r'^workout/(?P<id>\d+)/forcecurve$',views.workout_forcecurve_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/forcecurve$',views.workout_forcecurve_view),
url(r'^workout/(?P<id>\d+)/unsubscribe$',views.workout_unsubscribe_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/unsubscribe$',views.workout_unsubscribe_view),
# url(r'^workout/(?P<id>\d+)/export$',views.workout_export_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/export$',views.workout_export_view),
url(r'^workout/(?P<id>\d+)/comment$',views.workout_comment_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/comment$',views.workout_comment_view),
url(r'^workout/(?P<id>\d+)/emailtcx$',views.workout_tcxemail_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailtcx$',views.workout_tcxemail_view),
url(r'^workout/(?P<id>\d+)/emailgpx$',views.workout_gpxemail_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailgpx$',views.workout_gpxemail_view),
url(r'^workout/(?P<id>\d+)/emailcsv$',views.workout_csvemail_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailcsv$',views.workout_csvemail_view),
url(r'^workout/(?P<id>\d+)/csvtoadmin$',views.workout_csvtoadmin_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/csvtoadmin$',views.workout_csvtoadmin_view),
url(r'^ergcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.otecp_toadmin_view), url(r'^ergcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.otecp_toadmin_view),
url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.otwcp_toadmin_view), url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.otwcp_toadmin_view),
# url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list), # url(r'^workout/compare/(?P<id>\b[0-9A-Fa-f]+\b)/$',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/compare2/(?P<id1>\b[0-9A-Fa-f]+\b)/(?P<id2>\b[0-9A-Fa-f]+\b)/(?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/compare/(?P<id>\b[0-9A-Fa-f]+\b)/(?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'), name='workout_edit_view'),
url(r'^workout/(?P<id>\d+)/map$',views.workout_map_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/map$',views.workout_map_view),
# url(r'^workout/(?P<id>\d+)/setprivate$',views.workout_setprivate_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/setprivate$',views.workout_setprivate_view),
url(r'^workout/(?P<id>\d+)/updatecp$',views.workout_update_cp_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/updatecp$',views.workout_update_cp_view),
# url(r'^workout/(?P<id>\d+)/makepublic$',views.workout_makepublic_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/makepublic$',views.workout_makepublic_view),
# url(r'^workout/(?P<id>\d+)/geeky$',views.workout_geeky_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/geeky$',views.workout_geeky_view),
# url(r'^workout/(?P<id>\d+)/advanced$',views.workout_advanced_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/advanced$',views.workout_advanced_view),
url(r'^workout/(?P<id>\d+)/instroke/(?P<metric>\w+.*)$',views.instroke_chart), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/instroke/(?P<metric>\w+.*)$',views.instroke_chart),
url(r'^workout/(?P<id>\d+)/instroke$',views.instroke_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/instroke$',views.instroke_view),
url(r'^workout/(?P<id>\d+)/stats$',views.workout_stats_view,name='workout_stats_view'), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stats$',views.workout_stats_view,name='workout_stats_view'),
url(r'^workout/(?P<id>\d+)/data$',views.workout_data_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/data$',views.workout_data_view,
name='workout_data_view'), name='workout_data_view'),
url(r'^workout/(?P<id>\d+)/otwsetpower$',views.workout_otwsetpower_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/otwsetpower$',views.workout_otwsetpower_view),
url(r'^workout/(?P<id>\d+)/interactiveotwplot$',views.workout_otwpowerplot_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/interactiveotwplot$',views.workout_otwpowerplot_view),
url(r'^workout/(?P<id>\d+)/wind$',views.workout_wind_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/wind$',views.workout_wind_view),
url(r'^workout/(?P<id>\d+)/image$',views.workout_uploadimage_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/image$',views.workout_uploadimage_view),
url(r'^virtualevent/(?P<id>\d+)/compare$',views.virtualevent_compare_view), url(r'^virtualevent/(?P<id>\d+)/compare$',views.virtualevent_compare_view),
url(r'^virtualevent/(?P<id>\d+)/image$', url(r'^virtualevent/(?P<id>\d+)/image$',
views.virtualevent_uploadimage_view), views.virtualevent_uploadimage_view),
@@ -285,56 +285,56 @@ urlpatterns = [
views.virtualevent_setlogo_view), views.virtualevent_setlogo_view),
url(r'^logo/(?P<id>\d+)/delete/$', url(r'^logo/(?P<id>\d+)/delete/$',
views.logo_delete_view), views.logo_delete_view),
url(r'^workout/(?P<id>\d+)/darkskywind$',views.workout_downloadwind_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/darkskywind$',views.workout_downloadwind_view),
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
url(r'^workout/(?P<id>\d+)/stream$',views.workout_stream_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stream$',views.workout_stream_view),
# url(r'^workout/(?P<id>\d+)/crewnerdsummary$',views.workout_crewnerd_summary_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/crewnerdsummary$',views.workout_crewnerd_summary_view),
url(r'^workout/(?P<id>\d+)/editintervals$',views.workout_summary_edit_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/editintervals$',views.workout_summary_edit_view,
name='workout_summary_edit_view'), name='workout_summary_edit_view'),
url(r'^workout/(?P<id>\d+)/restore$',views.workout_summary_restore_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/restore$',views.workout_summary_restore_view),
url(r'^workout/(?P<id>\d+)/split$',views.workout_split_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/split$',views.workout_split_view),
# url(r'^workout/(?P<id>\d+)/interactiveplot$',views.workout_biginteractive_view), # url(r'^workout/(?P<id>\d+)/interactiveplot$',views.workout_biginteractive_view),
url(r'^workout/(?P<id>\d+)/view$',views.workout_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/view$',views.workout_view),
url(r'^workout/(?P<id>\d+)/$',views.workout_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.workout_view),
url(r'^workout/fusion/(?P<id1>\d+)/(?P<id2>\d+)$',views.workout_fusion_view), url(r'^workout/fusion/(?P<id1>\b[0-9A-Fa-f]+\b)/(?P<id2>\b[0-9A-Fa-f]+\b)$',views.workout_fusion_view),
url(r'^workout/fusion/(?P<id>\d+)/$',views.workout_fusion_list), url(r'^workout/fusion/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.workout_fusion_list),
url(r'^workout/fusion/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)$',views.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),
url(r'^help$',TemplateView.as_view( url(r'^help$',TemplateView.as_view(
template_name='help.html'),name='help' template_name='help.html'),name='help'
), ),
url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'), url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'),
url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'), url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'),
# keeping the old URLs for retrofit # keeping the old URLs for retrofit
url(r'^workout/(?P<id>\d+)/addtimeplot$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addtimeplot$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'1'}), {'plotnr':'1'}),
url(r'^workout/(?P<id>\d+)/adddistanceplot$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/adddistanceplot$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'2'}), {'plotnr':'2'}),
url(r'^workout/(?P<id>\d+)/addpiechart$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addpiechart$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'3'}), {'plotnr':'3'}),
url(r'^workout/(?P<id>\d+)/adddistanceplot2$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/adddistanceplot2$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'7'}), {'plotnr':'7'}),
url(r'^workout/(?P<id>\d+)/addtimeplot2$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addtimeplot2$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'8'}), {'plotnr':'8'}),
url(r'^workout/(?P<id>\d+)/addotwpowerplot$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addotwpowerplot$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'9'}), {'plotnr':'9'}),
url(r'^workout/(?P<id>\d+)/addpowerpiechart$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addpowerpiechart$',
views.workout_add_chart_view, views.workout_add_chart_view,
{'plotnr':'13'}), {'plotnr':'13'}),
# addstatic is the new URL -> need to update in templates # addstatic is the new URL -> need to update in templates
url(r'^workout/(?P<id>\d+)/addstatic/(?P<plotnr>\d+)$', url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addstatic/(?P<plotnr>\d+)$',
views.workout_add_chart_view), views.workout_add_chart_view),
url(r'^workout/(?P<id>\d+)/addstatic$',views.workout_add_chart_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/addstatic$',views.workout_add_chart_view),
url(r'^workout/(?P<pk>\d+)/delete$',login_required( url(r'^workout/(?P<pk>\d+)/delete$',login_required(
views.WorkoutDelete.as_view()), views.WorkoutDelete.as_view()),
name='workout_delete'), name='workout_delete'),
url(r'^workout/(?P<id>\d+)/smoothenpace$',views.workout_smoothenpace_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/smoothenpace$',views.workout_smoothenpace_view),
url(r'^workout/(?P<id>\d+)/undosmoothenpace$',views.workout_undo_smoothenpace_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/undosmoothenpace$',views.workout_undo_smoothenpace_view),
url(r'^workout/c2import/$',views.workout_c2import_view), url(r'^workout/c2import/$',views.workout_c2import_view),
url(r'^workout/c2list/$',views.workout_c2import_view), url(r'^workout/c2list/$',views.workout_c2import_view),
url(r'^workout/c2list/(?P<page>\d+)$',views.workout_c2import_view), url(r'^workout/c2list/(?P<page>\d+)$',views.workout_c2import_view),
@@ -355,16 +355,16 @@ urlpatterns = [
url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view), url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view),
url(r'^workout/runkeeperimport/user/(?P<userid>\d+)$',views.workout_runkeeperimport_view), url(r'^workout/runkeeperimport/user/(?P<userid>\d+)$',views.workout_runkeeperimport_view),
url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view), url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view),
# url(r'^workout/(?P<id>\d+)/deleteconfirm$',views.workout_delete_confirm_view), # url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/deleteconfirm$',views.workout_delete_confirm_view),
url(r'^workout/(?P<id>\d+)/c2uploadw/$',views.workout_c2_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/c2uploadw/$',views.workout_c2_upload_view),
url(r'^workout/(?P<id>\d+)/stravauploadw/$',views.workout_strava_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stravauploadw/$',views.workout_strava_upload_view),
url(r'^workout/(?P<id>\d+)/recalcsummary/$',views.workout_recalcsummary_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/recalcsummary/$',views.workout_recalcsummary_view),
url(r'^workout/(?P<id>\d+)/sporttracksuploadw/$',views.workout_sporttracks_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/sporttracksuploadw/$',views.workout_sporttracks_upload_view),
url(r'^workout/(?P<id>\d+)/runkeeperuploadw/$',views.workout_runkeeper_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/runkeeperuploadw/$',views.workout_runkeeper_upload_view),
url(r'^workout/(?P<id>\d+)/underarmouruploadw/$',views.workout_underarmour_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/underarmouruploadw/$',views.workout_underarmour_upload_view),
url(r'^workout/(?P<id>\d+)/tpuploadw/$',views.workout_tp_upload_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/tpuploadw/$',views.workout_tp_upload_view),
url(r'^multi-compare/workout/(?P<id>\d+)/user/(?P<userid>\d+)/$',views.multi_compare_view), url(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.multi_compare_view),
url(r'^multi-compare/workout/(?P<id>\d+)/$',views.multi_compare_view), url(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.multi_compare_view),
url(r'^multi-compare/$',views.multi_compare_view), url(r'^multi-compare/$',views.multi_compare_view),
url(r'^user-boxplot/user/(?P<userid>\d+)$',views.boxplot_view), url(r'^user-boxplot/user/(?P<userid>\d+)$',views.boxplot_view),
url(r'^user-boxplot$',views.boxplot_view), url(r'^user-boxplot$',views.boxplot_view),
@@ -461,14 +461,14 @@ urlpatterns = [
url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'), url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'),
url(r'^register$',views.rower_register_view), url(r'^register$',views.rower_register_view),
url(r'^register/thankyou/$', TemplateView.as_view(template_name='registerthankyou.html'), name='registerthankyou'), url(r'^register/thankyou/$', TemplateView.as_view(template_name='registerthankyou.html'), name='registerthankyou'),
url(r'^workout/(?P<id>\d+)/workflow$',views.workout_workflow_view, url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/workflow$',views.workout_workflow_view,
name='workout_workflow_view'), name='workout_workflow_view'),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>[\w\ ]+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+)/$',views.workout_flexchart3_view), 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),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)/(?P<plottype>\w+.*)$',views.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),
url(r'^workout/(?P<id>\d+)/flexchart/(?P<xparam>\w+.*)/(?P<yparam1>[\w\ ]+.*)/(?P<yparam2>[\w\ ]+.*)$',views.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),
url(r'^workout/(?P<id>\d+)/flexchart$',views.workout_flexchart3_view), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/flexchart$',views.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>\b[0-9A-Fa-f]+\b)/(?P<id2>\b[0-9A-Fa-f]+\b)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/(?P<plottype>[\w\ ]+.*)$',views.workout_comparison_view2),
# url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2), # url(r'^workout/compare/(?P<id1>\b[0-9A-Fa-f]+\b)/(?P<id2>\b[0-9A-Fa-f]+\b)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2),
url(r'^test\_callback',views.rower_process_testcallback), url(r'^test\_callback',views.rower_process_testcallback),
url(r'^createplan/$',views.rower_create_trainingplan), url(r'^createplan/$',views.rower_create_trainingplan),
url(r'^createplan/user/(?P<userid>\d+)/$',views.rower_create_trainingplan), url(r'^createplan/user/(?P<userid>\d+)/$',views.rower_create_trainingplan),
@@ -510,7 +510,7 @@ urlpatterns = [
url(r'^edittarget/(?P<pk>\d+)/$',login_required( url(r'^edittarget/(?P<pk>\d+)/$',login_required(
views.TrainingTargetUpdate.as_view()), views.TrainingTargetUpdate.as_view()),
name='trainingtarget_update_view'), name='trainingtarget_update_view'),
url(r'^workout/(?P<id>\d+)/test\_strokedata$',views.strokedataform), url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/test\_strokedata$',views.strokedataform),
url(r'^sessions/teamcreate/user/(?P<userid>\d+)/$',views.plannedsession_teamcreate_view), url(r'^sessions/teamcreate/user/(?P<userid>\d+)/$',views.plannedsession_teamcreate_view),
url(r'^sessions/teamcreate/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$', url(r'^sessions/teamcreate/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',
views.plannedsession_teamcreate_view), views.plannedsession_teamcreate_view),

View File

@@ -143,7 +143,7 @@ from rowsandall_app.settings import (
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET, RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET, TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET,
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY, BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY,
PAYMENT_PROCESSING_ON PAYMENT_PROCESSING_ON,OPAQUE_SECRET_KEY
) )
from rowers.tasks_standalone import addcomment2 from rowers.tasks_standalone import addcomment2
@@ -219,6 +219,7 @@ from rq import Queue,cancel_job
from django.core.cache import cache from django.core.cache import cache
from django_mailbox.models import Message,Mailbox,MessageAttachment from django_mailbox.models import Message,Mailbox,MessageAttachment
from rowers.opaque import encoder
# Utility to get stroke data in a JSON response # Utility to get stroke data in a JSON response
@@ -643,6 +644,7 @@ def get_stored_tasks_status(request):
@login_required() @login_required()
def get_thumbnails(request,id): def get_thumbnails(request,id):
id = encoder.decode_hex(id)
row = get_workout_permitted(request.user,id) row = get_workout_permitted(request.user,id)
@@ -842,6 +844,7 @@ def remove_user(request):
@login_required() @login_required()
def get_testscript(request,id): def get_testscript(request,id):
id = encoder.decode_hex(id)
row = get_workout_permitted(request.user,id) row = get_workout_permitted(request.user,id)
r = getrower(request.user) r = getrower(request.user)
@@ -1863,6 +1866,7 @@ def add_workout_from_strokedata(user,importid,data,strokedata,
# Export workout to TCX and send to user's email address # Export workout to TCX and send to user's email address
@login_required() @login_required()
def workout_tcxemail_view(request,id=0): def workout_tcxemail_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
successmessage = "" successmessage = ""
r = getrower(request.user) r = getrower(request.user)
@@ -2025,6 +2029,7 @@ def course_kmlemail_view(request,id=0):
# Export workout to GPX and send to user's email address # Export workout to GPX and send to user's email address
@login_required() @login_required()
def workout_gpxemail_view(request,id=0): def workout_gpxemail_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
successmessage = "" successmessage = ""
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
@@ -2118,6 +2123,7 @@ def workouts_summaries_email_view(request):
# Get Workout CSV file and send it to user's email address # Get Workout CSV file and send it to user's email address
@login_required() @login_required()
def workout_csvemail_view(request,id=0): def workout_csvemail_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
r = getrower(request.user) r = getrower(request.user)
if r.emailbounced: if r.emailbounced:
@@ -2162,6 +2168,7 @@ def workout_csvemail_view(request,id=0):
# Get Workout CSV file and send it to user's email address # Get Workout CSV file and send it to user's email address
@login_required() @login_required()
def workout_csvtoadmin_view(request,id=0): def workout_csvtoadmin_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
r = getrower(request.user) r = getrower(request.user)
w = get_workout(id) w = get_workout(id)
@@ -2188,6 +2195,7 @@ def workout_csvtoadmin_view(request,id=0):
# Send workout to TP # Send workout to TP
@login_required() @login_required()
def workout_tp_upload_view(request,id=0): def workout_tp_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
r = getrower(request.user) r = getrower(request.user)
@@ -2245,6 +2253,7 @@ def workout_tp_upload_view(request,id=0):
# abundance of error logging here because there were/are some bugs # abundance of error logging here because there were/are some bugs
@login_required() @login_required()
def workout_strava_upload_view(request,id=0): def workout_strava_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
r = getrower(request.user) r = getrower(request.user)
res = -1 res = -1
@@ -2349,6 +2358,7 @@ def workout_strava_upload_view(request,id=0):
# Upload workout to Concept2 logbook # Upload workout to Concept2 logbook
@login_required() @login_required()
def workout_c2_upload_view(request,id=0): def workout_c2_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
# ready to upload. Hurray # ready to upload. Hurray
w = get_workout(id) w = get_workout(id)
@@ -2378,6 +2388,7 @@ def workout_c2_upload_view(request,id=0):
# Upload workout to RunKeeper # Upload workout to RunKeeper
@login_required() @login_required()
def workout_runkeeper_upload_view(request,id=0): def workout_runkeeper_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
w = get_workout(id) w = get_workout(id)
r = w.user r = w.user
@@ -2441,6 +2452,7 @@ def workout_runkeeper_upload_view(request,id=0):
# Upload workout to Underarmour # Upload workout to Underarmour
@login_required() @login_required()
def workout_underarmour_upload_view(request,id=0): def workout_underarmour_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
w = get_workout(id) w = get_workout(id)
r = w.user r = w.user
@@ -2505,6 +2517,7 @@ def workout_underarmour_upload_view(request,id=0):
# Upload workout to SportTracks # Upload workout to SportTracks
@login_required() @login_required()
def workout_sporttracks_upload_view(request,id=0): def workout_sporttracks_upload_view(request,id=0):
id = encoder.decode_hex(id)
message = "" message = ""
# ready to upload. Hurray # ready to upload. Hurray
w = get_workout(id) w = get_workout(id)
@@ -3559,6 +3572,7 @@ def fitnessmetric_view(request,id=0,mode='rower',
message="This functionality requires a Pro plan or higher", message="This functionality requires a Pro plan or higher",
redirect_field_name=None) redirect_field_name=None)
def workout_forcecurve_view(request,id=0,workstrokesonly=False): def workout_forcecurve_view(request,id=0,workstrokesonly=False):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
promember=0 promember=0
@@ -3594,7 +3608,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_forcecurve_view,kwargs={'id':id}), 'url':reverse(workout_forcecurve_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Empower Force Curve' 'name': 'Empower Force Curve'
} }
@@ -3622,6 +3636,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
# Test asynchronous tasking and messaging # Test asynchronous tasking and messaging
@login_required() @login_required()
def workout_test_task_view(request,id=0): def workout_test_task_view(request,id=0):
id = encoder.decode_hex(id)
row = Workout.objects.get(id=id) row = Workout.objects.get(id=id)
res = myqueue(queuehigh,addcomment2,request.user.id,row.id) res = myqueue(queuehigh,addcomment2,request.user.id,row.id)
@@ -3635,6 +3650,7 @@ def workout_test_task_view(request,id=0):
# Show Stroke power histogram for a workout # Show Stroke power histogram for a workout
@login_required() @login_required()
def workout_histo_view(request,id=0): def workout_histo_view(request,id=0):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
promember=0 promember=0
@@ -3664,7 +3680,7 @@ def workout_histo_view(request,id=0):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_histo_view,kwargs={'id':id}), 'url':reverse(workout_histo_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Histogram' 'name': 'Histogram'
} }
@@ -3972,7 +3988,7 @@ def addmanual_view(request):
url = reverse( url = reverse(
workout_edit_view, workout_edit_view,
kwargs={'id':id} kwargs={'id':encoder.encode_hex(id)}
) )
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
@@ -4806,6 +4822,7 @@ def rankings_view2(request,theuser=0,
message="This functionality requires a Pro plan or higher", message="This functionality requires a Pro plan or higher",
redirect_field_name=None) redirect_field_name=None)
def workout_update_cp_view(request,id=0): def workout_update_cp_view(request,id=0):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -5586,6 +5603,7 @@ def oterankings_view(request,theuser=0,
# Reload the workout and calculate the summary from the stroke data (lapIDx) # Reload the workout and calculate the summary from the stroke data (lapIDx)
@login_required() @login_required()
def workout_recalcsummary_view(request,id=0): def workout_recalcsummary_view(request,id=0):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -5621,6 +5639,7 @@ def workout_makepublic_view(request,id,
message='', message='',
successmessage=''): successmessage=''):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -5652,6 +5671,7 @@ def workout_makepublic_view(request,id,
def workout_setprivate_view(request,id, def workout_setprivate_view(request,id,
message='', message='',
successmessage=''): successmessage=''):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -5894,6 +5914,8 @@ def team_comparison_select(request,
id=0, id=0,
teamid=0): teamid=0):
id = encoder.decode_hex(id)
r = getrequestrower(request,userid=userid) r = getrequestrower(request,userid=userid)
requestrower = getrower(request.user) requestrower = getrower(request.user)
@@ -6065,7 +6087,7 @@ def team_comparison_select(request,
'name': firstworkout.name 'name': firstworkout.name
}, },
{ {
'url':reverse(team_comparison_select,kwargs={'id':id,'teamid':teamid}), 'url':reverse(team_comparison_select,kwargs={'id':encoder.encode_hex(id),'teamid':teamid}),
'name':'Compare Select' 'name':'Compare Select'
}, },
] ]
@@ -6276,7 +6298,8 @@ def plannedsession_compare_view(request,id=0,userid=0):
request.session['plottype'] = plottype request.session['plottype'] = plottype
request.session['ps'] = ps.id request.session['ps'] = ps.id
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])})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -6356,7 +6379,7 @@ def multi_compare_view(request,id=0,userid=0):
else: else:
url = reverse(team_comparison_select, url = reverse(team_comparison_select,
kwargs={ kwargs={
'id':id, 'id':encoder.encode_hex(id),
'teamid':0}) 'teamid':0})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -7730,6 +7753,7 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
startdate=timezone.now()-datetime.timedelta(days=365), startdate=timezone.now()-datetime.timedelta(days=365),
enddate=timezone.now()): enddate=timezone.now()):
id = encoder.decode_hex(id)
try: try:
r = getrower(request.user) r = getrower(request.user)
except Rower.DoesNotExist: except Rower.DoesNotExist:
@@ -7816,6 +7840,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
startdate=timezone.now()-datetime.timedelta(days=365), startdate=timezone.now()-datetime.timedelta(days=365),
enddate=timezone.now()): enddate=timezone.now()):
id = encoder.decode_hex(id)
try: try:
r = getrower(request.user) r = getrower(request.user)
except Rower.DoesNotExist: except Rower.DoesNotExist:
@@ -7888,7 +7913,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_fusion_list,kwargs={'id':id}), 'url':reverse(workout_fusion_list,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Sensor Fusion' 'name': 'Sensor Fusion'
} }
@@ -7914,6 +7939,8 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
def workout_view(request,id=0): def workout_view(request,id=0):
request.session['referer'] = absolute(request)['PATH'] request.session['referer'] = absolute(request)['PATH']
id = encoder.decode_hex(id)
if not request.user.is_anonymous(): if not request.user.is_anonymous():
rower = getrower(request.user) rower = getrower(request.user)
else: else:
@@ -7981,7 +8008,7 @@ def workout_view(request,id=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse(workout_view,kwargs={'id':id}), 'url':reverse(workout_view,kwargs={'id':encoder.encode_hex(id)}),
'name': row.name, 'name': row.name,
} }
@@ -8017,6 +8044,7 @@ def workout_view(request,id=0):
def workout_undo_smoothenpace_view( def workout_undo_smoothenpace_view(
request,id=0,message="",successmessage="" request,id=0,message="",successmessage=""
): ):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
@@ -8041,7 +8069,7 @@ def workout_undo_smoothenpace_view(
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':id, 'id':encoder.encode_hex(id),
} }
) )
@@ -8054,6 +8082,7 @@ def workout_undo_smoothenpace_view(
message="This functionality requires a Pro plan or higher", message="This functionality requires a Pro plan or higher",
redirect_field_name=None) redirect_field_name=None)
def workout_smoothenpace_view(request,id=0,message="",successmessage=""): def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
previousurl = request.META.get('HTTP_REFERER') previousurl = request.META.get('HTTP_REFERER')
@@ -8096,7 +8125,7 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
else: else:
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':id, 'id':encoder.encode_hex(id),
} }
) )
@@ -8107,6 +8136,7 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
message="This functionality requires a Pro plan or higher", message="This functionality requires a Pro plan or higher",
redirect_field_name=None) redirect_field_name=None)
def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""): def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
breadcrumbs = [ breadcrumbs = [
@@ -8119,7 +8149,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_crewnerd_summary_view,kwargs={'id':id}), 'url':reverse(workout_crewnerd_summary_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'CrewNerd Summary' 'name': 'CrewNerd Summary'
} }
@@ -8186,6 +8216,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
def workout_downloadwind_view(request,id=0, def workout_downloadwind_view(request,id=0,
airportcode=None, airportcode=None,
message="",successmessage=""): message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
f1 = row.csvfilename f1 = row.csvfilename
@@ -8252,6 +8283,7 @@ def workout_downloadwind_view(request,id=0,
def workout_downloadmetar_view(request,id=0, def workout_downloadmetar_view(request,id=0,
airportcode=None, airportcode=None,
message="",successmessage=""): message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
f1 = row.csvfilename f1 = row.csvfilename
@@ -8317,6 +8349,7 @@ def workout_downloadmetar_view(request,id=0,
# Show form to update wind data # Show form to update wind data
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_wind_view(request,id=0,message="",successmessage=""): def workout_wind_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
breadcrumbs = [ breadcrumbs = [
@@ -8329,7 +8362,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_wind_view,kwargs={'id':id}), 'url':reverse(workout_wind_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Wind' 'name': 'Wind'
} }
@@ -8453,6 +8486,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
# Show form to update River stream data (for river dwellers) # Show form to update River stream data (for river dwellers)
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_stream_view(request,id=0,message="",successmessage=""): def workout_stream_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
@@ -8517,7 +8551,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_stream_view,kwargs={'id':id}), 'url':reverse(workout_stream_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Stream' 'name': 'Stream'
} }
@@ -8539,6 +8573,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
# Form to set average crew weight and boat type, then run power calcs # Form to set average crew weight and boat type, then run power calcs
@user_passes_test(ispromember, login_url="/rowers/promembership",redirect_field_name=None) @user_passes_test(ispromember, login_url="/rowers/promembership",redirect_field_name=None)
def workout_otwsetpower_view(request,id=0,message="",successmessage=""): def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
@@ -8649,7 +8684,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_otwsetpower_view,kwargs={'id':id}), 'url':reverse(workout_otwsetpower_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'OTW Power' 'name': 'OTW Power'
} }
@@ -8671,6 +8706,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
@login_required() @login_required()
def instroke_view(request,id=0): def instroke_view(request,id=0):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
mayedit = 0 mayedit = 0
@@ -8689,7 +8725,7 @@ def instroke_view(request,id=0):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(instroke_view,kwargs={'id':id}), 'url':reverse(instroke_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'In-Stroke Metrics' 'name': 'In-Stroke Metrics'
} }
@@ -8729,6 +8765,7 @@ def instroke_view(request,id=0):
# A special Edit page with all the Geeky functionality for the workout # A special Edit page with all the Geeky functionality for the workout
@login_required() @login_required()
def workout_geeky_view(request,id=0,message="",successmessage=""): def workout_geeky_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
# form = WorkoutForm(instance=row) # form = WorkoutForm(instance=row)
@@ -8791,6 +8828,7 @@ def workout_geeky_view(request,id=0,message="",successmessage=""):
# generate instroke chart # generate instroke chart
@login_required() @login_required()
def instroke_chart(request,id=0,metric=''): def instroke_chart(request,id=0,metric=''):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
if (checkworkoutuser(request.user,w)==False): if (checkworkoutuser(request.user,w)==False):
@@ -8840,7 +8878,7 @@ def instroke_chart(request,id=0,metric=''):
r = getrower(request.user) r = getrower(request.user)
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = { kwargs = {
'id':id, 'id':encoder.encode_hex(id),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -9150,6 +9188,7 @@ def cumstats(request,theuser=0,
# data explorer # data explorer
@login_required() @login_required()
def workout_data_view(request, id=0): def workout_data_view(request, id=0):
id = encoder.decode_hex(id)
r = getrower(request.user) r = getrower(request.user)
w = get_workout(id) w = get_workout(id)
@@ -9167,7 +9206,7 @@ def workout_data_view(request, id=0):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_data_view,kwargs={'id':id}), 'url':reverse(workout_data_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Data Explorer' 'name': 'Data Explorer'
} }
@@ -9249,6 +9288,7 @@ def workout_data_view(request, id=0):
# Stats page # Stats page
@login_required() @login_required()
def workout_stats_view(request,id=0,message="",successmessage=""): def workout_stats_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
r = getrower(request.user) r = getrower(request.user)
w = get_workout(id) w = get_workout(id)
@@ -9269,7 +9309,7 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_stats_view,kwargs={'id':id}), 'url':reverse(workout_stats_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Stats' 'name': 'Stats'
} }
@@ -9417,6 +9457,7 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
# The Advanced edit page # The Advanced edit page
@login_required() @login_required()
def workout_advanced_view(request,id=0,message="",successmessage=""): def workout_advanced_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
# form = WorkoutForm(instance=row) # form = WorkoutForm(instance=row)
@@ -9474,6 +9515,8 @@ def workout_advanced_view(request,id=0,message="",successmessage=""):
# The interactive plot comparing two workouts (obsolete version) # The interactive plot comparing two workouts (obsolete version)
def workout_comparison_view(request,id1=0,id2=0,xparam='distance',yparam='spm'): def workout_comparison_view(request,id1=0,id2=0,xparam='distance',yparam='spm'):
id1 = encoder.decode_hex(id1)
id2 = encoder.decode_hex(id2)
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous():
r = getrower(request.user) r = getrower(request.user)
@@ -9509,6 +9552,8 @@ def workout_comparison_view(request,id1=0,id2=0,xparam='distance',yparam='spm'):
# Updated version of comparison plot # Updated version of comparison plot
def workout_comparison_view2(request,id1=0,id2=0,xparam='distance', def workout_comparison_view2(request,id1=0,id2=0,xparam='distance',
yparam='spm',plottype='line'): yparam='spm',plottype='line'):
id1 = encoder.decode_hex(id1)
id2 = encoder.decode_hex(id2)
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous():
r = getrower(request.user) r = getrower(request.user)
@@ -9582,6 +9627,7 @@ def workflow_default_view(request):
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
def get_workout_default_page(request,id): def get_workout_default_page(request,id):
id = encoder.encode_hex(id)
if request.user.is_anonymous(): if request.user.is_anonymous():
return reverse(workout_view,kwargs={'id':str(id)}) return reverse(workout_view,kwargs={'id':str(id)})
else: else:
@@ -9741,6 +9787,7 @@ def getfavorites(r,row):
# Workflow View # Workflow View
@login_required() @login_required()
def workout_workflow_view(request,id): def workout_workflow_view(request,id):
id = encoder.decode_hex(id)
request.session['referer'] = absolute(request)['PATH'] request.session['referer'] = absolute(request)['PATH']
request.session['lastworkout'] = id request.session['lastworkout'] = id
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
@@ -9804,7 +9851,7 @@ def workout_workflow_view(request,id):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_workflow_view,kwargs={'id':id}), 'url':reverse(workout_workflow_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'View' 'name': 'View'
} }
@@ -9835,6 +9882,8 @@ def workout_flexchart3_view(request,*args,**kwargs):
except KeyError: except KeyError:
raise Http404("Invalid workout number") raise Http404("Invalid workout number")
id = encoder.decode_hex(id)
if 'promember' in kwargs: if 'promember' in kwargs:
promember = kwargs['promember'] promember = kwargs['promember']
else: else:
@@ -10132,6 +10181,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
# The interactive plot with the colored Heart rate zones # The interactive plot with the colored Heart rate zones
def workout_biginteractive_view(request,id=0,message="",successmessage=""): def workout_biginteractive_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
# check if user is owner of this workout # check if user is owner of this workout
@@ -10173,6 +10223,7 @@ def workout_biginteractive_view(request,id=0,message="",successmessage=""):
# The interactive plot with wind corrected pace for OTW outings # The interactive plot with wind corrected pace for OTW outings
def workout_otwpowerplot_view(request,id=0,message="",successmessage=""): def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
@@ -10186,7 +10237,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_otwpowerplot_view,kwargs={'id':id}), 'url':reverse(workout_otwpowerplot_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Interactive OTW Power Plot' 'name': 'Interactive OTW Power Plot'
} }
@@ -10233,6 +10284,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
@login_required() @login_required()
def workout_export_view(request,id=0, message="", successmessage=""): def workout_export_view(request,id=0, message="", successmessage=""):
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
try: try:
@@ -10290,6 +10342,7 @@ def workout_export_view(request,id=0, message="", successmessage=""):
# #
@login_required() @login_required()
def workout_unsubscribe_view(request,id=0): def workout_unsubscribe_view(request,id=0):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
if w.privacy == 'private' and w.user.user != request.user: if w.privacy == 'private' and w.user.user != request.user:
@@ -10320,6 +10373,7 @@ def workout_unsubscribe_view(request,id=0):
# list of comments to a workout # list of comments to a workout
@login_required() @login_required()
def workout_comment_view(request,id=0): def workout_comment_view(request,id=0):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
if w.privacy == 'private' and w.user.user != request.user: if w.privacy == 'private' and w.user.user != request.user:
@@ -10346,7 +10400,7 @@ def workout_comment_view(request,id=0):
c.save() c.save()
url = reverse(workout_comment_view, url = reverse(workout_comment_view,
kwargs={ kwargs={
'id':id 'id':encoder.encode_hex(id)
}) })
message = '{name} says: <a href="{url}">{comment}</a>'.format( message = '{name} says: <a href="{url}">{comment}</a>'.format(
name = request.user.first_name, name = request.user.first_name,
@@ -10386,7 +10440,7 @@ def workout_comment_view(request,id=0):
) )
url = reverse(workout_comment_view,kwargs = { url = reverse(workout_comment_view,kwargs = {
'id':id}) 'id':encoder.encode_hex(id)})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
form = WorkoutCommentForm() form = WorkoutCommentForm()
@@ -10413,7 +10467,7 @@ def workout_comment_view(request,id=0):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_comment_view,kwargs={'id':id}), 'url':reverse(workout_comment_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Comments' 'name': 'Comments'
} }
@@ -10671,6 +10725,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
request.session['referer'] = absolute(request)['PATH'] request.session['referer'] = absolute(request)['PATH']
id = encoder.decode_hex(id)
row = get_workout(id) row = get_workout(id)
@@ -10853,7 +10908,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_edit_view,kwargs={'id':id}), 'url':reverse(workout_edit_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Edit' 'name': 'Edit'
} }
@@ -10886,6 +10941,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
@login_required() @login_required()
def workout_map_view(request,id=0): def workout_map_view(request,id=0):
id = encoder.decode_hex(id)
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
request.session['referer'] = absolute(request)['PATH'] request.session['referer'] = absolute(request)['PATH']
@@ -10901,7 +10957,7 @@ def workout_map_view(request,id=0):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_map_view,kwargs={'id':id}), 'url':reverse(workout_map_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Map' 'name': 'Map'
} }
@@ -11109,6 +11165,7 @@ def virtualevent_uploadimage_view(request,id=0):
# Image upload # Image upload
@login_required() @login_required()
def workout_uploadimage_view(request,id): def workout_uploadimage_view(request,id):
id = encoder.decode_hex(id)
is_ajax = False is_ajax = False
if request.is_ajax(): if request.is_ajax():
is_ajax = True is_ajax = True
@@ -11127,7 +11184,7 @@ def workout_uploadimage_view(request,id):
'name': w.name 'name': w.name
}, },
{ {
'url':reverse(workout_uploadimage_view,kwargs={'id':id}), 'url':reverse(workout_uploadimage_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Upload Image' 'name': 'Upload Image'
} }
@@ -11164,7 +11221,7 @@ def workout_uploadimage_view(request,id):
messages.error(request,message) messages.error(request,message)
os.remove(path_and_filename) os.remove(path_and_filename)
url = reverse(workout_uploadimage_view, url = reverse(workout_uploadimage_view,
kwargs = {'id':id}) kwargs = {'id':encoder.encode_hex(id)})
if is_ajax: if is_ajax:
return JSONResponse({'result':0,'url':0}) return JSONResponse({'result':0,'url':0})
@@ -11178,7 +11235,7 @@ def workout_uploadimage_view(request,id):
i.save() i.save()
url = reverse(r.defaultlandingpage, url = reverse(r.defaultlandingpage,
kwargs = {'id':id}) kwargs = {'id':encoder.encode_hex(id)})
if is_ajax: if is_ajax:
return JSONResponse({'result':1,'url':url}) return JSONResponse({'result':1,'url':url})
else: else:
@@ -11186,7 +11243,7 @@ def workout_uploadimage_view(request,id):
else: else:
messages.error(request,'Something went wrong - no file attached') messages.error(request,'Something went wrong - no file attached')
url = reverse(workout_uploadimage_view, url = reverse(workout_uploadimage_view,
kwargs = {'id':id}) kwargs = {'id':encoder.encode_hex(id)})
if is_ajax: if is_ajax:
return JSONResponse({'result':0,'url':0}) return JSONResponse({'result':0,'url':0})
@@ -11273,6 +11330,7 @@ def course_upload_view(request):
# Generic chart creation # Generic chart creation
@login_required() @login_required()
def workout_add_chart_view(request,id,plotnr=1): def workout_add_chart_view(request,id,plotnr=1):
id = encoder.decode_hex(id)
w = get_workout(id) w = get_workout(id)
r = getrower(request.user) r = getrower(request.user)
@@ -12030,6 +12088,7 @@ def workout_getstravaworkout_next(request):
@login_required @login_required
def workout_toggle_ranking(request,id=0): def workout_toggle_ranking(request,id=0):
id = encoder.decode_hex(id)
is_ajax = False is_ajax = False
if request.is_ajax(): if request.is_ajax():
is_ajax = True is_ajax = True
@@ -12297,7 +12356,7 @@ def workout_upload_view(request,
url = reverse(workout_edit_view, url = reverse(workout_edit_view,
kwargs = { kwargs = {
'id':int(id), 'id':encoder.decode_hex(id),
}) })
if is_ajax: if is_ajax:
@@ -12305,7 +12364,7 @@ def workout_upload_view(request,
else: else:
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id) w = Workout.objects.get(id=encoder.decode_hex(id))
r = getrower(request.user) r = getrower(request.user)
if (make_plot): if (make_plot):
@@ -12426,7 +12485,7 @@ def workout_upload_view(request,
if landingpage != 'workout_upload_view': if landingpage != 'workout_upload_view':
url = reverse(landingpage, url = reverse(landingpage,
kwargs = { kwargs = {
'id':w.id, 'id':encoder.encode_hex(w.id),
}) })
else: else:
url = reverse(landingpage) url = reverse(landingpage)
@@ -12660,6 +12719,7 @@ def team_workout_upload_view(request,message="",
# Ask the user if he really wants to delete the workout # Ask the user if he really wants to delete the workout
@login_required() @login_required()
def workout_delete_confirm_view(request, id=0): def workout_delete_confirm_view(request, id=0):
id = encoder.decode_hex(id)
try: try:
row = Workout.objects.get(id=id) row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -12678,6 +12738,7 @@ def workout_delete_confirm_view(request, id=0):
# Really deleting the workout # Really deleting the workout
@login_required() @login_required()
def workout_delete_view(request,id=0): def workout_delete_view(request,id=0):
id = encoder.decode_hex(id)
try: try:
row = Workout.objects.get(id=id) row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -12838,6 +12899,7 @@ def graph_show_view(request,id):
# Restore original stroke data and summary # Restore original stroke data and summary
@login_required() @login_required()
def workout_summary_restore_view(request,id,message="",successmessage=""): def workout_summary_restore_view(request,id,message="",successmessage=""):
id = encoder.decode_hex(id)
try: try:
row = Workout.objects.get(id=id) row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
@@ -12893,6 +12955,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
# Split a workout # Split a workout
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/promembership",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=id):
id = encoder.decode_hex(id)
row = get_workout_permitted(request.user,id) row = get_workout_permitted(request.user,id)
r = row.user r = row.user
@@ -12984,6 +13047,8 @@ def workout_split_view(request,id=id):
# Fuse two workouts # Fuse two workouts
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None) @user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_fusion_view(request,id1=0,id2=1): def workout_fusion_view(request,id1=0,id2=1):
id1 = encoder.decode_hex(id1)
id2 = encoder.decode_hex(id2)
r = getrower(request.user) r = getrower(request.user)
@@ -13023,7 +13088,7 @@ def workout_fusion_view(request,id1=0,id2=1):
url = reverse(workout_edit_view, url = reverse(workout_edit_view,
kwargs={ kwargs={
'id':idnew, 'id':encoder.encode_hex(idnew),
}) })
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -13040,7 +13105,7 @@ def workout_fusion_view(request,id1=0,id2=1):
'name': str(w1.id) 'name': str(w1.id)
}, },
{ {
'url':reverse(workout_fusion_list,kwargs={'id':id1}), 'url':reverse(workout_fusion_list,kwargs={'id':encoder.encode_hex(id1)}),
'name': 'Sensor Fusion' 'name': 'Sensor Fusion'
}, },
{ {
@@ -13066,6 +13131,7 @@ def workout_fusion_view(request,id1=0,id2=1):
@login_required() @login_required()
def workout_summary_edit_view(request,id,message="",successmessage="" def workout_summary_edit_view(request,id,message="",successmessage=""
): ):
id = encoder.decode_hex(id)
row = get_workout_permitted(request.user,id) row = get_workout_permitted(request.user,id)
r = getrower(request.user) r = getrower(request.user)
breadcrumbs = [ breadcrumbs = [
@@ -13078,7 +13144,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'name': row.name 'name': row.name
}, },
{ {
'url':reverse(workout_summary_edit_view,kwargs={'id':id}), 'url':reverse(workout_summary_edit_view,kwargs={'id':encoder.encode_hex(id)}),
'name': 'Edit Intervals' 'name': 'Edit Intervals'
} }
@@ -14254,7 +14320,7 @@ def strokedataform(request,id=0):
{ {
'form':form, 'form':form,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
'id':id, 'id':encoder.encode_hex(id),
'workout':w, 'workout':w,
}) })
elif request.method == 'POST': elif request.method == 'POST':
@@ -14264,7 +14330,7 @@ def strokedataform(request,id=0):
{ {
'form':form, 'form':form,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
'id':id, 'id':encoder.encode_hex(id),
'workout':w, 'workout':w,
}) })
@@ -14276,6 +14342,7 @@ from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer
@login_required() @login_required()
@api_view(['GET','POST']) @api_view(['GET','POST'])
def strokedatajson(request,id): def strokedatajson(request,id):
id = encoder.decode_hex(id)
""" """
POST: Add Stroke data to workout POST: Add Stroke data to workout
GET: Get stroke data of workout GET: Get stroke data of workout

View File

@@ -460,3 +460,9 @@ try:
PAYMENT_PROCESSING_ON = CFG['payment_processing_on'] PAYMENT_PROCESSING_ON = CFG['payment_processing_on']
except KeyError: except KeyError:
PAYMENT_PROCESSING_ON = False PAYMENT_PROCESSING_ON = False
# ID obfuscation
try:
OPAQUE_SECRET_KEY = CFG['opaque_secret_key']
except KeyError:
OPAQUE_SECRET_KEY = 0xa193443a