diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 0e27bad9..250e1369 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -447,8 +447,12 @@ def get_username(access_token): me_json = response.json() + try: + res = me_json['data']['username'] + except KeyError: + res = None - return me_json['data']['username'] + return res # Get user id, having access token # Handy for checking if the API access is working diff --git a/rowers/templates/500.html b/rowers/templates/500.html index d64e7bf2..cf988e28 100644 --- a/rowers/templates/500.html +++ b/rowers/templates/500.html @@ -9,12 +9,11 @@
-The site reported an internal server error. If this behavior repeats, please inform us by using the contact form at the bottom of this page. This allows us to improve the site's behaviour. + The site reported an internal server error. The site developer has been + notified automatically with a full error report. You can help the developer + by reporting an issue on Bitbucket using the button below.
-- You can also report an issue on the Rowsandall Bitbucket issue list: -
diff --git a/rowers/testdata/c2strokedatanohr.txt b/rowers/testdata/c2strokedatanohr.txt new file mode 100644 index 00000000..d93a9b19 --- /dev/null +++ b/rowers/testdata/c2strokedatanohr.txt @@ -0,0 +1 @@ +{"data": [{"p": 0, "spm": 20, "d": 114, "t": 45}, {"p": 0, "spm": 20, "d": 114, "t": 45}, {"p": 0, "spm": 21, "d": 201, "t": 74}, {"p": 1655, "spm": 21, "d": 242, "t": 87}, {"p": 1573, "spm": 21, "d": 332, "t": 115}, {"p": 1557, "spm": 21, "d": 422, "t": 144}, {"p": 1548, "spm": 22, "d": 513, "t": 172}, {"p": 1516, "spm": 22, "d": 602, "t": 199}, {"p": 1476, "spm": 22, "d": 727, "t": 235}, {"p": 1460, "spm": 22, "d": 787, "t": 252}, {"p": 1472, "spm": 22, "d": 882, "t": 281}, {"p": 1487, "spm": 22, "d": 973, "t": 308}, {"p": 1481, "spm": 22, "d": 1069, "t": 336}, {"p": 1461, "spm": 22, "d": 1198, "t": 374}, {"p": 1438, "spm": 22, "d": 1255, "t": 390}, {"p": 1427, "spm": 23, "d": 1351, "t": 417}, {"p": 1415, "spm": 23, "d": 1442, "t": 442}, {"p": 1399, "spm": 23, "d": 1534, "t": 468}, {"p": 1393, "spm": 23, "d": 1627, "t": 494}, {"p": 1395, "spm": 23, "d": 1723, "t": 521}, {"p": 1395, "spm": 23, "d": 1816, "t": 547}, {"p": 1393, "spm": 22, "d": 1913, "t": 574}, {"p": 1408, "spm": 23, "d": 2006, "t": 600}, {"p": 1421, "spm": 22, "d": 2130, "t": 635}, {"p": 1424, "spm": 22, "d": 2195, "t": 653}, {"p": 1413, "spm": 22, "d": 2295, "t": 682}, {"p": 1408, "spm": 23, "d": 2413, "t": 714}, {"p": 1399, "spm": 23, "d": 2484, "t": 734}, {"p": 1385, "spm": 22, "d": 2581, "t": 761}, {"p": 1360, "spm": 24, "d": 2672, "t": 786}, {"p": 1355, "spm": 23, "d": 2773, "t": 813}, {"p": 1371, "spm": 21, "d": 2925, "t": 855}, {"p": 1387, "spm": 23, "d": 2968, "t": 867}, {"p": 1388, "spm": 23, "d": 3066, "t": 894}, {"p": 1386, "spm": 22, "d": 3209, "t": 934}, {"p": 1386, "spm": 22, "d": 3323, "t": 965}, {"p": 1392, "spm": 22, "d": 3396, "t": 985}, {"p": 1392, "spm": 22, "d": 3455, "t": 1002}, {"p": 1386, "spm": 23, "d": 3548, "t": 1027}, {"p": 1372, "spm": 22, "d": 3686, "t": 1065}, {"p": 1366, "spm": 23, "d": 3793, "t": 1094}, {"p": 1369, "spm": 22, "d": 3845, "t": 1108}, {"p": 1336, "spm": 23, "d": 3938, "t": 1134}, {"p": 1555, "spm": 22, "d": 4202, "t": 1219}, {"p": 1862, "spm": -1, "d": 4252, "t": 1905}, {"p": 2173, "spm": 22, "d": 4334, "t": 1934}, {"p": 1986, "spm": -1, "d": 4479, "t": 2415}, {"p": 1826, "spm": 23, "d": 4541, "t": 2437}, {"p": 1594, "spm": 22, "d": 4628, "t": 2464}, {"p": 1498, "spm": 22, "d": 4767, "t": 2505}, {"p": 1501, "spm": 18, "d": 4828, "t": 2524}, {"p": 1494, "spm": 22, "d": 4918, "t": 2551}, {"p": 1474, "spm": 22, "d": 5040, "t": 2586}, {"p": 1446, "spm": 22, "d": 5108, "t": 2606}, {"p": 1427, "spm": 22, "d": 5207, "t": 2634}, {"p": 1404, "spm": 22, "d": 5317, "t": 2664}, {"p": 1397, "spm": 21, "d": 5462, "t": 2705}, {"p": 1393, "spm": 23, "d": 5535, "t": 2725}, {"p": 1399, "spm": 22, "d": 5603, "t": 2744}, {"p": 1406, "spm": 22, "d": 5747, "t": 2785}, {"p": 1408, "spm": 22, "d": 5852, "t": 2814}, {"p": 1403, "spm": 22, "d": 5891, "t": 2825}, {"p": 1401, "spm": 22, "d": 6029, "t": 2863}, {"p": 1403, "spm": 22, "d": 6109, "t": 2886}, {"p": 1392, "spm": 22, "d": 6181, "t": 2906}, {"p": 1381, "spm": 22, "d": 6322, "t": 2945}, {"p": 1374, "spm": 22, "d": 6390, "t": 2963}, {"p": 1372, "spm": 22, "d": 6475, "t": 2987}, {"p": 1367, "spm": 23, "d": 6579, "t": 3015}, {"p": 1363, "spm": 22, "d": 6687, "t": 3044}, {"p": 1357, "spm": 23, "d": 6804, "t": 3075}, {"p": 1360, "spm": 23, "d": 6873, "t": 3094}, {"p": 1360, "spm": 22, "d": 6963, "t": 3119}, {"p": 1359, "spm": 22, "d": 7063, "t": 3146}, {"p": 1352, "spm": 22, "d": 7163, "t": 3173}, {"p": 1354, "spm": 22, "d": 7267, "t": 3201}, {"p": 1359, "spm": 22, "d": 7366, "t": 3228}, {"p": 1365, "spm": 22, "d": 7465, "t": 3255}, {"p": 1378, "spm": 22, "d": 7568, "t": 3283}, {"p": 1399, "spm": 22, "d": 7718, "t": 3325}, {"p": 1405, "spm": 21, "d": 7823, "t": 3354}, {"p": 1397, "spm": 22, "d": 7896, "t": 3374}, {"p": 1390, "spm": 22, "d": 7963, "t": 3393}, {"p": 1362, "spm": 22, "d": 8111, "t": 3434}, {"p": 1506, "spm": 22, "d": 8336, "t": 3507}, {"p": 1701, "spm": -1, "d": 8384, "t": 4424}, {"p": 1679, "spm": 23, "d": 8448, "t": 4444}, {"p": 1438, "spm": 22, "d": 8558, "t": 4475}, {"p": 1361, "spm": 22, "d": 8643, "t": 4498}, {"p": 1364, "spm": 22, "d": 8774, "t": 4533}, {"p": 1359, "spm": 22, "d": 8842, "t": 4552}, {"p": 1356, "spm": 23, "d": 8941, "t": 4579}, {"p": 1356, "spm": 23, "d": 9041, "t": 4606}, {"p": 1355, "spm": 23, "d": 9137, "t": 4632}, {"p": 1357, "spm": 22, "d": 9236, "t": 4659}, {"p": 1353, "spm": 23, "d": 9331, "t": 4685}, {"p": 1363, "spm": 22, "d": 9478, "t": 4724}, {"p": 1373, "spm": 22, "d": 9588, "t": 4755}, {"p": 1372, "spm": 22, "d": 9695, "t": 4784}, {"p": 1351, "spm": 22, "d": 9732, "t": 4794}, {"p": 1337, "spm": 22, "d": 9882, "t": 4833}, {"p": 1328, "spm": 22, "d": 9963, "t": 4854}, {"p": 1323, "spm": 22, "d": 10038, "t": 4874}, {"p": 1317, "spm": 22, "d": 10185, "t": 4913}, {"p": 1314, "spm": 22, "d": 10304, "t": 4945}, {"p": 1321, "spm": 22, "d": 10346, "t": 4955}, {"p": 1324, "spm": 23, "d": 10455, "t": 4984}, {"p": 1317, "spm": 23, "d": 10546, "t": 5008}, {"p": 1310, "spm": 22, "d": 10649, "t": 5035}, {"p": 1315, "spm": 22, "d": 10752, "t": 5062}, {"p": 1318, "spm": 23, "d": 10915, "t": 5105}, {"p": 1316, "spm": 23, "d": 10953, "t": 5115}, {"p": 1307, "spm": 23, "d": 11056, "t": 5142}, {"p": 1297, "spm": 23, "d": 11180, "t": 5173}, {"p": 1292, "spm": 23, "d": 11301, "t": 5205}, {"p": 1293, "spm": 23, "d": 11380, "t": 5225}, {"p": 1294, "spm": 23, "d": 11461, "t": 5246}, {"p": 1299, "spm": 22, "d": 11569, "t": 5274}, {"p": 1311, "spm": 23, "d": 11663, "t": 5299}, {"p": 1322, "spm": 22, "d": 11765, "t": 5325}, {"p": 1318, "spm": 22, "d": 11868, "t": 5352}, {"p": 1306, "spm": 23, "d": 11996, "t": 5385}, {"p": 1298, "spm": 22, "d": 12076, "t": 5406}, {"p": 1295, "spm": 22, "d": 12181, "t": 5433}, {"p": 1291, "spm": 23, "d": 12339, "t": 5474}, {"p": 1289, "spm": 22, "d": 12386, "t": 5486}, {"p": 1290, "spm": 22, "d": 12532, "t": 5523}, {"p": 1293, "spm": 22, "d": 12599, "t": 5541}, {"p": 1301, "spm": 23, "d": 12765, "t": 5584}, {"p": 1308, "spm": 22, "d": 12843, "t": 5604}, {"p": 1308, "spm": 22, "d": 12910, "t": 5622}, {"p": 1306, "spm": 22, "d": 13014, "t": 5649}, {"p": 1305, "spm": 22, "d": 13117, "t": 5676}, {"p": 1304, "spm": 22, "d": 13263, "t": 5713}, {"p": 1298, "spm": 22, "d": 13383, "t": 5745}, {"p": 1296, "spm": 22, "d": 13429, "t": 5757}, {"p": 1305, "spm": 22, "d": 13538, "t": 5784}, {"p": 1315, "spm": 22, "d": 13640, "t": 5812}, {"p": 1322, "spm": 22, "d": 13765, "t": 5844}, {"p": 1331, "spm": 23, "d": 13844, "t": 5865}, {"p": 1334, "spm": 22, "d": 13945, "t": 5892}, {"p": 1315, "spm": 22, "d": 14048, "t": 5919}, {"p": 1301, "spm": 23, "d": 14148, "t": 5945}, {"p": 1303, "spm": 23, "d": 14247, "t": 5971}, {"p": 1306, "spm": 23, "d": 14408, "t": 6013}, {"p": 1303, "spm": 23, "d": 14491, "t": 6034}, {"p": 1298, "spm": 23, "d": 14569, "t": 6054}, {"p": 1294, "spm": 23, "d": 14682, "t": 6083}, {"p": 1288, "spm": 23, "d": 14754, "t": 6102}, {"p": 1291, "spm": 22, "d": 14918, "t": 6144}, {"p": 1300, "spm": 23, "d": 14996, "t": 6164}, {"p": 1303, "spm": 22, "d": 15067, "t": 6183}, {"p": 1294, "spm": 23, "d": 15186, "t": 6213}, {"p": 1283, "spm": 23, "d": 15272, "t": 6235}, {"p": 1287, "spm": 23, "d": 15423, "t": 6274}, {"p": 1292, "spm": 22, "d": 15477, "t": 6289}, {"p": 1297, "spm": 23, "d": 15582, "t": 6315}, {"p": 1299, "spm": 22, "d": 15686, "t": 6342}, {"p": 1309, "spm": 23, "d": 15842, "t": 6383}, {"p": 1304, "spm": 22, "d": 15921, "t": 6403}, {"p": 1300, "spm": 23, "d": 15993, "t": 6422}, {"p": 1301, "spm": 22, "d": 16096, "t": 6449}, {"p": 1307, "spm": 22, "d": 16266, "t": 6493}, {"p": 1299, "spm": 22, "d": 16308, "t": 6504}, {"p": 1294, "spm": 22, "d": 16428, "t": 6535}, {"p": 1297, "spm": 22, "d": 16574, "t": 6573}, {"p": 1307, "spm": 22, "d": 16616, "t": 6584}, {"p": 1313, "spm": 23, "d": 16772, "t": 6625}, {"p": 1304, "spm": 22, "d": 16846, "t": 6643}, {"p": 1292, "spm": 23, "d": 16960, "t": 6673}, {"p": 1284, "spm": 23, "d": 17082, "t": 6704}, {"p": 1278, "spm": 23, "d": 17129, "t": 6716}, {"p": 1275, "spm": 24, "d": 17226, "t": 6741}, {"p": 1276, "spm": 23, "d": 17332, "t": 6768}, {"p": 1281, "spm": 23, "d": 17475, "t": 6804}, {"p": 1279, "spm": 23, "d": 17539, "t": 6820}, {"p": 1278, "spm": 23, "d": 17669, "t": 6853}, {"p": 1279, "spm": 23, "d": 17751, "t": 6874}, {"p": 1284, "spm": 22, "d": 17905, "t": 6914}, {"p": 1292, "spm": 23, "d": 17952, "t": 6926}, {"p": 1294, "spm": 22, "d": 18056, "t": 6953}, {"p": 1292, "spm": 22, "d": 18160, "t": 6980}, {"p": 1293, "spm": 23, "d": 18265, "t": 7007}, {"p": 1293, "spm": 22, "d": 18370, "t": 7034}, {"p": 1289, "spm": 22, "d": 18490, "t": 7064}, {"p": 1280, "spm": 23, "d": 18604, "t": 7093}, {"p": 1276, "spm": 23, "d": 18682, "t": 7113}, {"p": 1277, "spm": 22, "d": 18788, "t": 7140}, {"p": 1280, "spm": 22, "d": 18922, "t": 7174}, {"p": 1283, "spm": 22, "d": 18999, "t": 7194}, {"p": 1288, "spm": 23, "d": 19099, "t": 7220}, {"p": 1291, "spm": 22, "d": 19270, "t": 7264}, {"p": 1294, "spm": 22, "d": 19308, "t": 7274}, {"p": 1301, "spm": 22, "d": 19412, "t": 7301}, {"p": 1316, "spm": 22, "d": 19515, "t": 7328}, {"p": 1324, "spm": 22, "d": 19653, "t": 7364}, {"p": 1322, "spm": 22, "d": 19728, "t": 7384}, {"p": 1315, "spm": 22, "d": 19875, "t": 7423}, {"p": 1331, "spm": 22, "d": 19959, "t": 7445}]} diff --git a/rowers/tests.py b/rowers/tests.py index 8fee138d..d9c610dc 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -64,6 +64,27 @@ class C2Objects(DjangoTestCase): res = add_workout_from_strokedata(u,1,data,strokedata,source='c2') + def test_strokedatanohr(self): + with open('rowers/testdata/c2strokedatanohr.txt','r') as infile: + res = json.load(infile) + + strokedata = pd.DataFrame.from_dict(res['data']) + + with open('rowers/testdata/c2testdata.txt','r') as infile: + res = json.load(infile) + + data = res['data'] + + from rowers.views import add_workout_from_strokedata + + u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + r = Rower.objects.create(user=u) + + res = add_workout_from_strokedata(u,1,data,strokedata,source='c2') + + class StravaObjects(DjangoTestCase): def test_strokedata(self): timejson = json.load(open('rowers/testdata/stravatimetestdata.txt','r')) diff --git a/rowers/views.py b/rowers/views.py index 7cee538d..966fb0ef 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -9,7 +9,7 @@ from django.shortcuts import render from django.http import ( HttpResponse, HttpResponseRedirect, HttpResponseForbidden, HttpResponseNotAllowed, - HttpResponseNotFound, + HttpResponseNotFound,Http404 ) from django.contrib.auth import authenticate, login, logout from rowers.forms import LoginForm,DocumentsForm,UploadOptionsForm @@ -382,7 +382,10 @@ def add_workout_from_strokedata(user,importid,data,strokedata, dist2 = 0.1*strokedata.ix[:,'d'] spm = strokedata.ix[:,'spm'] - hr = strokedata.ix[:,'hr'] + try: + hr = strokedata.ix[:,'hr'] + except KeyError: + hr = 0*spm pace = strokedata.ix[:,'p']/10. pace = np.clip(pace,0,1e4) pace = pace.replace(0,300) @@ -791,7 +794,10 @@ def workout_tcxemail_view(request,id=0): message = "" successmessage = "" r = Rower.objects.get(user=request.user) - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") if (checkworkoutuser(request.user,w)): try: tcxfile = stravastuff.createstravaworkoutdata(w) @@ -843,7 +849,10 @@ def workout_tcxemail_view(request,id=0): def workout_csvemail_view(request,id=0): message = "" r = Rower.objects.get(user=request.user) - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") if (checkworkoutuser(request.user,w)): csvfile = w.csvfilename if settings.DEBUG: @@ -887,7 +896,10 @@ def workout_strava_upload_view(request,id=0): return HttpResponseRedirect("/rowers/me/stravaauthorize/") else: # ready to upload. Hurray - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") if (checkworkoutuser(request.user,w)): try: tcxfile = stravastuff.createstravaworkoutdata(w) @@ -980,9 +992,15 @@ def workout_c2_upload_view(request,id=0): return HttpResponseRedirect("/rowers/me/c2authorize/") # ready to upload. Hurray - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") if (checkworkoutuser(request.user,w)): c2userid = c2stuff.get_userid(thetoken) + if not c2userid: + return HttpResponseRedirect("/rowers/me/c2authorize") + data = c2stuff.createc2workoutdata(w) authorizationstring = str('Bearer ' + thetoken) headers = {'Authorization': authorizationstring, @@ -1049,7 +1067,11 @@ def workout_sporttracks_upload_view(request,id=0): return HttpResponseRedirect("/rowers/me/sporttracksauthorize/") # ready to upload. Hurray - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)): data = sporttracksstuff.createsporttracksworkoutdata(w) if not data: @@ -1473,7 +1495,11 @@ def cum_flex(request,theuser=0, # Show the EMpower Oarlock generated Stroke Profile @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_forcecurve_view(request,id=0,workstrokesonly=False): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + promember=0 mayedit=0 if not request.user.is_anonymous(): @@ -1512,7 +1538,11 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False): # Show Stroke power histogram for a workout @login_required() def workout_histo_view(request,id=0): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + promember=0 mayedit=0 if not request.user.is_anonymous(): @@ -1948,7 +1978,11 @@ def rankings_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): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2081,7 +2115,7 @@ def workout_comparison_list(request,id=0,message='',successmessage='', s = enddate enddate = startdate startdate = s - + workouts = Workout.objects.filter(user=r, startdatetime__gte=startdate, startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=id) @@ -2105,8 +2139,11 @@ def workout_comparison_list(request,id=0,message='',successmessage='', workouts = paginator.page(1) except EmptyPage: workouts = paginator.page(paginator.num_pages) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") - row = Workout.objects.get(id=id) return render(request, 'comparison_list.html', {'id':id, @@ -2160,12 +2197,16 @@ def workout_view(request,id=0): except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") # Resets stroke data to raw data (pace) @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_undo_smoothenpace_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2192,7 +2233,11 @@ def workout_undo_smoothenpace_view(request,id=0,message="",successmessage=""): # Data smoothing of pace data @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_smoothenpace_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2228,7 +2273,11 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""): # Process CrewNerd Summary CSV and update summary @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if request.method == 'POST': form = CNsummaryForm(request.POST,request.FILES) if form.is_valid(): @@ -2273,7 +2322,11 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""): # Get weather for given location and date/time @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_downloadwind_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + f1 = row.csvfilename if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" @@ -2330,7 +2383,11 @@ def workout_downloadwind_view(request,id=0,message="",successmessage=""): # Show form to update wind data @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_wind_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2430,7 +2487,11 @@ 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="/",redirect_field_name=None) def workout_stream_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2492,7 +2553,11 @@ 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="/",redirect_field_name=None) def workout_otwsetpower_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to edit this workout" url = reverse(workouts_view,args=[str(message)]) @@ -2578,7 +2643,11 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""): # A special Edit page with all the Geeky functionality for the workout @login_required() def workout_geeky_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + form = WorkoutForm(instance=row) g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") # check if user is owner of this workout @@ -2892,7 +2961,10 @@ def workout_stats_view(request,id=0,message="",successmessage=""): # The Advanced edit page @login_required() def workout_advanced_view(request,id=0,message="",successmessage=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") form = WorkoutForm(instance=row) g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") # check if user is owner of this workout @@ -3008,8 +3080,11 @@ def workout_flexchart3_view(request,*args,**kwargs): favoritenr = 0 - - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + promember=0 mayedit=0 if not request.user.is_anonymous(): @@ -3156,7 +3231,11 @@ 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=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + # check if user is owner of this workout @@ -3193,7 +3272,11 @@ 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=""): - row = Workout.objects.get(id=id) + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + # check if user is owner of this workout @@ -3231,8 +3314,11 @@ 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 + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") - row = Workout.objects.get(id=id) form = WorkoutForm(instance=row) g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") # check if user is owner of this workout @@ -3410,7 +3496,11 @@ def workout_edit_view(request,id=0,message="",successmessage=""): # Create the chart image with wind corrected pace (OTW) @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_add_otw_powerplot_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3463,7 +3553,11 @@ def workout_add_otw_powerplot_view(request,id): # Create the Heart rate zone pie chart @login_required() def workout_add_piechart_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3517,7 +3611,11 @@ def workout_add_piechart_view(request,id): # Create the Power zone pie chart @login_required() def workout_add_power_piechart_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3569,7 +3667,11 @@ def workout_add_power_piechart_view(request,id): # Create the time based summary chart @login_required() def workout_add_timeplot_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3622,7 +3724,11 @@ def workout_add_timeplot_view(request,id): # Create the distance based summary chart @login_required() def workout_add_distanceplot_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3673,7 +3779,11 @@ def workout_add_distanceplot_view(request,id): # Create the advanced parameters distance overview chart @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_add_distanceplot2_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3726,7 +3836,11 @@ def workout_add_distanceplot2_view(request,id): # Create the advanced parameters time based overview chart @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_add_timeplot2_view(request,id): - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + if (checkworkoutuser(request.user,w)==False): return HttpResponse("You are not allowed add plots to this workout") else: @@ -3935,7 +4049,11 @@ def workout_getstravaworkout_view(request,stravaid): data = res[0] id = add_workout_from_strokedata(request.user,stravaid,data,strokedata, source='strava') - w = Workout.objects.get(id=id) + try: + w = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + w.uploadedtostrava=stravaid w.save() url = "/rowers/workout/"+str(id)+"/edit" @@ -4436,7 +4554,7 @@ def workout_delete_confirm_view(request, id=0): 'workout':row}) except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") # Really deleting the workout @login_required() @@ -4456,7 +4574,7 @@ def workout_delete_view(request,id=0): return HttpResponseRedirect(url) except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") # Ask the user to confirm that he wants to delete a chart @login_required() @@ -4472,7 +4590,9 @@ def graph_delete_confirm_view(request, id=0): 'graph':img}) except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") + except GraphImage.DoesNotExist: + raise Http404("The image doesn't exist") # Really deleting the chart @login_required() @@ -4493,7 +4613,7 @@ def graph_delete_view(request,id=0): return HttpResponseRedirect(url) except GraphImage.DoesNotExist: - return HttpResponse("Graph Image doesn't exist") + raise Http404("Graph Image doesn't exist") # A page with all the recent graphs (searchable on workout name) @@ -4536,7 +4656,9 @@ def graph_show_view(request,id): 'rower':r,}) except GraphImage.DoesNotExist: - return HttpResponse("This graph doesn't exist") + raise Http404("This graph doesn't exist") + except Workout.DoesNotExist: + raise Http404("This workout doesn't exist") # Restore original stroke data and summary @login_required() @@ -4546,7 +4668,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""): if (checkworkoutuser(request.user,row)==False): return HttpResponse("You are not allowed to edit this workout") except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") s = "" # still here - this is a workout we may edit @@ -4601,7 +4723,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" if (checkworkoutuser(request.user,row)==False): return HttpResponse("You are not allowed to edit this workout") except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") s = "" # still here - this is a workout we may edit @@ -5179,7 +5301,7 @@ def strokedatajson(request,id): if (checkworkoutuser(request.user,row)==False): return HttpResponseForbidden("Permission error") except Workout.DoesNotExist: - return HttpResponseNotFound("Workout doesn't exist") + raise Http404("Workout doesn't exist") try: id = int(id) except ValueError: