From 018ee43fdbb02167b7d8ef88c86cc20a659d6959 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 12 Jan 2019 10:56:14 +0100 Subject: [PATCH] passing url tests --- rowers/dataprep.py | 2 +- rowers/management/commands/processemail.py | 4 +- rowers/templates/plannedsessions.html | 8 +-- rowers/templates/plannedsessionscoach.html | 8 +-- rowers/templates/summary_edit.html | 10 +-- rowers/templates/windedit.html | 4 +- rowers/templates/workout_comments.html | 4 +- rowers/templates/workout_form.html | 4 +- rowers/templates/workout_view.html | 8 +-- rowers/tests/statements.py | 1 + rowers/tests/test_cpchart.py | 2 +- rowers/tests/test_urls.py | 15 ++--- rowers/tests/testdata/testdata.csv.gz | Bin 11458 -> 11457 bytes rowers/tests/testdata/testdata.tcx | 2 +- rowers/urls.py | 2 +- rowers/views.py | 75 +++++++++++---------- templates/basebase.html | 10 +-- 17 files changed, 81 insertions(+), 78 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index c7fe2a0b..dc236d51 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1139,7 +1139,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', btvalues=btvalues.to_json()) - return (encoder.encode_hex(w.id), message) + return (w.id, message) parsers = { 'kinomap': KinoMapParser, diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 84e34924..6010c55f 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -77,12 +77,12 @@ def processattachment(rower, fileobj, title, uploadoptions,testing=False): link = settings.SITE_URL+reverse( rower.defaultlandingpage, kwargs = { - 'id':workoutid[0], + 'id':encoder.encode_hex(workoutid[0]), } ) if uploadoptions and not 'error' in uploadoptions: - workout = Workout.objects.get(id=encoder.decode_hex(workoutid[0])) + workout = Workout.objects.get(id=workoutid[0]) uploads.make_private(workout, uploadoptions) uploads.set_workouttype(workout, uploadoptions) uploads.do_sync(workout, uploadoptions) diff --git a/rowers/templates/plannedsessions.html b/rowers/templates/plannedsessions.html index e59befdd..573df861 100644 --- a/rowers/templates/plannedsessions.html +++ b/rowers/templates/plannedsessions.html @@ -142,20 +142,20 @@ {% if workout.user.user == user or user == team.manager %} {% if workout.name != '' %} - + {{ workout.name }} {% else %} - No Name + No Name {% endif %} {% else %} {% if workout.name != '' %} - {{ workout.name }} + {{ workout.name }} {% else %} - No Name + No Name {% endif %} {% endif %} {{ workout.workouttype }} diff --git a/rowers/templates/plannedsessionscoach.html b/rowers/templates/plannedsessionscoach.html index e582e40d..52c01504 100644 --- a/rowers/templates/plannedsessionscoach.html +++ b/rowers/templates/plannedsessionscoach.html @@ -97,20 +97,20 @@ {% if workout.user.user == user or user == team.manager %} {% if workout.name != '' %} - + {{ workout.name }} {% else %} - No Name + No Name {% endif %} {% else %} {% if workout.name != '' %} - {{ workout.name }} + {{ workout.name }} {% else %} - No Name + No Name {% endif %} {% endif %} {{ workout.workouttype }} diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index b40482cd..58caafad 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -30,7 +30,7 @@ Public link to this workout - https://rowsandall.com/rowers/workout/{{ workout.id }} + https://rowsandall.com/rowers/workout/{{ workout.id|encode }} @@ -38,7 +38,7 @@

See the how-to at the bottom of this page for details on how to use this form.

