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.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
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({
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) {

View File

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

View File

@@ -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>&nbsp;View
</a>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/workflow">
<a href="/rowers/workout/{{ workout.id|encode }}/workflow">
<i class="fas fa-tachometer-alt fa-fw"></i>&nbsp;View
</a>
{% endif %}
</li>
{% if user.is_authenticated and workout|may_edit:request %}
<li id="workout-edit">
<a href="/rowers/workout/{{ workout.id }}/edit">
<a href="/rowers/workout/{{ workout.id|encode }}/edit">
<i class="fas fa-pencil-alt fa-fw"></i>&nbsp;Edit
</a>
</li>
<li id="workout-intervals">
<a href="/rowers/workout/{{ workout.id }}/editintervals">
<a href="/rowers/workout/{{ workout.id|encode }}/editintervals">
<i class="fas fa-pause fa-fw"></i>&nbsp;Intervals
</a>
</li>
{% endif %}
{% if user.is_authenticated %}
<li id="workout-comments">
<a href="/rowers/workout/{{ workout.id }}/comment">
<a href="/rowers/workout/{{ workout.id|encode }}/comment">
<i class="fas fa-comments fa-fw"></i>&nbsp;Comments
({{ workout|aantalcomments }})
</a>
</li>
{% endif %}
<li id="workout-stats">
<a href="/rowers/workout/{{ workout.id }}/stats">
<a href="/rowers/workout/{{ workout.id|encode }}/stats">
<i class="fal fa-table fa-fw"></i>&nbsp;Statistics
</a>
</li>
<li id="compare">
<a href="/rowers/multi-compare/workout/{{ workout.id }}">
<a href="/rowers/multi-compare/workout/{{ workout.id|encode }}">
<i class="fas fa-balance-scale fa-fw"></i>&nbsp;Compare
</a>
</li>
{% if user.is_authenticated and workout|may_edit:request %}
<li id="chart-image">
<a href="/rowers/workout/{{ workout.id }}/image">
<a href="/rowers/workout/{{ workout.id|encode }}/image">
<i class="fas fa-file-image fa-fw"></i>&nbsp;Upload Image
</a>
</li>
@@ -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>&nbsp;Flex Chart
</a>
</li>
{% if workout|water %}
<li id="chart-map">
<a href="/rowers/workout/{{ workout.id }}/map">
<a href="/rowers/workout/{{ workout.id|encode }}/map">
<i class="fas fa-map-marked-alt fa-fw"></i>&nbsp;Map
</a>
</li>
<li id="chart-empower">
<a href="/rowers/workout/{{ workout.id }}/forcecurve">
<a href="/rowers/workout/{{ workout.id|encode }}/forcecurve">
<i class="fas fa-dumbbell fa-fw"></i>&nbsp;Force Curve
</a>
</li>
<li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/interactiveotwplot">
<a href="/rowers/workout/{{ workout.id|encode }}/interactiveotwplot">
<i class="fal fa-calculator-alt fa-fw"></i>&nbsp;Corrected Pace Plot
</a>
</li>
@@ -94,28 +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>&nbsp;Time
</a>
</li>
<li id="chart-distance">
<a href="/rowers/workout/{{ workout.id }}/addstatic/2">
<a href="/rowers/workout/{{ workout.id|encode }}/addstatic/2">
<i class="fas fa-ruler fa-fw"></i>&nbsp;Distance
</a>
</li>
<li id="chart-powerpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/13">
<a href="/rowers/workout/{{ workout.id|encode }}/addstatic/13">
<i class="far fa-chart-pie fa-fw"></i>&nbsp;Power (Pie)
</a>
</li>
<li id="chart-hrpie">
<a href="/rowers/workout/{{ workout.id }}/addstatic/3">
<a href="/rowers/workout/{{ workout.id|encode }}/addstatic/3">
<i class="fas fa-heartbeat fa-fw"></i>&nbsp;Heart Rate (Pie)
</a>
</li>
{% if workout|water %}
<li id="chart-otwpower">
<a href="/rowers/workout/{{ workout.id }}/addstatic/9">
<a href="/rowers/workout/{{ workout.id|encode }}/addstatic/9">
<i class="fas fa-chart-area fa-fw"></i>&nbsp;OTW Power
</a>
</li>
@@ -136,7 +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>&nbsp;Smoothen
</a>
</li>
<li id="data-raw">
<a href="/rowers/workout/{{ workout.id }}/undosmoothenpace">
<a href="/rowers/workout/{{ workout.id|encode }}/undosmoothenpace">
<i class="fas fa-undo fa-fw"></i>&nbsp;Restore Raw
</a>
</li>
<li id="data-fusion">
<a href="/rowers/workout/fusion/{{ workout.id }}/">
<a href="/rowers/workout/fusion/{{ workout.id|encode }}/">
<i class="fas fa-blender fa-fw"></i>&nbsp;Sensor Fusion
</a>
</li>
<li id="data-split">
<a href="/rowers/workout/{{ workout.id }}/split">
<a href="/rowers/workout/{{ workout.id|encode }}/split">
<i class="fas fa-cut fa-fw"></i>&nbsp;Split Workout
</a>
</li>
<li id="data-view">
<a href="/rowers/workout/{{ workout.id }}/data">
<a href="/rowers/workout/{{ workout.id|encode }}/data">
<i class="fal fa-table fa-fw"></i>&nbsp;Explore Raw Data
</a>
</ul>
@@ -269,28 +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>&nbsp;Wind
</a>
</li>
<li id="advanced-stream">
<a href="/rowers/workout/{{ workout.id }}/stream">
<a href="/rowers/workout/{{ workout.id|encode }}/stream">
<i class="fas fa-stream fa-fw"></i>&nbsp;Stream
</a>
</li>
<li id="advanced-otwpower">
<a href="/rowers/workout/{{ workout.id }}/otwsetpower">
<a href="/rowers/workout/{{ workout.id|encode }}/otwsetpower">
<i class="fas fa-calculator-alt fa-fw"></i>&nbsp;OTW Power
</a>
</li>
{% endif %}
<li id="advanced-instroke">
<a href="/rowers/workout/{{ workout.id }}/instroke">
<a href="/rowers/workout/{{ workout.id|encode }}/instroke">
<i class="fas fa-search-plus fa-fw"></i>&nbsp;In-Stroke Metrics
</a>
</li>
<li id="advanced-recalcsummary">
<a href="/rowers/workout/{{ workout.id }}/recalcsummary">
<a href="/rowers/workout/{{ workout.id|encode }}/recalcsummary">
<i class="fas fa-window-restore fa-fw"></i>&nbsp;Update Summary
</a>
</li>

View File

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

View File

@@ -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>

View File

@@ -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

View File

@@ -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),

View File

@@ -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

View File

@@ -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