Private
Public Access
1
0

simple upload tests

This commit is contained in:
2025-10-22 12:31:36 +02:00
parent b6d8ec0429
commit 6ca40ad6ba
7 changed files with 236 additions and 331 deletions

View File

@@ -33,7 +33,9 @@ from django.urls import reverse
from django.utils import timezone as tz from django.utils import timezone as tz
from rowers.forms import DocumentsForm, TeamUploadOptionsForm 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.opaque import encoder
from rowers import uploads from rowers import uploads
@@ -68,23 +70,27 @@ def generate_job_id():
return str(uuid4()) return str(uuid4())
def valid_uploadoptions(uploadoptions): def valid_uploadoptions(uploadoptions):
secret = uploadoptions.get('secret', '')
if secret != settings.UPLOAD_SERVICE_SECRET:
return False
fstr = uploadoptions.get('file', None) fstr = uploadoptions.get('file', None)
if fstr is None: if fstr is None:
return False return False, "Missing file in upload options."
# check if file can be found # check if file can be found
if isinstance(fstr, str):
if not os.path.isfile(fstr): if not os.path.isfile(fstr):
return False return False, f"File not found: {fstr}"
form = DocumentsForm(uploadoptions) form = DocumentsForm(uploadoptions)
optionsform = TeamUploadOptionsForm(uploadoptions) optionsform = TeamUploadOptionsForm(uploadoptions)
rowerform = TeamInviteForm(uploadoptions) rowerform = TeamInviteForm(uploadoptions)
rowerform.fields.pop('email') # we don't need email here 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): def is_zipfile(file_path):
fileformat = get_file_type(file_path) fileformat = get_file_type(file_path)
@@ -126,11 +132,12 @@ def is_invalid_file(file_path):
def upload_handler(uploadoptions, filename): def upload_handler(uploadoptions, filename):
if not valid_uploadoptions(uploadoptions): valid, message = valid_uploadoptions(uploadoptions)
if not valid:
return { return {
"status": "error", "status": "error",
"job_id": None, "job_id": None,
"message": "Invalid upload options or file not found." "message": message
} }
is_valid, message = is_invalid_file(filename) is_valid, message = is_invalid_file(filename)
if not is_valid: if not is_valid:

View File

@@ -142,6 +142,16 @@ def handle_uploaded_image(i): # pragma: no cover
def handle_uploaded_file(f): def handle_uploaded_file(f):
fname = f.name 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] ext = fname.split('.')[-1]
fname = '%s.%s' % (uuid.uuid4(), ext) fname = '%s.%s' % (uuid.uuid4(), ext)
fname2 = 'media/'+fname fname2 = 'media/'+fname

View File

@@ -9,6 +9,9 @@ nu = datetime.datetime.now()
from django.db import transaction from django.db import transaction
from rowers.views import add_defaultfavorites 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 #@pytest.mark.django_db
@override_settings(TESTING=True) @override_settings(TESTING=True)
@@ -28,6 +31,55 @@ class ViewTest(TestCase):
self.nu = datetime.datetime.now() 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.create_engine')
@patch('rowers.dataprep.read_data',side_effect=mocked_read_data) @patch('rowers.dataprep.read_data',side_effect=mocked_read_data)
def test_upload_view_sled(self, mocked_sqlalchemy,mocked_read_data): def test_upload_view_sled(self, mocked_sqlalchemy,mocked_read_data):
@@ -35,57 +87,45 @@ class ViewTest(TestCase):
self.assertTrue(login) self.assertTrue(login)
filename = 'rowers/tests/testdata/testdata.csv' filename = 'rowers/tests/testdata/testdata.csv'
f = open(filename,'rb') with open(filename,'rb') as f:
file_data = {'file': f} file_data = {'file': f}
form_data = { form_data = {
'title':'test', 'title':'test',
'workouttype':'rower', 'workouttype':'rower',
'boattype':'1x', 'boattype':'1x',
'notes':'aap noot mies', 'notes':'aap noot mies',
'rpe':4,
'make_plot':False, 'make_plot':False,
'rpe':6, 'rpe':6,
'upload_to_c2':False, 'upload_to_c2':False,
'plottype':'timeplot', 'plottype':'timeplot',
'landingpage':'workout_edit_view', 'landingpage':'workout_edit_view',
'raceid':0, 'raceid':0,
'file': f,
} }
request = RequestFactory() request = RequestFactory()
request.user = self.u request.user = self.u
form = DocumentsForm(form_data,file_data) 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) optionsform = UploadOptionsForm(form_data,request=request)
self.assertTrue(optionsform.is_valid()) 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/', self.assertRedirects(response, expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200) 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) uploadoptions = form.cleaned_data.copy()
self.assertEqual(response.status_code, 200) 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 = { form_data = {
'name':'aap', 'name':'aap',
@@ -206,7 +246,7 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) 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) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -252,7 +292,7 @@ class ViewTest(TestCase):
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -454,13 +494,13 @@ class ViewTest(TestCase):
url = reverse('otw_use_gps',kwargs={'id':encoded1}) url = reverse('otw_use_gps',kwargs={'id':encoded1})
response = self.c.get(url,follow=True) 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) status_code=302,target_status_code=200)
url = reverse('otw_use_impeller',kwargs={'id':encoded1}) url = reverse('otw_use_impeller',kwargs={'id':encoded1})
response = self.c.get(url,follow=True) 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) 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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.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) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close() 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) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -958,7 +998,7 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) 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) status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)

