From 3d62772ed2d4ef09477d9c1bf8356ae1d026bf42 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 11 Jul 2022 20:30:05 +0200 Subject: [PATCH] using models in tasks.py --- rowers/dataroutines.py | 6 +- rowers/models.py | 1 + rowers/tasks.py | 256 +++++++++---------------------- rowers/tests/test_async_tasks.py | 9 +- 4 files changed, 81 insertions(+), 191 deletions(-) diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 028fc100..cd3f82fc 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -784,7 +784,8 @@ def deletecpdata_sql(rower_id, table='cpdata'): # pragma: no cover with engine.connect() as conn, conn.begin(): try: _ = conn.execute(query) - except: + except Exception as e: + print(Exception, e) print("Database locked") conn.close() engine.dispose() @@ -1811,7 +1812,8 @@ def delete_agegroup_db(age, sex, weightcategory, debug=False): with engine.connect() as conn, conn.begin(): try: _ = conn.execute(query) - except: # pragma: no cover + except Exception as e: # pragma: no cover + print(Exception, e) print("Database locked") conn.close() engine.dispose() diff --git a/rowers/models.py b/rowers/models.py index 8225aa16..2e2bca95 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -555,6 +555,7 @@ def polygon_coord_center(polygon): def polygon_to_path(polygon): points = GeoPoint.objects.filter(polygon=polygon).order_by("order_in_poly") + s = [] for point in points: s.append([point.latitude, point.longitude]) diff --git a/rowers/tasks.py b/rowers/tasks.py index 56201f88..f6f062ad 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -11,7 +11,10 @@ except KeyError: from django.core.wsgi import get_wsgi_application application = get_wsgi_application() -from rowers.models import * +from rowers.models import ( + Workout, GeoPolygon, GeoPoint, GeoCourse, + VirtualRaceResult, CourseTestResult, Rower + ) import math from rowers.courseutils import ( @@ -51,7 +54,6 @@ from rowingdata import make_cumvalues from uuid import uuid4 from rowingdata import rowingdata as rdata from datetime import timedelta -from sqlalchemy import create_engine from rowers.celery import app from celery import shared_task @@ -296,7 +298,9 @@ def summaryfromsplitdata(splitdata, data, filename, sep='|', workouttype='rower' @app.task def handle_request_post(url, data, debug=False, **kwargs): # pragma: no cover - response = requests.post(url, data) + if 'localhost' in url: + url = 'http'+url[5:] + response = requests.post(url, data, verify=False) dologging('upload_api.log', data) dologging('upload_api.log', response.status_code) return response.status_code @@ -530,30 +534,7 @@ def getagegrouprecord(age, sex='male', weightcategory='hwt', return power -def polygon_to_path(polygon, debug=True): - pid = polygon[0] - query = "SELECT id, latitude, longitude FROM rowers_geopoint WHERE polygon_id = {pid}"\ - " ORDER BY order_in_poly ASC".format( - pid=pid) - if debug: - engine = create_engine(database_url_debug, echo=False) - else: # pragma: no cover - engine = create_engine(database_url, echo=False) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - points = result.fetchall() - - conn.close() - engine.dispose() - s = [] - - for point in points: - s.append([point[1], point[2]]) - - p = path.Path(s[:-1]) - - return p +from rowers.models import polygon_to_path @app.task(bind=True) @@ -639,25 +620,9 @@ def handle_check_race_course(self, rowdata = rowdata.resample('100ms', on='dt').mean() rowdata = rowdata.interpolate() - # initiate database engine + course = GeoCourse.objects.get(courseid) + polygons = course.polygons.all() - if debug: # pragma: no cover - engine = create_engine(database_url_debug, echo=False) - else: - engine = create_engine(database_url, echo=False) - - # get polygons - query = "SELECT id,name FROM rowers_geopolygon WHERE course_id = {courseid} ORDER BY order_in_course ASC".format( - courseid=courseid - ) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - polygons = result.fetchall() - - conn.close() - - engine.dispose() paths = [] for polygon in polygons: @@ -759,33 +724,25 @@ def handle_check_race_course(self, coursedistance = coursemeters velo = coursedistance/coursetimeseconds points = 100*(2.-referencespeed/velo) - query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 1,'\ - ' duration = "{duration}", distance = {distance},'\ - ' workoutid = {workoutid}, startsecond = {startsecond},'\ - ' endsecond = {endsecond}, points={points} WHERE id={recordid}'.format( - recordid=recordid, - duration=totaltime_sec_to_string(coursetimeseconds), - distance=int(coursemeters), - points=points, - workoutid=workoutid, - startsecond=startsecond, - endsecond=endsecond,) + record = VirtualRaceResult.objects.get(id=recordid) + record.duration = totaltime_sec_to_string(coursetimeseconds) + record.distance=int(coursemeters) + record.points = points + record.startsecond = startsecond + record.endsecond = endsecond + record.workoutid = workoutid + record.coursecompleted = 1 + record.save() if mode == 'coursetest': - query = 'UPDATE rowers_coursetestresult SET coursecompleted = 1,'\ - ' duration = "{duration}", distance = {distance},'\ - ' workoutid = {workoutid}, startsecond = {startsecond},'\ - ' endsecond = {endsecond}, points={points} WHERE id={recordid}'.format( - recordid=recordid, - duration=totaltime_sec_to_string(coursetimeseconds), - distance=int(coursemeters), - points=points, - workoutid=workoutid, - startsecond=startsecond, - endsecond=endsecond,) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) + record = CourseTestResult.objects.get(id=recordid) + record.duration = totaltime_sec_to_string(coursetimeseconds) + record.distance = int(coursemeters) + record.workoutid = workoutid + record.startsecond = startsecond + record.endsecond = endsecond + record.points = points + record.save() if summary: try: @@ -807,15 +764,10 @@ def handle_check_race_course(self, summary = row.allstats() row.write_csv(f1, gzip=True) + workout = Workout.objects.get(id=workoutid) + workout.summary = summary + workout.save() - query = "UPDATE `rowers_workout` SET `summary` = '%s' WHERE `id` = %s" % ( - summary, workoutid) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - - conn.close() - engine.dispose() if successemail: handle_sendemail_coursesucceed( @@ -827,36 +779,26 @@ def handle_check_race_course(self, return 1 else: # pragma: no cover - query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 0,'\ - ' duration = "{duration}", distance = {distance},'\ - ' workoutid = {workoutid}, startsecond = {startsecond},'\ - ' endsecond = {endsecond}, points={points} WHERE id={recordid}'.format( - recordid=recordid, - duration=totaltime_sec_to_string(0), - distance=0, - points=0.0, - workoutid=workoutid, - startsecond=startsecond, - endsecond=endsecond,) + record = VirtualRaceResult.object.get(id=recordid) + record.duration = totaltime_sec_to_string(0) + record.distance = 0 + record.workoutid = workoutid + record.startsecond = startsecond + record.endsecond = endsecond + record.points = 0 + record.save() if mode == 'coursetest': - query = 'UPDATE rowers_coursetestresult SET coursecompleted = 0,'\ - ' duration = "{duration}", distance = {distance}, workoutid = {workoutid}'\ - ', startsecond = {startsecond}, endsecond = {endsecond}'\ - ', points={points} WHERE id={recordid}'.format( - recordid=recordid, - duration=totaltime_sec_to_string(0), - distance=0, - points=0, - workoutid=workoutid, - startsecond=startsecond, - endsecond=endsecond,) + record = CourseTestResult.objects.get(id=recordid) + record.duration = totaltime_sec_to_string(0) + record.distance = 0 + record.workoutid = workoutid + record.startsecond = startsecond + record.endsecond = endsecond + record.points = 0 + record.save() - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - conn.close() - engine.dispose() # add times for all gates to log file with open(logfile, 'ab') as f: @@ -1109,10 +1051,7 @@ def handle_calctrimp(id, hrmax, hrmin, debug=False, **kwargs): - if debug: # pragma: no cover - engine = create_engine(database_url_debug, echo=False) - else: - engine = create_engine(database_url, echo=False) + tss = 0 normp = 0 @@ -1201,21 +1140,14 @@ def handle_calctrimp(id, if hrtss > 1000: # pragma: no cover hrtss = 0 - query = 'UPDATE rowers_workout SET rscore = {tss},'\ - ' normp = {normp}, trimp={trimp}, hrtss={hrtss},'\ - ' normv={normv}, normw={normw} WHERE id={id}'.format( - tss=int(tss), - normp=int(normp), - trimp=int(trimp), - hrtss=int(hrtss), - normv=normv, - normw=normw, - id=id,) - - with engine.connect() as conn, conn.begin(): - _ = conn.execute(query) - conn.close() - engine.dispose() + workout = Workout.objects.get(id=id) + workout.tss = int(tss) + workout.normp = int(normp) + workout.trimp = int(trimp) + workout.hrtss = int(hrtss) + workout.normv = normv + workout.normw = normw + workout.save() return 1 @@ -2857,23 +2789,13 @@ def handle_update_wps(rid, types, ids, mode, debug=False, **kwargs): except ValueError: # pragma: no cover return 0 + rower = Rower.objects.get(id=rid) if mode == 'water': - query = "UPDATE `rowers_rower` SET `median_wps` = '%s' WHERE `id` = '%s'" % ( - wps_median, rid) + rower.median_wps = wps_median else: - query = "UPDATE `rowers_rower` SET `median_wps_erg` = '%s' WHERE `id` = '%s'" % ( - wps_median, rid) + rower.median_wps_erg = wps_median - 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(): - _ = conn.execute(query) - - conn.close() - engine.dispose() + rower.save() return wps_median @@ -3022,23 +2944,8 @@ def handle_nk_async_workout(alldata, userid, nktoken, nkid, delaysec, defaulttim workoutid, error = add_workout_from_data(userid, nkid, data, df) # dologging('nklog.log','NK Workout ID {id}'.format(id=workoutid)) - - if debug: # pragma: no cover - engine = create_engine(database_url_debug, echo=False) - else: - engine = create_engine(database_url, echo=False) - - query = 'SELECT uploadedtonk from rowers_workout WHERE id ={workoutid}'.format( - workoutid=workoutid) - - newnkid = 0 - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - tdata = result.fetchall() - if tdata: - newnkid = tdata[0][0] - - conn.close() + workout = Workout.objects.get(id=workoutid) + newnkid = workout.uploadedtonk parkedids = [] try: @@ -3326,22 +3233,8 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, defaulttim workoutid = response.json()['id'] - if debug: # pragma: no cover - engine = create_engine(database_url_debug, echo=False) - else: - engine = create_engine(database_url, echo=False) - - query = 'SELECT uploadedtoc2 from rowers_workout WHERE id ={workoutid}'.format( - workoutid=workoutid) - - newc2id = 0 - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - tdata = result.fetchall() - if tdata: # pragma: no cover - newc2id = tdata[0][0] - - conn.close() + workout = Workout.objects.get(id=workoutid) + newc2id = workout.uploadedtoc2 parkedids = [] with open('c2blocked.json', 'r') as c2blocked: @@ -3358,14 +3251,10 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, defaulttim json.dump(tdata, c2blocked) # set distance, time - query = "UPDATE `rowers_workout` SET `distance` = '%s', `duration` = '%s' WHERE `id` = '%s'" % ( - distance, duration, workoutid) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - - conn.close() - engine.dispose() + workout = Workout.objects.get(id=workoutid) + workout.distance = distance + workout.duration = duration + workout.save() # summary if 'workout' in data: @@ -3382,14 +3271,9 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, defaulttim summary, sa, results = summaryfromsplitdata( splitdata, data, csvfilename, workouttype=workouttype) - query = "UPDATE `rowers_workout` SET `summary` = '%s' WHERE `id` = %s" % ( - summary, workoutid) - - with engine.connect() as conn, conn.begin(): - result = conn.execute(query) - - conn.close() - engine.dispose() + workout = Workout.objects.get(id=workoutid) + workout.summary = summary + workout.save() from rowingdata.trainingparser import getlist if sa: diff --git a/rowers/tests/test_async_tasks.py b/rowers/tests/test_async_tasks.py index 7f341870..713dbd04 100644 --- a/rowers/tests/test_async_tasks.py +++ b/rowers/tests/test_async_tasks.py @@ -81,10 +81,13 @@ class AsyncTaskTests(TestCase): def test_polygons(self): polygons = GeoPolygon.objects.all() + polygon = polygons[0] - obj = (polygon.id,polygon.name) - path = tasks.polygon_to_path(obj) - self.assertEqual(len(path),4) + + #obj = (polygon.id,polygon.name) + path = tasks.polygon_to_path(polygon) + + self.assertEqual(len(path),6) def test_summaryfromsplitdata(self): splitdata = [