import stuff tested in tasks
This commit is contained in:
@@ -66,21 +66,6 @@ from rowers.utils import deserialize_list,ewmovingaverage,wavg
|
|||||||
from rowers.emails import htmlstrip
|
from rowers.emails import htmlstrip
|
||||||
from rowers import mytypes
|
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 (
|
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)
|
res = update_workout_field_sql(workoutid,'uploadedtosporttracks',id,debug=debug)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
@app.task
|
@app.task
|
||||||
def handle_runkeeper_sync(workoutid,url,headers,data,debug=False,**kwargs):
|
def handle_runkeeper_sync(workoutid,url,headers,data,debug=False,**kwargs):
|
||||||
response = requests.post(url,headers=headers,data=data)
|
response = requests.post(url,headers=headers,data=data)
|
||||||
if response.status_code not in [200,201]:
|
if response.status_code not in [200,201]:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
try:
|
uri = response.headers["Location"]
|
||||||
t = response.json()
|
|
||||||
except JSONDecodeError:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
uri = t['uris'][0]
|
tester = re.compile('^\/fitnessActivities\/(\d+)$')
|
||||||
regex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/(\d+)\.json$'
|
id = int(tester.match(uri).group(1))
|
||||||
m = re.compile(regex).match(uri).group(1)
|
|
||||||
|
|
||||||
id = int(m)
|
|
||||||
|
|
||||||
res = update_workout_field_sql(workoutid,'uploadedtorunkeeper',id,debug=debug)
|
res = update_workout_field_sql(workoutid,'uploadedtorunkeeper',id,debug=debug)
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ def mocked_videodata(*args, **kwargs):
|
|||||||
data = df .to_dict()
|
data = df .to_dict()
|
||||||
df = pd.read_csv('rowers/tests/testdata/testvideodata_metrics.csv')
|
df = pd.read_csv('rowers/tests/testdata/testvideodata_metrics.csv')
|
||||||
metrics = OrderedDict(df.to_dict())
|
metrics = OrderedDict(df.to_dict())
|
||||||
|
|
||||||
maxtime = 3282.4
|
maxtime = 3282.4
|
||||||
|
|
||||||
return data, metrics, maxtime
|
return data, metrics, maxtime
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ from mock import Mock, patch
|
|||||||
#from minimocktest import MockTestCase
|
#from minimocktest import MockTestCase
|
||||||
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.runkeeperstuff as runkeeperstuff
|
||||||
|
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,106 @@ from rowers.mytypes import rowtypes
|
|||||||
|
|
||||||
|
|
||||||
nu = datetime.datetime.now()
|
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
|
# interactive plots
|
||||||
from rowers import interactiveplots
|
from rowers import interactiveplots
|
||||||
|
|||||||
@@ -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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
7,8,virtualevents_view,virtual races list,TRUE,200,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE,
|
||||||
|
|||||||
|
@@ -230,9 +230,9 @@ urlpatterns = [
|
|||||||
re_path(r'^agegroupcp/(?P<age>\d+)/(?P<normalize>\d+)/$',views.agegroupcpview,name='agegroupcpview'),
|
re_path(r'^agegroupcp/(?P<age>\d+)/(?P<normalize>\d+)/$',views.agegroupcpview,name='agegroupcpview'),
|
||||||
re_path(r'^ajax_agegroup/(?P<age>\d+)/(?P<weightcategory>\w+.*)/(?P<sex>\w+.*)/(?P<userid>\d+)/$',
|
re_path(r'^ajax_agegroup/(?P<age>\d+)/(?P<weightcategory>\w+.*)/(?P<sex>\w+.*)/(?P<userid>\d+)/$',
|
||||||
views.ajax_agegrouprecords,name='ajax_agegrouprecords'),
|
views.ajax_agegrouprecords,name='ajax_agegrouprecords'),
|
||||||
re_path(r'^updatefitness/(?P<mode>\w+.*)/(?P<days>\d+)/$',views.fitness_metric_view,name='fitness_metric_view'),
|
# re_path(r'^updatefitness/(?P<mode>\w+.*)/(?P<days>\d+)/$',views.fitness_metric_view,name='fitness_metric_view'),
|
||||||
re_path(r'^updatefitness/(?P<mode>\w+.*)/$',views.fitness_metric_view,name='fitness_metric_view'),
|
# re_path(r'^updatefitness/(?P<mode>\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/$',views.fitness_metric_view,name='fitness_metric_view'),
|
||||||
re_path(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<distance>\d+)m/$',
|
re_path(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<distance>\d+)m/$',
|
||||||
views.agegrouprecordview,name='agegrouprecordview'),
|
views.agegrouprecordview,name='agegrouprecordview'),
|
||||||
re_path(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<duration>\d+)min/$',
|
re_path(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<duration>\d+)min/$',
|
||||||
|
|||||||
@@ -784,48 +784,6 @@ def addmanual_view(request,raceid=0):
|
|||||||
'active':'nav-workouts',
|
'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)
|
@permission_required('workout.change_workout',fn=get_workout_by_opaqueid,raise_exception=True)
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ MIDDLEWARE = [
|
|||||||
'tz_detect.middleware.TimezoneMiddleware',
|
'tz_detect.middleware.TimezoneMiddleware',
|
||||||
'rowers.middleware.SurveyMiddleWare',
|
'rowers.middleware.SurveyMiddleWare',
|
||||||
'rowers.middleware.GDPRMiddleWare',
|
'rowers.middleware.GDPRMiddleWare',
|
||||||
'rowers.middleware.PowerTimeFitnessMetricMiddleWare',
|
# 'rowers.middleware.PowerTimeFitnessMetricMiddleWare',
|
||||||
'rowers.middleware.RowerPlanMiddleWare',
|
'rowers.middleware.RowerPlanMiddleWare',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user