View File

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

View File

@@ -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,,,
1 Concept2 Utility - Version 7.06.15
2
3 Log Data for: F
4 Total Workout Results Split or Work Interval Results Results Calculated by Formulas Interval Rest Results
5 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
6
7 F 2/3/2017 7:48 0:25:03 25:03.6 6326 23 163 01:58.8 1017 209
8 F 2/3/2017 7:48 0:25:03 06:00.0 1484 23 150 02:01.2 975 196
9 F 2/3/2017 7:48 0:25:03 12:00.0 1532 24 161 01:57.4 1042 216
10 F 2/3/2017 7:48 0:25:03 18:00.0 1504 23 163 01:59.6 1002 204
11 F 2/3/2017 7:48 0:25:03 24:00.0 1535 23 171 01:57.2 1047 217
12 F 2/3/2017 7:48 0:25:03 25:03.6 271 23 170 01:57.3 1045 217
13
14 F 2/3/2017 7:21 0:01:23 01:23.7 312 20 116 02:14.1 799 145
15 F 2/3/2017 7:21 0:01:23 01:23.7 313 20 116 02:13.7 803 146
16
17 F 1/13/2017 8:42 0:45:00 45:00.0 11437 23 168 01:58.0 1032 213
18 F 1/13/2017 8:42 0:45:00 03:00.0 773 24 155 01:56.4 1063 222
19 F 1/13/2017 8:42 0:45:00 06:00.0 769 24 161 01:57.0 1051 218
20 F 1/13/2017 8:42 0:45:00 09:00.0 769 24 164 01:57.0 1051 218
21 F 1/13/2017 8:42 0:45:00 12:00.0 770 24 165 01:56.8 1054 219
22 F 1/13/2017 8:42 0:45:00 15:00.0 765 24 168 01:57.6 1039 215
23 F 1/13/2017 8:42 0:45:00 18:00.0 753 23 165 01:59.5 1005 205
24 F 1/13/2017 8:42 0:45:00 21:00.0 770 24 171 01:56.8 1054 219
25 F 1/13/2017 8:42 0:45:00 24:00.0 764 24 167 01:57.8 1036 214
26 F 1/13/2017 8:42 0:45:00 27:00.0 763 24 169 01:57.9 1033 213
27 F 1/13/2017 8:42 0:45:00 30:00.0 770 24 173 01:56.8 1054 219
28 F 1/13/2017 8:42 0:45:00 33:00.0 764 23 173 01:57.8 1036 214
29 F 1/13/2017 8:42 0:45:00 36:00.0 739 23 172 02:01.7 966 194
30 F 1/13/2017 8:42 0:45:00 39:00.0 723 22 171 02:04.4 924 181
31 F 1/13/2017 8:42 0:45:00 42:00.0 759 23 175 01:58.5 1022 210
32 F 1/13/2017 8:42 0:45:00 45:00.0 787 23 179 01:54.3 1105 234
33
34 F 1/13/2017 7:57 0:04:53 04:53.6 1080 20 71 02:15.9 779 139
35 F 1/13/2017 7:57 0:04:53 04:53.6 1081 20 71 02:15.8 780 140
36
37 F 1/10/2017 8:29 0:45:00 45:00.0 11260 21 170 01:59.8 998 203
38 F 1/10/2017 8:29 0:45:00 09:00.0 2320 22 168 01:56.3 1064 222
39 F 1/10/2017 8:29 0:45:00 18:00.0 2275 22 168 01:58.6 1020 209
40 F 1/10/2017 8:29 0:45:00 27:00.0 2142 21 167 02:06.0 901 175
41 F 1/10/2017 8:29 0:45:00 36:00.0 2243 21 173 02:00.3 990 201
42 F 1/10/2017 8:29 0:45:00 45:00.0 2281 22 177 01:58.3 1026 211
43
44 F 1/10/2017 7:43 0:04:36 04:36.1 1048 21 113 02:11.7 826 153
45 F 1/10/2017 7:43 0:04:36 04:36.1 1049 21 113 02:11.6 828 154
46
47 F 1/8/2017 8:29 0:45:00 45:00.0 10960 21 167 02:03.1 944 187
48 F 1/8/2017 8:29 0:45:00 09:00.0 2033 20 160 02:12.8 814 149
49 F 1/8/2017 8:29 0:45:00 18:00.0 2182 21 168 02:03.7 935 185
50 F 1/8/2017 8:29 0:45:00 27:00.0 2251 22 167 01:59.9 998 203
51 F 1/8/2017 8:29 0:45:00 36:00.0 2221 21 168 02:01.5 970 195
52 F 1/8/2017 8:29 0:45:00 45:00.0 2273 22 176 01:58.7 1018 209
53
54 F 1/8/2017 7:43 0:05:01 05:01.3 1119 20 106 02:14.6 793 143
55 F 1/8/2017 7:43 0:05:01 05:00.0 1117 20 106 02:14.2 797 145
56 F 1/8/2017 7:43 0:05:01 05:01.3 3 0 106 03:36.6 418 34
57
58 F 1/4/2017 9:03 v5:00/2:00r...3 55:00.0 12799 18 157 02:08.9 862 163
59 F 1/4/2017 9:03 v5:00/2:00r...3 05:00.0 879 16 130 02:50.6 542 70
60 F 1/4/2017 9:03 v5:00/2:00r...3 02:00.0 128 124
61 F 1/4/2017 9:03 v5:00/2:00r...3 45:00.0 10953 22 176 02:03.2 943 187
62 F 1/4/2017 9:03 v5:00/2:00r...3 00:00.0 0 0
63 F 1/4/2017 9:03 v5:00/2:00r...3 05:00.0 971 18 165 02:34.4 626 95
64 F 1/4/2017 9:03 v5:00/2:00r...3 00:00.0 0 0
65
66 F 1/2/2017 7:56 v5:00/1:00r...2 22:14.2 5280 22 152 02:06.3 897 174
67 F 1/2/2017 7:56 v5:00/1:00r...2 05:00.0 1224 23 147 02:02.5 954 190
68 F 1/2/2017 7:56 v5:00/1:00r...2 01:00.0 23 132
69 F 1/2/2017 7:56 v5:00/1:00r...2 17:14.2 4060 21 158 02:07.3 883 169
70 F 1/2/2017 7:56 v5:00/1:00r...2 01:00.0 0 0
71
72 F 10/6/2016 8:53 10000m 40:30.8 10000 21 173 02:01.5 970 195
73 F 10/6/2016 8:53 10000m 07:52.1 2000 23 169 01:58.0 1032 213
74 F 10/6/2016 8:53 10000m 08:03.3 4000 22 164 02:00.8 982 198
75 F 10/6/2016 8:53 10000m 08:19.4 6000 21 175 02:04.8 918 180
76 F 10/6/2016 8:53 10000m 08:10.7 8000 21 176 02:02.6 952 190
77 F 10/6/2016 8:53 10000m 08:05.3 10000 21 181 02:01.3 974 196
78
79 F 10/6/2016 8:12 0:03:02 03:02.3 713 21 142 02:07.8 876 168
80 F 10/6/2016 8:12 0:03:02 03:02.3 714 21 142 02:07.6 878 168
81
82 F 9/27/2016 16:39 0:10:19 10:19.2 2110 22 0 02:26.7 681 111
83 F 9/27/2016 16:39 0:10:19 05:00.0 1029 24 0 02:25.7 688 113
84 F 9/27/2016 16:39 0:10:19 10:00.0 1020 25 0 02:27.0 678 110
85 F 9/27/2016 16:39 0:10:19 10:19.2 61 19 0 02:37.3 609 90
86
87 F 9/27/2016 16:26 0:01:20 01:20.8 259 22 0 02:35.9 617 92
88 F 9/27/2016 16:26 0:01:20 01:20.8 259 22 0 02:35.9 617 92
89
90 F 9/23/2016 7:59 0:30:00 30:00.0 7142 21 163 02:06.0 901 175
91 F 9/23/2016 7:59 0:30:00 06:00.0 1473 22 160 02:02.1 960 192
92 F 9/23/2016 7:59 0:30:00 12:00.0 1409 20 162 02:07.7 877 168
93 F 9/23/2016 7:59 0:30:00 18:00.0 1393 21 163 02:09.2 858 162
94 F 9/23/2016 7:59 0:30:00 24:00.0 1429 22 158 02:05.9 902 175
95 F 9/23/2016 7:59 0:30:00 30:00.0 1439 21 173 02:05.0 915 179
96
97 F 9/23/2016 7:29 0:03:08 03:08.0 744 21 147 02:06.3 897 174
98 F 9/23/2016 7:29 0:03:08 03:08.0 744 21 147 02:06.3 897 174
99
100 F 9/21/2016 16:09 0:34:16 34:16.9 6512 20 0 02:37.9 605 89
101 F 9/21/2016 16:09 0:34:16 05:00.0 980 22 0 02:33.0 635 98
102 F 9/21/2016 16:09 0:34:16 10:00.0 989 20 0 02:31.6 645 100
103 F 9/21/2016 16:09 0:34:16 15:00.0 966 21 0 02:35.2 621 93
104 F 9/21/2016 16:09 0:34:16 20:00.0 938 20 0 02:39.9 594 86
105 F 9/21/2016 16:09 0:34:16 25:00.0 946 21 0 02:38.5 602 88
106 F 9/21/2016 16:09 0:34:16 30:00.0 909 21 0 02:45.0 568 78
107 F 9/21/2016 16:09 0:34:16 34:16.9 785 20 0 02:43.6 574 80
108
109 F 9/20/2016 17:11 0:33:19 33:19.3 6519 21 0 02:33.3 634 97
110 F 9/20/2016 17:11 0:33:19 05:00.0 991 22 0 02:31.3 647 101
111 F 9/20/2016 17:11 0:33:19 10:00.0 994 21 0 02:30.9 650 102
112 F 9/20/2016 17:11 0:33:19 15:00.0 977 21 0 02:33.5 632 97
113 F 9/20/2016 17:11 0:33:19 20:00.0 968 21 0 02:34.9 623 94
114 F 9/20/2016 17:11 0:33:19 25:00.0 982 21 0 02:32.7 637 98
115 F 9/20/2016 17:11 0:33:19 30:00.0 971 21 0 02:34.4 626 95
116 F 9/20/2016 17:11 0:33:19 33:19.3 637 20 0 02:36.4 614 91
117
118 F 9/20/2016 8:12 0:22:32 22:32.5 4731 18 158 02:22.9 712 120
119 F 9/20/2016 8:12 0:22:32 09:00.0 2197 22 171 02:02.8 948 189
120 F 9/20/2016 8:12 0:22:32 18:00.0 1781 18 136 02:31.6 645 100
121 F 9/20/2016 8:12 0:22:32 22:32.5 753 15 168 03:00.9 503 59
122
123 F 9/20/2016 7:48 v5:00...1 05:00.0 758 14 115 03:17.8 455 45
124 F 9/20/2016 7:48 v5:00...1 05:00.0 759 14 115 03:17.6 456 45
125 F 9/20/2016 7:48 v5:00...1 00:00.0 0 0
126
127 F 9/19/2016 15:28 0:31:15 31:15.4 6511 22 0 02:24.0 703 117
128 F 9/19/2016 15:28 0:31:15 05:00.0 1040 24 0 02:24.2 701 117
129 F 9/19/2016 15:28 0:31:15 10:00.0 1037 23 0 02:24.6 698 116
130 F 9/19/2016 15:28 0:31:15 15:00.0 1067 23 0 02:20.5 733 126
131 F 9/19/2016 15:28 0:31:15 20:00.0 1046 23 0 02:23.4 708 119
132 F 9/19/2016 15:28 0:31:15 25:00.0 1025 21 0 02:26.3 684 112
133 F 9/19/2016 15:28 0:31:15 30:00.0 1045 22 0 02:23.5 707 118
134 F 9/19/2016 15:28 0:31:15 31:15.4 252 19 0 02:29.6 659 105
135
136 F 9/15/2016 18:01 0:32:53 32:53.1 6694 22 0 02:27.3 676 109
137 F 9/15/2016 18:01 0:32:53 05:00.0 1055 24 0 02:22.1 719 122
138 F 9/15/2016 18:01 0:32:53 10:00.0 1042 23 0 02:23.9 703 117
139 F 9/15/2016 18:01 0:32:53 15:00.0 1017 22 0 02:27.4 675 109
140 F 9/15/2016 18:01 0:32:53 20:00.0 1030 23 0 02:25.6 690 113
141 F 9/15/2016 18:01 0:32:53 25:00.0 996 23 0 02:30.6 652 102
142 F 9/15/2016 18:01 0:32:53 30:00.0 983 22 0 02:32.5 639 99
143 F 9/15/2016 18:01 0:32:53 32:53.1 572 22 0 02:31.3 647 101
144
145 F 9/13/2016 16:52 0:35:12 35:12.4 6740 23 0 02:36.7 613 91
146 F 9/13/2016 16:52 0:35:12 10:00.0 1928 28 0 02:35.6 619 93
147 F 9/13/2016 16:52 0:35:12 20:00.0 1955 26 0 02:33.4 633 97
148 F 9/13/2016 16:52 0:35:12 30:00.0 1958 23 0 02:33.2 634 97
149 F 9/13/2016 16:52 0:35:12 35:12.4 900 18 0 02:53.5 530 67
150
151 F 9/3/2016 11:33 0:01:26 01:26.7 113 28 0 06:23.6 321 6
152 F 9/3/2016 11:33 0:01:26 01:26.7 114 28 0 06:20.2 321 6
153
154 F 8/8/2016 7:45 0:24:18 24:18.4 4438 15 136 02:44.3 571 79
155 F 8/8/2016 7:45 0:24:18 11:00.0 2322 19 147 02:22.1 719 122
156 F 8/8/2016 7:45 0:24:18 22:00.0 1830 15 0 03:00.3 505 60
157 F 8/8/2016 7:45 0:24:18 24:18.4 287 11 126 04:01.1 385 25
158
159 F 7/6/2016 7:49 0:45:00 45:00.0 10872 21 164 02:04.1 929 183
160 F 7/6/2016 7:49 0:45:00 09:00.0 2186 22 151 02:03.5 939 186
161 F 7/6/2016 7:49 0:45:00 18:00.0 2222 22 163 02:01.5 971 195
162 F 7/6/2016 7:49 0:45:00 27:00.0 2048 20 158 02:11.8 825 153
163 F 7/6/2016 7:49 0:45:00 36:00.0 2146 21 169 02:05.8 904 176
164 F 7/6/2016 7:49 0:45:00 45:00.0 2271 22 179 01:58.8 1016 208
165
166 F 7/5/2016 8:18 0:45:00 45:00.0 10900 21 168 02:03.8 934 184
167 F 7/5/2016 8:18 0:45:00 09:00.0 2285 23 166 01:58.1 1030 212
168 F 7/5/2016 8:18 0:45:00 18:00.0 2256 22 168 01:59.6 1002 204
169 F 7/5/2016 8:18 0:45:00 27:00.0 2156 21 174 02:05.2 913 178
170 F 7/5/2016 8:18 0:45:00 36:00.0 2016 20 155 02:13.9 801 146
171 F 7/5/2016 8:18 0:45:00 45:00.0 2188 21 177 02:03.4 941 186
172
173 F 7/2/2016 7:14 0:35:17 35:17.2 8855 22 167 01:59.5 1005 205
174 F 7/2/2016 7:14 0:35:17 11:01.6 2800 24 161 01:58.1 1030 212
175 F 7/2/2016 7:14 0:35:17 10:57.7 5600 23 171 01:57.4 1043 216
176 F 7/2/2016 7:14 0:35:17 11:24.5 8400 22 169 02:02.2 959 192
177 F 7/2/2016 7:14 0:35:17 01:53.4 8855 21 167 02:04.6 922 181
178
179 F 7/1/2016 7:32 10000m 40:15.0 10000 23 176 02:00.7 984 199
180 F 7/1/2016 7:32 10000m 07:54.1 2000 24 168 01:58.5 1023 210
181 F 7/1/2016 7:32 10000m 07:50.3 4000 24 174 01:57.5 1041 215
182 F 7/1/2016 7:32 10000m 08:24.4 6000 22 177 02:06.1 900 175
183 F 7/1/2016 7:32 10000m 08:02.3 8000 23 180 02:00.5 987 200
184 F 7/1/2016 7:32 10000m 08:03.9 10000 22 182 02:00.9 980 198
185
186 F 7/1/2016 6:51 0:02:29 02:29.5 529 20 130 02:21.3 726 124
187 F 7/1/2016 6:51 0:02:29 02:29.5 529 20 130 02:21.3 726 124
188
189 F 6/28/2016 6:45 0:30:00 30:00.0 7434 22 173 02:01.0 978 197
190 F 6/28/2016 6:45 0:30:00 06:00.0 1534 23 0 01:57.3 1045 217
191 F 6/28/2016 6:45 0:30:00 12:00.0 1342 21 166 02:14.1 799 145
192 F 6/28/2016 6:45 0:30:00 18:00.0 1523 24 172 01:58.1 1029 212
193 F 6/28/2016 6:45 0:30:00 24:00.0 1484 22 173 02:01.2 975 196
194 F 6/28/2016 6:45 0:30:00 30:00.0 1552 23 184 01:55.9 1072 224
195
196 F 6/25/2016 7:10 0:30:00 30:00.0 7675 23 171 01:57.2 1047 217
197 F 6/25/2016 7:10 0:30:00 06:00.0 1542 24 159 01:56.7 1057 220
198 F 6/25/2016 7:10 0:30:00 12:00.0 1527 24 165 01:57.8 1035 214
199 F 6/25/2016 7:10 0:30:00 18:00.0 1550 24 174 01:56.1 1069 223
200 F 6/25/2016 7:10 0:30:00 24:00.0 1502 23 179 01:59.8 999 203
201 F 6/25/2016 7:10 0:30:00 30:00.0 1556 23 181 01:55.6 1078 226
202
203 F 6/9/2016 7:17 0:30:00 30:00.0 7299 22 166 02:03.3 942 187
204 F 6/9/2016 7:17 0:30:00 06:00.0 1563 24 168 01:55.1 1088 229
205 F 6/9/2016 7:17 0:30:00 12:00.0 1463 22 166 02:03.0 946 188
206 F 6/9/2016 7:17 0:30:00 18:00.0 1371 21 160 02:11.2 832 155
207 F 6/9/2016 7:17 0:30:00 24:00.0 1434 22 165 02:05.5 909 177
208 F 6/9/2016 7:17 0:30:00 30:00.0 1468 22 174 02:02.6 953 190
209
210 F 5/24/2016 7:42 0:30:00 30:00.0 7612 23 168 01:58.2 1028 212
211 F 5/24/2016 7:42 0:30:00 06:00.0 1534 24 158 01:57.3 1045 217
212 F 5/24/2016 7:42 0:30:00 12:00.0 1491 23 167 02:00.7 984 199
213 F 5/24/2016 7:42 0:30:00 18:00.0 1507 23 169 01:59.4 1006 205
214 F 5/24/2016 7:42 0:30:00 24:00.0 1532 23 171 01:57.4 1042 216
215 F 5/24/2016 7:42 0:30:00 30:00.0 1548 23 175 01:56.2 1066 223
216
217 F 5/7/2016 9:14 0:30:00 30:00.0 7540 23 164 01:59.3 1008 206
218 F 5/7/2016 9:14 0:30:00 06:00.0 1493 23 162 02:00.5 987 200
219 F 5/7/2016 9:14 0:30:00 12:00.0 1517 23 161 01:58.6 1021 210
220 F 5/7/2016 9:14 0:30:00 18:00.0 1498 23 165 02:00.1 994 202
221 F 5/7/2016 9:14 0:30:00 24:00.0 1506 23 164 01:59.5 1005 205
222 F 5/7/2016 9:14 0:30:00 30:00.0 1526 23 169 01:57.9 1033 213
223
224 F 4/23/2016 8:17 10000m 39:24.5 10000 23 166 01:58.2 1028 212
225 F 4/23/2016 8:17 10000m 07:47.0 2000 24 161 01:56.7 1056 220
226 F 4/23/2016 8:17 10000m 07:44.2 4000 24 171 01:56.0 1070 224
227 F 4/23/2016 8:17 10000m 07:50.7 6000 23 165 01:57.6 1039 215
228 F 4/23/2016 8:17 10000m 08:09.4 8000 22 165 02:02.3 957 191
229 F 4/23/2016 8:17 10000m 07:53.1 10000 23 170 01:58.2 1028 212
230
231 F 4/20/2016 8:12 0:30:00 30:00.0 7961 24 170 01:53.0 1133 242
232 F 4/20/2016 8:12 0:30:00 06:00.0 1583 24 160 01:53.7 1119 238
233 F 4/20/2016 8:12 0:30:00 12:00.0 1590 24 163 01:53.2 1130 241
234 F 4/20/2016 8:12 0:30:00 18:00.0 1594 24 173 01:52.9 1136 243
235 F 4/20/2016 8:12 0:30:00 24:00.0 1589 25 174 01:53.2 1128 241
236 F 4/20/2016 8:12 0:30:00 30:00.0 1607 24 182 01:52.0 1157 249
237
238 F 4/18/2016 8:24 0:30:00 30:00.0 7608 22 167 01:58.2 1027 211
239 F 4/18/2016 8:24 0:30:00 06:00.0 1508 22 154 01:59.3 1008 206
240 F 4/18/2016 8:24 0:30:00 12:00.0 1468 21 161 02:02.6 953 190
241 F 4/18/2016 8:24 0:30:00 18:00.0 1542 23 171 01:56.7 1057 220
242 F 4/18/2016 8:24 0:30:00 24:00.0 1544 23 172 01:56.5 1060 221
243 F 4/18/2016 8:24 0:30:00 30:00.0 1546 23 179 01:56.4 1063 222
244
245 F 4/17/2016 9:32 0:35:33 35:33.4 8406 21 152 02:06.8 889 171
246 F 4/17/2016 9:32 0:35:33 11:25.3 2800 22 162 02:02.3 957 191
247 F 4/17/2016 9:32 0:35:33 11:02.1 5600 22 171 01:58.2 1028 212
248 F 4/17/2016 9:32 0:35:33 13:03.3 8400 19 138 02:19.8 740 128
249 F 4/17/2016 9:32 0:35:33 00:02.7 8406 0 138 03:45.0 405 31
250
251 F 4/11/2016 8:29 0:37:24 37:24.9 9267 22 170 02:01.1 977 197
252 F 4/11/2016 8:29 0:37:24 11:03.9 2800 23 169 01:58.5 1022 210
253 F 4/11/2016 8:29 0:37:24 11:21.7 5600 22 171 02:01.7 967 194
254 F 4/11/2016 8:29 0:37:24 11:30.7 8400 22 170 02:03.3 941 187
255 F 4/11/2016 8:29 0:37:24 03:28.8 9267 22 170 02:00.4 989 200

Binary file not shown.

View File

@@ -5306,15 +5306,19 @@ def workout_upload_view(request,
uploadoptions.update(optionsform.cleaned_data) uploadoptions.update(optionsform.cleaned_data)
request.session['uploadoptions'] = uploadoptions request.session['uploadoptions'] = uploadoptions
uploadoptions['secret'] = settings.UPLOAD_SERVICE_SECRET
uploadoptions['user'] = r.user.id 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']) filename, file_path = handle_uploaded_file(request.FILES['file'])
else:
return HttpResponseRedirect(reverse("workout_upload_view"))
uploadoptions['file'] = file_path uploadoptions['file'] = file_path
response = upload_handler(uploadoptions, file_path) response = upload_handler(uploadoptions, file_path)
if response["status"] not in ["processing"]: if response["status"] not in ["processing"]:
messages.error(request, response["message"]) messages.error(request, response["message"])
url = reverse('workout_upload_view')
return HttpResponseRedirect(url)
else: else:
messages.info(request, response["message"]) messages.info(request, response["message"])