From f439204bf9ab0137d6c9acfb7a15938d127e051e Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 7 Dec 2018 17:06:57 +0100
Subject: [PATCH 1/5] javascript around race form
---
.../templates/indoorvirtualeventcreate.html | 37 ++++++++++++++++++-
rowers/templates/virtualeventcreate.html | 35 ++++++++++++++++++
static/css/rowsandall2.css | 4 ++
3 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/rowers/templates/indoorvirtualeventcreate.html b/rowers/templates/indoorvirtualeventcreate.html
index 1492d6aa..63095c09 100644
--- a/rowers/templates/indoorvirtualeventcreate.html
+++ b/rowers/templates/indoorvirtualeventcreate.html
@@ -26,7 +26,7 @@
{% endif %}
-
+
@@ -64,6 +64,41 @@
{% endblock %}
{% block scripts %}
+
+
{% endblock %}
{% block sidebar %}
diff --git a/rowers/templates/virtualeventcreate.html b/rowers/templates/virtualeventcreate.html
index 131ce9d1..05fc0a03 100644
--- a/rowers/templates/virtualeventcreate.html
+++ b/rowers/templates/virtualeventcreate.html
@@ -56,6 +56,41 @@
{% endblock %}
{% block scripts %}
+
+
{% endblock %}
{% block sidebar %}
diff --git a/static/css/rowsandall2.css b/static/css/rowsandall2.css
index 4838a54d..388f56eb 100644
--- a/static/css/rowsandall2.css
+++ b/static/css/rowsandall2.css
@@ -1086,3 +1086,7 @@ a.wh:hover {
background: silver;
cursor: pointer;
}
+
+table.djangoform tbody > tr > th {
+ vertical-align: top;
+}
From cc40615f46991fb6f7907c9ebe4456dc275ebf8b Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sat, 8 Dec 2018 09:15:16 +0100
Subject: [PATCH 2/5] unknown column error fixed in data explore view
---
rowers/forms.py | 4 ++++
rowers/templates/workoutstats.html | 2 +-
rowers/views.py | 16 +++++++++++++---
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/rowers/forms.py b/rowers/forms.py
index c73770fc..7de91fdb 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -25,6 +25,10 @@ class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput())
+# search form
+class SearchForm(forms.Form):
+ q = forms.CharField(max_length=255,required=False,initial='Search')
+
# simple form for Contact page. Sends email to info@rowsandall.com
class EmailForm(forms.Form):
firstname = forms.CharField(max_length=255)
diff --git a/rowers/templates/workoutstats.html b/rowers/templates/workoutstats.html
index d4976046..dbfed1f4 100644
--- a/rowers/templates/workoutstats.html
+++ b/rowers/templates/workoutstats.html
@@ -93,7 +93,7 @@
{% for key, value in stats.items %}
- {% if value.std > 2 %}
+ {% if value.std > 10 %}
| {{ value.verbosename }} |
{{ value.mean|floatformat:0 }} |
{{ value.wmean|floatformat:0 }} |
diff --git a/rowers/views.py b/rowers/views.py
index b00e6e38..a0a4cfeb 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -50,7 +50,7 @@ from rowers.forms import (
RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm,
FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm,
MetricsForm,DisqualificationForm,disqualificationreasons,
- disqualifiers
+ disqualifiers,SearchForm,
)
from django.core.urlresolvers import reverse, reverse_lazy
@@ -6994,6 +6994,9 @@ def workouts_view(request,message='',successmessage='',
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
paginator = Paginator(workouts,20) # show 25 workouts per page
page = request.GET.get('page')
@@ -7038,6 +7041,7 @@ def workouts_view(request,message='',successmessage='',
{'workouts': workouts,
'active': 'nav-workouts',
'rower':r,
+ 'searchform':searchform,
'breadcrumbs':breadcrumbs,
'dateform':dateform,
'startdate':startdate,
@@ -8496,10 +8500,16 @@ def workout_data_view(request, id=0):
datadf.sort_values(['ftime'],inplace=True)
- datadf.drop(labels=[
+ columns = datadf.columns.values
+
+ to_be_dropped = [
'id','time','hr_an','hr_at','hr_bottom','hr_max',
'hr_tr','hr_ut1','hr_ut2','x_right',
- ],inplace=True,axis=1)
+ ]
+
+ to_be_dropped = [c for c in to_be_dropped if c in columns]
+
+ datadf.drop(labels=to_be_dropped,inplace=True,axis=1)
cols = ['ftime','cumdist','fpace','spm',
From 5496a0f5333a24f6025da6e02be440363c538003 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sat, 8 Dec 2018 09:26:43 +0100
Subject: [PATCH 3/5] search form in list view
---
rowers/forms.py | 7 ++++++-
rowers/templates/list_workouts.html | 6 +++---
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/rowers/forms.py b/rowers/forms.py
index 7de91fdb..05fc77a8 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -27,7 +27,12 @@ class LoginForm(forms.Form):
# search form
class SearchForm(forms.Form):
- q = forms.CharField(max_length=255,required=False,initial='Search')
+ q = forms.CharField(max_length=255,required=False,
+ widget=forms.TextInput(
+ attrs={'placeholder': 'Search'}),
+ label='Search')
+
+
# simple form for Contact page. Sends email to info@rowsandall.com
class EmailForm(forms.Form):
diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html
index a46e7fdd..2ccb8c53 100644
--- a/rowers/templates/list_workouts.html
+++ b/rowers/templates/list_workouts.html
@@ -85,9 +85,9 @@
{% else %}
From b9062bd7685dbb07d8592a109aa5e01a75a1807a Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sat, 8 Dec 2018 09:56:46 +0100
Subject: [PATCH 4/5] improved search forms
---
rowers/templates/comparison_list.html | 6 ++--
rowers/templates/fusion_list.html | 8 ++---
rowers/templates/list_courses.html | 8 ++---
rowers/templates/list_graphs.html | 6 ++--
rowers/templates/team_compare_select.html | 8 ++---
rowers/templates/user_boxplot_select.html | 10 +++---
rowers/templates/user_multiflex_select.html | 10 +++---
rowers/templates/workout_join_select.html | 12 +++----
rowers/views.py | 36 +++++++++++++++++++--
9 files changed, 60 insertions(+), 44 deletions(-)
diff --git a/rowers/templates/comparison_list.html b/rowers/templates/comparison_list.html
index ab60d9ce..2ad2d425 100644
--- a/rowers/templates/comparison_list.html
+++ b/rowers/templates/comparison_list.html
@@ -34,10 +34,8 @@
diff --git a/rowers/templates/fusion_list.html b/rowers/templates/fusion_list.html
index 9dd58932..97f84a06 100644
--- a/rowers/templates/fusion_list.html
+++ b/rowers/templates/fusion_list.html
@@ -32,10 +32,8 @@
@@ -49,7 +47,7 @@
{% csrf_token %}
-
+
Fuse this workout with data from:
diff --git a/rowers/templates/list_courses.html b/rowers/templates/list_courses.html
index 5648405d..53648139 100644
--- a/rowers/templates/list_courses.html
+++ b/rowers/templates/list_courses.html
@@ -60,14 +60,12 @@
- Add Courses
+ Add Courses
{% if announcements %}
What's New?
diff --git a/rowers/templates/list_graphs.html b/rowers/templates/list_graphs.html
index ff6e1022..0b9a82df 100644
--- a/rowers/templates/list_graphs.html
+++ b/rowers/templates/list_graphs.html
@@ -16,10 +16,8 @@
diff --git a/rowers/templates/team_compare_select.html b/rowers/templates/team_compare_select.html
index 63c3ae41..0480f481 100644
--- a/rowers/templates/team_compare_select.html
+++ b/rowers/templates/team_compare_select.html
@@ -103,10 +103,8 @@
@@ -133,7 +131,7 @@
-
+
diff --git a/rowers/templates/user_boxplot_select.html b/rowers/templates/user_boxplot_select.html
index 46008816..ba2ff67b 100644
--- a/rowers/templates/user_boxplot_select.html
+++ b/rowers/templates/user_boxplot_select.html
@@ -101,7 +101,7 @@
{{ chartform.as_table }}
-
+
@@ -118,16 +118,14 @@
{{ optionsform.as_table }}
{% csrf_token %}
-
+
diff --git a/rowers/templates/user_multiflex_select.html b/rowers/templates/user_multiflex_select.html
index 9d553b5d..0566ad12 100644
--- a/rowers/templates/user_multiflex_select.html
+++ b/rowers/templates/user_multiflex_select.html
@@ -92,16 +92,14 @@
{{ modalityform.as_table }}
{% csrf_token %}
-
+
@@ -122,7 +120,7 @@
{{ chartform.as_table }}
-
+
diff --git a/rowers/templates/workout_join_select.html b/rowers/templates/workout_join_select.html
index 50a0d5bb..a6f2649e 100644
--- a/rowers/templates/workout_join_select.html
+++ b/rowers/templates/workout_join_select.html
@@ -91,7 +91,7 @@
{% csrf_token %}
-
+
@@ -106,7 +106,7 @@
{% csrf_token %}
-
+
@@ -121,7 +121,7 @@
{% csrf_token %}
-
+
@@ -133,10 +133,8 @@
diff --git a/rowers/views.py b/rowers/views.py
index a0a4cfeb..ce2a80c0 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -5336,6 +5336,9 @@ def workouts_join_select(request,
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
form = WorkoutMultipleCompareForm()
form.fields["workouts"].queryset = workouts
@@ -5358,6 +5361,7 @@ def workouts_join_select(request,
return render(request, 'workout_join_select.html',
{'workouts': workouts,
'dateform':dateform,
+ 'searchform':searchform,
'startdate':startdate,
'enddate':enddate,
'active':'nav-workouts',
@@ -5510,6 +5514,9 @@ def team_comparison_select(request,
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
if id:
firstworkout = get_workout(id)
@@ -5573,6 +5580,7 @@ def team_comparison_select(request,
'startdate':startdate,
'enddate':enddate,
'team':theteam,
+ 'searchform':searchform,
'form':form,
'rower':r,
'breadcrumbs':breadcrumbs,
@@ -5921,6 +5929,9 @@ def user_multiflex_select(request,
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
form = WorkoutMultipleCompareForm()
form.fields["workouts"].queryset = workouts
@@ -5975,6 +5986,7 @@ def user_multiflex_select(request,
'rower':r,
'form':form,
'chartform':chartform,
+ 'searchform':searchform,
'modalityform':modalityform,
'teams':get_my_teams(request.user),
})
@@ -6551,6 +6563,9 @@ def user_boxplot_select(request,
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
form = WorkoutMultipleCompareForm()
form.fields["workouts"].queryset = workouts
@@ -6592,6 +6607,7 @@ def user_boxplot_select(request,
'form':form,
'active':'nav-analysis',
'chartform':chartform,
+ 'searchform':searchform,
'optionsform':optionsform,
'teams':get_my_teams(request.user),
})
@@ -6834,10 +6850,14 @@ def courses_view(request):
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
-
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
+
return render(request,'list_courses.html',
{'courses':courses,
'active':'nav-racing',
+ 'searchform':searchform,
'rower':r,
})
@@ -7108,6 +7128,9 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
paginator = Paginator(workouts,15) # show 25 workouts per page
page = request.GET.get('page')
@@ -7130,6 +7153,7 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
'workouts': workouts,
'last_name':u.last_name,
'first_name':u.first_name,
+ 'searchform':searchform,
'dateform':dateform,
'startdate':startdate,
'enddate':enddate,
@@ -7189,7 +7213,10 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
(Q(name__icontains=q) for q in query_list)) |
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
- )
+ )
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
paginator = Paginator(workouts,15) # show 25 workouts per page
page = request.GET.get('page')
@@ -7225,6 +7252,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
{'id':int(id),
'workout':row,
'rower':r,
+ 'searchform':searchform,
'active':'nav-workouts',
'breadcrumbs':breadcrumbs,
'workouts': workouts,
@@ -12067,6 +12095,9 @@ def graphs_view(request):
reduce(operator.and_,
(Q(notes__icontains=q) for q in query_list))
)
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
g = GraphImage.objects.filter(workout__in=workouts).order_by("-creationdatetime")
@@ -12083,6 +12114,7 @@ def graphs_view(request):
return render(request, 'list_graphs.html',
{'graphs': g,
+ 'searchform':searchform,
'active':'nav-workouts',
'teams':get_my_teams(request.user),
})
From e4bc752b3b9ad8d2f01608b16eaf9cd0bc0908ed Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sat, 8 Dec 2018 11:10:01 +0100
Subject: [PATCH 5/5] fixing strava import failure
---
rowers/stravastuff.py | 7 ++++++-
rowers/utils.py | 7 ++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py
index aecf3c70..ac19fb00 100644
--- a/rowers/stravastuff.py
+++ b/rowers/stravastuff.py
@@ -150,7 +150,12 @@ def get_strava_workouts(rower):
start_date = item['start_date']
stravaid = item['id']
if arrow.get(start_date) == arrow.get(w.startdatetime):
- if datetime.time(seconds=int(elapsed_time)) == w.duration:
+ dd = datetime.min + timedelta(
+ seconds=int(elapsed_time)
+ )
+
+
+ if datetime.time(dd) == w.duration:
w.uploadedtostrava = int(stravaid)
w.save()
diff --git a/rowers/utils.py b/rowers/utils.py
index 5a0abf2c..cb9fbaae 100644
--- a/rowers/utils.py
+++ b/rowers/utils.py
@@ -377,7 +377,12 @@ def totaltime_sec_to_string(totaltime):
if not message:
message = 'Warning: there is something wrong with the workout duration'
- duration = "%s:%s:%s.%s" % (hours, minutes, seconds, tenths)
+ duration = "{hours:02d}:{minutes:02d}:{seconds:02d}.{tenths}".format(
+ hours=hours,
+ minutes=minutes,
+ seconds=seconds,
+ tenths=tenths
+ )
return duration