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 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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
@@ -230,9 +230,9 @@ urlpatterns = [
|
||||
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+)/$',
|
||||
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+.*)/$',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<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/$',views.fitness_metric_view,name='fitness_metric_view'),
|
||||
re_path(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<distance>\d+)m/$',
|
||||
views.agegrouprecordview,name='agegrouprecordview'),
|
||||
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',
|
||||
})
|
||||
|
||||
@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)
|
||||
|
||||
@@ -107,7 +107,7 @@ MIDDLEWARE = [
|
||||
'tz_detect.middleware.TimezoneMiddleware',
|
||||
'rowers.middleware.SurveyMiddleWare',
|
||||
'rowers.middleware.GDPRMiddleWare',
|
||||
'rowers.middleware.PowerTimeFitnessMetricMiddleWare',
|
||||
# 'rowers.middleware.PowerTimeFitnessMetricMiddleWare',
|
||||
'rowers.middleware.RowerPlanMiddleWare',
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user