diff --git a/rowers/nkstuff.py b/rowers/nkstuff.py index 070d5a78..b23887f6 100644 --- a/rowers/nkstuff.py +++ b/rowers/nkstuff.py @@ -210,7 +210,7 @@ def rower_nk_token_refresh(user): def make_authorization_url(request): return imports_make_authorization_url(oauth_data) -def get_nk_workout_list(user,fake=False,startTime=0,endTime=0): +def get_nk_workout_list(user,fake=False,after=0,before=0): r = Rower.objects.get(user=user) if (r.nktoken == '') or (r.nktoken is None): @@ -221,12 +221,12 @@ def get_nk_workout_list(user,fake=False,startTime=0,endTime=0): return custom_exception_handler(401,s) else: # ready to fetch. Hurray - if not endTime: - endTime = arrow.now()+timedelta(days=1) - endTime = str(int(endTime.timestamp())*1000) - if not startTime: - startTime = arrow.now()-timedelta(days=30) - startTime = str(int(startTime.timestamp())*1000) + if not before: + before = arrow.now()+timedelta(days=1) + before = str(int(before.timestamp())*1000) + if not after: + after = arrow.now()-timedelta(days=30) + after = str(int(after.timestamp())*1000) authorizationstring = str('Bearer ' + r.nktoken) headers = {'Authorization': authorizationstring, 'user-agent': 'sanderroosendaal', @@ -236,8 +236,8 @@ def get_nk_workout_list(user,fake=False,startTime=0,endTime=0): url = NK_API_LOCATION+"api/v1/sessions" params = { - 'startTime':startTime, - 'endTime':endTime, + 'after':after, + 'before':before, } # start / end time s = requests.get(url,headers=headers,params=params) @@ -260,6 +260,7 @@ def get_workout(user,nkid): 'sessionIds': nkid, } + authorizationstring = str('Bearer ' + r.nktoken) headers = {'Authorization': authorizationstring, 'user-agent': 'sanderroosendaal', @@ -270,7 +271,6 @@ def get_workout(user,nkid): url = NK_API_LOCATION+"api/v1/sessions/strokes" response = requests.get(url,headers=headers,params=params) - if response.status_code != 200: # error handling and logging return {},pd.DataFrame() @@ -287,8 +287,8 @@ def get_workout(user,nkid): url = NK_API_LOCATION+"api/v1/sessions/" params = { - 'startTime':timestampbegin-1, - 'endTime': timestampend+1, + 'after':timestampbegin-1, + 'before': timestampend+1, } response = requests.get(url, headers=headers,params=params) @@ -303,4 +303,5 @@ def get_workout(user,nkid): if str(w['id']) == str(nkid): workoutdata = w + return workoutdata, df diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 6e96daf0..162dbc1d 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -972,7 +972,7 @@ def mocked_requests(*args, **kwargs): return MockResponse(nkstrokedata,200) if nkworkoutlisttester.match(args[0]): params = kwargs.pop('params',{}) - if 'startTime' in params and params['startTime'] == 1267136372998: + if 'after' in params and params['after'] == 1267136372998: return MockResponse(nkimpellerworkoutlist,200) return MockResponse(nkworkoutlist,200) diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index a0226334..55390e9b 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -35,7 +35,8 @@ from rowers.views import c2_open, multi_compare_view from rowers.forms import ( DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail, ChartParamChoiceForm,WorkoutMultipleCompareForm, - BoxPlotChoiceForm) + BoxPlotChoiceForm,PerformanceManagerForm, + ) import rowers.plots as plots import rowers.interactiveplots as iplots import datetime diff --git a/rowers/tests/test_analysis.py b/rowers/tests/test_analysis.py index 42ef4a03..5deb71b9 100644 --- a/rowers/tests/test_analysis.py +++ b/rowers/tests/test_analysis.py @@ -1512,3 +1512,133 @@ class WorkoutStatsTestNew(TestCase): response = self.c.post('/rowers/user-analysis-select/',form_data) self.assertEqual(response.status_code,200) + +class MarkerPerformanceTest(TestCase): + def setUp(self): + self.u = UserFactory() + + self.r = Rower.objects.create(user=self.u, + birthdate=faker.profile()['birthdate'], + gdproptin=True,surveydone=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + self.c = Client() + self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) + self.factory = RequestFactory() + self.password = faker.word() + self.u.set_password(self.password) + self.u.save() + + # need a 2k, 5k, 1h row + self.werg2k = WorkoutFactory( + user=self.r, + duration=datetime.time(hour=0,minute=7,second=0), + distance=2000, + workouttype='rower', + rankingpiece=True, + ) + + # need a 2k, 5k, 1h row + self.werg5k = WorkoutFactory( + user=self.r, + duration=datetime.time(hour=0,minute=18,second=0), + distance=5000, + workouttype='rower', + rankingpiece=True, + ) + + # need a 2k, 5k, 1h row + self.werg1h = WorkoutFactory( + user=self.r, + duration=datetime.time(hour=1,minute=0,second=0), + distance=15000, + workouttype='rower', + rankingpiece=True, + ) + + def tearDown(self): + for workout in self.user_workouts: + try: + os.remove(workout.csvfilename) + except (IOError, FileNotFoundError, OSError): + pass + + @patch('rowers.dataprep.create_engine') + @patch('rowers.dataprep.getsmallrowdata_db') + def test_create_marker_workouts(self, mocked_sqlalchemy, + mocked_getsmallrowdata_db): + login = self.c.login(username=self.u.username,password=self.password) + self.assertTrue(login) + + startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() + enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() + + url = reverse('create_marker_workouts_view') + response = self.c.get(url, follow=True) + + expected_url = reverse('goldmedalscores_view',kwargs={'userid':self.u.id}) + + self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200) + + @patch('rowers.dataprep.create_engine') + @patch('rowers.dataprep.getsmallrowdata_db') + def test_performancemanager_view(self, mocked_sqlalchemy, + mocked_getsmallrowdata_db): + login = self.c.login(username=self.u.username,password=self.password) + self.assertTrue(login) + + startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() + enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() + + url = reverse('performancemanager_view') + response = self.c.get(url) + self.assertEqual(response.status_code,200) + + form_data = { + 'startdate':startdate.strftime("%Y-%m-%d"), + 'enddate': enddate.strftime("%Y-%m-%d"), + 'doform': True, + 'dofatigue': True, + 'metricchoice':'rscore', + 'modelchoice': 'coggan', + 'daterange': '', + } + form = PerformanceManagerForm(form_data) + if not form.is_valid(): + print(form.errors) + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code,200) + + @patch('rowers.dataprep.create_engine') + @patch('rowers.dataprep.getsmallrowdata_db') + def test_ranking_view2(self, mocked_sqlalchemy, + mocked_getsmallrowdata_db): + login = self.c.login(username=self.u.username,password=self.password) + self.assertTrue(login) + + startdate = (self.user_workouts[0].startdatetime-datetime.timedelta(days=3)).date() + enddate = (self.user_workouts[0].startdatetime+datetime.timedelta(days=3)).date() + + url = reverse('rankings_view2') + response = self.c.get(url) + self.assertEqual(response.status_code,200) + + form_data = { + 'startdate':startdate.strftime("%Y-%m-%d"), + 'enddate': enddate.strftime("%Y-%m-%d"), + 'doform': True, + 'dofatigue': True, + 'metricchoice':'rscore', + 'modelchoice': 'coggan', + 'daterange': '', + } + form = DateRangeForm(form_data) + if not form.is_valid(): + print(form.errors) + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code,200) diff --git a/rowers/tests/test_cpchart.py b/rowers/tests/test_cpchart.py index 020654c4..13f4b197 100644 --- a/rowers/tests/test_cpchart.py +++ b/rowers/tests/test_cpchart.py @@ -13,99 +13,6 @@ from rowers.utils import calculate_age import rowers.dataprep as dataprep - -@override_settings(TESTING=True) -class OTWCPChartTest(TestCase): - def setUp(self): - self.u = UserFactory() - - self.r = Rower.objects.create(user=self.u, - birthdate=faker.profile()['birthdate'], - gdproptin=True,surveydone=True,sex='male', - weightcategory='hwt', - gdproptindate=timezone.now(), - rowerplan='coach') - - r = self.u.rower - age = calculate_age(r.birthdate) - self.c = Client() - self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) - self.factory = RequestFactory() - self.password = faker.word() - self.u.set_password(self.password) - self.u.save() - - self.lastdate = datetime.date(year=1970,month=1,day=1) - - for filename in os.listdir(u'rowers/tests/testdata/otwcp'): - a2 = 'rowers/tests/testdata/otwcp/temp/'+filename - try: - copy(u'rowers/tests/testdata/otwcp/'+filename,a2) - row = rdata(a2) - totaldist = row.df['cum_dist'].max() - totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() - totaltime = totaltime+row.df.loc[:,' ElapsedTime (sec)'].iloc[0] - - - hours = int(totaltime/3600.) - minutes = int((totaltime - 3600.*hours)/60.) - seconds = int(totaltime - 3600.*hours - 60.*minutes) - tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) - - duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) - duration = datetime.time(hour=hours,minute=minutes,second=seconds) - - workoutdate = row.rowdatetime.strftime('%Y-%m-%d') - workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') - - w = Workout.objects.create(name=faker.word(), - workouttype='water', - user = self.r, - starttime = workoutstarttime, - date = workoutdate, - duration = duration, - distance = totaldist, - csvfilename = a2, - rankingpiece = True) - w.save() - - if row.rowdatetime.date() > self.lastdate: - self.lastdate = row.rowdatetime.date() - except: - pass - - def tearDown(self): - try: - for filename in os.listdir('rowers/tests/testdata/otwcp/temp'): - path = os.path.join('rowers/tests/testdata/otwcp/temp/',filename) - if not os.path.isdir(path): - try: - os.remove(path) - except (IOError,FileNotFoundError,OSError): - pass - except (IOError,FileNotFoundError,OSError): - pass - - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_cpraw) - @patch('rowers.dataprep.getcpdata_sql',side_effect=mocked_getcpdata_sql) - def test_otwrankingpieces(self, mocked_cpraw,mocked_getcpdata_sql): - workouts = Workout.objects.filter(workouttype='water', - rankingpiece=True,user=self.r) - - delta, cpvalue, avgpower = dataprep.fetchcp(self.r,workouts) - - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_cpraw) - @patch('rowers.dataprep.getcpdata_sql',side_effect=mocked_getcpdata_sql) - def test_otwrankingpieces(self, mocked_cpraw,mocked_getcpdata_sql): - login = self.c.login(username=self.u.username,password=self.password) - self.assertTrue(login) - - url = '/rowers/otw-bests/' - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - @override_settings(TESTING=True) class CPChartTest(TestCase): def setUp(self): diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index 1458c551..6a75c617 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -136,18 +136,18 @@ class URLTests(TestCase): '/rowers/me/workflowconfig2/user/1/', '/rowers/me/workflowdefault/', # '/rowers/multi-compare/', - '/rowers/ote-bests/', +# '/rowers/ote-bests/', # '/rowers/ote-bests/2016-01-01/2016-12-31/', - '/rowers/ote-bests/user/1/', +# '/rowers/ote-bests/user/1/', # '/rowers/ote-bests/user/1/2016-01-01/2016-12-31/', '/rowers/ote-bests2/', # '/rowers/ote-bests2/2016-01-01/2016-12-31/', '/rowers/ote-bests2/user/1/', - '/rowers/ote-ranking/', +# '/rowers/ote-ranking/', # '/rowers/ote-ranking/2016-01-01/2016-12-31/', - '/rowers/ote-ranking/user/1/', +# '/rowers/ote-ranking/user/1/', # '/rowers/ote-ranking/user/1/2016-01-01/2016-12-31/', - '/rowers/otw-bests/', +# '/rowers/otw-bests/', # '/rowers/otw-bests/2016-01-01/2016-12-31/', # '/rowers/otw-bests/user/1/2016-01-01/2016-12-31/', '/rowers/partners/', diff --git a/rowers/tests/viewnames.csv b/rowers/tests/viewnames.csv index 3dad7c11..a8f12ac7 100644 --- a/rowers/tests/viewnames.csv +++ b/rowers/tests/viewnames.csv @@ -34,12 +34,9 @@ 33,35,kill_async_job,kill job,TRUE,302,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 34,36,post_progress,post progress,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 35,37,graphs_view,view charts,TRUE,302,basic,200,302,basic,200,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, -37,39,rankings_view,view ranking,TRUE,302,pro,200,302,pro,403,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, 38,40,rankings_view2,view ranking,TRUE,302,pro,200,302,pro,403,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, -39,41,otwrankings_view,view ranking,TRUE,302,pro,200,302,pro,403,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, -40,42,oterankings_view,view ranking,TRUE,302,pro,200,302,pro,403,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, 41,43,cum_flex,flex all chart,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -42,44,analysis_view_data,redirects to analysis direct,TRUE,302,pro,302,302,pro,302,302,coach,302,302,FALSE,FALSE,FALSE,TRUE,TRUE, +42,44,analysis_view_data,redirects to analysis direct,TRUE,302,pro,200,302,pro,200,302,coach,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 43,47,cum_flex_data,flex all chart data (json),TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 44,48,histo,histogram view,TRUE,302,pro,200,302,pro,403,302,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, 45,49,histo_data,histogram data,TRUE,302,pro,200,302,pro,200,302,coach,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, diff --git a/rowers/urls.py b/rowers/urls.py index b796cb97..eb62075a 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -242,7 +242,6 @@ urlpatterns = [ path('404/', TemplateView.as_view(template_name='404.html'),name='404'), path('400/', TemplateView.as_view(template_name='400.html'),name='400'), path('403/', TemplateView.as_view(template_name='403.html'),name='403'), -# re_path(r'^imports/$', views.imports_view), re_path(r'^exportallworkouts/?/$',views.workouts_summaries_email_view,name='workouts_summaries_email_view'), path('failedjobs/',views.failed_queue_view,name='failed_queue_view'), path('failedjobs/empty/',views.failed_queue_empty,name='failed_queue_empty'), @@ -252,9 +251,6 @@ urlpatterns = [ re_path(r'^agegroupcp/(?P\d+)/(?P\d+)/$',views.agegroupcpview,name='agegroupcpview'), re_path(r'^ajax_agegroup/(?P\d+)/(?P\w+.*)/(?P\w+.*)/(?P\d+)/$', views.ajax_agegrouprecords,name='ajax_agegrouprecords'), -# re_path(r'^updatefitness/(?P\w+.*)/(?P\d+)/$',views.fitness_metric_view,name='fitness_metric_view'), -# re_path(r'^updatefitness/(?P\w+.*)/$',views.fitness_metric_view,name='fitness_metric_view'), -# re_path(r'^updatefitness/$',views.fitness_metric_view,name='fitness_metric_view'), re_path(r'^agegrouprecords/(?P\w+.*)/(?P\w+.*)/(?P\d+)m/$', views.agegrouprecordview,name='agegrouprecordview'), re_path(r'^agegrouprecords/(?P\w+.*)/(?P\w+.*)/(?P\d+)min/$', @@ -265,22 +261,14 @@ urlpatterns = [ views.agegrouprecordview,name='agegrouprecordview'), re_path(r'^list-workouts/ranking/$',views.workouts_view,{'rankingonly':True}, name='workouts_view'), -# re_path(r'^list-workouts/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workouts_view, -# name='workouts_view'), re_path(r'^list-workouts/team/(?P\d+)/$',views.workouts_view, name='workouts_view'), re_path(r'^(?P\d+)/list-workouts/$',views.workouts_view, name='workouts_view'), -# re_path(r'^(?P\d+)/list-workouts/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workouts_view, -# name='workouts_view'), re_path(r'^list-workouts/ranking/user/(?P\d+)/$',views.workouts_view,{'rankingonly':True}, name='workouts_view'), re_path(r'^list-workouts/user/(?P\d+)/$',views.workouts_view, name='workouts_view'), -# re_path(r'^list-workouts/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.workouts_view, -# name='workouts_view'), -# re_path(r'^list-workouts/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workouts_view, -# name='workouts_view'), re_path(r'^virtualevents/$',views.virtualevents_view,name='virtualevents_view'), re_path(r'^virtualevent/createchoice/$', TemplateView.as_view(template_name='newchallengechoice.html'),name='newchallengechoice'), re_path(r'^virtualevent/create/$',views.virtualevent_create_view,name='virtualevent_create_view'), @@ -323,16 +311,9 @@ urlpatterns = [ re_path(r'^workout/addmanual/(?P\d+)/$',views.addmanual_view,name='addmanual_view'), re_path(r'^workout/addmanual/$',views.addmanual_view,name='addmanual_view'), re_path(r'^team-compare-select/workout/(?P\d+)/team/(?P\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/team/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/team/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/team/(?P\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^team-compare-select/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/workout/(?P\b[0-9A-Fa-f]+\b)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/team/(?P\d+)/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), @@ -340,12 +321,8 @@ urlpatterns = [ re_path(r'^team-compare-select/team/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/user/(?P\d+)/$',views.team_comparison_select,name='team_comparison_select'), re_path(r'^team-compare-select/$',views.team_comparison_select,name='team_comparison_select'), -# re_path(r'^workouts-join-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workouts_join_select, -# name='workouts_join_select'), re_path(r'^workouts-join/$',views.workouts_join_view,name='workouts_join_view'), re_path(r'^workouts-join/user/(?P\d+)$',views.workouts_join_view,name='workouts_join_view'), - #re_path(r'^workouts-join-select/team/(?P\d+)/$',views.workouts_join_select,name='workouts_join_select'), - # re_path(r'^workouts-join-select/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workouts_join_select,name='workouts_join_select'), re_path(r'^workouts-join-select/$',views.workouts_join_select,name='workouts_join_select'), re_path(r'^workouts-join-select/user/(?P\d+)/$',views.workouts_join_select,name='workouts_join_select'), re_path(r'^user-boxplot-select/user/(?P\d+)/$',views.user_boxplot_select,name='user_boxplot_select'), @@ -357,23 +334,16 @@ urlpatterns = [ re_path(r'^user-analysis-select/team/(?P\d+)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/(?P\w.*)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/$',views.analysis_new,name='analysis_new'), -# re_path(r'^user-multiflex-select/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.user_multiflex_select,name='user_multiflex_select'), re_path(r'^user-multiflex-select/user/(?P\d+)/$',views.user_multiflex_select,name='user_multiflex_select'), -# re_path(r'^user-multiflex-select/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.user_multiflex_select,name='user_multiflex_select'), re_path(r'^user-multiflex-select/$',views.user_multiflex_select,name='user_multiflex_select'), re_path(r'^list-jobs/$',views.session_jobs_view,name='session_jobs_view'), re_path(r'^jobs-status/$',views.session_jobs_status,name='session_jobs_status'), re_path(r'^job-kill/(?P.*)/$',views.kill_async_job), -# re_path(r'^test-job/(?P\d+)/$',views.test_job_view), -# re_path(r'^test-job2/(?P\d+)/$',views.test_job_view2), re_path(r'^record-progress/(?P\d+)/(?P.*)/$',views.post_progress,name='post_progress'), re_path(r'^record-progress/(?P.*)/$',views.post_progress), re_path(r'^record-progress/$',views.post_progress), re_path(r'^list-graphs/$',views.graphs_view,name='graphs_view'), re_path(r'^list-graphs/user/(?P\d+)/$',views.graphs_view,name='graphs_view'), - #re_path(r'^fitness-progress/$',views.fitnessmetric_view,name='fitnessmetric_view'), - #re_path(r'^fitness-progress/user/(?P\d+)/$',views.fitnessmetric_view,name='fitnessmetric_view'), - #re_path(r'^fitness-progress/user/(?P\d+)/(?P\w+.*)/$',views.fitnessmetric_view,name='fitnessmetric_view'), re_path(r'^createmarkerworkouts/user/(?P\d+)/$',views.create_marker_workouts_view, name='create_marker_workouts_view'), re_path(r'^createmarkerworkouts/$',views.create_marker_workouts_view, @@ -384,25 +354,8 @@ urlpatterns = [ re_path(r'^performancemanager/$',views.performancemanager_view,name='performancemanager_view'), re_path(r'^performancemanager/user/(?P\d+)/$',views.performancemanager_view,name='performancemanager_view'), re_path(r'^performancemanager/user/(?P\d+)/(?P\w+.*)/$',views.performancemanager_view,name='performancemanager_view'), -# re_path(r'^ote-bests/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.rankings_view,name='rankings_view'), - re_path(r'^ote-bests/user/(?P\d+)/$',views.rankings_view,name='rankings_view'), -# re_path(r'^ote-bests/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.rankings_view,name='rankings_view'), - re_path(r'^ote-bests/$',views.rankings_view,name='rankings_view'), - re_path(r'^(?P\d+)/ote-bests/$',views.rankings_view,name='rankings_view'), -# re_path(r'^(?P\d+)/ote-bests2/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.rankings_view2,name='rankings_view2'), re_path(r'^ote-bests2/user/(?P\d+)/$',views.rankings_view2,name='rankings_view2'), -# re_path(r'^ote-bests2/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.rankings_view2,name='rankings_view2'), re_path(r'^ote-bests2/$',views.rankings_view2,name='rankings_view2'), -# re_path(r'^otw-bests/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otwrankings_view,name='otwrankings_view'), -# re_path(r'^otw-bests/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otwrankings_view,name='otwrankings_view'), - re_path(r'^otw-bests/user/(?P\d+)/$',views.otwrankings_view,name='otwrankings_view'), - re_path(r'^otw-bests/$',views.otwrankings_view,name='otwrankings_view'), -# re_path(r'^ote-ranking/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.oterankings_view,name='oterankings_view'), -# re_path(r'^ote-ranking/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.oterankings_view,name='oterankings_view'), - re_path(r'^ote-ranking/$',views.oterankings_view,name='oterankings_view'), - re_path(r'^ote-ranking/user/(?P\d+)/$',views.oterankings_view,name='oterankings_view'), -# re_path(r'^flexall/(?P\w+.*)/(?P\w+.*)/(?P\w+.*)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.cum_flex,name='cum_flex'), -# re_path(r'^flexall/(?P\w+.*)/(?P\w+.*)/(?P\w+.*)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.cum_flex,name='cum_flex'), re_path(r'^flexall/(?P\w+.*)/(?P\w+.*)/(?P\w+.*)/$',views.cum_flex,name='cum_flex'), re_path(r'^analysisdata/$',views.analysis_view_data,name='analysis_view_data'), re_path(r'^flexall/user/(?P\d+)/$',views.cum_flex,name='cum_flex'), @@ -410,12 +363,8 @@ urlpatterns = [ re_path(r'^flexalldata/$',views.cum_flex_data,name='cum_flex_data'), re_path(r'^histo/user/(?P\d+)/$',views.histo,name='histo'), re_path(r'^histodata/$',views.histo_data,name='histo_data'), -# re_path(r'^histo/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.histo,name='histo'), re_path(r'^histo/$',views.histo,name='histo'), re_path(r'^cumstats/user/(?P\d+)/$',views.cumstats,name='cumstats'), -# re_path(r'^cumstats/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.cumstats,name='cumstats'), -# re_path(r'^cumstats/user/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.cumstats,name='cumstats'), -# re_path(r'^cumstats/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.cumstats,name='cumstats'), re_path(r'^cumstats/$',views.cumstats,name='cumstats'), re_path(r'^graph/(?P\d+)/$',views.graph_show_view,name='graph_show_view'), re_path(r'^graph/(?P\d+)/delete/$',views.GraphDelete.as_view(),name='graph_delete'), @@ -432,12 +381,10 @@ urlpatterns = [ re_path(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/histo/$',views.workout_histo_view, name='workout_histo_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/task/$',views.workout_test_task_view,name='workout_test_task_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/forcecurve/$',views.workout_forcecurve_view, name='workout_forcecurve_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/unsubscribe/$',views.workout_unsubscribe_view, name='workout_unsubscribe_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/export/$',views.workout_export_view), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/comment/$',views.workout_comment_view, name='workout_comment_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/emailtcx/$',views.workout_tcxemail_view, @@ -448,16 +395,9 @@ urlpatterns = [ name='workout_csvemail_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/csvtoadmin/$',views.workout_csvtoadmin_view, name='workout_csvtoadmin_view'), -# re_path(r'^ergcpdatatoadmin/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otecp_toadmin_view,name='otecp_toadmin_view'), -# re_path(r'^otwcpdatatoadmin/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otwcp_toadmin_view,name='otwcp_toadmin_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/edit/$',views.workout_edit_view, name='workout_edit_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/map/$',views.workout_map_view,name='workout_map_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/setprivate/$',views.workout_setprivate_view), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/updatecp/$',views.workout_update_cp_view,name='workout_update_cp_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/makepublic/$',views.workout_makepublic_view), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/geeky/$',views.workout_geeky_view), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/advanced/$',views.workout_advanced_view), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/instroke/(?P\w+.*)/$',views.instroke_chart,name='instroke_chart'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/instroke/$',views.instroke_view,name='instroke_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/stats/$',views.workout_stats_view,name='workout_stats_view'), @@ -487,12 +427,10 @@ urlpatterns = [ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/darkskywind/$',views.workout_downloadwind_view,name='workout_downloadwind_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/metar/(?P\w+)/$',views.workout_downloadmetar_view,name='workout_downloadmetar_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/stream/$',views.workout_stream_view,name='workout_stream_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/crewnerdsummary/$',views.workout_crewnerd_summary_view), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/editintervals/$',views.workout_summary_edit_view, name='workout_summary_edit_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/restore/$',views.workout_summary_restore_view,name='workout_summary_restore_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/split/$',views.workout_split_view,name='workout_split_view'), -# re_path(r'^workout/(?P\d+)/interactiveplot/$',views.workout_biginteractive_view), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/view/entry/(?P\d+)/$',views.workout_view,name='workout_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/view/entry/(?P\d+)/nocourse/$',views.workout_view,name='workout_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/view/session/(?P\d+)/$',views.workout_view,name='workout_view'), @@ -540,7 +478,6 @@ urlpatterns = [ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/addpowerpiechart/$', views.workout_add_chart_view, {'plotnr':'13'},name='workout_add_chart_view'), - # addstatic is the new URL -> need to update in templates re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/addstatic/(?P\d+)/$', views.workout_add_chart_view,name='workout_add_chart_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/addstatic/$',views.workout_add_chart_view,name='workout_add_chart_view'), @@ -552,8 +489,6 @@ urlpatterns = [ re_path(r'^garmin/files/',views.garmin_newfiles_ping,name='garmin_newfiles_ping'), re_path(r'^garmin/activities/',views.garmin_details_view,name='garmin_details_view'), re_path(r'^garmin/deregistration/',views.garmin_deregistration_view,name='garmin_deregistration_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/delete/$',login_required( -# views.workout_code_delete_view),name='workout_code_delete'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/smoothenpace/$',views.workout_smoothenpace_view,name='workout_smoothenpace_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/undosmoothenpace/$',views.workout_undo_smoothenpace_view,name='workout_undo_smoothenpace_view'), re_path(r'^workout/c2import/$',views.workout_c2import_view,name='workout_c2import_view'), @@ -568,7 +503,7 @@ urlpatterns = [ re_path(r'^workout/c2import/all/$',views.workout_getc2workout_all,name='workout_getc2workout_all'), re_path(r'^workout/c2import/all/(?P\d+)/$',views.workout_getc2workout_all,name='workout_getc2workout_all'), re_path(r'^workout/nkimport/$',views.workout_nkimport_view,name='workout_nkimport_view'), - re_path(r'^workout/nkimport/(?P\d+)/(?P\d+)/$',views.workout_nkimport_view,name='workout_nkimport_view'), + re_path(r'^workout/nkimport/(?P\d+)/(?P\d+)/$',views.workout_nkimport_view,name='workout_nkimport_view'), re_path(r'^workout/nkimport/all/$',views.workout_getnkworkout_all,name='workout_getnkworkout_all'), re_path(r'^workout/rp3import/(?P\d+)/$',views.workout_getrp3importview, name='workout_getrp3importview'), @@ -585,7 +520,6 @@ urlpatterns = [ re_path(r'^workout/runkeeperimport/user/(?P\d+)/$',views.workout_runkeeperimport_view,name='workout_runkeeperimport_view'), re_path(r'^workout/underarmourimport/user/(?P\d+)/$',views.workout_underarmourimport_view,name='workout_underarmourimport_view'), re_path(r'^workout/underarmourimport/$',views.workout_underarmourimport_view,name='workout_underarmourimport_view'), -# re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/deleteconfirm/$',views.workout_delete_confirm_view), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/c2uploadw/$',views.workout_c2_upload_view,name='workout_c2_upload_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/stravauploadw/$',views.workout_strava_upload_view,name='workout_strava_upload_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/recalcsummary/$',views.workout_recalcsummary_view,name='workout_recalcsummary_view'), @@ -701,8 +635,6 @@ urlpatterns = [ re_path(r'^brochure/$',TemplateView.as_view(template_name='brochure.html'), name='brochure'), re_path(r'^developers', TemplateView.as_view(template_name='developers.html'),name='about'), -# re_path(r'^compatibility', TemplateView.as_view(template_name='compatibility.html'),name='about'), -# re_path(r'^videos', TemplateView.as_view(template_name='videos.html'),name='videos'), re_path(r'^analysis/user/(?P\d+)/$', views.analysis_view,name='analysis'), re_path(r'^laboratory/$', views.laboratory_view,name='laboratory_view'), re_path(r'^laboratory/user/(?P\d+)/$', views.laboratory_view,name='laboratory_view'), @@ -728,8 +660,6 @@ urlpatterns = [ re_path(r'^planrequired/',views.planrequired_view,name='planrequired_view'), re_path(r'^starttrial/$',views.start_trial_view,name='start_trial_view'), re_path(r'^startplantrial/$',views.start_plantrial_view,name='start_plantrial_view'), -# re_path(r'^planmembership', TemplateView.as_view(template_name='planmembership.html'),name='planmembership'), - # re_path(r'^paypaltest', TemplateView.as_view(template_name='paypaltest.html'),name='paypaltest'), re_path(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'), re_path(r'^register/$',views.rower_register_view,name='rower_register_view'), re_path(r'^coachregister/$',views.freecoach_register_view,name='freecoach_register_view'), @@ -742,8 +672,6 @@ urlpatterns = [ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchart/(?P\w+.*)/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchart/$',views.workout_flexchart3_view,name='workout_flexchart3_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/flexchartstacked/$',views.workout_flexchart_stacked_view,name='workout_flexchart_stacked_view'), -# re_path(r'^workout/compare/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P[\w\ ]+.*)/(?P[\w\ ]+.*)/$',views.workout_comparison_view2), -# re_path(r'^workout/compare/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P[\w\ ]+.*)/$',views.workout_comparison_view2), re_path(r'^test\_callback',views.rower_process_testcallback,name='rower_process_testcallback'), re_path(r'^createplan/$',views.rower_create_trainingplan,name='rower_create_trainingplan'), re_path(r'^createplan/user/(?P\d+)/$',views.rower_create_trainingplan,name='rower_create_trainingplan'), @@ -835,12 +763,6 @@ urlpatterns = [ re_path(r'^sessions/create/user/(?P\d+)/$', views.plannedsession_create_view, name='plannedsession_create_view'), -# re_path(r'^sessions/create/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$', -# views.plannedsession_create_view, -# name='plannedsession_create_view'), -# re_path(r'^sessions/create/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$', -# views.plannedsession_create_view, -# name='plannedsession_create_view'), re_path(r'^sessions/multiclone/$',views.plannedsession_multiclone_view,name='plannedsession_multiclone_view'), re_path(r'^sessions/multiclone/user/(?P\d+)/$', views.plannedsession_multiclone_view, @@ -918,19 +840,11 @@ urlpatterns = [ name='plannedsessions_view'), re_path(r'^sessions/user/(?P\d+)/$',views.plannedsessions_view, name='plannedsessions_view'), -# re_path(r'^sessions/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$', -# views.plannedsessions_view, -# name='plannedsessions_view'), -# re_path(r'^sessions/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$', -# views.plannedsessions_view, -# name='plannedsessions_view'), re_path(r'^courses/(?P\d+)/edit/$',views.course_edit_view, name='course_edit_view'), re_path(r'^courses/(?P\d+)/delete/$',views.course_delete_view,name='course_delete_view'), re_path(r'^courses/(?P\d+)/downloadkml/$',views.course_kmldownload_view, name='course_kmldownload_view'), -# re_path(r'^courses/(?P\d+)/replace/$',views.course_replace_view, -# name='course_replace_view'), re_path(r'^courses/(?P\d+)/$',views.course_view,name='course_view'), re_path(r'^standards/(?P\d+)/$',views.standard_view,name='standard_view'), re_path(r'^standards/(?P\d+)/download/$',views.standards_download_view, @@ -938,7 +852,6 @@ urlpatterns = [ re_path(r'^standards/(?P\d+)/deactivate/$',views.standard_deactivate_view, name='standard_deactivate_view'), re_path(r'^courses/(?P\d+)/map/$',views.course_map_view,name='course_map_view'), - # URLS to be created re_path(r'^help/$',TemplateView.as_view(template_name='help.html'), name='help'), re_path(r'^workout/api/upload/',views.workout_upload_api,name='workout_upload_api'), re_path(r'^access/share/$',views.createShareURL, name="sharedURL"), @@ -955,5 +868,3 @@ if settings.DEBUG: re_path(r'^c2listug/(?P\d+)/$',views.c2listdebug_view), re_path(r'^c2listug/$',views.c2listdebug_view), ] - -#urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 5111cd9d..848b1820 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -891,7 +891,7 @@ def analysis_view_data(request,userid=0): is_ajax = request_is_ajax(request) if settings.TESTING: is_ajax = True - if not is_ajax: + if not is_ajax: # pragma: no cover url = reverse('analysis_new') return HttpResponseRedirect(url) @@ -906,7 +906,14 @@ def analysis_view_data(request,userid=0): workouts = [] - ids = options['ids'] + try: + ids = options['ids'] + except KeyError: # pragma: no cover + return JSONResponse({ + "script":'', + "div":'No data found' + }) + function = options['function'] if not ids: # pragma: no cover @@ -1574,7 +1581,7 @@ def create_marker_workouts_view(request,userid=0, url = reverse('goldmedalscores_view', kwargs={ - 'userid':userid, + 'userid':request.user.id, }) return HttpResponseRedirect(url) @@ -1596,7 +1603,7 @@ def goldmedalscores_view(request,userid=0, if form.is_valid(): startdate = form.cleaned_data['startdate'] enddate = form.cleaned_data['enddate'] - if startdate > enddate: + if startdate > enddate: # pragma: no cover s = enddate enddate = startdate startdate = s @@ -1623,7 +1630,7 @@ def goldmedalscores_view(request,userid=0, } ] - if is_ajax: + if is_ajax: # pragma: no cover response = json.dumps({ 'script':script, 'div':div, @@ -1710,7 +1717,7 @@ def performancemanager_view(request,userid=0,mode='rower', } ] - if is_ajax: + if is_ajax: # pragma: no cover response = json.dumps({ 'script':script, 'div':thediv, @@ -1738,409 +1745,6 @@ def performancemanager_view(request,userid=0,mode='rower', }) -@user_passes_test(isplanmember,login_url="/rowers/paidplans", - message="This functionality requires a Coach or Self-Coach plan", - redirect_field_name=None) -@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True) -def fitness_from_cp_view(request,userid=0,mode='rower', - startdate=timezone.now()-timezone.timedelta(days=365), - enddate=timezone.now()): - - - - therower = getrequestrower(request,userid=userid) - theuser = therower.user - - kfitness = 42 - kfatigue = 7 - fitnesstest = 20 - metricchoice = 'trimp' - modelchoice = 'tsb' - usegoldmedalstandard = False - - # temp fit parameters - k1 = 1 - k2 = 1 - p0 = 100. - - if request.method == 'POST': - form = FitnessFitForm(request.POST) - if form.is_valid(): - startdate = form.cleaned_data['startdate'] - enddate = form.cleaned_data['enddate'] - mode = form.cleaned_data['mode'] - kfitness = form.cleaned_data['kfitness'] - kfatigue = form.cleaned_data['kfatigue'] - fitnesstest = form.cleaned_data['fitnesstest'] - metricchoice = form.cleaned_data['metricchoice'] - # temporary manual "fit" parameters - k1 = form.cleaned_data['k1'] - k2 = form.cleaned_data['k2'] - p0 = form.cleaned_data['p0'] - modelchoice = form.cleaned_data['modelchoice'] - usegoldmedalstandard = form.cleaned_data['usegoldmedalstandard'] - else: - form = FitnessFitForm() - - workouts = Workout.objects.filter(user=therower,date__gte=startdate, - date__lte=enddate, - workouttype__in=mytypes.rowtypes, - duplicate=False) - - - - script,thediv = fitnessfit_chart( - workouts,theuser, - workoutmode=mode,startdate=startdate, - enddate=enddate, - kfitness=kfitness, - kfatigue=kfatigue, - fitnesstest=fitnesstest, - metricchoice=metricchoice, - k1=k1,k2=k2,p0=p0, - modelchoice=modelchoice, - usegoldmedalstandard=usegoldmedalstandard, - ) - - breadcrumbs = [ - { - 'url':'/rowers/analysis', - 'name':'Analysis' - }, - { - 'url':reverse('fitnessmetric_view'), - 'name': 'Power Progress' - } - ] - - - return render(request,'fitnessfit.html', - { - 'rower':therower, - 'active':'nav-analysis', - 'chartscript':script, - 'breadcrumbs':breadcrumbs, - 'the_div':thediv, - 'mode':mode, - 'form':form, - }) - - -# Show ranking distances including predicted paces -@login_required() -@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True) -def rankings_view(request,userid=0, - startdate=timezone.now()-datetime.timedelta(days=365), - enddate=timezone.now(), - deltadays=-1, - startdatestring="", - enddatestring=""): - - if deltadays>0: - startdate = enddate-datetime.timedelta(days=int(deltadays)) - - if startdatestring != "": - startdate = iso8601.parse_date(startdatestring) - - if enddatestring != "": - enddate = iso8601.parse_date(enddatestring) - - if enddate < startdate: - s = enddate - enddate = startdate - startdate = s - - - - promember=0 - r = getrequestrower(request,userid=userid) - theuser = r.user.id - - if r.birthdate: - age = calculate_age(r.birthdate) - worldclasspower = int(c2stuff.getagegrouprecord( - age, - sex=r.sex, - weightcategory=r.weightcategory, - )) - else: - worldclasspower = None - - result = request.user.is_authenticated and ispromember(request.user) - if result: - promember=1 - - # get all indoor rows in date range - - # process form - if request.method == 'POST' and "daterange" in request.POST: - dateform = DateRangeForm(request.POST) - deltaform = DeltaDaysForm(request.POST) - if dateform.is_valid(): - startdate = dateform.cleaned_data['startdate'] - enddate = dateform.cleaned_data['enddate'] - if startdate > enddate: - s = enddate - enddate = startdate - startdate = s - elif request.method == 'POST' and "datedelta" in request.POST: - deltaform = DeltaDaysForm(request.POST) - if deltaform.is_valid(): - deltadays = deltaform.cleaned_data['deltadays'] - if deltadays: - enddate = timezone.now() - startdate = enddate-datetime.timedelta(days=deltadays) - if startdate > enddate: - s = enddate - enddate = startdate - startdate = s - dateform = DateRangeForm(initial={ - 'startdate': startdate, - 'enddate': enddate, - }) - else: - dateform = DateRangeForm() - deltaform = DeltaDaysForm() - - else: - dateform = DateRangeForm(initial={ - 'startdate': startdate, - 'enddate': enddate, - }) - deltaform = DeltaDaysForm() - - # get all 2k (if any) - this rower, in date range - try: - r = getrower(theuser) - except Rower.DoesNotExist: - allergworkouts = [] - r=0 - - - try: - uu = User.objects.get(id=theuser) - except User.DoesNotExist: - uu = '' - - - # test to fix bug - startdate = datetime.datetime.combine(startdate,datetime.time()) - enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59)) - #enddate = enddate+datetime.timedelta(days=1) - startdate = arrow.get(startdate).datetime - enddate = arrow.get(enddate).datetime - - thedistances = [] - theworkouts = [] - thesecs = [] - - rankingdistances.sort() - rankingdurations.sort() - - for rankingdistance in rankingdistances: - - workouts = Workout.objects.filter( - user=r,distance=rankingdistance, - workouttype__in=['rower','dynamic','slides'], - rankingpiece=True, - startdatetime__gte=startdate, - startdatetime__lte=enddate - ).order_by('duration') - if workouts: - thedistances.append(rankingdistance) - theworkouts.append(workouts[0]) - - timesecs = 3600*workouts[0].duration.hour - timesecs += 60*workouts[0].duration.minute - timesecs += workouts[0].duration.second - timesecs += 1.e-6*workouts[0].duration.microsecond - - thesecs.append(timesecs) - - for rankingduration in rankingdurations: - - workouts = Workout.objects.filter( - user=r,duration=rankingduration, - workouttype='rower', - rankingpiece=True, - startdatetime__gte=startdate, - startdatetime__lte=enddate - ).order_by('-distance') - if workouts: - thedistances.append(workouts[0].distance) - theworkouts.append(workouts[0]) - - timesecs = 3600*workouts[0].duration.hour - timesecs += 60*workouts[0].duration.minute - timesecs += workouts[0].duration.second - timesecs += 1.e-5*workouts[0].duration.microsecond - - thesecs.append(timesecs) - - thedistances = np.array(thedistances) - thesecs = np.array(thesecs) - - thevelos = thedistances/thesecs - theavpower = 2.8*(thevelos**3) - - - # create interactive plot - if len(thedistances) !=0 : - res = interactive_cpchart( - r,thedistances,thesecs,theavpower, - theworkouts,promember=promember - ) - script = res[0] - div = res[1] - paulslope = res[2] - paulintercept = res[3] - p1 = res[4] - message = res[5] - else: - script = '' - div = '

