From 2bc277bebab475fe4c18b906d9f13d19bfaf56c3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 11 Mar 2020 17:55:07 +0100 Subject: [PATCH 1/4] adding runkeeper, fixing sporttracks bugs --- rowers/runkeeperstuff.py | 12 +++++++++++- rowers/sporttracksstuff.py | 9 ++++++++- rowers/tasks.py | 15 +++++++++++++++ rowers/uploads.py | 2 +- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/rowers/runkeeperstuff.py b/rowers/runkeeperstuff.py index 4b2b3322..3e047be4 100644 --- a/rowers/runkeeperstuff.py +++ b/rowers/runkeeperstuff.py @@ -7,6 +7,12 @@ from __future__ import unicode_literals, absolute_import from rowers.imports import * import re +import django_rq +queue = django_rq.get_queue('default') +queuelow = django_rq.get_queue('low') +queuehigh = django_rq.get_queue('low') +from rowers.utils import myqueue + from rowers.rower_rules import is_workout_user from rowsandall_app.settings import ( @@ -276,7 +282,7 @@ def default(o): if isinstance(o, numpy.int64): return int(o) raise TypeError -def workout_runkeeper_upload(user,w): +def workout_runkeeper_upload(user,w,asynchron=False): message = "Uploading to Runkeeper" rkid = 0 @@ -301,6 +307,10 @@ def workout_runkeeper_upload(user,w): 'Content-Length':'nnn'} url = "https://api.runkeeper.com/fitnessActivities" + if asynchron: + job = myqueue(queue,handle_runkeeper_sync, + w.id,url,headers,json.dumps(data,default=default)) + return "Asynchronous sync",0 response = requests.post(url,headers=headers,data=json.dumps(data,default=default)) # check for duplicate error first diff --git a/rowers/sporttracksstuff.py b/rowers/sporttracksstuff.py index 9f3210a9..2facc764 100644 --- a/rowers/sporttracksstuff.py +++ b/rowers/sporttracksstuff.py @@ -8,6 +8,12 @@ from __future__ import unicode_literals, absolute_import import numpy +import django_rq +queue = django_rq.get_queue('default') +queuelow = django_rq.get_queue('low') +queuehigh = django_rq.get_queue('low') +from rowers.utils import myqueue + from rowers.imports import * import re from rowsandall_app.settings import ( @@ -280,7 +286,8 @@ def workout_sporttracks_upload(user,w,asynchron=False): url = "https://api.sporttracks.mobi/api/v2/fitnessActivities.json" if asynchron: - job = myqueue(w.id,url,headers,json.dumps(data,default=default)) + job = myqueue(queue,handle_sporttracks_sync, + w.id,url,headers,json.dumps(data,default=default)) return "Asynchronous sync",0 response = requests.post(url,headers=headers,data=json.dumps(data,default=default)) diff --git a/rowers/tasks.py b/rowers/tasks.py index 6a46da89..0e93b257 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -151,6 +151,21 @@ def handle_sporttracks_sync(workoutid,url,headers,data,debug=False,**kwargs): res = update_workout_field_sql(workoutid,'uploadedtosporttracks',id,debug=debug) +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 + + t = response.json() + uri = t['uris'][0] + regex = '.*?sporttracks\.mobi\/api\/v2\/fitnessActivities/(\d+)\.json$' + m = re.compile(regex).match(uri).group(1) + + id = int(m) + + res = update_workout_field_sql(workoutid,'uploadedtorunkeeper',id,debug=debug) + @app.task diff --git a/rowers/uploads.py b/rowers/uploads.py index 0d4f3c29..7992b0c1 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -555,7 +555,7 @@ def do_sync(w,options, quick=False): if ('upload_to_RunKeeper' in options and options['upload_to_RunKeeper']) or (w.user.runkeeper_auto_export and ispromember(w.user.user)): try: message,id = runkeeperstuff.workout_runkeeper_upload( - w.user.user,w + w.user.user,w,asynchron=True, ) except NoTokenError: message = "Please connect to Runkeeper first" From adc1c5fbd5bd46fba2e56835af890e0ee058c6a7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 15 Mar 2020 17:10:45 +0100 Subject: [PATCH 2/4] team messages --- rowers/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/tasks.py b/rowers/tasks.py index 0e93b257..0a0c1354 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -2192,7 +2192,7 @@ def handle_sendemail_message(email,fromemail,rowername,message,teamname,managern fullemail = email subject = 'New message from team ' + teamname - from_email = fromemail + from_email = 'Rowsandall ' d = { 'rowername':rowername, From 3039abbeafe046248b7c6f61f2492597f2168420 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 15 Mar 2020 20:29:00 +0100 Subject: [PATCH 3/4] new group members automatically get the new sessions --- rowers/teams.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rowers/teams.py b/rowers/teams.py index aa1c8903..42c57406 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -42,7 +42,7 @@ from rowers.tasks import ( handle_sendemail_message, ) -from rowers.models import ValidationError +from rowers.models import ValidationError, PlannedSession # Low level functions - to be called by higher level methods @@ -133,6 +133,11 @@ def add_member(id,rower): res = handle_add_workouts_team(ws,t) + # code to add plannedsessions + plannedsessions = PlannedSession.objects.filter(team=t) + for ps in plannedsessions: + res = ps.rower.add(rower) + # set_teamplanexpires(rower) return (id,'Member added') From 3c9cc516c7171847c8077481e5fc05b10487da77 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 15 Mar 2020 20:35:57 +0100 Subject: [PATCH 4/4] adding date filter on sessions --- rowers/teams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/teams.py b/rowers/teams.py index 42c57406..1e591e3c 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -134,7 +134,7 @@ def add_member(id,rower): res = handle_add_workouts_team(ws,t) # code to add plannedsessions - plannedsessions = PlannedSession.objects.filter(team=t) + plannedsessions = PlannedSession.objects.filter(team=t,enddate__gte=timezone.now().date()) for ps in plannedsessions: res = ps.rower.add(rower)