From 5437ff6e2f5c6dbfcf2a4cd803508cb1c6b0effe Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 24 May 2021 21:56:23 +0200 Subject: [PATCH] adding update wps to upload routine --- rowers/dataprep.py | 44 ++++++++++++++++++++++++-- rowers/tasks.py | 27 ++++++++++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 0 -> 4001 bytes 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 4b934b05..859f6072 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -28,7 +28,7 @@ from rowingdata import ( from rowers.tasks import ( handle_sendemail_unrecognized,handle_setcp, - handle_getagegrouprecords + handle_getagegrouprecords, handle_update_wps ) from rowers.tasks import handle_zip_file @@ -1263,6 +1263,44 @@ def setcp(workout,background=False,recurrance=True): return pd.DataFrame({'delta':[],'cp':[]}),pd.Series(dtype='float'),pd.Series(dtype='float') +def update_wps(r,types,mode='water',asynchron=True): + firstdate = datetime.date.today()-datetime.timedelta(days=r.cprange) + workouts = Workout.objects.filter( + date__gte=firstdate, + workouttype__in=types, + user = r + ) + + ids = [w.id for w in workouts] + if asynchron: + job = myqueue( + queue, + handle_update_wps, + r.id, + types, + ids, + mode + ) + + df = getsmallrowdata_db(['time','driveenergy'],ids=ids) + + try: + mask = df['driveenergy'] > 100 + except KeyError: + return False + wps_median = int(df.loc[mask,'driveenergy'].median()) + + if mode == 'water': + r.median_wps = wps_median + else: + r.median_wps_erg = wps_median + + r.save() + + return True + + + def update_rolling_cp(r,types,mode='water'): firstdate = datetime.date.today()-datetime.timedelta(days=r.cprange) workouts = Workout.objects.filter( @@ -1801,6 +1839,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', isbreakthrough, ishard = checkbreakthrough(w, r) marker = check_marker(w) + result = update_wps(r,mytypes.otwtypes) + result = update_wps(r,mytypes.otetypes) job = myqueue(queuehigh,handle_calctrimp,w.id,f2,r.ftp,r.sex,r.hrftp,r.max,r.rest) @@ -2436,7 +2476,7 @@ def getsmallrowdata_db(columns, ids=[], doclean=True,workstrokesonly=True,comput #df = dd.read_parquet(f,columns=columns,engine='pyarrow') df = pd.read_parquet(f,columns=columns) data.append(df) - except OSError: # pragma: no cover + except (OSError,ArrowInvalid): # pragma: no cover rowdata, row = getrowdata(id=id) if rowdata and len(rowdata.df): datadf = dataprep(rowdata.df,id=id,bands=True,otwpower=True,barchart=True) diff --git a/rowers/tasks.py b/rowers/tasks.py index d8f24c01..11bb4c3b 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -2797,6 +2797,33 @@ def add2(x, y,debug=False,**kwargs): # pragma: no cover graphql_url = "https://rp3rowing-app.com/graphql" +@app.task +def handle_update_wps(rid,types,ids,mode,debug=False,**kwargs): + df = getsmallrowdata_db(['time','driveenergy'],ids=ids) + try: + mask = df['driveenergy'] > 100 + except KeyError: + return 0 + wps_median = int(df.loc[mask,'driveenergy'].median()) + + if mode == 'water': + query = "UPDATE `rowers_rower` SET `median_wps` = '%s' WHERE `id` = '%s'" % (wps_median,rid) + else: + query = "UPDATE `rowers_rower` SET `median_wps_erg` = '%s' WHERE `id` = '%s'" % (wps_median,rid) + + if debug: # pragma: no cover + engine = create_engine(database_url_debug, echo=False) + else: + engine = create_engine(database_url, echo=False) + + with engine.connect() as conn, conn.begin(): + result = conn.execute(query) + + conn.close() + engine.dispose() + + return wps_median + @app.task def handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,max_attempts,debug=False,**kwargs): headers = {'Authorization': 'Bearer ' + rp3token } diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz new file mode 100644 index 0000000000000000000000000000000000000000..fa880cf2aa52519ac22ffdcf6fe15abea0934da1 GIT binary patch literal 4001 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 H#DD<+YYarf literal 0 HcmV?d00001