diff --git a/rowers/models.py b/rowers/models.py index 1ecccfac..53f5034d 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2729,6 +2729,7 @@ class PlannedSession(models.Model): dct = trainingparser.parsetodict(self.interval_string) dct = [item for item in dct if item['value'] != 0] dct = trainingparser.tofitdict(dct) + for step in dct['steps']: try: step['targetValue'] = int(step['targetValue']) diff --git a/rowers/rojabo_stuff.py b/rowers/rojabo_stuff.py index af3029b6..7f76195d 100644 --- a/rowers/rojabo_stuff.py +++ b/rowers/rojabo_stuff.py @@ -169,6 +169,68 @@ aweekago = timezone.now()-timedelta(days=7) today = timezone.now() a_week_from_now = timezone.now()+timedelta(days=7) +def stepsconvert(rojabo_steps, startid = 0, warmup = False, cooldown = False): + workout_steps = [] + for step in rojabo_steps: + durationtype = 'Time' + durationvalue = 10 + if step['duration_type'] == 'seconds': + durationvalue = 1000*step['duration_value'] # milliseconds + if step['duration_type'] == 'meters': + durationtype = 'Distance' + durationvalue = step['duration_value']*100 # centimeters + elif step['duration_type'] == 'strokes': + durationtype = 'Time' + try: + durationvalue = int(60.*step['duration_value']/step['stroke_rate']) + except TypeError: + try: + durationvalue = step['time']*1000 + except KeyError: + durationvalue = 1000 + + intensity = 'Active' + if warmup: + intensity = 'Warmup' + if cooldown: + intensity = 'Cooldown' + targettype = 'Power' + targetvalue = step['target_value'] + if targetvalue is None: + targettype = 'Cadence' + targetvalue = step['stroke_rate'] + if targettype == 'Power': + targetvalue += 1000 + + if step['target_type'] == 'rest': + targettype = '' + intensity = 'Rest' + targetvalue = 0 + + description = step['description'] + + if step['stroke_rate'] is not None: + description = description +' Stroke Rate {cadence} SPM'.format( + cadence = step['stroke_rate'] + ) + + newstep = { + 'stepId': startid, + 'wkt_step_name': step['id'], + 'durationType': durationtype, + 'durationValue': durationvalue, + 'targetType': targettype, + 'targetValue': targetvalue, + 'intensity': intensity, + 'description': description + } + + startid += 1 + workout_steps.append(newstep) + + return workout_steps + + def get_rojabo_workout_list(user,startdate=aweekago,enddate=a_week_from_now): r = Rower.objects.get(user=user) if (r.rojabo_token == '') or (r.rojabo_token is None): # pragma: no cover @@ -190,7 +252,7 @@ def get_rojabo_workout_list(user,startdate=aweekago,enddate=a_week_from_now): date2 = enddate.strftime('%Y-%m-%d') - url = ROJABO_OAUTH_LOCATION+'api/v1/training_sessions?from={date1}&to={date2}'.format(date1=date1,date2=date2) + url = ROJABO_OAUTH_LOCATION+'api/v2/training_sessions?from={date1}&to={date2}'.format(date1=date1,date2=date2) response = requests.get(url, headers=headers) diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 4e8bfc34..89ac6292 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -734,6 +734,9 @@ def mocked_requests(*args, **kwargs): with open('rowers/tests/testdata/c2_timezone.json','r') as infile: c2timezoneworkoutdata = json.load(infile) + with open('rowers/tests/testdata/rojabolist.json','r') as infile: + rojabodata = json.load(infile) + with open('rowers/tests/testdata/c2_timezone2.json','r') as infile: c2timezoneworkoutdata2 = json.load(infile) @@ -1045,6 +1048,9 @@ def mocked_requests(*args, **kwargs): return MockResponse(jsonresponse,200) + if 'rojabo' in args[0]: + return MockResponse(rojabodata, 200) + polartester = re.compile(r'.*?polaraccesslink\.com') polarremotetester = re.compile(r'.*?polarremote\.com') diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index eae18b4b..aa4821ea 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -66,6 +66,7 @@ from mock import Mock, patch import pandas as pd import rowers.c2stuff as c2stuff import rowers.sporttracksstuff as sporttracksstuff +import rowers.rojabo_stuff as rojabo_stuff from django.urls import reverse, reverse_lazy diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index 6ef6c6e0..5534ea5d 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -21,11 +21,64 @@ import urllib import json import rowers.utils as utils +import rowers.rojabo_stuff as rojabo_stuff from django.db import transaction import rowers.garmin_stuff as gs +@pytest.mark.django_db +@override_settings(TESTING=True) +class RojaboObjects(DjangoTestCase): + def setUp(self): + self.c = Client() + self.u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + + self.u.first_name = 'John' + self.u.last_name = 'Sander' + self.u.save() + self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.r.rojabo_token = '12' + self.r.rojabo_refreshtoken = 'ab' + self.r.rojabo_tokenexpirydate = arrow.get(datetime.datetime.now()+datetime.timedelta(days=1)).datetime + self.r.defaulttimezone = 'Europe/Prague' + self.r.rowerplan = 'plan' + self.r.save() + self.c.login(username='john',password='koeinsloot') + + self.nu = datetime.datetime.now() + + @patch('rowers.rojabo_stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.rojabo_stuff.requests.post', side_effect=mocked_requests) + def test_rojabo_import(self, mock_get, mock_post): + url = '/rowers/session/rojaboimport/' + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + form_data = { + 'csrfmiddlewaretoken': ['xalRrf8y7P2Hhobges9QC4aKCWg4l06gexDc8g2DeuVExgadfk4YhV8oSE1Yu43U'], + 'sessions': ['Import selected sessions'], + 'sessionid': ['862172'] + } + + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code,200) + + pss = PlannedSession.objects.filter(manager=self.r.user) + self.assertEqual(pss.count(),1) + + ps = pss[0] + self.assertEqual(ps.approximate_duration,57) + + self.assertEqual(len(ps.steps['steps']),20) + + @pytest.mark.django_db @override_settings(TESTING=True) class GarminObjects(DjangoTestCase): diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 0dea2569..6d7b2a65 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1062,7 +1062,7 @@ def workout_rojaboimport_view(request, message="", userid=0): if (res.status_code != 200): # pragma: no cover if (res.status_code == 401): r = getrower(request.user) - if (r.stravatoken == '') or (r.stravatoken is None): + if (r.rojabo_token == '') or (r.rojabo_token is None): s = "Token doesn't exist. Need to authorize" return HttpResponseRedirect("/rowers/me/rojaboauthorize/") message = "Something went wrong in workout_rojaboimport_view" @@ -1111,6 +1111,39 @@ def workout_rojaboimport_view(request, message="", userid=0): ps.rower.add(r) ps.tags.add('ROJABO') ps.save() + # get steps if there are any + steps = [] + try: + steps = steps+rojabo_stuff.stepsconvert( + item['warm_up']['steps'], + warmup=True + ) + except KeyError: + pass + try: + steps = steps + rojabo_stuff.stepsconvert( + item['primary']['steps'], + startid=len(steps) + ) + except KeyError: + pass + try: + steps = steps + rojabo_stuff.stepsconvert( + item['cool_down']['steps'], + cooldown=True, + startid=len(steps)) + except KeyError: + pass + + if steps: + ps.steps = { + 'name':'', + 'sport':'rowing', + 'filename':'', + 'steps': steps, + } + ps.save() + messages.info(request,'Saved planned session {id}'.format(id=ps.id)) except KeyError: pass diff --git a/rowsandall_app/settings_test.py b/rowsandall_app/settings_test.py index d4fb60ff..554fc568 100644 --- a/rowsandall_app/settings_test.py +++ b/rowsandall_app/settings_test.py @@ -5,5 +5,8 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'HOST': 'localhost', + 'USER': '', + 'PORT': 1, + 'PASSWORD': 'aap' }, }