From 6ca40ad6bace1333c65894ad257dd9f52c110808 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 22 Oct 2025 12:31:36 +0200 Subject: [PATCH] simple upload tests --- rowers/dataflow.py | 29 +- rowers/rows.py | 10 + .../{test_uploads.py => old_test_uploads.py} | 166 +++++++----- rowers/tests/test_uploads2.py | 99 +++++++ rowers/tests/testdata/logcard.csv | 255 ------------------ rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes rowers/views/workoutviews.py | 8 +- 7 files changed, 236 insertions(+), 331 deletions(-) rename rowers/tests/{test_uploads.py => old_test_uploads.py} (87%) create mode 100644 rowers/tests/test_uploads2.py delete mode 100644 rowers/tests/testdata/logcard.csv diff --git a/rowers/dataflow.py b/rowers/dataflow.py index c938a84a..84a53b77 100644 --- a/rowers/dataflow.py +++ b/rowers/dataflow.py @@ -33,7 +33,9 @@ from django.urls import reverse from django.utils import timezone as tz from rowers.forms import DocumentsForm, TeamUploadOptionsForm -from rowers.models import TeamInviteForm, Workout, User, Rower, Team +from rowers.models import ( + TeamInviteForm, Workout, User, Rower, Team, + VirtualRace, IndoorVirtualRaceResult, VirtualRaceResult) from rowers.opaque import encoder from rowers import uploads @@ -68,23 +70,27 @@ def generate_job_id(): return str(uuid4()) def valid_uploadoptions(uploadoptions): - secret = uploadoptions.get('secret', '') - if secret != settings.UPLOAD_SERVICE_SECRET: - return False - fstr = uploadoptions.get('file', None) if fstr is None: - return False + return False, "Missing file in upload options." # check if file can be found - if not os.path.isfile(fstr): - return False + if isinstance(fstr, str): + if not os.path.isfile(fstr): + return False, f"File not found: {fstr}" + form = DocumentsForm(uploadoptions) optionsform = TeamUploadOptionsForm(uploadoptions) rowerform = TeamInviteForm(uploadoptions) rowerform.fields.pop('email') # we don't need email here - return form.is_valid() and optionsform.is_valid() and rowerform.is_valid() + return ( + form.is_valid() and optionsform.is_valid() and rowerform.is_valid(), + "{form_errors}, {optionsform_errors}, {rowerform_errors}".format( + form_errors=form.errors, + optionsform_errors=optionsform.errors, + rowerform_errors=rowerform.errors, + )) def is_zipfile(file_path): fileformat = get_file_type(file_path) @@ -126,11 +132,12 @@ def is_invalid_file(file_path): def upload_handler(uploadoptions, filename): - if not valid_uploadoptions(uploadoptions): + valid, message = valid_uploadoptions(uploadoptions) + if not valid: return { "status": "error", "job_id": None, - "message": "Invalid upload options or file not found." + "message": message } is_valid, message = is_invalid_file(filename) if not is_valid: diff --git a/rowers/rows.py b/rowers/rows.py index 623c926a..f16de523 100644 --- a/rowers/rows.py +++ b/rowers/rows.py @@ -142,6 +142,16 @@ def handle_uploaded_image(i): # pragma: no cover def handle_uploaded_file(f): fname = f.name + if hasattr(f, 'temporary_file_path'): + file_path = f.temporary_file_path() + else: + import tempfile + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + for chunk in f.chunks(): + temp_file.write(chunk) + file_path = temp_file.name + return fname, file_path + ext = fname.split('.')[-1] fname = '%s.%s' % (uuid.uuid4(), ext) fname2 = 'media/'+fname diff --git a/rowers/tests/test_uploads.py b/rowers/tests/old_test_uploads.py similarity index 87% rename from rowers/tests/test_uploads.py rename to rowers/tests/old_test_uploads.py index 62e6e309..e1283885 100644 --- a/rowers/tests/test_uploads.py +++ b/rowers/tests/old_test_uploads.py @@ -9,6 +9,9 @@ nu = datetime.datetime.now() from django.db import transaction from rowers.views import add_defaultfavorites +from rowers.dataflow import process_single_file, upload_handler +from django.core.files.uploadedfile import SimpleUploadedFile +from django.conf import settings #@pytest.mark.django_db @override_settings(TESTING=True) @@ -28,6 +31,55 @@ class ViewTest(TestCase): self.nu = datetime.datetime.now() + file_list = ['rowers/tests/testdata/testdata.csv', + 'rowers/tests/testdata/testdata.csv', + ] + @parameterized.expand(file_list) + def test_upload_view(self, filename): + # simple test to see if upload view works. Submits a DocumentsForm to /rowers/workout/upload/ + login = self.c.login(username='john',password='koeinsloot') + self.assertTrue(login) + + with open(filename, 'rb') as f: + file_content = f.read() + uploaded_file = SimpleUploadedFile( + "testdata.csv", + file_content, + content_type="text/csv" + ) + form_data = { + 'title':'test', + 'workouttype':'rower', + 'boattype':'1x', + 'notes':'aap noot mies', + 'make_plot':False, + 'rpe':6, + 'upload_to_c2':False, + 'plottype':'timeplot', + 'landingpage':'workout_edit_view', + 'raceid':0, + 'file': filename, + } + + + request = RequestFactory() + request.user = self.u + form = DocumentsForm(data = form_data,files={'file': uploaded_file}) + self.assertTrue(form.is_valid()) + + optionsform = UploadOptionsForm(form_data,request=request) + self.assertTrue(optionsform.is_valid()) + + response = self.c.post('/rowers/workout/upload/', data = form_data, + files = {'file': uploaded_file}, follow=True) + + uploadoptions = form.cleaned_data.copy() + uploadoptions.update(optionsform.cleaned_data) + result = upload_handler(uploadoptions, filename) + + self.assertEqual(result["status"], "processing") + + @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_upload_view_sled(self, mocked_sqlalchemy,mocked_read_data): @@ -35,57 +87,45 @@ class ViewTest(TestCase): self.assertTrue(login) filename = 'rowers/tests/testdata/testdata.csv' - f = open(filename,'rb') - file_data = {'file': f} - form_data = { - 'title':'test', - 'workouttype':'rower', - 'boattype':'1x', - 'notes':'aap noot mies', - 'rpe':4, - 'make_plot':False, - 'rpe':6, - 'upload_to_c2':False, - 'plottype':'timeplot', - 'landingpage':'workout_edit_view', - 'raceid':0, - 'file': f, + with open(filename,'rb') as f: + file_data = {'file': f} + form_data = { + 'title':'test', + 'workouttype':'rower', + 'boattype':'1x', + 'notes':'aap noot mies', + 'make_plot':False, + 'rpe':6, + 'upload_to_c2':False, + 'plottype':'timeplot', + 'landingpage':'workout_edit_view', + 'raceid':0, } - request = RequestFactory() - request.user = self.u - form = DocumentsForm(form_data,file_data) + request = RequestFactory() + request.user = self.u + form = DocumentsForm(data = form_data,files=file_data) + if not form.is_valid(): + print(form.errors) + self.assertTrue(form.is_valid()) - optionsform = UploadOptionsForm(form_data,request=request) - self.assertTrue(optionsform.is_valid()) + optionsform = UploadOptionsForm(form_data,request=request) + self.assertTrue(optionsform.is_valid()) - response = self.c.post('/rowers/workout/upload/', form_data, follow=True) + response = self.c.post('/rowers/workout/upload/', data = form_data, + files = file_data, follow=True) - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', - status_code=302,target_status_code=200) + self.assertRedirects(response, expected_url='/rowers/list-workouts/', + status_code=302,target_status_code=200) - self.assertEqual(response.status_code, 200) + self.assertEqual(response.status_code, 200) - response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True) - self.assertEqual(response.status_code, 200) + uploadoptions = form.cleaned_data.copy() + uploadoptions.update(optionsform.cleaned_data) + result = process_single_file(f, uploadoptions, 1) + self.assertEqual(result, True) - response = self.c.get('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True) - self.assertEqual(response.status_code, 200) - - - f.close() - - - response = self.c.get('/rowers/workout/'+encoded1+'/workflow/', - follow=True) - - self.assertEqual(response.status_code, 200) - - response = self.c.get('/rowers/workout/'+encoded1+'/get-thumbnails/', - follow=True) - - self.assertEqual(response.status_code, 200) form_data = { 'name':'aap', @@ -206,7 +246,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -252,7 +292,7 @@ class ViewTest(TestCase): f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -326,7 +366,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -366,7 +406,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -406,7 +446,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -446,7 +486,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -454,13 +494,13 @@ class ViewTest(TestCase): url = reverse('otw_use_gps',kwargs={'id':encoded1}) response = self.c.get(url,follow=True) - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) url = reverse('otw_use_impeller',kwargs={'id':encoded1}) response = self.c.get(url,follow=True) - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) @@ -502,7 +542,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -541,7 +581,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -581,7 +621,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -622,7 +662,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -662,7 +702,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -699,7 +739,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -735,7 +775,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -773,7 +813,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -811,7 +851,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -847,7 +887,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -885,7 +925,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -923,7 +963,7 @@ class ViewTest(TestCase): response = self.c.post('/rowers/workout/upload/', form_data, follow=True) f.close() - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) @@ -958,7 +998,7 @@ class ViewTest(TestCase): form = DocumentsForm(form_data,file_data) response = self.c.post('/rowers/workout/upload/', form_data, follow=True) - self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', + self.assertRedirects(response, expected_url='/rowers/list-workouts/', status_code=302,target_status_code=200) self.assertEqual(response.status_code, 200) diff --git a/rowers/tests/test_uploads2.py b/rowers/tests/test_uploads2.py new file mode 100644 index 00000000..f94666b5 --- /dev/null +++ b/rowers/tests/test_uploads2.py @@ -0,0 +1,99 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +#from __future__ import print_function +from .statements import * +nu = datetime.datetime.now() +from django.db import transaction + +from rowers.views import add_defaultfavorites +from rowers.dataflow import process_single_file, upload_handler +from django.core.files.uploadedfile import SimpleUploadedFile +from django.conf import settings + +#@pytest.mark.django_db +@override_settings(TESTING=True) +class ViewTest(TestCase): + def setUp(self): + redis_connection.publish('tasks','KILL') + self.c = Client() + self.u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + ) + + add_defaultfavorites(self.r) + + self.nu = datetime.datetime.now() + + file_list = ['rowers/tests/testdata/testdata.csv', + 'rowers/tests/testdata/tim.csv', + 'rowers/tests/testdata/crewnerddata.tcx', + 'rowers/tests/testdata/Speedcoach2example.csv', + 'rowers/tests/testdata/Impeller.csv', + 'rowers/tests/testdata/speedcoach3test3.csv', + 'rowers/tests/testdata/SpeedCoach2Linkv1.27.csv', + 'rowers/tests/testdata/SpeedCoach2Link_interval.csv', + 'rowers/tests/testdata/NoHR.tcx', + 'rowers/tests/testdata/rowinginmotionexample.tcx', + 'rowers/tests/testdata/RP_testdata.csv', + 'rowers/tests/testdata/mystery.csv', + 'rowers/tests/testdata/RP_interval.csv', + 'rowers/tests/testdata/painsled_desktop_example.csv', + 'rowers/tests/testdata/ergdata_example.csv', + 'rowers/tests/testdata/boatcoach_2021-09-09__18-15-53.csv', + 'rowers/tests/testdata/boatcoach.csv', + 'rowers/tests/testdata/ergstick.csv', + ] + @parameterized.expand(file_list) + def test_upload_view(self, filename): + # simple test to see if upload view works. Submits a DocumentsForm to /rowers/workout/upload/ + login = self.c.login(username='john',password='koeinsloot') + self.assertTrue(login) + + with open(filename, 'rb') as f: + file_content = f.read() + uploaded_file = SimpleUploadedFile( + "testdata.csv", + file_content, + content_type="text/csv" + ) + form_data = { + 'title':'test', + 'workouttype':'rower', + 'boattype':'1x', + 'notes':'aap noot mies', + 'make_plot':False, + 'rpe':6, + 'upload_to_c2':False, + 'plottype':'timeplot', + 'landingpage':'workout_edit_view', + 'raceid':0, + 'file': filename, + } + + + request = RequestFactory() + request.user = self.u + form = DocumentsForm(data = form_data,files={'file': uploaded_file}) + self.assertTrue(form.is_valid()) + + optionsform = UploadOptionsForm(form_data,request=request) + self.assertTrue(optionsform.is_valid()) + + response = self.c.post('/rowers/workout/upload/', data = form_data, + files = {'file': uploaded_file}, follow=True) + + uploadoptions = form.cleaned_data.copy() + uploadoptions.update(optionsform.cleaned_data) + result = upload_handler(uploadoptions, filename) + + self.assertEqual(result["status"], "processing") + + + diff --git a/rowers/tests/testdata/logcard.csv b/rowers/tests/testdata/logcard.csv deleted file mode 100644 index 35d39e46..00000000 --- a/rowers/tests/testdata/logcard.csv +++ /dev/null @@ -1,255 +0,0 @@ -Concept2 Utility - Version 7.06.15,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,, -Log Data for:,F,,,,,,,,,,,,,,,,, -,,,,,Total Workout Results,,,,Split or Work Interval Results,,,,Results Calculated by Formulas,,,Interval Rest Results,, -,Name,Date,Time of Day,Workout Name,Time,Meters,Avg SPM,Avg Heart Rate,Time,Meters,SPM,Heart Rate,/500m,Cal/hr,Watt,Time,Meters,Heart Rate -,,,,,,,,,,,,,,,,,, -,F,2/3/2017,7:48,0:25:03,25:03.6,6326,23,163,,,,,01:58.8,1017,209,,, -,F,2/3/2017,7:48,0:25:03,,,,,06:00.0,1484,23,150,02:01.2,975,196,,, -,F,2/3/2017,7:48,0:25:03,,,,,12:00.0,1532,24,161,01:57.4,1042,216,,, -,F,2/3/2017,7:48,0:25:03,,,,,18:00.0,1504,23,163,01:59.6,1002,204,,, -,F,2/3/2017,7:48,0:25:03,,,,,24:00.0,1535,23,171,01:57.2,1047,217,,, -,F,2/3/2017,7:48,0:25:03,,,,,25:03.6,271,23,170,01:57.3,1045,217,,, -,,,,,,,,,,,,,,,,,, -,F,2/3/2017,7:21,0:01:23,01:23.7,312,20,116,,,,,02:14.1,799,145,,, -,F,2/3/2017,7:21,0:01:23,,,,,01:23.7,313,20,116,02:13.7,803,146,,, -,,,,,,,,,,,,,,,,,, -,F,1/13/2017,8:42,0:45:00,45:00.0,11437,23,168,,,,,01:58.0,1032,213,,, -,F,1/13/2017,8:42,0:45:00,,,,,03:00.0,773,24,155,01:56.4,1063,222,,, -,F,1/13/2017,8:42,0:45:00,,,,,06:00.0,769,24,161,01:57.0,1051,218,,, -,F,1/13/2017,8:42,0:45:00,,,,,09:00.0,769,24,164,01:57.0,1051,218,,, -,F,1/13/2017,8:42,0:45:00,,,,,12:00.0,770,24,165,01:56.8,1054,219,,, -,F,1/13/2017,8:42,0:45:00,,,,,15:00.0,765,24,168,01:57.6,1039,215,,, -,F,1/13/2017,8:42,0:45:00,,,,,18:00.0,753,23,165,01:59.5,1005,205,,, -,F,1/13/2017,8:42,0:45:00,,,,,21:00.0,770,24,171,01:56.8,1054,219,,, -,F,1/13/2017,8:42,0:45:00,,,,,24:00.0,764,24,167,01:57.8,1036,214,,, -,F,1/13/2017,8:42,0:45:00,,,,,27:00.0,763,24,169,01:57.9,1033,213,,, -,F,1/13/2017,8:42,0:45:00,,,,,30:00.0,770,24,173,01:56.8,1054,219,,, -,F,1/13/2017,8:42,0:45:00,,,,,33:00.0,764,23,173,01:57.8,1036,214,,, -,F,1/13/2017,8:42,0:45:00,,,,,36:00.0,739,23,172,02:01.7,966,194,,, -,F,1/13/2017,8:42,0:45:00,,,,,39:00.0,723,22,171,02:04.4,924,181,,, -,F,1/13/2017,8:42,0:45:00,,,,,42:00.0,759,23,175,01:58.5,1022,210,,, -,F,1/13/2017,8:42,0:45:00,,,,,45:00.0,787,23,179,01:54.3,1105,234,,, -,,,,,,,,,,,,,,,,,, -,F,1/13/2017,7:57,0:04:53,04:53.6,1080,20,71,,,,,02:15.9,779,139,,, -,F,1/13/2017,7:57,0:04:53,,,,,04:53.6,1081,20,71,02:15.8,780,140,,, -,,,,,,,,,,,,,,,,,, -,F,1/10/2017,8:29,0:45:00,45:00.0,11260,21,170,,,,,01:59.8,998,203,,, -,F,1/10/2017,8:29,0:45:00,,,,,09:00.0,2320,22,168,01:56.3,1064,222,,, -,F,1/10/2017,8:29,0:45:00,,,,,18:00.0,2275,22,168,01:58.6,1020,209,,, -,F,1/10/2017,8:29,0:45:00,,,,,27:00.0,2142,21,167,02:06.0,901,175,,, -,F,1/10/2017,8:29,0:45:00,,,,,36:00.0,2243,21,173,02:00.3,990,201,,, -,F,1/10/2017,8:29,0:45:00,,,,,45:00.0,2281,22,177,01:58.3,1026,211,,, -,,,,,,,,,,,,,,,,,, -,F,1/10/2017,7:43,0:04:36,04:36.1,1048,21,113,,,,,02:11.7,826,153,,, -,F,1/10/2017,7:43,0:04:36,,,,,04:36.1,1049,21,113,02:11.6,828,154,,, -,,,,,,,,,,,,,,,,,, -,F,1/8/2017,8:29,0:45:00,45:00.0,10960,21,167,,,,,02:03.1,944,187,,, -,F,1/8/2017,8:29,0:45:00,,,,,09:00.0,2033,20,160,02:12.8,814,149,,, -,F,1/8/2017,8:29,0:45:00,,,,,18:00.0,2182,21,168,02:03.7,935,185,,, -,F,1/8/2017,8:29,0:45:00,,,,,27:00.0,2251,22,167,01:59.9,998,203,,, -,F,1/8/2017,8:29,0:45:00,,,,,36:00.0,2221,21,168,02:01.5,970,195,,, -,F,1/8/2017,8:29,0:45:00,,,,,45:00.0,2273,22,176,01:58.7,1018,209,,, -,,,,,,,,,,,,,,,,,, -,F,1/8/2017,7:43,0:05:01,05:01.3,1119,20,106,,,,,02:14.6,793,143,,, -,F,1/8/2017,7:43,0:05:01,,,,,05:00.0,1117,20,106,02:14.2,797,145,,, -,F,1/8/2017,7:43,0:05:01,,,,,05:01.3,3,0,106,03:36.6,418,34,,, -,,,,,,,,,,,,,,,,,, -,F,1/4/2017,9:03,v5:00/2:00r...3,55:00.0,12799,18,157,,,,,02:08.9,862,163,,, -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,05:00.0,879,16,130,02:50.6,542,70,,, -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,02:00.0,128,124 -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,45:00.0,10953,22,176,02:03.2,943,187,,, -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,00:00.0,0,0 -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,05:00.0,971,18,165,02:34.4,626,95,,, -,F,1/4/2017,9:03,v5:00/2:00r...3,,,,,,,,,,,,00:00.0,0,0 -,,,,,,,,,,,,,,,,,, -,F,1/2/2017,7:56,v5:00/1:00r...2,22:14.2,5280,22,152,,,,,02:06.3,897,174,,, -,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,05:00.0,1224,23,147,02:02.5,954,190,,, -,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,,,,,,,,01:00.0,23,132 -,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,17:14.2,4060,21,158,02:07.3,883,169,,, -,F,1/2/2017,7:56,v5:00/1:00r...2,,,,,,,,,,,,01:00.0,0,0 -,,,,,,,,,,,,,,,,,, -,F,10/6/2016,8:53,10000m,40:30.8,10000,21,173,,,,,02:01.5,970,195,,, -,F,10/6/2016,8:53,10000m,,,,,07:52.1,2000,23,169,01:58.0,1032,213,,, -,F,10/6/2016,8:53,10000m,,,,,08:03.3,4000,22,164,02:00.8,982,198,,, -,F,10/6/2016,8:53,10000m,,,,,08:19.4,6000,21,175,02:04.8,918,180,,, -,F,10/6/2016,8:53,10000m,,,,,08:10.7,8000,21,176,02:02.6,952,190,,, -,F,10/6/2016,8:53,10000m,,,,,08:05.3,10000,21,181,02:01.3,974,196,,, -,,,,,,,,,,,,,,,,,, -,F,10/6/2016,8:12,0:03:02,03:02.3,713,21,142,,,,,02:07.8,876,168,,, -,F,10/6/2016,8:12,0:03:02,,,,,03:02.3,714,21,142,02:07.6,878,168,,, -,,,,,,,,,,,,,,,,,, -,F,9/27/2016,16:39,0:10:19,10:19.2,2110,22,0,,,,,02:26.7,681,111,,, -,F,9/27/2016,16:39,0:10:19,,,,,05:00.0,1029,24,0,02:25.7,688,113,,, -,F,9/27/2016,16:39,0:10:19,,,,,10:00.0,1020,25,0,02:27.0,678,110,,, -,F,9/27/2016,16:39,0:10:19,,,,,10:19.2,61,19,0,02:37.3,609,90,,, -,,,,,,,,,,,,,,,,,, -,F,9/27/2016,16:26,0:01:20,01:20.8,259,22,0,,,,,02:35.9,617,92,,, -,F,9/27/2016,16:26,0:01:20,,,,,01:20.8,259,22,0,02:35.9,617,92,,, -,,,,,,,,,,,,,,,,,, -,F,9/23/2016,7:59,0:30:00,30:00.0,7142,21,163,,,,,02:06.0,901,175,,, -,F,9/23/2016,7:59,0:30:00,,,,,06:00.0,1473,22,160,02:02.1,960,192,,, -,F,9/23/2016,7:59,0:30:00,,,,,12:00.0,1409,20,162,02:07.7,877,168,,, -,F,9/23/2016,7:59,0:30:00,,,,,18:00.0,1393,21,163,02:09.2,858,162,,, -,F,9/23/2016,7:59,0:30:00,,,,,24:00.0,1429,22,158,02:05.9,902,175,,, -,F,9/23/2016,7:59,0:30:00,,,,,30:00.0,1439,21,173,02:05.0,915,179,,, -,,,,,,,,,,,,,,,,,, -,F,9/23/2016,7:29,0:03:08,03:08.0,744,21,147,,,,,02:06.3,897,174,,, -,F,9/23/2016,7:29,0:03:08,,,,,03:08.0,744,21,147,02:06.3,897,174,,, -,,,,,,,,,,,,,,,,,, -,F,9/21/2016,16:09,0:34:16,34:16.9,6512,20,0,,,,,02:37.9,605,89,,, -,F,9/21/2016,16:09,0:34:16,,,,,05:00.0,980,22,0,02:33.0,635,98,,, -,F,9/21/2016,16:09,0:34:16,,,,,10:00.0,989,20,0,02:31.6,645,100,,, -,F,9/21/2016,16:09,0:34:16,,,,,15:00.0,966,21,0,02:35.2,621,93,,, -,F,9/21/2016,16:09,0:34:16,,,,,20:00.0,938,20,0,02:39.9,594,86,,, -,F,9/21/2016,16:09,0:34:16,,,,,25:00.0,946,21,0,02:38.5,602,88,,, -,F,9/21/2016,16:09,0:34:16,,,,,30:00.0,909,21,0,02:45.0,568,78,,, -,F,9/21/2016,16:09,0:34:16,,,,,34:16.9,785,20,0,02:43.6,574,80,,, -,,,,,,,,,,,,,,,,,, -,F,9/20/2016,17:11,0:33:19,33:19.3,6519,21,0,,,,,02:33.3,634,97,,, -,F,9/20/2016,17:11,0:33:19,,,,,05:00.0,991,22,0,02:31.3,647,101,,, -,F,9/20/2016,17:11,0:33:19,,,,,10:00.0,994,21,0,02:30.9,650,102,,, -,F,9/20/2016,17:11,0:33:19,,,,,15:00.0,977,21,0,02:33.5,632,97,,, -,F,9/20/2016,17:11,0:33:19,,,,,20:00.0,968,21,0,02:34.9,623,94,,, -,F,9/20/2016,17:11,0:33:19,,,,,25:00.0,982,21,0,02:32.7,637,98,,, -,F,9/20/2016,17:11,0:33:19,,,,,30:00.0,971,21,0,02:34.4,626,95,,, -,F,9/20/2016,17:11,0:33:19,,,,,33:19.3,637,20,0,02:36.4,614,91,,, -,,,,,,,,,,,,,,,,,, -,F,9/20/2016,8:12,0:22:32,22:32.5,4731,18,158,,,,,02:22.9,712,120,,, -,F,9/20/2016,8:12,0:22:32,,,,,09:00.0,2197,22,171,02:02.8,948,189,,, -,F,9/20/2016,8:12,0:22:32,,,,,18:00.0,1781,18,136,02:31.6,645,100,,, -,F,9/20/2016,8:12,0:22:32,,,,,22:32.5,753,15,168,03:00.9,503,59,,, -,,,,,,,,,,,,,,,,,, -,F,9/20/2016,7:48,v5:00...1,05:00.0,758,14,115,,,,,03:17.8,455,45,,, -,F,9/20/2016,7:48,v5:00...1,,,,,05:00.0,759,14,115,03:17.6,456,45,,, -,F,9/20/2016,7:48,v5:00...1,,,,,,,,,,,,00:00.0,0,0 -,,,,,,,,,,,,,,,,,, -,F,9/19/2016,15:28,0:31:15,31:15.4,6511,22,0,,,,,02:24.0,703,117,,, -,F,9/19/2016,15:28,0:31:15,,,,,05:00.0,1040,24,0,02:24.2,701,117,,, -,F,9/19/2016,15:28,0:31:15,,,,,10:00.0,1037,23,0,02:24.6,698,116,,, -,F,9/19/2016,15:28,0:31:15,,,,,15:00.0,1067,23,0,02:20.5,733,126,,, -,F,9/19/2016,15:28,0:31:15,,,,,20:00.0,1046,23,0,02:23.4,708,119,,, -,F,9/19/2016,15:28,0:31:15,,,,,25:00.0,1025,21,0,02:26.3,684,112,,, -,F,9/19/2016,15:28,0:31:15,,,,,30:00.0,1045,22,0,02:23.5,707,118,,, -,F,9/19/2016,15:28,0:31:15,,,,,31:15.4,252,19,0,02:29.6,659,105,,, -,,,,,,,,,,,,,,,,,, -,F,9/15/2016,18:01,0:32:53,32:53.1,6694,22,0,,,,,02:27.3,676,109,,, -,F,9/15/2016,18:01,0:32:53,,,,,05:00.0,1055,24,0,02:22.1,719,122,,, -,F,9/15/2016,18:01,0:32:53,,,,,10:00.0,1042,23,0,02:23.9,703,117,,, -,F,9/15/2016,18:01,0:32:53,,,,,15:00.0,1017,22,0,02:27.4,675,109,,, -,F,9/15/2016,18:01,0:32:53,,,,,20:00.0,1030,23,0,02:25.6,690,113,,, -,F,9/15/2016,18:01,0:32:53,,,,,25:00.0,996,23,0,02:30.6,652,102,,, -,F,9/15/2016,18:01,0:32:53,,,,,30:00.0,983,22,0,02:32.5,639,99,,, -,F,9/15/2016,18:01,0:32:53,,,,,32:53.1,572,22,0,02:31.3,647,101,,, -,,,,,,,,,,,,,,,,,, -,F,9/13/2016,16:52,0:35:12,35:12.4,6740,23,0,,,,,02:36.7,613,91,,, -,F,9/13/2016,16:52,0:35:12,,,,,10:00.0,1928,28,0,02:35.6,619,93,,, -,F,9/13/2016,16:52,0:35:12,,,,,20:00.0,1955,26,0,02:33.4,633,97,,, -,F,9/13/2016,16:52,0:35:12,,,,,30:00.0,1958,23,0,02:33.2,634,97,,, -,F,9/13/2016,16:52,0:35:12,,,,,35:12.4,900,18,0,02:53.5,530,67,,, -,,,,,,,,,,,,,,,,,, -,F,9/3/2016,11:33,0:01:26,01:26.7,113,28,0,,,,,06:23.6,321,6,,, -,F,9/3/2016,11:33,0:01:26,,,,,01:26.7,114,28,0,06:20.2,321,6,,, -,,,,,,,,,,,,,,,,,, -,F,8/8/2016,7:45,0:24:18,24:18.4,4438,15,136,,,,,02:44.3,571,79,,, -,F,8/8/2016,7:45,0:24:18,,,,,11:00.0,2322,19,147,02:22.1,719,122,,, -,F,8/8/2016,7:45,0:24:18,,,,,22:00.0,1830,15,0,03:00.3,505,60,,, -,F,8/8/2016,7:45,0:24:18,,,,,24:18.4,287,11,126,04:01.1,385,25,,, -,,,,,,,,,,,,,,,,,, -,F,7/6/2016,7:49,0:45:00,45:00.0,10872,21,164,,,,,02:04.1,929,183,,, -,F,7/6/2016,7:49,0:45:00,,,,,09:00.0,2186,22,151,02:03.5,939,186,,, -,F,7/6/2016,7:49,0:45:00,,,,,18:00.0,2222,22,163,02:01.5,971,195,,, -,F,7/6/2016,7:49,0:45:00,,,,,27:00.0,2048,20,158,02:11.8,825,153,,, -,F,7/6/2016,7:49,0:45:00,,,,,36:00.0,2146,21,169,02:05.8,904,176,,, -,F,7/6/2016,7:49,0:45:00,,,,,45:00.0,2271,22,179,01:58.8,1016,208,,, -,,,,,,,,,,,,,,,,,, -,F,7/5/2016,8:18,0:45:00,45:00.0,10900,21,168,,,,,02:03.8,934,184,,, -,F,7/5/2016,8:18,0:45:00,,,,,09:00.0,2285,23,166,01:58.1,1030,212,,, -,F,7/5/2016,8:18,0:45:00,,,,,18:00.0,2256,22,168,01:59.6,1002,204,,, -,F,7/5/2016,8:18,0:45:00,,,,,27:00.0,2156,21,174,02:05.2,913,178,,, -,F,7/5/2016,8:18,0:45:00,,,,,36:00.0,2016,20,155,02:13.9,801,146,,, -,F,7/5/2016,8:18,0:45:00,,,,,45:00.0,2188,21,177,02:03.4,941,186,,, -,,,,,,,,,,,,,,,,,, -,F,7/2/2016,7:14,0:35:17,35:17.2,8855,22,167,,,,,01:59.5,1005,205,,, -,F,7/2/2016,7:14,0:35:17,,,,,11:01.6,2800,24,161,01:58.1,1030,212,,, -,F,7/2/2016,7:14,0:35:17,,,,,10:57.7,5600,23,171,01:57.4,1043,216,,, -,F,7/2/2016,7:14,0:35:17,,,,,11:24.5,8400,22,169,02:02.2,959,192,,, -,F,7/2/2016,7:14,0:35:17,,,,,01:53.4,8855,21,167,02:04.6,922,181,,, -,,,,,,,,,,,,,,,,,, -,F,7/1/2016,7:32,10000m,40:15.0,10000,23,176,,,,,02:00.7,984,199,,, -,F,7/1/2016,7:32,10000m,,,,,07:54.1,2000,24,168,01:58.5,1023,210,,, -,F,7/1/2016,7:32,10000m,,,,,07:50.3,4000,24,174,01:57.5,1041,215,,, -,F,7/1/2016,7:32,10000m,,,,,08:24.4,6000,22,177,02:06.1,900,175,,, -,F,7/1/2016,7:32,10000m,,,,,08:02.3,8000,23,180,02:00.5,987,200,,, -,F,7/1/2016,7:32,10000m,,,,,08:03.9,10000,22,182,02:00.9,980,198,,, -,,,,,,,,,,,,,,,,,, -,F,7/1/2016,6:51,0:02:29,02:29.5,529,20,130,,,,,02:21.3,726,124,,, -,F,7/1/2016,6:51,0:02:29,,,,,02:29.5,529,20,130,02:21.3,726,124,,, -,,,,,,,,,,,,,,,,,, -,F,6/28/2016,6:45,0:30:00,30:00.0,7434,22,173,,,,,02:01.0,978,197,,, -,F,6/28/2016,6:45,0:30:00,,,,,06:00.0,1534,23,0,01:57.3,1045,217,,, -,F,6/28/2016,6:45,0:30:00,,,,,12:00.0,1342,21,166,02:14.1,799,145,,, -,F,6/28/2016,6:45,0:30:00,,,,,18:00.0,1523,24,172,01:58.1,1029,212,,, -,F,6/28/2016,6:45,0:30:00,,,,,24:00.0,1484,22,173,02:01.2,975,196,,, -,F,6/28/2016,6:45,0:30:00,,,,,30:00.0,1552,23,184,01:55.9,1072,224,,, -,,,,,,,,,,,,,,,,,, -,F,6/25/2016,7:10,0:30:00,30:00.0,7675,23,171,,,,,01:57.2,1047,217,,, -,F,6/25/2016,7:10,0:30:00,,,,,06:00.0,1542,24,159,01:56.7,1057,220,,, -,F,6/25/2016,7:10,0:30:00,,,,,12:00.0,1527,24,165,01:57.8,1035,214,,, -,F,6/25/2016,7:10,0:30:00,,,,,18:00.0,1550,24,174,01:56.1,1069,223,,, -,F,6/25/2016,7:10,0:30:00,,,,,24:00.0,1502,23,179,01:59.8,999,203,,, -,F,6/25/2016,7:10,0:30:00,,,,,30:00.0,1556,23,181,01:55.6,1078,226,,, -,,,,,,,,,,,,,,,,,, -,F,6/9/2016,7:17,0:30:00,30:00.0,7299,22,166,,,,,02:03.3,942,187,,, -,F,6/9/2016,7:17,0:30:00,,,,,06:00.0,1563,24,168,01:55.1,1088,229,,, -,F,6/9/2016,7:17,0:30:00,,,,,12:00.0,1463,22,166,02:03.0,946,188,,, -,F,6/9/2016,7:17,0:30:00,,,,,18:00.0,1371,21,160,02:11.2,832,155,,, -,F,6/9/2016,7:17,0:30:00,,,,,24:00.0,1434,22,165,02:05.5,909,177,,, -,F,6/9/2016,7:17,0:30:00,,,,,30:00.0,1468,22,174,02:02.6,953,190,,, -,,,,,,,,,,,,,,,,,, -,F,5/24/2016,7:42,0:30:00,30:00.0,7612,23,168,,,,,01:58.2,1028,212,,, -,F,5/24/2016,7:42,0:30:00,,,,,06:00.0,1534,24,158,01:57.3,1045,217,,, -,F,5/24/2016,7:42,0:30:00,,,,,12:00.0,1491,23,167,02:00.7,984,199,,, -,F,5/24/2016,7:42,0:30:00,,,,,18:00.0,1507,23,169,01:59.4,1006,205,,, -,F,5/24/2016,7:42,0:30:00,,,,,24:00.0,1532,23,171,01:57.4,1042,216,,, -,F,5/24/2016,7:42,0:30:00,,,,,30:00.0,1548,23,175,01:56.2,1066,223,,, -,,,,,,,,,,,,,,,,,, -,F,5/7/2016,9:14,0:30:00,30:00.0,7540,23,164,,,,,01:59.3,1008,206,,, -,F,5/7/2016,9:14,0:30:00,,,,,06:00.0,1493,23,162,02:00.5,987,200,,, -,F,5/7/2016,9:14,0:30:00,,,,,12:00.0,1517,23,161,01:58.6,1021,210,,, -,F,5/7/2016,9:14,0:30:00,,,,,18:00.0,1498,23,165,02:00.1,994,202,,, -,F,5/7/2016,9:14,0:30:00,,,,,24:00.0,1506,23,164,01:59.5,1005,205,,, -,F,5/7/2016,9:14,0:30:00,,,,,30:00.0,1526,23,169,01:57.9,1033,213,,, -,,,,,,,,,,,,,,,,,, -,F,4/23/2016,8:17,10000m,39:24.5,10000,23,166,,,,,01:58.2,1028,212,,, -,F,4/23/2016,8:17,10000m,,,,,07:47.0,2000,24,161,01:56.7,1056,220,,, -,F,4/23/2016,8:17,10000m,,,,,07:44.2,4000,24,171,01:56.0,1070,224,,, -,F,4/23/2016,8:17,10000m,,,,,07:50.7,6000,23,165,01:57.6,1039,215,,, -,F,4/23/2016,8:17,10000m,,,,,08:09.4,8000,22,165,02:02.3,957,191,,, -,F,4/23/2016,8:17,10000m,,,,,07:53.1,10000,23,170,01:58.2,1028,212,,, -,,,,,,,,,,,,,,,,,, -,F,4/20/2016,8:12,0:30:00,30:00.0,7961,24,170,,,,,01:53.0,1133,242,,, -,F,4/20/2016,8:12,0:30:00,,,,,06:00.0,1583,24,160,01:53.7,1119,238,,, -,F,4/20/2016,8:12,0:30:00,,,,,12:00.0,1590,24,163,01:53.2,1130,241,,, -,F,4/20/2016,8:12,0:30:00,,,,,18:00.0,1594,24,173,01:52.9,1136,243,,, -,F,4/20/2016,8:12,0:30:00,,,,,24:00.0,1589,25,174,01:53.2,1128,241,,, -,F,4/20/2016,8:12,0:30:00,,,,,30:00.0,1607,24,182,01:52.0,1157,249,,, -,,,,,,,,,,,,,,,,,, -,F,4/18/2016,8:24,0:30:00,30:00.0,7608,22,167,,,,,01:58.2,1027,211,,, -,F,4/18/2016,8:24,0:30:00,,,,,06:00.0,1508,22,154,01:59.3,1008,206,,, -,F,4/18/2016,8:24,0:30:00,,,,,12:00.0,1468,21,161,02:02.6,953,190,,, -,F,4/18/2016,8:24,0:30:00,,,,,18:00.0,1542,23,171,01:56.7,1057,220,,, -,F,4/18/2016,8:24,0:30:00,,,,,24:00.0,1544,23,172,01:56.5,1060,221,,, -,F,4/18/2016,8:24,0:30:00,,,,,30:00.0,1546,23,179,01:56.4,1063,222,,, -,,,,,,,,,,,,,,,,,, -,F,4/17/2016,9:32,0:35:33,35:33.4,8406,21,152,,,,,02:06.8,889,171,,, -,F,4/17/2016,9:32,0:35:33,,,,,11:25.3,2800,22,162,02:02.3,957,191,,, -,F,4/17/2016,9:32,0:35:33,,,,,11:02.1,5600,22,171,01:58.2,1028,212,,, -,F,4/17/2016,9:32,0:35:33,,,,,13:03.3,8400,19,138,02:19.8,740,128,,, -,F,4/17/2016,9:32,0:35:33,,,,,00:02.7,8406,0,138,03:45.0,405,31,,, -,,,,,,,,,,,,,,,,,, -,F,4/11/2016,8:29,0:37:24,37:24.9,9267,22,170,,,,,02:01.1,977,197,,, -,F,4/11/2016,8:29,0:37:24,,,,,11:03.9,2800,23,169,01:58.5,1022,210,,, -,F,4/11/2016,8:29,0:37:24,,,,,11:21.7,5600,22,171,02:01.7,967,194,,, -,F,4/11/2016,8:29,0:37:24,,,,,11:30.7,8400,22,170,02:03.3,941,187,,, -,F,4/11/2016,8:29,0:37:24,,,,,03:28.8,9267,22,170,02:00.4,989,200,,, diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 62a906bd7205510cf9b564f8c76028f811b31ce2..cc2322c7a6371e1ba6448a28f817707ca61185e7 100644 GIT binary patch delta 16 XcmbO#KUJPxzMF&NQ`3))?0x(IFAoLl delta 16 XcmbO#KUJPxzMF%Cx$@ga_C9_9C`JVF diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 609abe23..ad5044bb 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -5306,15 +5306,19 @@ def workout_upload_view(request, uploadoptions.update(optionsform.cleaned_data) request.session['uploadoptions'] = uploadoptions - uploadoptions['secret'] = settings.UPLOAD_SERVICE_SECRET uploadoptions['user'] = r.user.id - if request.FILES['file'] is not None: + if 'file' in request.FILES and request.FILES['file'] is not None: filename, file_path = handle_uploaded_file(request.FILES['file']) + else: + return HttpResponseRedirect(reverse("workout_upload_view")) + uploadoptions['file'] = file_path response = upload_handler(uploadoptions, file_path) if response["status"] not in ["processing"]: messages.error(request, response["message"]) + url = reverse('workout_upload_view') + return HttpResponseRedirect(url) else: messages.info(request, response["message"])