diff --git a/rowers/tasks.py b/rowers/tasks.py index 8605656b..be750f6f 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -66,21 +66,6 @@ from rowers.utils import deserialize_list,ewmovingaverage,wavg from rowers.emails import htmlstrip from rowers import mytypes -#from HTMLParser import HTMLParser -from html.parser import HTMLParser -class MLStripper(HTMLParser): - def __init__(self): - self.reset() - self.fed = [] - def handle_data(self, d): - self.fed.append(d) - def get_data(self): - return ''.join(self.fed) - -def strip_tags(html): - s = MLStripper() - s.feed(html) - return s.get_data() from rowers.dataprepnodjango import ( @@ -166,22 +151,18 @@ def handle_sporttracks_sync(workoutid,url,headers,data,debug=False,**kwargs): res = update_workout_field_sql(workoutid,'uploadedtosporttracks',id,debug=debug) + return 1 + @app.task def handle_runkeeper_sync(workoutid,url,headers,data,debug=False,**kwargs): response = requests.post(url,headers=headers,data=data) if response.status_code not in [200,201]: return 0 - try: - t = response.json() - except JSONDecodeError: - return 0 + uri = response.headers["Location"] - uri = t['uris'][0] - regex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/(\d+)\.json$' - m = re.compile(regex).match(uri).group(1) - - id = int(m) + tester = re.compile('^\/fitnessActivities\/(\d+)$') + id = int(tester.match(uri).group(1)) res = update_workout_field_sql(workoutid,'uploadedtorunkeeper',id,debug=debug) diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index a1a50614..8c040096 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -190,7 +190,7 @@ def mocked_videodata(*args, **kwargs): data = df .to_dict() df = pd.read_csv('rowers/tests/testdata/testvideodata_metrics.csv') metrics = OrderedDict(df.to_dict()) - + maxtime = 3282.4 return data, metrics, maxtime diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index edb30faa..1170cae6 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -53,6 +53,8 @@ from mock import Mock, patch #from minimocktest import MockTestCase import pandas as pd import rowers.c2stuff as c2stuff +import rowers.sporttracksstuff as sporttracksstuff +import rowers.runkeeperstuff as runkeeperstuff from django.urls import reverse, reverse_lazy diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index c1e2c9f3..b99d4823 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -8,6 +8,106 @@ from rowers.mytypes import rowtypes nu = datetime.datetime.now() +from rowers import tasks + +# asynchronous tasks +class AsyncTaskTests(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() + + result = get_random_file(filename='rowers/tests/testdata/onwater2.csv') + + self.wwater = WorkoutFactory(user=self.r, + csvfilename=result['filename'], + starttime=result['starttime'], + startdatetime=result['startdatetime'], + duration=result['duration'], + distance=result['totaldist'], + workouttype = 'water', + ) + + def test_safetimedelta(self): + x = 5 + y = tasks.safetimedelta(x) + self.assertEqual(datetime.timedelta(seconds=5),y) + + x = np.nan + y = tasks.safetimedelta(x) + self.assertEqual(datetime.timedelta(seconds=0),y) + + @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + def test_c2_sync(self, mock_get, mock_post): + authorizationstring = str('Bearer aap') + headers = {'Authorization': authorizationstring, + 'user-agent': 'sanderroosendaal', + 'Content-Type': 'application/json'} + + data = c2stuff.createc2workoutdata(self.wwater) + + url = "https://log.concept2.com/api/users/%s/results" % (1) + res = tasks.handle_c2_sync(1,url,headers,data) + self.assertEqual(res,1) + + + + @patch('rowers.sporttracksstuff.requests.post', side_effect=mocked_requests) + @patch('rowers.sporttracksstuff.requests.get', side_effect=mocked_requests) + def test_sporttracks_sync(self, mock_get, mock_post): + authorizationstring = str('Bearer aap') + headers = {'Authorization': authorizationstring, + 'user-agent': 'sanderroosendaal', + 'Content-Type': 'application/json'} + + url = "https://api.sporttracks.mobi/api/v2/fitnessActivities.json" + + data = sporttracksstuff.createsporttracksworkoutdata(self.wwater) + + + res = tasks.handle_sporttracks_sync(1,url,headers,json.dumps(data,default=sporttracksstuff.default)) + self.assertEqual(res,1) + + @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests) + @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests) + def test_runkeeper_sync(self, mock_get, mock_post): + authorizationstring = str('Bearer aap') + headers = {'Authorization': authorizationstring, + 'user-agent': 'sanderroosendaal', + 'Content-Type': 'application/vnd.com.runkeeper.NewFitnessActivity+json', + 'Content-Length':'nnn'} + + url = "https://api.runkeeper.com/fitnessActivities" + + data = runkeeperstuff.createrunkeeperworkoutdata(self.wwater) + + + res = tasks.handle_runkeeper_sync(1,url,headers,json.dumps(data,default=sporttracksstuff.default)) + self.assertEqual(res,1) + + @patch('rowers.c2stuff.requests.post',side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.get',side_effect=mocked_requests) + def test_import_c2_strokedata(self, mock_get, mock_post): + c2token = 'aap' + c2id = 1212 + workoutid = 1 + starttimeunix = 121 + csvfilename = self.wwater.csvfilename + + res = tasks.handle_c2_import_stroke_data(c2token,c2id,workoutid,starttimeunix,csvfilename) + self.assertEqual(res,1) # interactive plots from rowers import interactiveplots diff --git a/rowers/tests/viewnames.csv b/rowers/tests/viewnames.csv index f918c67a..41c2180d 100644 --- a/rowers/tests/viewnames.csv +++ b/rowers/tests/viewnames.csv @@ -3,7 +3,6 @@ 1,1,rower_update_empower_view,updates old Empower Oarlock files (corrects Power bug),TRUE,302,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 2,2,agegroupcpview,needs age,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 3,4,ajax_agegrouprecords,gets age group records from C2 ,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -4,5,fitness_metric_view,updates a person's fitness metric,TRUE,302,basic,302,302,FALSE,403,302,FALSE,403,403,FALSE,FALSE,FALSE,TRUE,TRUE, 5,6,agegrouprecordview,shows ergo age group records,TRUE,200,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 6,7,workouts_view,workouts list,TRUE,302,basic,200,302,basic,200,403,coach,200,403,FALSE,TRUE,FALSE,TRUE,TRUE, 7,8,virtualevents_view,virtual races list,TRUE,200,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, diff --git a/rowers/urls.py b/rowers/urls.py index c7525dcd..eb80de1d 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -230,9 +230,9 @@ 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'^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/$', diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 2fbf8d59..4b9a031f 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -784,48 +784,6 @@ def addmanual_view(request,raceid=0): 'active':'nav-workouts', }) -@login_required() -def fitness_metric_view(request,mode='rower',days=42): - r = getrower(request.user) - startdate = timezone.now()-datetime.timedelta(days=days) - - # test if not something already done - ms = PowerTimeFitnessMetric.objects.filter(user=request.user) - if not ms: - url = reverse('workouts_view') - return HttpResponseRedirect(url) - - max_workout_id = max([m.last_workout for m in ms]) - last_update_date = max([m.date.strftime('%Y-%m-%d') for m in ms]) - - - now_date = timezone.now().strftime('%Y-%m-%d') - - - if mode == 'rower': - workouts = Workout.objects.filter( - user=r, - workouttype__in=['rower','dynamic','slides'], - startdatetime__gte=startdate) - else: - workouts = Workout.objects.filter( - user=r, - workouttype__in=['water','coastal'], - startdatetime__gte=startdate) - - theids = [int(w.id) for w in workouts] - max_id = max(theids) - - if last_update_date >= now_date or max_workout_id >= max_id: - return HttpResponse("already done today or no new workouts") - - - job = myqueue(queue, - handle_updatefitnessmetric, - request.user.id,mode,theids, - ) - - return HttpResponse("job queued") @permission_required('workout.change_workout',fn=get_workout_by_opaqueid,raise_exception=True) diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 0591ee09..1f9f0298 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -107,7 +107,7 @@ MIDDLEWARE = [ 'tz_detect.middleware.TimezoneMiddleware', 'rowers.middleware.SurveyMiddleWare', 'rowers.middleware.GDPRMiddleWare', - 'rowers.middleware.PowerTimeFitnessMetricMiddleWare', +# 'rowers.middleware.PowerTimeFitnessMetricMiddleWare', 'rowers.middleware.RowerPlanMiddleWare', ]