opaquification part 1
This commit is contained in:
@@ -77,7 +77,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
|
||||
@@ -1139,7 +1139,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
||||
btvalues=btvalues.to_json())
|
||||
|
||||
|
||||
return (w.id, message)
|
||||
return (encoder.encode_hex(w.id), message)
|
||||
|
||||
parsers = {
|
||||
'kinomap': KinoMapParser,
|
||||
@@ -1404,7 +1404,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,
|
||||
@@ -1431,7 +1431,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:
|
||||
@@ -1439,7 +1439,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()
|
||||
|
||||
59
rowers/opaque.py
Normal file
59
rowers/opaque.py
Normal 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)
|
||||
@@ -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) {
|
||||
|
||||
@@ -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">★</span>
|
||||
<span id="star{{ workout.id|encode }}" class="yellow">★</span>
|
||||
{% else %}
|
||||
<span id="star{{ workout.id }}" class="notyellow">☆</span>
|
||||
<span id="star{{ workout.id|encode }}" class="notyellow">☆</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>
|
||||
@@ -221,7 +221,7 @@
|
||||
</a>
|
||||
</td>
|
||||
{% 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>
|
||||
<a class="small" href="/rowers/workout/{{ workout.id }}/delete">Delete
|
||||
</td>
|
||||
|
||||
@@ -7,48 +7,48 @@
|
||||
<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> 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> 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> 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> 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> 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> 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> 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> Upload Image
|
||||
</a>
|
||||
</li>
|
||||
@@ -65,23 +65,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> 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> 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> 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> Corrected Pace Plot
|
||||
</a>
|
||||
</li>
|
||||
@@ -94,28 +94,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> 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> 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> 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> 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> OTW Power
|
||||
</a>
|
||||
</li>
|
||||
@@ -136,7 +136,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 +151,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 +166,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 +181,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 +196,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 +211,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 +238,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> 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> 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> 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> 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> Explore Raw Data
|
||||
</a>
|
||||
</ul>
|
||||
@@ -269,28 +269,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> 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> 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> 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> 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> Update Summary
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -57,7 +57,7 @@ $('#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>
|
||||
</div>
|
||||
@@ -65,7 +65,7 @@ $('#id_workouttype').change();
|
||||
<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>
|
||||
|
||||
@@ -26,6 +26,8 @@ from rowers.utils import NoTokenError
|
||||
|
||||
import rowers.payments as payments
|
||||
|
||||
from rowers.opaque import encoder
|
||||
|
||||
def strfdelta(tdelta):
|
||||
minutes,seconds = divmod(tdelta.seconds,60)
|
||||
tenths = int(tdelta.microseconds/1e5)
|
||||
@@ -79,6 +81,10 @@ def aantalcomments(workout):
|
||||
|
||||
return aantalcomments
|
||||
|
||||
@register.filter
|
||||
def encode(id):
|
||||
return str(encoder.encode_hex(id))
|
||||
|
||||
@register.filter
|
||||
def water(workout):
|
||||
try:
|
||||
@@ -509,7 +515,7 @@ def nextworkout(workout,user):
|
||||
|
||||
|
||||
if ws:
|
||||
return ws[0].id
|
||||
return encoder.encode_hex(ws[0].id)
|
||||
else:
|
||||
return 0
|
||||
|
||||
@@ -534,7 +540,7 @@ def previousworkout(workout,user):
|
||||
|
||||
|
||||
if ws:
|
||||
return ws[0].id
|
||||
return encoder.encode_hex(ws[0].id)
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
158
rowers/urls.py
158
rowers/urls.py
@@ -110,7 +110,7 @@ urlpatterns = [
|
||||
url(r'^', include(router.urls)),
|
||||
url(r'^api-docs$', views.schema_view),
|
||||
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'^502/$', TemplateView.as_view(template_name='502.html'),name='502'),
|
||||
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/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/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+)/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>\d+)/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)/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+)/user/(?P<userid>\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/(?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/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/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/user/(?P<userid>\d+)/$',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'^graph/(?P<id>\d+)/$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/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-thumbnails$',views.get_thumbnails),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/toggle-ranking$',views.workout_toggle_ranking),
|
||||
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/$',views.workout_upload_view,name='workout_upload_view'),
|
||||
url(r'^workout/(?P<id>\d+)/histo$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/unsubscribe$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/emailtcx$',views.workout_tcxemail_view),
|
||||
url(r'^workout/(?P<id>\d+)/emailgpx$',views.workout_gpxemail_view),
|
||||
url(r'^workout/(?P<id>\d+)/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)/histo$',views.workout_histo_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/task$',views.workout_test_task_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/forcecurve$',views.workout_forcecurve_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/unsubscribe$',views.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),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailtcx$',views.workout_tcxemail_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailgpx$',views.workout_gpxemail_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/emailcsv$',views.workout_csvemail_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'^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/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/compare/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.workout_comparison_list),
|
||||
# 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>\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>\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),
|
||||
# url(r'^workout/(?P<id>\d+)/setprivate$',views.workout_setprivate_view),
|
||||
url(r'^workout/(?P<id>\d+)/updatecp$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/instroke$',views.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),
|
||||
# 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),
|
||||
# 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),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/instroke$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/interactiveotwplot$',views.workout_otwpowerplot_view),
|
||||
url(r'^workout/(?P<id>\d+)/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)/otwsetpower$',views.workout_otwsetpower_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/interactiveotwplot$',views.workout_otwpowerplot_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/wind$',views.workout_wind_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+)/image$',
|
||||
views.virtualevent_uploadimage_view),
|
||||
@@ -285,56 +285,56 @@ urlpatterns = [
|
||||
views.virtualevent_setlogo_view),
|
||||
url(r'^logo/(?P<id>\d+)/delete/$',
|
||||
views.logo_delete_view),
|
||||
url(r'^workout/(?P<id>\d+)/darkskywind$',views.workout_downloadwind_view),
|
||||
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
|
||||
url(r'^workout/(?P<id>\d+)/stream$',views.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),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stream$',views.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),
|
||||
url(r'^workout/(?P<id>\d+)/split$',views.workout_split_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/restore$',views.workout_summary_restore_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+)/view$',views.workout_view),
|
||||
url(r'^workout/(?P<id>\d+)/$',views.workout_view),
|
||||
url(r'^workout/fusion/(?P<id1>\d+)/(?P<id2>\d+)$',views.workout_fusion_view),
|
||||
url(r'^workout/fusion/(?P<id>\d+)/$',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/(?P<id>\b[0-9A-Fa-f]+\b)/view$',views.workout_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.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),
|
||||
url(r'^workout/fusion/(?P<id>\b[0-9A-Fa-f]+\b)/$',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(
|
||||
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'}),
|
||||
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'}),
|
||||
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'}),
|
||||
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'}),
|
||||
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'}),
|
||||
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'}),
|
||||
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'}),
|
||||
# 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),
|
||||
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(
|
||||
views.WorkoutDelete.as_view()),
|
||||
name='workout_delete'),
|
||||
url(r'^workout/(?P<id>\d+)/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)/smoothenpace$',views.workout_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/c2list/$',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/user/(?P<userid>\d+)$',views.workout_runkeeperimport_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>\d+)/c2uploadw/$',views.workout_c2_upload_view),
|
||||
url(r'^workout/(?P<id>\d+)/stravauploadw/$',views.workout_strava_upload_view),
|
||||
url(r'^workout/(?P<id>\d+)/recalcsummary/$',views.workout_recalcsummary_view),
|
||||
url(r'^workout/(?P<id>\d+)/sporttracksuploadw/$',views.workout_sporttracks_upload_view),
|
||||
url(r'^workout/(?P<id>\d+)/runkeeperuploadw/$',views.workout_runkeeper_upload_view),
|
||||
url(r'^workout/(?P<id>\d+)/underarmouruploadw/$',views.workout_underarmour_upload_view),
|
||||
url(r'^workout/(?P<id>\d+)/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>\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),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/stravauploadw/$',views.workout_strava_upload_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/recalcsummary/$',views.workout_recalcsummary_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/sporttracksuploadw/$',views.workout_sporttracks_upload_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/runkeeperuploadw/$',views.workout_runkeeper_upload_view),
|
||||
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/underarmouruploadw/$',views.workout_underarmour_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>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\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'^user-boxplot/user/(?P<userid>\d+)$',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'^register$',views.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),
|
||||
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>\d+)/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/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/(?P<plottype>[\w\ ]+.*)$',views.workout_comparison_view2),
|
||||
# url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2),
|
||||
url(r'^workout/(?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>\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>\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>\b[0-9A-Fa-f]+\b)/flexchart$',views.workout_flexchart3_view),
|
||||
# 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>\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'^createplan/$',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(
|
||||
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),
|
||||
url(r'^sessions/teamcreate/team/(?P<teamid>\d+)/user/(?P<userid>\d+)/$',
|
||||
views.plannedsession_teamcreate_view),
|
||||
|
||||
143
rowers/views.py
143
rowers/views.py
@@ -143,7 +143,7 @@ from rowsandall_app.settings import (
|
||||
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
|
||||
PAYMENT_PROCESSING_ON,OPAQUE_SECRET_KEY
|
||||
)
|
||||
|
||||
from rowers.tasks_standalone import addcomment2
|
||||
@@ -219,6 +219,7 @@ from rq import Queue,cancel_job
|
||||
from django.core.cache import cache
|
||||
from django_mailbox.models import Message,Mailbox,MessageAttachment
|
||||
|
||||
from rowers.opaque import encoder
|
||||
|
||||
|
||||
# Utility to get stroke data in a JSON response
|
||||
@@ -643,6 +644,7 @@ def get_stored_tasks_status(request):
|
||||
|
||||
@login_required()
|
||||
def get_thumbnails(request,id):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout_permitted(request.user,id)
|
||||
|
||||
|
||||
@@ -842,6 +844,7 @@ def remove_user(request):
|
||||
|
||||
@login_required()
|
||||
def get_testscript(request,id):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout_permitted(request.user,id)
|
||||
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
|
||||
@login_required()
|
||||
def workout_tcxemail_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
successmessage = ""
|
||||
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
|
||||
@login_required()
|
||||
def workout_gpxemail_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
successmessage = ""
|
||||
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
|
||||
@login_required()
|
||||
def workout_csvemail_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
r = getrower(request.user)
|
||||
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
|
||||
@login_required()
|
||||
def workout_csvtoadmin_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
r = getrower(request.user)
|
||||
w = get_workout(id)
|
||||
@@ -2188,6 +2195,7 @@ def workout_csvtoadmin_view(request,id=0):
|
||||
# Send workout to TP
|
||||
@login_required()
|
||||
def workout_tp_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
message = ""
|
||||
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
|
||||
@login_required()
|
||||
def workout_strava_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
r = getrower(request.user)
|
||||
res = -1
|
||||
@@ -2349,6 +2358,7 @@ def workout_strava_upload_view(request,id=0):
|
||||
# Upload workout to Concept2 logbook
|
||||
@login_required()
|
||||
def workout_c2_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
# ready to upload. Hurray
|
||||
w = get_workout(id)
|
||||
@@ -2378,6 +2388,7 @@ def workout_c2_upload_view(request,id=0):
|
||||
# Upload workout to RunKeeper
|
||||
@login_required()
|
||||
def workout_runkeeper_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
w = get_workout(id)
|
||||
r = w.user
|
||||
@@ -2441,6 +2452,7 @@ def workout_runkeeper_upload_view(request,id=0):
|
||||
# Upload workout to Underarmour
|
||||
@login_required()
|
||||
def workout_underarmour_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
w = get_workout(id)
|
||||
r = w.user
|
||||
@@ -2505,6 +2517,7 @@ def workout_underarmour_upload_view(request,id=0):
|
||||
# Upload workout to SportTracks
|
||||
@login_required()
|
||||
def workout_sporttracks_upload_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
message = ""
|
||||
# ready to upload. Hurray
|
||||
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",
|
||||
redirect_field_name=None)
|
||||
def workout_forcecurve_view(request,id=0,workstrokesonly=False):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
promember=0
|
||||
@@ -3594,7 +3608,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -3622,6 +3636,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
|
||||
# Test asynchronous tasking and messaging
|
||||
@login_required()
|
||||
def workout_test_task_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
row = Workout.objects.get(id=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
|
||||
@login_required()
|
||||
def workout_histo_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
|
||||
promember=0
|
||||
@@ -3664,7 +3680,7 @@ def workout_histo_view(request,id=0):
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_histo_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_histo_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': 'Histogram'
|
||||
}
|
||||
|
||||
@@ -3972,7 +3988,7 @@ def addmanual_view(request):
|
||||
|
||||
url = reverse(
|
||||
workout_edit_view,
|
||||
kwargs={'id':id}
|
||||
kwargs={'id':encoder.encode_hex(id)}
|
||||
)
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
@@ -4806,6 +4822,7 @@ def rankings_view2(request,theuser=0,
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_update_cp_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
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)
|
||||
@login_required()
|
||||
def workout_recalcsummary_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -5621,6 +5639,7 @@ def workout_makepublic_view(request,id,
|
||||
message='',
|
||||
successmessage=''):
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -5652,6 +5671,7 @@ def workout_makepublic_view(request,id,
|
||||
def workout_setprivate_view(request,id,
|
||||
message='',
|
||||
successmessage=''):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -5894,6 +5914,8 @@ def team_comparison_select(request,
|
||||
id=0,
|
||||
teamid=0):
|
||||
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
r = getrequestrower(request,userid=userid)
|
||||
requestrower = getrower(request.user)
|
||||
|
||||
@@ -6065,7 +6087,7 @@ def team_comparison_select(request,
|
||||
'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'
|
||||
},
|
||||
]
|
||||
@@ -6276,7 +6298,8 @@ def plannedsession_compare_view(request,id=0,userid=0):
|
||||
request.session['plottype'] = plottype
|
||||
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)
|
||||
|
||||
@@ -6356,7 +6379,7 @@ def multi_compare_view(request,id=0,userid=0):
|
||||
else:
|
||||
url = reverse(team_comparison_select,
|
||||
kwargs={
|
||||
'id':id,
|
||||
'id':encoder.encode_hex(id),
|
||||
'teamid':0})
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@@ -7730,6 +7753,7 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now()):
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
try:
|
||||
r = getrower(request.user)
|
||||
except Rower.DoesNotExist:
|
||||
@@ -7816,6 +7840,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now()):
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
try:
|
||||
r = getrower(request.user)
|
||||
except Rower.DoesNotExist:
|
||||
@@ -7888,7 +7913,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -7914,6 +7939,8 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
|
||||
def workout_view(request,id=0):
|
||||
request.session['referer'] = absolute(request)['PATH']
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
if not request.user.is_anonymous():
|
||||
rower = getrower(request.user)
|
||||
else:
|
||||
@@ -7981,7 +8008,7 @@ def workout_view(request,id=0):
|
||||
'name':'Workouts'
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': row.name,
|
||||
}
|
||||
|
||||
@@ -8017,6 +8044,7 @@ def workout_view(request,id=0):
|
||||
def workout_undo_smoothenpace_view(
|
||||
request,id=0,message="",successmessage=""
|
||||
):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
|
||||
@@ -8041,7 +8069,7 @@ def workout_undo_smoothenpace_view(
|
||||
|
||||
url = reverse(r.defaultlandingpage,
|
||||
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",
|
||||
redirect_field_name=None)
|
||||
def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
previousurl = request.META.get('HTTP_REFERER')
|
||||
@@ -8096,7 +8125,7 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
||||
else:
|
||||
url = reverse(r.defaultlandingpage,
|
||||
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",
|
||||
redirect_field_name=None)
|
||||
def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
breadcrumbs = [
|
||||
@@ -8119,7 +8149,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -8186,6 +8216,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
|
||||
def workout_downloadwind_view(request,id=0,
|
||||
airportcode=None,
|
||||
message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
f1 = row.csvfilename
|
||||
@@ -8252,6 +8283,7 @@ def workout_downloadwind_view(request,id=0,
|
||||
def workout_downloadmetar_view(request,id=0,
|
||||
airportcode=None,
|
||||
message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
f1 = row.csvfilename
|
||||
@@ -8317,6 +8349,7 @@ def workout_downloadmetar_view(request,id=0,
|
||||
# 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)
|
||||
def workout_wind_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
breadcrumbs = [
|
||||
@@ -8329,7 +8362,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
|
||||
'name': row.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_wind_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_wind_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'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)
|
||||
@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=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
|
||||
@@ -8517,7 +8551,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
|
||||
'name': row.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_stream_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_stream_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'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
|
||||
@user_passes_test(ispromember, login_url="/rowers/promembership",redirect_field_name=None)
|
||||
def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
|
||||
@@ -8649,7 +8684,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -8671,6 +8706,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
|
||||
@login_required()
|
||||
def instroke_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
mayedit = 0
|
||||
@@ -8689,7 +8725,7 @@ def instroke_view(request,id=0):
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse(instroke_view,kwargs={'id':id}),
|
||||
'url':reverse(instroke_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'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
|
||||
@login_required()
|
||||
def workout_geeky_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
# form = WorkoutForm(instance=row)
|
||||
@@ -8791,6 +8828,7 @@ def workout_geeky_view(request,id=0,message="",successmessage=""):
|
||||
# generate instroke chart
|
||||
@login_required()
|
||||
def instroke_chart(request,id=0,metric=''):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,w)==False):
|
||||
@@ -8840,7 +8878,7 @@ def instroke_chart(request,id=0,metric=''):
|
||||
r = getrower(request.user)
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':id,
|
||||
'id':encoder.encode_hex(id),
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
@@ -9150,6 +9188,7 @@ def cumstats(request,theuser=0,
|
||||
# data explorer
|
||||
@login_required()
|
||||
def workout_data_view(request, id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
r = getrower(request.user)
|
||||
w = get_workout(id)
|
||||
@@ -9167,7 +9206,7 @@ def workout_data_view(request, id=0):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -9249,6 +9288,7 @@ def workout_data_view(request, id=0):
|
||||
# Stats page
|
||||
@login_required()
|
||||
def workout_stats_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
r = getrower(request.user)
|
||||
w = get_workout(id)
|
||||
@@ -9269,7 +9309,7 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_stats_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_stats_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': 'Stats'
|
||||
}
|
||||
|
||||
@@ -9417,6 +9457,7 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
|
||||
# The Advanced edit page
|
||||
@login_required()
|
||||
def workout_advanced_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
# 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)
|
||||
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
|
||||
if not request.user.is_anonymous():
|
||||
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
|
||||
def workout_comparison_view2(request,id1=0,id2=0,xparam='distance',
|
||||
yparam='spm',plottype='line'):
|
||||
id1 = encoder.decode_hex(id1)
|
||||
id2 = encoder.decode_hex(id2)
|
||||
promember=0
|
||||
if not request.user.is_anonymous():
|
||||
r = getrower(request.user)
|
||||
@@ -9582,6 +9627,7 @@ def workflow_default_view(request):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
def get_workout_default_page(request,id):
|
||||
id = encoder.encode_hex(id)
|
||||
if request.user.is_anonymous():
|
||||
return reverse(workout_view,kwargs={'id':str(id)})
|
||||
else:
|
||||
@@ -9741,6 +9787,7 @@ def getfavorites(r,row):
|
||||
# Workflow View
|
||||
@login_required()
|
||||
def workout_workflow_view(request,id):
|
||||
id = encoder.decode_hex(id)
|
||||
request.session['referer'] = absolute(request)['PATH']
|
||||
request.session['lastworkout'] = id
|
||||
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
|
||||
@@ -9804,7 +9851,7 @@ def workout_workflow_view(request,id):
|
||||
'name': row.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_workflow_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_workflow_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': 'View'
|
||||
}
|
||||
|
||||
@@ -9835,6 +9882,8 @@ def workout_flexchart3_view(request,*args,**kwargs):
|
||||
except KeyError:
|
||||
raise Http404("Invalid workout number")
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
if 'promember' in kwargs:
|
||||
promember = kwargs['promember']
|
||||
else:
|
||||
@@ -10132,6 +10181,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
|
||||
|
||||
# The interactive plot with the colored Heart rate zones
|
||||
def workout_biginteractive_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
# 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
|
||||
def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
|
||||
@@ -10186,7 +10237,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -10233,6 +10284,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
|
||||
@login_required()
|
||||
def workout_export_view(request,id=0, message="", successmessage=""):
|
||||
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout(id)
|
||||
|
||||
try:
|
||||
@@ -10290,6 +10342,7 @@ def workout_export_view(request,id=0, message="", successmessage=""):
|
||||
#
|
||||
@login_required()
|
||||
def workout_unsubscribe_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
|
||||
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
|
||||
@login_required()
|
||||
def workout_comment_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
w = get_workout(id)
|
||||
|
||||
if w.privacy == 'private' and w.user.user != request.user:
|
||||
@@ -10346,7 +10400,7 @@ def workout_comment_view(request,id=0):
|
||||
c.save()
|
||||
url = reverse(workout_comment_view,
|
||||
kwargs={
|
||||
'id':id
|
||||
'id':encoder.encode_hex(id)
|
||||
})
|
||||
message = '{name} says: <a href="{url}">{comment}</a>'.format(
|
||||
name = request.user.first_name,
|
||||
@@ -10386,7 +10440,7 @@ def workout_comment_view(request,id=0):
|
||||
)
|
||||
|
||||
url = reverse(workout_comment_view,kwargs = {
|
||||
'id':id})
|
||||
'id':encoder.encode_hex(id)})
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
form = WorkoutCommentForm()
|
||||
@@ -10413,7 +10467,7 @@ def workout_comment_view(request,id=0):
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_comment_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_comment_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'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['referer'] = absolute(request)['PATH']
|
||||
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
row = get_workout(id)
|
||||
|
||||
@@ -10853,7 +10908,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
|
||||
'name': row.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_edit_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_edit_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': 'Edit'
|
||||
}
|
||||
|
||||
@@ -10886,6 +10941,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
|
||||
|
||||
@login_required()
|
||||
def workout_map_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
|
||||
request.session['referer'] = absolute(request)['PATH']
|
||||
|
||||
@@ -10901,7 +10957,7 @@ def workout_map_view(request,id=0):
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse(workout_map_view,kwargs={'id':id}),
|
||||
'url':reverse(workout_map_view,kwargs={'id':encoder.encode_hex(id)}),
|
||||
'name': 'Map'
|
||||
}
|
||||
|
||||
@@ -11109,6 +11165,7 @@ def virtualevent_uploadimage_view(request,id=0):
|
||||
# Image upload
|
||||
@login_required()
|
||||
def workout_uploadimage_view(request,id):
|
||||
id = encoder.decode_hex(id)
|
||||
is_ajax = False
|
||||
if request.is_ajax():
|
||||
is_ajax = True
|
||||
@@ -11127,7 +11184,7 @@ def workout_uploadimage_view(request,id):
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -11164,7 +11221,7 @@ def workout_uploadimage_view(request,id):
|
||||
messages.error(request,message)
|
||||
os.remove(path_and_filename)
|
||||
url = reverse(workout_uploadimage_view,
|
||||
kwargs = {'id':id})
|
||||
kwargs = {'id':encoder.encode_hex(id)})
|
||||
|
||||
if is_ajax:
|
||||
return JSONResponse({'result':0,'url':0})
|
||||
@@ -11178,7 +11235,7 @@ def workout_uploadimage_view(request,id):
|
||||
i.save()
|
||||
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {'id':id})
|
||||
kwargs = {'id':encoder.encode_hex(id)})
|
||||
if is_ajax:
|
||||
return JSONResponse({'result':1,'url':url})
|
||||
else:
|
||||
@@ -11186,7 +11243,7 @@ def workout_uploadimage_view(request,id):
|
||||
else:
|
||||
messages.error(request,'Something went wrong - no file attached')
|
||||
url = reverse(workout_uploadimage_view,
|
||||
kwargs = {'id':id})
|
||||
kwargs = {'id':encoder.encode_hex(id)})
|
||||
|
||||
if is_ajax:
|
||||
return JSONResponse({'result':0,'url':0})
|
||||
@@ -11273,6 +11330,7 @@ def course_upload_view(request):
|
||||
# Generic chart creation
|
||||
@login_required()
|
||||
def workout_add_chart_view(request,id,plotnr=1):
|
||||
id = encoder.decode_hex(id)
|
||||
|
||||
w = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
@@ -12030,6 +12088,7 @@ def workout_getstravaworkout_next(request):
|
||||
|
||||
@login_required
|
||||
def workout_toggle_ranking(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
is_ajax = False
|
||||
if request.is_ajax():
|
||||
is_ajax = True
|
||||
@@ -12297,7 +12356,7 @@ def workout_upload_view(request,
|
||||
|
||||
url = reverse(workout_edit_view,
|
||||
kwargs = {
|
||||
'id':int(id),
|
||||
'id':encoder.decode_hex(id),
|
||||
})
|
||||
|
||||
if is_ajax:
|
||||
@@ -12305,7 +12364,7 @@ def workout_upload_view(request,
|
||||
else:
|
||||
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):
|
||||
@@ -12426,7 +12485,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)
|
||||
@@ -12660,6 +12719,7 @@ def team_workout_upload_view(request,message="",
|
||||
# Ask the user if he really wants to delete the workout
|
||||
@login_required()
|
||||
def workout_delete_confirm_view(request, id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
try:
|
||||
row = Workout.objects.get(id=id)
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -12678,6 +12738,7 @@ def workout_delete_confirm_view(request, id=0):
|
||||
# Really deleting the workout
|
||||
@login_required()
|
||||
def workout_delete_view(request,id=0):
|
||||
id = encoder.decode_hex(id)
|
||||
try:
|
||||
row = Workout.objects.get(id=id)
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -12838,6 +12899,7 @@ def graph_show_view(request,id):
|
||||
# Restore original stroke data and summary
|
||||
@login_required()
|
||||
def workout_summary_restore_view(request,id,message="",successmessage=""):
|
||||
id = encoder.decode_hex(id)
|
||||
try:
|
||||
row = Workout.objects.get(id=id)
|
||||
if (checkworkoutuser(request.user,row)==False):
|
||||
@@ -12893,6 +12955,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
|
||||
# Split a workout
|
||||
@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):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout_permitted(request.user,id)
|
||||
|
||||
r = row.user
|
||||
@@ -12984,6 +13047,8 @@ def workout_split_view(request,id=id):
|
||||
# Fuse two workouts
|
||||
@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):
|
||||
id1 = encoder.decode_hex(id1)
|
||||
id2 = encoder.decode_hex(id2)
|
||||
|
||||
r = getrower(request.user)
|
||||
|
||||
@@ -13023,7 +13088,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)
|
||||
@@ -13040,7 +13105,7 @@ def workout_fusion_view(request,id1=0,id2=1):
|
||||
'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'
|
||||
},
|
||||
{
|
||||
@@ -13066,6 +13131,7 @@ def workout_fusion_view(request,id1=0,id2=1):
|
||||
@login_required()
|
||||
def workout_summary_edit_view(request,id,message="",successmessage=""
|
||||
):
|
||||
id = encoder.decode_hex(id)
|
||||
row = get_workout_permitted(request.user,id)
|
||||
r = getrower(request.user)
|
||||
breadcrumbs = [
|
||||
@@ -13078,7 +13144,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
|
||||
'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'
|
||||
}
|
||||
|
||||
@@ -14254,7 +14320,7 @@ def strokedataform(request,id=0):
|
||||
{
|
||||
'form':form,
|
||||
'teams':get_my_teams(request.user),
|
||||
'id':id,
|
||||
'id':encoder.encode_hex(id),
|
||||
'workout':w,
|
||||
})
|
||||
elif request.method == 'POST':
|
||||
@@ -14264,7 +14330,7 @@ def strokedataform(request,id=0):
|
||||
{
|
||||
'form':form,
|
||||
'teams':get_my_teams(request.user),
|
||||
'id':id,
|
||||
'id':encoder.encode_hex(id),
|
||||
'workout':w,
|
||||
})
|
||||
|
||||
@@ -14276,6 +14342,7 @@ from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer
|
||||
@login_required()
|
||||
@api_view(['GET','POST'])
|
||||
def strokedatajson(request,id):
|
||||
id = encoder.decode_hex(id)
|
||||
"""
|
||||
POST: Add Stroke data to workout
|
||||
GET: Get stroke data of workout
|
||||
|
||||
@@ -460,3 +460,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
|
||||
|
||||
Reference in New Issue
Block a user