From fab32ff81cf7f3e3d1b719e3da8243cb77649420 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 2 Aug 2020 13:16:35 +0200 Subject: [PATCH 1/5] better form validation for new challenge --- rowers/models.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 8ab4eb1f..f9d3f0a2 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -578,12 +578,16 @@ def course_length(course): totaldist += 1000.*dist[0] - vector = get_dir_vector(polygons[0],polygons[1]) - deltastart = get_delta(vector,polygons[0]) + try: + vector = get_dir_vector(polygons[0],polygons[1]) + deltastart = get_delta(vector,polygons[0]) - polygons = polygons.reverse() - vector = get_dir_vector(polygons[0],polygons[1]) - deltafinish = get_delta(vector,polygons[0]) + polygons = polygons.reverse() + vector = get_dir_vector(polygons[0],polygons[1]) + deltafinish = get_delta(vector,polygons[0]) + except IndexError: + deltastart = 0 + deltafinish = 0 return int(totaldist-deltastart-deltafinish) @@ -2644,14 +2648,31 @@ class VirtualRaceForm(ModelForm): startdatetime ) - end_time = cd['end_time'] + try: + end_time = cd['end_time'] + except KeyError: + raise forms.ValidationError( + 'Must have end time', + code='missing endtime' + ) + + if end_time is None: raise forms.ValidationError( 'Must have end time', code='missing endtime' ) - end_date = cd['enddate'] + try: + end_date = cd['enddate'] + except KeyError: + raise forms.ValidationError( + 'Missing or invalid end date', + code='missing end date' + ) + + + enddatetime = datetime.datetime.combine(end_date,end_time) enddatetime = pytz.timezone(timezone_str).localize( enddatetime From 9a4441b6d0b46fa3134af043fbe4f89c64593012 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 3 Aug 2020 22:21:09 +0200 Subject: [PATCH 2/5] correct status code --- rowers/views/apiviews.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index c0290179..c6e068d8 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -96,7 +96,7 @@ def strokedatajson_v2(request,id): try: id = int(id) except ValueError: - return HttpResponse("Not a valid workout number",stauts=400) + return HttpResponse("Not a valid workout number",status=400) if request.method == 'GET': columns = ['spm','time','hr','pace','power','distance'] @@ -112,9 +112,10 @@ def strokedatajson_v2(request,id): if request.method == 'POST': checkdata, r = dataprep.getrowdata_db(id=row.id) if not checkdata.empty: - return HttpResponse("Duplicate Error",400) + return HttpResponse("Duplicate Error",status=400) df = pd.DataFrame() + print(request.POST) try: df = pd.read_json(request.POST['data'],orient='split') @@ -122,7 +123,7 @@ def strokedatajson_v2(request,id): try: df = pd.read_json(request.POST['strokedata'],orient='split') except: - return HttpResponse("No JSON object could be decoded",400) + return HttpResponse("No JSON object could be decoded",status=400) df.index = df.index.astype(int) df.sort_index(inplace=True) @@ -134,12 +135,12 @@ def strokedatajson_v2(request,id): try: time = df['t']/10. except KeyError: - return HttpResponse("Missing time",400) + return HttpResponse("Missing time",status=400) try: spm = df['spm'] except KeyError: - return HttpResponse("Missing spm",400) + return HttpResponse("Missing spm",status=400) try: distance = df['distance'] @@ -147,7 +148,7 @@ def strokedatajson_v2(request,id): try: distance = df['d']/10. except KeyError: - return HttpResponse("Missing distance",400) + return HttpResponse("Missing distance",status=400) try: pace = df['pace']/1.e3 @@ -155,7 +156,7 @@ def strokedatajson_v2(request,id): try: pace = df['p']/10. except KeyError: - return HttpResponse("Missing pace",400) + return HttpResponse("Missing pace",status=400) @@ -320,13 +321,13 @@ def strokedatajson(request,id): if request.method == 'POST': checkdata,r = dataprep.getrowdata_db(id=row.id) if not checkdata.empty: - return HttpResponse("Duplicate Error",409) + return HttpResponse("Duplicate Error",status=409) # strokedata = request.POST['strokedata'] # checking/validating and cleaning try: strokedata = json.loads(request.POST['strokedata']) except: - return HttpResponse("No JSON object could be decoded",400) + return HttpResponse("No JSON object could be decoded",status=400) df = pd.DataFrame(strokedata) df.index = df.index.astype(int) From 66b79aaae9227d30bf5e8dd4f2e2a311d244fb45 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 4 Aug 2020 21:22:10 +0200 Subject: [PATCH 3/5] fixing json for v2 in developers.html --- rowers/templates/developers.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/templates/developers.html b/rowers/templates/developers.html index 51dd5ce6..50b3e667 100644 --- a/rowers/templates/developers.html +++ b/rowers/templates/developers.html @@ -194,7 +194,7 @@

The payload is application/json data and looks as follows:

-    {'data':
+    {"data":
     [
     {"distance":5, "power": 112, "hr": 132, "pace": 145800, "spm": 11, "time": 0},
     {"distance":12, "power": 221, "hr": 131, "pace": 116400, "spm": 41, "time": 2200},

From 6a3cac185379a66b8ace7d17fdfe697d6cdfa1de Mon Sep 17 00:00:00 2001
From: Sander Roosendaal 
Date: Tue, 4 Aug 2020 21:28:48 +0200
Subject: [PATCH 4/5] fix bug in under armour gps coordinate evaluation

---
 rowers/underarmourstuff.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/rowers/underarmourstuff.py b/rowers/underarmourstuff.py
index 7d68d2c3..68623782 100644
--- a/rowers/underarmourstuff.py
+++ b/rowers/underarmourstuff.py
@@ -152,8 +152,8 @@ def createunderarmourworkoutdata(w):
     haslatlon=1
 
     try:
-        lat = row.df[' latitude'].tolist()
-        lon = row.df[' longitude'].tolist()
+        lat = row.df[' latitude']
+        lon = row.df[' longitude']
         if not lat.std() and not lon.std():
             haslatlon = 0
     except KeyError:

From f069df5f95860e8f4c08a3abf8799b07427100b1 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal 
Date: Tue, 4 Aug 2020 21:43:38 +0200
Subject: [PATCH 5/5] fixing bug for self coach trial

---
 rowers/rower_rules.py | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/rowers/rower_rules.py b/rowers/rower_rules.py
index f7e84f80..b41bf069 100644
--- a/rowers/rower_rules.py
+++ b/rowers/rower_rules.py
@@ -147,8 +147,10 @@ def is_protrial(user):
     return False
 
 
+
 ispromember = is_promember | is_protrial
 
+
 can_have_teams = ispromember | is_coach
 
 @rules.predicate
@@ -202,8 +204,13 @@ def can_add_session(user):
 def can_plan(user):
     if user.is_anonymous:
         return False
-
-    return user.rower.rowerplan in ['plan','coach','freecoach']
+    if user.rower.rowerplan in ['plan','coach']:
+        return True
+    if user.rower.rowerplan in ['basic','pro']:
+        return user.rower.plantrialexpires >= datetime.date.today()
+    if user.rower.rowerplan == 'freecoach':
+        if user.rower.mycoachgroup is not None:
+            return len(user.rower.mycoachgroup)>=4
 
 # checks if rower is coach of user (or is user himself)
 @rules.predicate