Private
Public Access
1
0

now passes new tests

This commit is contained in:
Sander Roosendaal
2019-01-09 17:01:36 +01:00
parent ebb90e5997
commit 1e3f3844f7
8 changed files with 124 additions and 68 deletions

View File

@@ -1,6 +1,9 @@
import pytest
pytestmark = pytest.mark.django_db
from rowers.opaque import encoder
encoded1 = str(encoder.encode_hex(1))
encoded2 = str(encoder.encode_hex(2))
from bs4 import BeautifulSoup
import re

View File

@@ -112,9 +112,10 @@ class EmpowerTest(TestCase):
def test_workflow_map_view(self, mocked_sqlalchemy):
login = self.c.login(username='john',password='koeinsloot')
self.assertTrue(login)
encodedid = str(encoder.encode_hex(self.wote.id))
url = '/rowers/workout/{id}/workflow/'.format(
id = self.wote.id
id = encodedid
)
response = self.c.get(url)

View File

@@ -350,7 +350,7 @@ class StravaObjects(DjangoTestCase):
response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
self.assertRedirects(response,
expected_url='/rowers/workout/'+encoded1+'/edit/',
expected_url='/rowers/workout/'+encoded2+'/edit/',
status_code=301,target_status_code=200)
self.assertEqual(response.status_code, 200)

View File

@@ -144,7 +144,7 @@ class WorkoutCompareTest(TestCase):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
url = '/rowers/team-compare-select/workout/1/team/0/user/1/'
url = '/rowers/team-compare-select/workout/'+encoded1+'/team/0/user/1/'
response = self.c.get(url)
self.assertEqual(response.status_code,200)
@@ -374,7 +374,8 @@ class ForcecurveTest(TestCase):
login = self.c.login(username=self.u.username, password = self.password)
self.assertTrue(login)
url = '/rowers/workout/1/forcecurve/'
encoded1 = str(encoder.encode_hex(1))
url = '/rowers/workout/'+encoded1+'/forcecurve/'
response = self.c.get(url)
self.assertEqual(response.status_code,200)

View File

@@ -206,7 +206,7 @@ class URLTests(TestCase):
'/rowers/sessions/teamcreate/',
'/rowers/sessions/user/1/',
'/rowers/team-compare-select/',
'/rowers/team-compare-select/workout/1/',
'/rowers/team-compare-select/workout/'+encoded1+'/',
'/rowers/team-compare-select/2016-01-01/2016-12-31/',
'/rowers/test-job/2/',
'/rowers/test-job2/2/',
@@ -216,17 +216,17 @@ class URLTests(TestCase):
# '/rowers/updatefitness/rower/50/',
# '/rowers/user-boxplot/',
# '/rowers/user-boxplot-data/',
# '/rowers/user-boxplot-select//',
# '/rowers/user-boxplot-select/user/1//',
# '/rowers/user-boxplot-select/',
# '/rowers/user-boxplot-select/user/1/',
# '/rowers/user-boxplot/user/1/',
# '/rowers/user-multiflex-data/',
# '/rowers/user-multiflex-select//',
# '/rowers/user-multiflex-select/',
# '/rowers/user-multiflex-select/2016-01-01/2016-12-31/',
# '/rowers/user-multiflex-select/user/1//',
# '/rowers/user-multiflex-select/user/1/',
# '/rowers/user-multiflex-select/user/1/2016-01-01/2016-12-31/',
# '/rowers/user-multiflex//',
# '/rowers/user-multiflex/',
# '/rowers/user-multiflex/user/1/',
'/rowers/workout/'+encoded1+'//',
'/rowers/workout/'+encoded1+'/',
'/rowers/workout/'+encoded1+'/adddistanceplot/',
'/rowers/workout/'+encoded1+'/adddistanceplot2/',
'/rowers/workout/'+encoded1+'/addotwpowerplot/',
@@ -251,14 +251,14 @@ class URLTests(TestCase):
'/rowers/workout/'+encoded1+'/interactiveotwplot/',
'/rowers/workout/'+encoded1+'/map/',
'/rowers/workout/'+encoded1+'/otwsetpower/',
'/rowers/workout/'+encoded1+'/recalcsummary//',
'/rowers/workout/'+encoded1+'/recalcsummary/',
'/rowers/workout/'+encoded1+'/restore/',
'/rowers/workout/'+encoded1+'/smoothenpace/',
'/rowers/workout/'+encoded1+'/split/',
'/rowers/workout/'+encoded1+'/stats/',
'/rowers/workout/'+encoded1+'/stream/',
'/rowers/workout/'+encoded1+'/task/',
'/rowers/workout/'+encoded1+'/test_strokedata/',
'/rowers/workout/'+encoded1+'/teststrokedata/',
'/rowers/workout/'+encoded1+'/toggle-ranking/',
'/rowers/workout/'+encoded1+'/undosmoothenpace/',
'/rowers/workout/'+encoded1+'/unsubscribe/',
@@ -267,7 +267,7 @@ class URLTests(TestCase):
'/rowers/workout/'+encoded1+'/wind/',
'/rowers/workout/'+encoded1+'/workflow/',
'/rowers/workout/compare/'+encoded1+'/2016-01-01/2016-12-31/',
'/rowers/workout/fusion/'+encoded1+'//',
'/rowers/workout/fusion/'+encoded1+'/',
'/rowers/workout/fusion/'+encoded1+'/2016-01-01/2016-12-31/',
'/rowers/workout/upload/',
'/rowers/workout/upload/team/',