No ranking pieces found.

' - paulslope = 1 - paulintercept = 1 - p1 = [1,1,1,1] - message = "" - - - if request.method == 'POST' and "piece" in request.POST: - form = PredictedPieceForm(request.POST) - if form.is_valid(): - value = form.cleaned_data['value'] - hourvalue,value = divmod(value,60) - if hourvalue >= 24: - hourvalue = 23 - pieceunit = form.cleaned_data['pieceunit'] - if pieceunit == 'd': - rankingdistances.append(value) - else: - rankingdurations.append(datetime.time(minute=int(value),hour=int(hourvalue))) - else: - form = PredictedPieceForm() - - rankingdistances.sort() - rankingdurations.sort() - - - predictions = [] - cpredictions = [] - - - for rankingdistance in rankingdistances: - # Paul's model - p = paulslope*np.log10(rankingdistance)+paulintercept - velo = 500./p - t = rankingdistance/velo - pwr = 2.8*(velo**3) - a = {'distance':rankingdistance, - 'duration':timedeltaconv(t), - 'pace':timedeltaconv(p), - 'power':int(pwr)} - predictions.append(a) - - # CP model - - pwr2 = p1[0]/(1+t/p1[2]) - pwr2 += p1[1]/(1+t/p1[3]) - - if pwr2 <= 0: - pwr2 = 50. - - velo2 = (pwr2/2.8)**(1./3.) - - if np.isnan(velo2) or velo2 <= 0: - velo2 = 1.0 - - t2 = rankingdistance/velo2 - - pwr3 = p1[0]/(1+t2/p1[2]) - pwr3 += p1[1]/(1+t2/p1[3]) - - if pwr3 <= 0: - pwr3 = 50. - - velo3 = (pwr3/2.8)**(1./3.) - if np.isnan(velo3) or velo3 <= 0: - velo3 = 1.0 - - t3 = rankingdistance/velo3 - p3 = 500./velo3 - - a = {'distance':rankingdistance, - 'duration':timedeltaconv(t3), - 'pace':timedeltaconv(p3), - 'power':int(pwr3)} - cpredictions.append(a) - - - - - for rankingduration in rankingdurations: - t = 3600.*rankingduration.hour - t += 60.*rankingduration.minute - t += rankingduration.second - t += rankingduration.microsecond/1.e6 - - # Paul's model - ratio = paulintercept/paulslope - - u = ((2**(2+ratio))*(5.**(3+ratio))*t*np.log(10))/paulslope - - d = 500*t*np.log(10.) - d = d/(paulslope*lambertw(u)) - d = d.real - - velo = d/t - p = 500./velo - pwr = 2.8*(velo**3) - a = {'distance':int(d), - 'duration':timedeltaconv(t), - 'pace':timedeltaconv(p), - 'power':int(pwr)} - predictions.append(a) - - # CP model - pwr = p1[0]/(1+t/p1[2]) - pwr += p1[1]/(1+t/p1[3]) - - if pwr <= 0: - pwr = 50. - - velo = (pwr/2.8)**(1./3.) - - if np.isnan(velo) or velo <=0: - velo = 1.0 - - d = t*velo - p = 500./velo - a = {'distance':int(d), - 'duration':timedeltaconv(t), - 'pace':timedeltaconv(p), - 'power':int(pwr)} - cpredictions.append(a) - - - messages.error(request,message) - return render(request, 'rankings.html', - {'rankingworkouts':theworkouts, - 'interactiveplot':script, - 'the_div':div, - 'predictions':predictions, - 'cpredictions':cpredictions, - 'nrdata':len(thedistances), - 'form':form, - 'rower':r, - 'active':'nav-analysis', - 'dateform':dateform, - 'deltaform':deltaform, - 'worldclasspower':worldclasspower, - 'id': theuser, - 'theuser':uu, - 'startdate':startdate, - 'enddate':enddate, - 'teams':get_my_teams(request.user), - }) @login_required() def ajax_agegrouprecords(request, @@ -2189,16 +1793,16 @@ def rankings_view2(request,userid=0, startdatestring="", enddatestring=""): - if deltadays>0: + if deltadays>0: # pragma: no cover startdate = enddate-datetime.timedelta(days=int(deltadays)) - if startdatestring != "": + if startdatestring != "": # pragma: no cover startdate = iso8601.parse_date(startdatestring) - if enddatestring != "": + if enddatestring != "": # pragma: no cover enddate = iso8601.parse_date(enddatestring) - if enddate < startdate: + if enddate < startdate: # pragma: no cover s = enddate enddate = startdate startdate = s @@ -2228,7 +1832,7 @@ def rankings_view2(request,userid=0, pass try: userid = options['userid'] - except KeyError: + except KeyError: # pragma: no cover userid = 0 else: options = {} @@ -2243,7 +1847,7 @@ def rankings_view2(request,userid=0, if str(userid) != str(theuser) or deltatime_seconds > 3600: recalc = True options['lastupdated'] = arrow.utcnow().isoformat() - else: + else: # pragma: no cover recalc = False options['userid'] = theuser.id @@ -2295,7 +1899,7 @@ def rankings_view2(request,userid=0, s = enddate enddate = startdate startdate = s - elif request.method == 'POST' and "datedelta" in request.POST: + elif request.method == 'POST' and "datedelta" in request.POST: # pragma: no cover deltaform = DeltaDaysForm(request.POST) if deltaform.is_valid(): deltadays = deltaform.cleaned_data['deltadays'] @@ -2420,7 +2024,7 @@ def rankings_view2(request,userid=0, message = "" - if request.method == 'POST' and "piece" in request.POST: + if request.method == 'POST' and "piece" in request.POST: # pragma: no cover form = PredictedPieceForm(request.POST) if form.is_valid(): value = form.cleaned_data['value'] @@ -2451,7 +2055,7 @@ def rankings_view2(request,userid=0, pwr = 2.8*(velo**3) try: pwr = int(pwr) - except (ValueError, AttributeError): + except (ValueError, AttributeError): # pragma: no cover pwr = 0 a = {'distance':rankingdistance, @@ -2464,12 +2068,12 @@ def rankings_view2(request,userid=0, pwr2 = p1[0]/(1+t/p1[2]) pwr2 += p1[1]/(1+t/p1[3]) - if pwr2 <= 0: + if pwr2 <= 0: # pragma: no cover pwr2 = 50. velo2 = (pwr2/2.8)**(1./3.) - if np.isnan(velo2) or velo2 <= 0: + if np.isnan(velo2) or velo2 <= 0: # pragma: no cover velo2 = 1.0 t2 = rankingdistance/velo2 @@ -2477,7 +2081,7 @@ def rankings_view2(request,userid=0, pwr3 = p1[0]/(1+t2/p1[2]) pwr3 += p1[1]/(1+t2/p1[3]) - if pwr3 <= 0: + if pwr3 <= 0: # pragma: no cover pwr3 = 50. velo3 = (pwr3/2.8)**(1./3.) @@ -2520,19 +2124,19 @@ def rankings_view2(request,userid=0, 'pace':timedeltaconv(p), 'power':int(pwr)} predictions.append(a) - except: + except: # pragma: no cover pass # CP model pwr = p1[0]/(1+t/p1[2]) pwr += p1[1]/(1+t/p1[3]) - if pwr <= 0: + if pwr <= 0: # pragma: no cover pwr = 50. velo = (pwr/2.8)**(1./3.) - if np.isnan(velo) or velo <=0: + if np.isnan(velo) or velo <=0: # pragma: no cover velo = 1.0 d = t*velo @@ -2595,253 +2199,6 @@ def rankings_view2(request,userid=0, }) -# Show ranking distances including predicted paces -@user_passes_test(ispromember,login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) -@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True) -def otwrankings_view(request,userid=0, - startdate=timezone.now()-datetime.timedelta(days=365), - enddate=timezone.now(), - startdatestring="", - enddatestring=""): - - if startdatestring != "": - try: - startdate = iso8601.parse_date(startdatestring) - except ParseError: - pass - - if enddatestring != "": - try: - enddate = iso8601.parse_date(enddatestring) - except ParseError: - pass - - if enddate < startdate: - s = enddate - enddate = startdate - startdate = s - - r = getrequestrower(request,userid=userid) - promember = True - - theuser = r.user - - # get all OTW rows in date range - - # process form - if request.method == 'POST': - dateform = DateRangeForm(request.POST) - if dateform.is_valid(): - startdate = dateform.cleaned_data['startdate'] - enddate = dateform.cleaned_data['enddate'] - if startdate > enddate: - s = enddate - enddate = startdate - startdate = s - form = PredictedPieceFormNoDistance(request.POST) - if form.is_valid(): - value = form.cleaned_data['value'] - else: - value = None - trankingdurations = form.cleaned_data['trankingdurations'] - trankingdurations = [ - datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations - ] - if value: - hourvalue,tvalue = divmod(value,60) - hourvalue = int(hourvalue) - minutevalue = int(tvalue) - tvalue = int(60*(tvalue-minutevalue)) - if hourvalue >= 24: - hourvalue = 23 - trankingdurations.append(datetime.time( - minute=minutevalue, - hour=hourvalue, - second=tvalue - )) - - else: - form = PredictedPieceFormNoDistance() - dateform = DateRangeForm(initial={ - 'startdate': startdate, - 'enddate': enddate, - }) - workouttypes = ['rower','slides','dynamic'] - trankingdurations = rankingdurations - - # get all 2k (if any) - this rower, in date range - try: - r = Rower.objects.get(user=theuser) - request.session['rowerid'] = r.id - except Rower.DoesNotExist: - raise Http404("Rower doesn't exist") - - - - uu = theuser - - - # test to fix bug - startdate = datetime.datetime.combine(startdate,datetime.time()) - enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59)) - #enddate = enddate+datetime.timedelta(days=1) - - startdate = arrow.get(startdate).datetime - enddate = arrow.get(enddate).datetime - - thedistances = [] - theworkouts = [] - thesecs = [] - - theworkouts = Workout.objects.filter( - user=r,rankingpiece=True, - workouttype__in=mytypes.otwtypes, - startdatetime__gte=startdate, - startdatetime__lte=enddate - ).order_by( - "-startdatetime" - ) - - delta,cpvalue,avgpower = dataprep.fetchcp(r,theworkouts) - - runningjob = 0 - - taskstatus = get_stored_tasks_status(request) - for task in taskstatus: - if task['func_name'] == 'updatecpwater': - if 'success' in task['status'].lower() or 'finished' in task['status'].lower(): - runningjob = 1 - messages.info(request,'CP chart data have been updated') - remove_asynctask(request,task['id']) - elif 'fail' in task['status'].lower(): - runningjob = 0 - try: - remove_asynctask(request,task[id]) - messages.error(request,'Oh, your task failed') - except KeyError: - pass - elif 'started' in task['status'].lower(): - messages.info(request,'Busy updating CP chart data') - runningjob = 1 - elif 'queued' in task['status'].lower() or 'pending' in task['status'].lower(): - messages.info(request,'Getting ready to update CP chart data') - runningjob = 1 - - - - if not runningjob: - job = dataprep.runcpupdate( - r,type='water', - startdate=startdate, - enddate=enddate - ) - request.session['job_id'] = job.id - try: - request.session['async_tasks'] += [(job.id,'updatecpwater')] - except KeyError: - request.session['async_tasks'] = [(job.id,'updatecpwater')] - messages.info(request,'New calculation queued. Page will reload automatically. You can check the status of your calculations here') - - powerdf = pd.DataFrame({ - 'Delta':delta, - 'CP':cpvalue, - 'workout':pd.Series(), - }) - - if powerdf.empty: - messages.info(request,'Your calculations are running in the background. Page will reload automatically. You can check the status of your calculations here') - - powerdf = powerdf[powerdf['CP']>0] - powerdf.dropna(axis=0,inplace=True) - powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True) - powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True) - - - rowername = r.user.first_name+" "+r.user.last_name - # create interactive plot - if len(powerdf) !=0 : - res = interactive_otwcpchart(powerdf,promember=promember,rowername=rowername) - script = res[0] - div = res[1] - p1 = res[2] - ratio = res[3] - r.p0 = p1[0] - r.p1 = p1[1] - r.p2 = p1[2] - r.p3 = p1[3] - r.cpratio = ratio - r.save() - paulslope = 1 - paulintercept = 1 - message = res[4] - else: - script = '' - div = '

