Private
Public Access
1
0

Merge branch 'release/v18.8.5'

This commit is contained in:
Sander Roosendaal
2022-11-02 15:51:41 +01:00
7 changed files with 161 additions and 2 deletions

View File

@@ -2729,6 +2729,7 @@ class PlannedSession(models.Model):
dct = trainingparser.parsetodict(self.interval_string) dct = trainingparser.parsetodict(self.interval_string)
dct = [item for item in dct if item['value'] != 0] dct = [item for item in dct if item['value'] != 0]
dct = trainingparser.tofitdict(dct) dct = trainingparser.tofitdict(dct)
for step in dct['steps']: for step in dct['steps']:
try: try:
step['targetValue'] = int(step['targetValue']) step['targetValue'] = int(step['targetValue'])

View File

@@ -169,6 +169,68 @@ aweekago = timezone.now()-timedelta(days=7)
today = timezone.now() today = timezone.now()
a_week_from_now = timezone.now()+timedelta(days=7) 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): def get_rojabo_workout_list(user,startdate=aweekago,enddate=a_week_from_now):
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
if (r.rojabo_token == '') or (r.rojabo_token is None): # pragma: no cover 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') 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) response = requests.get(url, headers=headers)

View File

@@ -734,6 +734,9 @@ def mocked_requests(*args, **kwargs):
with open('rowers/tests/testdata/c2_timezone.json','r') as infile: with open('rowers/tests/testdata/c2_timezone.json','r') as infile:
c2timezoneworkoutdata = json.load(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: with open('rowers/tests/testdata/c2_timezone2.json','r') as infile:
c2timezoneworkoutdata2 = json.load(infile) c2timezoneworkoutdata2 = json.load(infile)
@@ -1045,6 +1048,9 @@ def mocked_requests(*args, **kwargs):
return MockResponse(jsonresponse,200) return MockResponse(jsonresponse,200)
if 'rojabo' in args[0]:
return MockResponse(rojabodata, 200)
polartester = re.compile(r'.*?polaraccesslink\.com') polartester = re.compile(r'.*?polaraccesslink\.com')
polarremotetester = re.compile(r'.*?polarremote\.com') polarremotetester = re.compile(r'.*?polarremote\.com')

View File

@@ -66,6 +66,7 @@ from mock import Mock, patch
import pandas as pd import pandas as pd
import rowers.c2stuff as c2stuff import rowers.c2stuff as c2stuff
import rowers.sporttracksstuff as sporttracksstuff import rowers.sporttracksstuff as sporttracksstuff
import rowers.rojabo_stuff as rojabo_stuff
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy

View File

@@ -21,11 +21,64 @@ import urllib
import json import json
import rowers.utils as utils import rowers.utils as utils
import rowers.rojabo_stuff as rojabo_stuff
from django.db import transaction from django.db import transaction
import rowers.garmin_stuff as gs 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 @pytest.mark.django_db
@override_settings(TESTING=True) @override_settings(TESTING=True)
class GarminObjects(DjangoTestCase): class GarminObjects(DjangoTestCase):

View File

@@ -1062,7 +1062,7 @@ def workout_rojaboimport_view(request, message="", userid=0):
if (res.status_code != 200): # pragma: no cover if (res.status_code != 200): # pragma: no cover
if (res.status_code == 401): if (res.status_code == 401):
r = getrower(request.user) 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" s = "Token doesn't exist. Need to authorize"
return HttpResponseRedirect("/rowers/me/rojaboauthorize/") return HttpResponseRedirect("/rowers/me/rojaboauthorize/")
message = "Something went wrong in workout_rojaboimport_view" 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.rower.add(r)
ps.tags.add('ROJABO') ps.tags.add('ROJABO')
ps.save() 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)) messages.info(request,'Saved planned session {id}'.format(id=ps.id))
except KeyError: except KeyError:
pass pass

View File

@@ -5,5 +5,8 @@ DATABASES = {
'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'HOST': 'localhost', 'HOST': 'localhost',
'USER': '',
'PORT': 1,
'PASSWORD': 'aap'
}, },
} }