Binary file not shown.

View File

@@ -175,7 +175,7 @@ urlpatterns = [
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/workout/(?P<id>\b[0-9A-Fa-f]+\b)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/user/(?P<userid>\d+)/$',views.team_comparison_select),
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>\b[0-9A-Fa-f]+\b)/user/(?P<userid>\d+)/$',views.team_comparison_select),
@@ -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>\b[0-9A-Fa-f]+\b)/test\_strokedata/$',views.strokedataform),
url(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/teststrokedata/$',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

@@ -1866,7 +1866,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
successmessage = ""
r = getrower(request.user)
@@ -2019,7 +2020,8 @@ def course_kmldownload_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)
if id != 0:
id = encoder.decode_hex(id)
message = ""
successmessage = ""
r = Rower.objects.get(user=request.user)
@@ -2110,7 +2112,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
r = getrower(request.user)
if r.emailbounced:
@@ -2155,7 +2158,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
r = getrower(request.user)
w = get_workout(id)
@@ -2182,7 +2186,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
r = getrower(request.user)
@@ -2240,7 +2245,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
r = getrower(request.user)
res = -1
@@ -2345,7 +2351,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
# ready to upload. Hurray
w = get_workout(id)
@@ -2375,7 +2382,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
w = get_workout(id)
r = w.user
@@ -2439,7 +2447,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
w = get_workout(id)
r = w.user
@@ -2505,7 +2514,8 @@ 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)
if id:
id = encoder.decode_hex(id)
message = ""
# ready to upload. Hurray
w = get_workout(id)
@@ -3561,7 +3571,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
promember=0
@@ -3625,7 +3636,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = Workout.objects.get(id=id)
res = myqueue(queuehigh,addcomment2,request.user.id,row.id)
@@ -3639,7 +3651,8 @@ 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)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
promember=0
@@ -4815,7 +4828,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
if (checkworkoutuser(request.user,row)==False):
@@ -5596,7 +5610,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
if (checkworkoutuser(request.user,row)==False):
@@ -5908,7 +5923,8 @@ def team_comparison_select(request,
teamid=0):
id = encoder.decode_hex(id)
if id != 0:
id = encoder.decode_hex(id)
r = getrequestrower(request,userid=userid)
requestrower = getrower(request.user)
@@ -7765,7 +7781,8 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
startdate=timezone.now()-datetime.timedelta(days=365),
enddate=timezone.now()):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
try:
r = getrower(request.user)
except Rower.DoesNotExist:
@@ -7852,7 +7869,8 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
startdate=timezone.now()-datetime.timedelta(days=365),
enddate=timezone.now()):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
try:
r = getrower(request.user)
except Rower.DoesNotExist:
@@ -7951,7 +7969,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 id:
id = encoder.decode_hex(id)
if not request.user.is_anonymous():
rower = getrower(request.user)
@@ -8056,7 +8075,8 @@ def workout_view(request,id=0):
def workout_undo_smoothenpace_view(
request,id=0,message="",successmessage=""
):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
r = getrower(request.user)
@@ -8094,7 +8114,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
previousurl = request.META.get('HTTP_REFERER')
@@ -8148,7 +8169,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
r = getrower(request.user)
breadcrumbs = [
@@ -8228,7 +8250,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
f1 = row.csvfilename
@@ -8295,7 +8318,8 @@ def workout_downloadwind_view(request,id=0,
def workout_downloadmetar_view(request,id=0,
airportcode=None,
message="",successmessage=""):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
f1 = row.csvfilename
@@ -8361,7 +8385,8 @@ def workout_downloadmetar_view(request,id=0,
# Show form to update wind data
@user_passes_test(ispromember,login_url="/rowers/paidplans",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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
r = getrower(request.user)
breadcrumbs = [
@@ -8498,7 +8523,8 @@ 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/paidplans",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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
r = getrower(request.user)
@@ -8585,7 +8611,8 @@ 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/paidplans",redirect_field_name=None)
def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
r = getrower(request.user)
@@ -8718,7 +8745,8 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
@login_required()
def instroke_view(request,id=0):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
r = getrower(request.user)
mayedit = 0
@@ -8777,7 +8805,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
# form = WorkoutForm(instance=row)
@@ -8840,7 +8869,8 @@ 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)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
if (checkworkoutuser(request.user,w)==False):
@@ -9200,7 +9230,8 @@ def cumstats(request,theuser=0,
# data explorer
@login_required()
def workout_data_view(request, id=0):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
r = getrower(request.user)
w = get_workout(id)
@@ -9300,7 +9331,8 @@ 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)
if id:
id = encoder.decode_hex(id)
r = getrower(request.user)
w = get_workout(id)
@@ -9469,7 +9501,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
# form = WorkoutForm(instance=row)
@@ -9527,8 +9560,10 @@ 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)
if id1:
id1 = encoder.decode_hex(id1)
if id2:
id2 = encoder.decode_hex(id2)
promember=0
if not request.user.is_anonymous():
r = getrower(request.user)
@@ -9564,8 +9599,10 @@ 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)
if id1:
id1 = encoder.decode_hex(id1)
if id2:
id2 = encoder.decode_hex(id2)
promember=0
if not request.user.is_anonymous():
r = getrower(request.user)
@@ -10191,7 +10228,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
# check if user is owner of this workout
@@ -10233,7 +10271,8 @@ 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)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
r = getrower(request.user)
@@ -10294,7 +10333,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
try:
@@ -10352,7 +10392,8 @@ def workout_export_view(request,id=0, message="", successmessage=""):
#
@login_required()
def workout_unsubscribe_view(request,id=0):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
if w.privacy == 'private' and w.user.user != request.user:
@@ -10383,7 +10424,8 @@ 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)
if id:
id = encoder.decode_hex(id)
w = get_workout(id)
if w.privacy == 'private' and w.user.user != request.user:
@@ -10735,7 +10777,8 @@ 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)
if id:
id = encoder.decode_hex(id)
row = get_workout(id)
@@ -10951,7 +10994,8 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
@login_required()
def workout_map_view(request,id=0):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
request.session['referer'] = absolute(request)['PATH']
@@ -12098,7 +12142,8 @@ def workout_getstravaworkout_next(request):
@login_required
def workout_toggle_ranking(request,id=0):
id = encoder.decode_hex(id)
if id:
id = encoder.decode_hex(id)
is_ajax = False
if request.is_ajax():
is_ajax = True
@@ -12366,7 +12411,7 @@ def workout_upload_view(request,
url = reverse(workout_edit_view,
kwargs = {
'id':encoder.decode_hex(id),
'id':str(id),
})
if is_ajax:
@@ -12729,7 +12774,8 @@ 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)
if id:
id = encoder.decode_hex(id)
try:
row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False):
@@ -12748,7 +12794,8 @@ 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)
if id:
id = encoder.decode_hex(id)
try:
row = Workout.objects.get(id=id)
if (checkworkoutuser(request.user,row)==False):
@@ -12964,8 +13011,9 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
# Split a workout
@user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_split_view(request,id=id):
id = encoder.decode_hex(id)
def workout_split_view(request,id=0):
if id:
id = encoder.decode_hex(id)
row = get_workout_permitted(request.user,id)
r = row.user
@@ -13057,8 +13105,10 @@ def workout_split_view(request,id=id):
# Fuse two workouts
@user_passes_test(ispromember,login_url="/rowers/paidplans",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
def workout_fusion_view(request,id1=0,id2=1):
id1 = encoder.decode_hex(id1)
id2 = encoder.decode_hex(id2)
if id1:
id1 = encoder.decode_hex(id1)
if id2:
id2 = encoder.decode_hex(id2)
r = getrower(request.user)
@@ -14313,6 +14363,7 @@ def trydf(df,aantal,column):
# Stroke data form to test API upload
@login_required()
def strokedataform(request,id=0):
id = encoder.decode_hex(id)
try:
id=int(id)