No ranking pieces found.

' - paulslope = 1 - paulintercept = 1 - p1 = [1,1,1,1] - message = "" - - - - - cpredictions = [] - - for rankingduration in trankingdurations: - t = 3600.*rankingduration.hour - t += 60.*rankingduration.minute - t += rankingduration.second - t += rankingduration.microsecond/1.e6 - - - # CP model - pwr = p1[0]/(1+t/p1[2]) - pwr += p1[1]/(1+t/p1[3]) - - - if pwr <= 0: - pwr = 50. - - - if not np.isnan(pwr): - try: - pwr2 = pwr*ratio - except: - pwr2 = pwr - - a = { - 'duration':timedeltaconv(t), - 'power':int(pwr), - 'upper':int(pwr2)} - cpredictions.append(a) - - - - startdatestring = startdate.strftime('%Y-%m-%d') - enddatestring = enddate.strftime('%Y-%m-%d') - request.session['startdate'] = startdatestring - request.session['enddate'] = enddatestring - - messages.error(request,message) - return render(request, 'otwrankings.html', - {'rankingworkouts':theworkouts, - 'interactiveplot':script, - 'the_div':div, - 'cpredictions':cpredictions, - 'rower':r, - 'active':'nav-analysis', - 'avgpower':avgpower, - 'form':form, - 'dateform':dateform, - 'id': theuser, - 'theuser':uu, - 'startdate':startdate, - 'enddate':enddate, - 'teams':get_my_teams(request.user), - 'workouttype':'water', - }) @login_required() def otecp_toadmin_view(request,theuser=0, @@ -2987,343 +2344,6 @@ def otwcp_toadmin_view(request,theuser=0, return response -# Show ranking distances including predicted paces -@user_passes_test(ispromember,login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) -@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True) -def oterankings_view(request,userid=0, - startdate=timezone.now()-datetime.timedelta(days=365), - enddate=timezone.now(), - startdatestring="", - enddatestring=""): - - if startdatestring != "": - try: - startdate = iso8601.parse_date(startdatestring) - except ParseError: - pass - - if enddatestring != "": - try: - enddate = iso8601.parse_date(enddatestring) - except ParseError: - pass - - if enddate < startdate: - s = enddate - enddate = startdate - startdate = s - - r = getrequestrower(request,userid=userid) - theuser = r.user - - - promember=0 - - # get all OTW rows in date range - - # process form - if request.method == 'POST': - dateform = DateRangeForm(request.POST) - if dateform.is_valid(): - startdate = dateform.cleaned_data['startdate'] - enddate = dateform.cleaned_data['enddate'] - if startdate > enddate: - s = enddate - enddate = startdate - startdate = s - workouttypeform = OteWorkoutTypeForm(request.POST) - if workouttypeform.is_valid(): - workouttypes = workouttypeform.cleaned_data['workouttypes'] - form = PredictedPieceForm(request.POST) - if form.is_valid(): - value = form.cleaned_data['value'] - pieceunit = form.cleaned_data['pieceunit'] - else: - value = None - - try: - trankingdistances = form.cleaned_data['trankingdistances'] - except KeyError: - trankingdistances = [] - - trankingdistances = [int(d) for d in trankingdistances] - - try: - trankingdurations = form.cleaned_data['trankingdurations'] - except KeyError: - trankingdurations = [] - - trankingdurations = [ - datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations - ] - if value: - hourvalue,tvalue = divmod(value,60) - hourvalue = int(hourvalue) - minutevalue = int(tvalue) - tvalue = int(60*(tvalue-minutevalue)) - if hourvalue >= 24: - hourvalue = 23 - if pieceunit == 'd': - trankingdistances.append(value) - else: - trankingdurations.append(datetime.time( - minute=minutevalue, - hour=hourvalue, - second=tvalue - )) - else: - form = PredictedPieceForm() - dateform = DateRangeForm(initial={ - 'startdate': startdate, - 'enddate': enddate, - }) - workouttypeform = OteWorkoutTypeForm() - workouttypes = ['rower','slides','dynamic'] - trankingdistances = rankingdistances - trankingdurations = rankingdurations - - # get all 2k (if any) - this rower, in date range - try: - r = Rower.objects.get(user=theuser) - request.session['rowerid'] = r.id - except Rower.DoesNotExist: - allergworkouts = [] - raise Http404("Rower doesn't exist") - - - uu = theuser - - - - # test to fix bug - startdate = datetime.datetime.combine(startdate,datetime.time()) - enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59)) - - startdate = arrow.get(startdate).datetime - enddate = arrow.get(enddate).datetime - - thedistances = [] - theworkouts = [] - thesecs = [] - - theworkouts = Workout.objects.filter( - user=r,rankingpiece=True, - workouttype__in=workouttypes, - startdatetime__gte=startdate, - startdatetime__lte=enddate - ).order_by("-startdatetime") - - - delta,cpvalue,avgpower = dataprep.fetchcp( - r,theworkouts,table='cpergdata' - ) - - runningjob = 0 - - taskstatus = get_stored_tasks_status(request) - for task in taskstatus: - if task['func_name'] == 'updatecp': - if 'success' in task['status'].lower() or 'finished' in task['status'].lower(): - runningjob = 1 - messages.info(request,'CP chart data have been updated') - remove_asynctask(request,task['id']) - elif 'fail' in task['status'].lower(): - runningjob = 0 - try: - remove_asynctask(request,task[id]) - messages.error(request,'Oh, your task failed') - except KeyError: - pass - elif 'started' in task['status'].lower(): - messages.info(request,'Busy updating CP chart data') - runningjob = 1 - elif 'queued' in task['status'].lower(): - messages.info(request,'Getting ready to update CP chart data') - runningjob = 1 - - - if not runningjob: - job = dataprep.runcpupdate( - r,type='rower', - startdate=startdate, - enddate=enddate - ) - request.session['job_id'] = job.id - try: - request.session['async_tasks'] += [(job.id,'updatecp')] - except KeyError: - request.session['async_tasks'] = [(job.id,'updatecp')] - messages.info(request,'New calculation queued. Page will reload automatically. You can check the status of your calculations here') - - powerdf = pd.DataFrame({ - 'Delta':delta, - 'CP':cpvalue, - }) - - if powerdf.empty: - messages.info(request,'Your calculations are running in the background. Page will reload automatically. You can check the status of your calculations here') - - powerdf = powerdf[powerdf['CP']>0] - powerdf.dropna(axis=0,inplace=True) - powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True) - powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True) - - rowername = r.user.first_name+" "+r.user.last_name - # create interactive plot - if len(powerdf) !=0 : - res = interactive_otwcpchart(powerdf,promember=promember,rowername=rowername) - script = res[0] - div = res[1] - p1 = res[2] - ratio = res[3] - r.ep0 = p1[0] - r.ep1 = p1[1] - r.ep2 = p1[2] - r.ep3 = p1[3] - r.ecpratio = ratio - r.save() - paulslope = 1 - paulintercept = 1 - message = res[4] - else: - ratio = 1 - script = '' - div = '