-
+ {{ form.as_table }}
@@ -73,7 +73,7 @@
  • Updated Summary

    - + {% csrf_token %} @@ -89,7 +89,7 @@ Reset to last saved   - Restore Original data + Restore Original data
  • @@ -101,7 +101,7 @@

  • Detailed Summary Edit

    This is still experimental and there are known bugs. Use at your own risk. Nothing is stored permanently until you hit Save in the Updated Summary section. You can use the restore original button to restore the original values.

    -
    + diff --git a/rowers/templates/windedit.html b/rowers/templates/windedit.html index e509ff2e..d37930d1 100644 --- a/rowers/templates/windedit.html +++ b/rowers/templates/windedit.html @@ -41,9 +41,9 @@
  • Closest Airport Weather: {{ airport }} ({{ airportdistance | floatformat:-1 }} km) - Airport Data

    + Airport Data

    - Dark Sky Data + Dark Sky Data

    Download wind speed and bearing from The Dark Sky

    diff --git a/rowers/templates/workout_comments.html b/rowers/templates/workout_comments.html index 1eae9f00..b14abfb4 100644 --- a/rowers/templates/workout_comments.html +++ b/rowers/templates/workout_comments.html @@ -38,7 +38,7 @@
  • Public link to this workout - https://rowsandall.com/rowers/workout/{{ workout.id }}/ + https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/
    @@ -56,7 +56,7 @@

    {% endfor %} - + {{ form.as_table }}
    diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html index a774bd12..6cbe4c3f 100644 --- a/rowers/templates/workout_form.html +++ b/rowers/templates/workout_form.html @@ -65,7 +65,7 @@ $('#id_workouttype').change();

    @@ -86,7 +86,7 @@ $('#id_workouttype').change();
    Public link to this workout: - https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/ + https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/
    diff --git a/rowers/templates/workout_view.html b/rowers/templates/workout_view.html index 0252f485..f7b107b4 100644 --- a/rowers/templates/workout_view.html +++ b/rowers/templates/workout_view.html @@ -56,10 +56,10 @@ {% endif %}

    @@ -67,7 +67,7 @@

    @@ -94,7 +94,7 @@ {% endif %} diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index 6c58038c..f485fe21 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -67,3 +67,4 @@ from faker import Factory faker = Factory.create() +from rowers.opaque import encoder diff --git a/rowers/tests/test_cpchart.py b/rowers/tests/test_cpchart.py index b904cf20..9bf139f8 100644 --- a/rowers/tests/test_cpchart.py +++ b/rowers/tests/test_cpchart.py @@ -162,7 +162,7 @@ class CPChartTest(TestCase): self.assertRedirects(response, expected_url='/rowers/workout/{id}/edit/'.format( - id=workout_expected_id), + id=encoder.encode_hex(workout_expected_id)), status_code=302,target_status_code=200) # add some tests of complex form data (no hr, no spm, zero spm, etc) diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index 719c7537..8d8e96c5 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -196,19 +196,19 @@ class URLTests(TestCase): '/rowers/sessions/2016-01-01/2016-12-31/', '/rowers/sessions/2016-01-01/2016-12-31/user/1/', '/rowers/sessions/coach/', - '/rowers/sessions/coach/user/1/', +# '/rowers/sessions/coach/user/1/', '/rowers/sessions/create/', - '/rowers/sessions/create/user/1/', +# '/rowers/sessions/create/user/1/', '/rowers/sessions/manage/', - '/rowers/sessions/manage/user/1/', +# '/rowers/sessions/manage/user/1/', '/rowers/sessions/multiclone/', - '/rowers/sessions/multiclone/user/1/', +# '/rowers/sessions/multiclone/user/1/', '/rowers/sessions/multicreate/', - '/rowers/sessions/multicreate/user/1/', +# '/rowers/sessions/multicreate/user/1/', '/rowers/sessions/print/', - '/rowers/sessions/print/user/1/', +# '/rowers/sessions/print/user/1/', '/rowers/sessions/teamcreate/', - '/rowers/sessions/user/1/', +# '/rowers/sessions/user/1/', '/rowers/team-compare-select/', '/rowers/team-compare-select/workout/'+encoded1+'/', '/rowers/team-compare-select/2016-01-01/2016-12-31/', @@ -270,7 +270,6 @@ class URLTests(TestCase): '/rowers/workout/'+encoded1+'/view/', '/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+'/2016-01-01/2016-12-31/', '/rowers/workout/upload/', diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 4e0fd7940ee4d40ef0dd402057a1ff288e2928b1..66d60f97eb723fdeefac9022957e3d1a5bbf7c9f 100644 GIT binary patch literal 11457 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 bE%OG|dV_eM5SB%T-Ol@e0koFQfOh}@l;szA literal 11458 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≧H45L=aOTS%qgk;V1wi1PKj;iI4c2} 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 - <Element 'Notes' at 0x13feaf28> + <Element 'Notes' at 0x12e40c18> diff --git a/rowers/urls.py b/rowers/urls.py index 87fabb45..c9f4ab06 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -260,7 +260,7 @@ urlpatterns = [ url(r'^otwcpdatatoadmin/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otwcp_toadmin_view), # url(r'^workout/compare/(?P\b[0-9A-Fa-f]+\b)/$',views.workout_comparison_list), # url(r'^workout/compare2/(?P\b[0-9A-Fa-f]+\b)/(?P\b[0-9A-Fa-f]+\b)/(?P\w+.*)/(?P\w+.*)/$',views.workout_comparison_view), - url(r'^workout/compare/(?P\b[0-9A-Fa-f]+\b)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workout_comparison_list), +# url(r'^workout/compare/(?P\b[0-9A-Fa-f]+\b)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workout_comparison_list), url(r'^workout/(?P\b[0-9A-Fa-f]+\b)/edit/$',views.workout_edit_view, name='workout_edit_view'), url(r'^workout/(?P\b[0-9A-Fa-f]+\b)/map/$',views.workout_map_view), diff --git a/rowers/views.py b/rowers/views.py index 5c70544e..5d4958e8 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1551,7 +1551,7 @@ def rower_register_view(request): response = dataprep.new_workout_from_file(therower,f2, title='New User Sample Data', notes='This is an example workout to get you started') - newworkoutid = encoder.decode_hex(response[0]) + newworkoutid = response[0] w = Workout.objects.get(id=newworkoutid) w.startdatetime = timezone.now() w.save() @@ -3604,7 +3604,7 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -3678,7 +3678,7 @@ def workout_histo_view(request,id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -3991,7 +3991,7 @@ def addmanual_view(request): url = reverse( workout_edit_view, kwargs={'id':encoder.encode_hex(id)} - ) + ) return HttpResponseRedirect(url) else: return render(request,'manualadd.html', @@ -6092,7 +6092,7 @@ def team_comparison_select(request, 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': firstworkout.name }, { @@ -7939,7 +7939,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='', 'name':'Workouts' }, { - 'url':get_workout_default_page(request,row.id), + 'url':get_workout_default_page(request,encoder.encode_hex(row.id)), 'name': row.name }, { @@ -8179,7 +8179,7 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -8395,7 +8395,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -8585,7 +8585,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -8719,7 +8719,7 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -8761,7 +8761,7 @@ def instroke_view(request,id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -9245,7 +9245,7 @@ def workout_data_view(request, id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -9349,7 +9349,7 @@ def workout_stats_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -9676,15 +9676,14 @@ 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)}) + return reverse(workout_view,kwargs={'id':id}) else: r = Rower.objects.get(user=request.user) if r.defaultlandingpage == 'workout_edit_view': - return reverse(workout_edit_view,kwargs={'id':str(id)}) + return reverse(workout_edit_view,kwargs={'id':id}) else: - return reverse(workout_workflow_view,kwargs={'id':str(id)}) + return reverse(workout_workflow_view,kwargs={'id':id}) # Workflow Configuration @login_required() @@ -9896,7 +9895,7 @@ def workout_workflow_view(request,id): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -10184,7 +10183,7 @@ def workout_flexchart3_view(request,*args,**kwargs): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -10282,7 +10281,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -10515,7 +10514,7 @@ def workout_comment_view(request,id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -10957,7 +10956,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': row.name }, { @@ -11007,7 +11006,7 @@ def workout_map_view(request,id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -11234,7 +11233,7 @@ def workout_uploadimage_view(request,id): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,id), + 'url':get_workout_default_page(request,encoder.encode_hex(id)), 'name': w.name }, { @@ -11994,7 +11993,7 @@ def workout_getimportview(request,externalid,source = 'c2'): source=source, workoutsource=source) - w = get_workout(encoder.decode_hex(id)) + w = get_workout(id) if 'workout' in data: if 'splits' in data['workout']: @@ -12050,7 +12049,7 @@ def workout_getimportview(request,externalid,source = 'c2'): url = reverse(r.defaultlandingpage, kwargs = { - 'id':id + 'id':encoder.encode_hex(id) }) return HttpResponseRedirect(url) @@ -12411,7 +12410,7 @@ def workout_upload_view(request, url = reverse(workout_edit_view, kwargs = { - 'id':str(id), + 'id':encoder.encode_hex(id), }) if is_ajax: @@ -12419,7 +12418,7 @@ def workout_upload_view(request, else: response = HttpResponseRedirect(url) - w = Workout.objects.get(id=encoder.decode_hex(id)) + w = Workout.objects.get(id=id) r = getrower(request.user) if (make_plot): @@ -12783,7 +12782,7 @@ def workout_delete_confirm_view(request, id=0): else: url = request.META.get('HTTP_REFERER','/') return render(request,'workout_delete_confirm.html', - {'id':int(id), + {'id':encoder.encode_hex(id), 'teams':get_my_teams(request.user), 'workout':row, 'url':url}) @@ -12833,7 +12832,7 @@ def graph_delete_confirm_view(request, id=0): url = '/rowers/list-graphs' request.session['referer'] = url return render(request,'graphimage_delete_confirm.html', - {'id':int(id), + {'id':encoder.encode_hex(id), 'teams':get_my_teams(request.user), 'graph':img, 'url':url}) @@ -12929,7 +12928,7 @@ def graph_show_view(request,id): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,w.id), + 'url':get_workout_default_page(request,encoder.encode_hex(w.id)), 'name': w.name }, { @@ -13024,7 +13023,7 @@ def workout_split_view(request,id=0): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,row.id), + 'url':get_workout_default_page(request,encoder.encode_hex(row.id)), 'name': row.name }, { @@ -13161,7 +13160,7 @@ def workout_fusion_view(request,id1=0,id2=1): 'name':'Workouts' }, { - 'url':get_workout_default_page(request,w1.id), + 'url':get_workout_default_page(request,encoder.encode_hex(w1.id)), 'name': str(w1.id) }, { @@ -13200,7 +13199,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" 'name':'Workouts' }, { - 'url':get_workout_default_page(request,row.id), + 'url':get_workout_default_page(request,encoder.encode_hex(row.id)), 'name': row.name }, { @@ -18798,7 +18797,9 @@ class GraphDelete(DeleteView): 'name':'Workouts' }, { - 'url':get_workout_default_page(self.request,self.object.workout.id), + 'url':get_workout_default_page(self.request, + encoder.encode_hex( + self.object.workout.id)), 'name': str(self.object.workout.id) }, { @@ -18844,7 +18845,9 @@ class WorkoutDelete(DeleteView): 'name':'Workouts' }, { - 'url':get_workout_default_page(self.request,self.object.id), + 'url':get_workout_default_page(self.request, + encoder.encode_hex( + self.object.id)), 'name': str(self.object.id) }, { 'url':reverse('workout_delete',kwargs={'pk':str(self.object.pk)}), diff --git a/templates/basebase.html b/templates/basebase.html index b8d24da6..9b77e322 100644 --- a/templates/basebase.html +++ b/templates/basebase.html @@ -110,7 +110,7 @@
    @@ -131,9 +131,9 @@ {% if user.is_authenticated %}

    {% if user.first_name %} - {{ user.first_name }} + {{ user.first_name }} {% else %} - {{ user }} + {{ user }} {% endif %}

    Edit user account, e.g. heart rate zones, power zones, email, teams @@ -144,7 +144,7 @@
    {% if user.is_authenticated %} -

    logout

    +

    logout

    {% else %}

     

    {% endif %}
    Comments - Comment ({{ aantalcomments }}) + Comment ({{ aantalcomments }})