diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 6bd2a38d..6cb34ded 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -25,7 +25,7 @@ from rowsandall_app.settings import ( C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET ) -from rowers.tasks import handle_c2_import_stroke_data +from rowers.tasks import handle_c2_import_stroke_data, handle_c2_sync import django_rq queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') @@ -859,7 +859,7 @@ def default(o): raise TypeError # Uploading workout -def workout_c2_upload(user,w): +def workout_c2_upload(user,w,async=False): message = 'trying C2 upload' try: if mytypes.c2mapping[w.workouttype] is None: @@ -888,25 +888,34 @@ def workout_c2_upload(user,w): 'Content-Type': 'application/json'} import urllib url = "https://log.concept2.com/api/users/%s/results" % (c2userid) - response = requests.post(url,headers=headers,data=json.dumps(data,default=default)) + if not async: + response = requests.post(url,headers=headers,data=json.dumps(data,default=default)) - if (response.status_code == 409 ): - message = "Concept2 Duplicate error" - w.uploadedtoc2 = -1 - c2id = -1 - w.save() - elif (response.status_code == 201 or response.status_code == 200): - # s= json.loads(response.text) - s = response.json() - c2id = s['data']['id'] - w.uploadedtoc2 = c2id - w.save() - message = "Upload to Concept2 was successful" + + if (response.status_code == 409 ): + message = "Concept2 Duplicate error" + w.uploadedtoc2 = -1 + c2id = -1 + w.save() + elif (response.status_code == 201 or response.status_code == 200): + # s= json.loads(response.text) + s = response.json() + c2id = s['data']['id'] + w.uploadedtoc2 = c2id + w.save() + message = "Upload to Concept2 was successful" + else: + message = "Something went wrong in workout_c2_upload_view. Response code 200/201 but C2 sync failed: "+response.text + c2id = 0 else: - message = "Something went wrong in workout_c2_upload_view. Response code 200/201 but C2 sync failed: "+response.text + job = myqueue(queue, + handle_c2_sync, + w.id, + url, + headers, + json.dumps(data,default=default)) c2id = 0 - return message,c2id # This is token refresh. Looks for tokens in our database, then refreshes diff --git a/rowers/dataprep.py b/rowers/dataprep.py index ca5839b4..1cd31583 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -806,6 +806,20 @@ def paceformatsecs(values): return out +def update_c2id_sql(id,c2id): + engine = create_engine(database_url, echo=False) + table = 'rowers_workout' + + query = "UPDATE %s SET uploadedtoc2 = %s WHERE `id` = %s;" % (table,c2id,id) + + with engine.connect() as conn, conn.begin(): + result = conn.execute(query) + + conn.close() + engine.dispose() + + return 1 + def fitnessmetric_to_sql(m,table='powertimefitnessmetric',debug=False): engine = create_engine(database_url, echo=False) columns = ', '.join(m.keys()) @@ -1087,7 +1101,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', message = None if title is None: title = 'Workout' - + powerperc = 100 * np.array([r.pw_ut2, r.pw_ut1, r.pw_at, diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index 15f66293..dd0bf35b 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -741,6 +741,20 @@ def getsmallrowdata_db(columns,ids=[],debug=False): return df +def update_c2id_sql(id,c2id): + engine = create_engine(database_url, echo=False) + table = 'rowers_workout' + + query = "UPDATE %s SET uploadedtoc2 = %s WHERE `id` = %s;" % (table,c2id,id) + + with engine.connect() as conn, conn.begin(): + result = conn.execute(query) + + conn.close() + engine.dispose() + + return 1 + def fitnessmetric_to_sql(m,table='powertimefitnessmetric',debug=False, doclean=False): # test if nan among values diff --git a/rowers/tasks.py b/rowers/tasks.py index c30a7f19..e694b3a7 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -75,7 +75,7 @@ def strip_tags(html): from rowers.dataprepnodjango import ( update_strokedata, new_workout_from_file, - getsmallrowdata_db, updatecpdata_sql, + getsmallrowdata_db, updatecpdata_sql,update_c2id_sql, update_agegroup_db,fitnessmetric_to_sql, add_c2_stroke_data_db,totaltime_sec_to_string, create_c2_stroke_data_db,update_empower, @@ -121,7 +121,18 @@ def add(x, y): return x + y +@app.task +def handle_c2_sync(workoutid,url,headers,data,debug=True,**kwargs): + response = requests.post(url,headers=headers,data=data) + if response.status_code not in [200,201]: + return 0 + s = response.json() + c2id = s['data']['id'] + + res = update_c2id_sql(workoutid,c2id) + + return res @app.task def handle_c2_import_stroke_data(c2token, diff --git a/rowers/uploads.py b/rowers/uploads.py index 0cd3c43b..a48361e7 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -24,6 +24,7 @@ import argparse import yamllint from subprocess import call import re +import sys from verbalexpressions import VerEx @@ -524,10 +525,12 @@ def do_sync(w,options, quick=False): if ('upload_to_C2' in options and options['upload_to_C2']) or (w.user.c2_auto_export and ispromember(w.user.user)): try: - message,id = c2stuff.workout_c2_upload(w.user.user,w) + message,id = c2stuff.workout_c2_upload(w.user.user,w,async=True) except NoTokenError: id = 0 message = "Something went wrong with the Concept2 sync" + except: + pass if ('upload_to_Strava' in options and upload_to_strava) or (w.user.strava_auto_export and ispromember(w.user.user)): try: diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 9a4f3239..e2d462e4 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4500,11 +4500,10 @@ def workout_upload_api(request): w = Workout.objects.get(id=id) - uploads.do_sync(w,post_data,quick=True) - if make_plot: res, jobid = uploads.make_plot(r,w,f1,f2,plottype,t) + uploads.do_sync(w,post_data,quick=True) else: # form invalid if fstr: @@ -4529,7 +4528,6 @@ def workout_upload_api(request): } ) email_sent = send_confirm(r.user, t, link, '') - return JSONResponse(status=statuscode,data=message)