No ranking pieces found.

' - paulslope = 1 - paulintercept = 1 - p1 = [1,1,1,1] - message = "" - - - - - - cpredictions = [] - - - - for rankingduration in trankingdurations: - t = 3600.*rankingduration.hour - t += 60.*rankingduration.minute - t += rankingduration.second - t += rankingduration.microsecond/1.e6 - - - # CP model - pwr = p1[0]/(1+t/p1[2]) - pwr += p1[1]/(1+t/p1[3]) - - velo = (pwr/2.8)**(1./3.) - p = 500./velo - d = t*velo - - if pwr <= 0: - pwr = 50. - - - if not np.isnan(pwr): - try: - pwr2 = pwr*ratio - except: - pwr2 = pwr - - a = collections.OrderedDict() - a['duration'] = timedeltaconv(t) - a['distance'] = int(d) - a['pace'] = timedeltaconv(p) - a['power'] = int(pwr) - a['upper'] = int(pwr2) - - cpredictions.append(a) - - - # initiation - get 10 min power, then use Paul's law - - t_10 = 600. - power_10 = p1[0]/(1+t_10/p1[2]) - power_10 += p1[1]/(1+t_10/p1[3]) - - velo_10 = (power_10/2.8)**(1./3.) - pace_10 = 500./velo_10 - distance_10 = t_10*velo_10 - - paulslope = 5. - - for rankingdistance in trankingdistances: - - delta = paulslope * np.log(rankingdistance/distance_10)/np.log(2) - - - p = pace_10+delta - velo = 500./p - t = rankingdistance/velo - - pwr2 = p1[0]/(1+t/p1[2]) - pwr2 += p1[1]/(1+t/p1[3]) - try: - pwr2 *= ratio - except UnboundLocalError: - pass - - if pwr2 <= 0: - pwr2 = 50. - - velo2 = (pwr2/2.8)**(1./3.) - - if np.isnan(velo2) or velo2 <= 0: - velo2 = 1.0 - - t2 = rankingdistance/velo2 - - pwr3 = p1[0]/(1+t2/p1[2]) - pwr3 += p1[1]/(1+t2/p1[3]) - pwr3 *= ratio - - - if pwr3 <= 0: - pwr3 = 50. - - velo3 = (pwr3/2.8)**(1./3.) - if np.isnan(velo3) or velo3 <= 0: - velo3 = 1.0 - - t3 = rankingdistance/velo3 - p3 = 500./velo3 - - a = { - 'distance':rankingdistance, - 'duration':timedeltaconv(t3), - 'power':'--', - 'upper':int(pwr3), - 'pace':timedeltaconv(p3)} - - cpredictions.append(a) - - # del form.fields["pieceunit"] - - - messages.error(request,message) - return render(request, 'oterankings.html', - {'rankingworkouts':theworkouts, - 'interactiveplot':script, - 'the_div':div, - 'rower':r, - 'active':'nav-analysis', - 'cpredictions':cpredictions, - 'avgpower':avgpower, - 'form':form, - 'dateform':dateform, - 'workouttypeform':workouttypeform, - 'id': theuser, - 'theuser':uu, - 'startdate':startdate, - 'enddate':enddate, - 'teams':get_my_teams(request.user), - 'workouttype':'rower', - }) - # Multi Flex Chart with Grouping diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 5fc3c2b9..69a036a8 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -836,14 +836,14 @@ def workout_getnkworkout_all(request): @login_required() @permission_required('rower.is_coach',fn=get_user_by_userid, raise_exception=True) -def workout_nkimport_view(request,userid=0,startTime=0,endTime=0): +def workout_nkimport_view(request,userid=0,after=0,before=0): r = getrequestrower(request,userid=userid) try: thetoken = nk_open(request.user) except NoTokenError: return HttpResponseRedirect("/rowers/me/nkauthorize/") - res = nkstuff.get_nk_workout_list(request.user,startTime=startTime,endTime=endTime) + res = nkstuff.get_nk_workout_list(request.user,before=before,after=after) if (res.status_code != 200): if (res.status_code == 401):