From f00b10182a67439c2fc561595fed7724df81c7f4 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 14 Jun 2019 13:42:18 +0200
Subject: [PATCH 1/9] dummy polarization index function
---
rowers/metrics.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/rowers/metrics.py b/rowers/metrics.py
index 1e7d55b1..c556e3c8 100644
--- a/rowers/metrics.py
+++ b/rowers/metrics.py
@@ -359,6 +359,9 @@ This value should be fairly constant across all stroke rates.""",
)
+def polarization_index(df,rower):
+ return 0
+
def calc_trimp(df,sex,hrmax,hrmin,hrftp):
if sex == 'male':
f = 1.92
From 319946f0b154d001215e55a5541abdb29dd515de Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 14 Jun 2019 15:26:45 +0200
Subject: [PATCH 2/9] able to calculate polarization index (from power only)
---
rowers/dataprep.py | 24 ++++++++++++++++++++++++
rowers/metrics.py | 4 ++--
rowers/views/workoutviews.py | 5 +++++
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/rowers/dataprep.py b/rowers/dataprep.py
index 89266aba..fb7ef68c 100644
--- a/rowers/dataprep.py
+++ b/rowers/dataprep.py
@@ -117,6 +117,30 @@ from scipy.signal import savgol_filter
import datetime
+def polarization_index(df,rower):
+ df['dt'] = df['time'].diff()/6.e4
+ # remove rest (spm<15)
+ df.dropna(axis=0,inplace=True)
+ df['dt'] = df['dt'].clip(upper=4,lower=0)
+
+
+ masklow = (df['power']>0) & (df['power']=rower.pw_at) & (df['power']rower.pw_an)
+
+
+ time_low_pw = df.loc[masklow,'dt'].sum()
+ time_mid_pw = df.loc[maskmid,'dt'].sum()
+ time_high_pw = df.loc[maskhigh,'dt'].sum()
+
+ frac_low = time_low_pw/(time_low_pw+time_mid_pw+time_high_pw)
+ frac_mid = time_mid_pw/(time_low_pw+time_mid_pw+time_high_pw)
+ frac_high = time_high_pw/(time_low_pw+time_mid_pw+time_high_pw)
+
+ index = math.log10(frac_high*100.*frac_low/frac_mid)
+
+ return index
+
def get_latlon(id):
try:
diff --git a/rowers/metrics.py b/rowers/metrics.py
index c556e3c8..c06debdd 100644
--- a/rowers/metrics.py
+++ b/rowers/metrics.py
@@ -11,6 +11,8 @@ import pandas as pd
from scipy import optimize
from django.utils import timezone
+from math import log10
+
nometrics = [
'originalvelo',
'cumdist',
@@ -359,8 +361,6 @@ This value should be fairly constant across all stroke rates.""",
)
-def polarization_index(df,rower):
- return 0
def calc_trimp(df,sex,hrmax,hrmin,hrftp):
if sex == 'male':
diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py
index 92c7e7ee..4a53bce4 100644
--- a/rowers/views/workoutviews.py
+++ b/rowers/views/workoutviews.py
@@ -1304,6 +1304,11 @@ def workouts_view(request,message='',successmessage='',
workoutsnohr = workouts.exclude(averagehr__isnull=False)
for w in workoutsnohr:
res = dataprep.workout_trimp(w)
+
+ # ids = [w.id for w in workouts]
+ # df = dataprep.getsmallrowdata_db(['time','power'],ids=ids)
+ # polarization = dataprep.polarization_index(df,r)
+
if query:
query_list = query.split()
From a89ad078dcf748d38eed4ec4b643ced5bbf512c9 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sun, 16 Jun 2019 15:23:33 +0200
Subject: [PATCH 3/9] tested
---
rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12523 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz
index eb6a3b613a007d7d43c9b7dbf857b28244d52d5d..1c0e69ca852071e405e3fc63682dc61fea877c9b 100644
GIT binary patch
delta 16
XcmaEz_&SkYzMF$%y%5_*_9q4aH~9ta
delta 16
XcmaEz_&SkYzMF$%x-a8K_9q4aIGP3v
From d073d1ffb720d2b13c1c1ed730cc065857b88f52 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sun, 16 Jun 2019 15:31:30 +0200
Subject: [PATCH 4/9] fixes #478
---
rowers/templates/trainingplan.html | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/rowers/templates/trainingplan.html b/rowers/templates/trainingplan.html
index 09202a4e..2e4d4a01 100644
--- a/rowers/templates/trainingplan.html
+++ b/rowers/templates/trainingplan.html
@@ -142,6 +142,10 @@
|
+
+ Replan by Months
+
+ /
view sessions
|
@@ -263,6 +267,10 @@
|
+
+ Replan by Weeks
+
+ /
view sessions
|
From 64a5435dd7a02cf8a05c9630f662e854a67e61bc Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Sun, 16 Jun 2019 17:06:12 +0200
Subject: [PATCH 5/9] team multicreate
---
rowers/forms.py | 14 +++++++++
rowers/models.py | 3 ++
rowers/plannedsessions.py | 4 +++
rowers/templates/menu_plan.html | 30 +++++++++++++++----
.../templates/plannedsession_multicreate.html | 13 ++++++++
rowers/templatetags/rowerfilters.py | 12 ++++++++
rowers/views/planviews.py | 27 ++++++++++++++++-
rowers/views/statements.py | 2 +-
8 files changed, 98 insertions(+), 7 deletions(-)
diff --git a/rowers/forms.py b/rowers/forms.py
index c0ee89fd..1462bae1 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -358,6 +358,7 @@ class TeamUploadOptionsForm(forms.Form):
class Meta:
fields = ['make_plot','plottype']
+
# This form is used on the Workout Split page
class WorkoutSplitForm(forms.Form):
splitchoices = (
@@ -1201,6 +1202,19 @@ class WorkoutRaceSelectForm(forms.Form):
# self.fields['evaluate_after'] =
+# Form to select team by rower
+class RowerTeamForm(forms.Form):
+ team = forms.ModelChoiceField(
+ queryset=Team.objects.all(),
+ required=False,
+ )
+
+ def __init__(self, user, *args, **kwargs):
+ super(RowerTeamForm, self).__init__(*args, **kwargs)
+
+ self.fields['team'].queryset = Team.objects.filter(manager=user)
+
+
class PlannedSessionTeamForm(forms.Form):
team = forms.ModelMultipleChoiceField(
queryset=Team.objects.all(),
diff --git a/rowers/models.py b/rowers/models.py
index 37a13822..63318e39 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -2982,6 +2982,9 @@ def auto_delete_image_on_delete(sender,instance, **kwargs):
print("couldn't find the file "+instance.filename)
+
+
+
# Form to update Workout data
class WorkoutForm(ModelForm):
# duration = forms.TimeInput(format='%H:%M:%S.%f')
diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py
index 34642a46..8682aaa7 100644
--- a/rowers/plannedsessions.py
+++ b/rowers/plannedsessions.py
@@ -486,6 +486,10 @@ def remove_rower_session(r,ps):
return 1
+def get_team(request):
+ teamid = request.GET.get('team')
+ return teamid
+
def get_dates_timeperiod(request,startdatestring='',enddatestring='',
defaulttimeperiod='thisweek'):
# set start end date according timeperiod
diff --git a/rowers/templates/menu_plan.html b/rowers/templates/menu_plan.html
index 7177f790..9c5d823d 100644
--- a/rowers/templates/menu_plan.html
+++ b/rowers/templates/menu_plan.html
@@ -61,11 +61,6 @@
Add Session
-
-
- Add Group Session
-
-
Plan Microcycle
@@ -78,6 +73,31 @@
+ {% if request.user|user_teams %}
+
+
+
+
+
+ {% endif %}
diff --git a/rowers/templates/plannedsession_multicreate.html b/rowers/templates/plannedsession_multicreate.html
index 2981a7b0..53418ea0 100644
--- a/rowers/templates/plannedsession_multicreate.html
+++ b/rowers/templates/plannedsession_multicreate.html
@@ -5,7 +5,11 @@
{% block title %}Plan entire microcycle{% endblock %}
{% block main %}
+{% if team %}
+Create Group Sessions for {{ team.name }}
+{% else %}
Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}
+{% endif %}
@@ -66,9 +73,15 @@
{% endfor %}
+ {% if team %}
+
+ Add More
+
+ {% else %}
Add More
+ {% endif %}
or
Clone multiple sessions
diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py
index 8ddf86f5..b5851649 100644
--- a/rowers/templatetags/rowerfilters.py
+++ b/rowers/templatetags/rowerfilters.py
@@ -355,6 +355,18 @@ def user_teams(user):
return teams
+@register.filter
+def user_team1(user):
+ try:
+ therower = Rower.objects.get(user=user)
+ teams1 = therower.team.all()
+ teams2 = Team.objects.filter(manager=user)
+ teams = list(set(teams1).union(set(teams2)))
+ except TypeError:
+ teams = []
+
+ return teams[0].id
+
@register.filter
def announcements(request):
announcements = SiteAnnouncement.objects.filter(
diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py
index 82e6e065..e1804a74 100644
--- a/rowers/views/planviews.py
+++ b/rowers/views/planviews.py
@@ -454,6 +454,7 @@ def plannedsession_multicreate_view(request,
startdate,enddate = get_dates_timeperiod(request)
+ teamid = get_team(request)
try:
trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate,
@@ -472,6 +473,16 @@ def plannedsession_multicreate_view(request,
).order_by("startdate","preferreddate","enddate").exclude(
sessiontype='race')
+ if teamid:
+ qset = qset.filter(team__in=[teamid])
+ try:
+ team = Team.objects.get(id=teamid)
+ if team.manager != request.user:
+ team = None
+ except Team.DoesNotExist:
+ team = None
+ else:
+ team = None
initial = {
@@ -500,6 +511,8 @@ def plannedsession_multicreate_view(request,
for ps in instances:
ps.save()
add_rower_session(r,ps)
+ if team:
+ add_team_session(team,ps)
messages.info(request,"Saved changes for Planned Session "+str(ps))
for obj in ps_formset.deleted_objects:
messages.info(request,"Deleted Planned Session "+str(obj))
@@ -515,6 +528,9 @@ def plannedsession_multicreate_view(request,
startdatestring = startdate.strftime('%Y-%m-%d')
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
+
+ if team:
+ url += '&team={teamid}'.format(teamid=team.id)
return HttpResponseRedirect(url)
@@ -537,16 +553,25 @@ def plannedsession_multicreate_view(request,
'enddate':enddate
})
+ if len(Team.objects.filter(manager=request.user))>=1:
+ teamform = RowerTeamForm(request.user)
+ if teamid:
+ teamform = RowerTeamForm(request.user,initial={'team':teamid})
+ else:
+ teamform = None
+
context = {
'ps_formset':ps_formset,
'breadcrumbs':breadcrumbs,
'rower':r,
'active':'nav-plan',
'dateform':dateform,
+ 'teamform':teamform,
'plan':trainingplan,
'timeperiod':timeperiod,
'teams':get_my_teams(request.user),
- 'extrasessions': extrasessions+1
+ 'extrasessions': extrasessions+1,
+ 'team':team,
}
diff --git a/rowers/views/statements.py b/rowers/views/statements.py
index 8b9a9991..e2b470c3 100644
--- a/rowers/views/statements.py
+++ b/rowers/views/statements.py
@@ -81,7 +81,7 @@ from rowers.forms import (
FusionMetricChoiceForm,BoxPlotChoiceForm,MultiFlexChoiceForm,
TrendFlexModalForm,WorkoutSplitForm,WorkoutJoinParamForm,
AnalysisOptionsForm, AnalysisChoiceForm,
- PlannedSessionMultipleCloneForm,SessionDateShiftForm,
+ PlannedSessionMultipleCloneForm,SessionDateShiftForm,RowerTeamForm,
)
from rowers.models import (
Workout, User, Rower, WorkoutForm,FavoriteChart,
From f051cec5101e1b790a049335030001072b611836 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Mon, 17 Jun 2019 11:57:54 +0200
Subject: [PATCH 6/9] added conn_max_age to settings - not tested
---
rowsandall_app/settings.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py
index ad9ea38a..941fd340 100644
--- a/rowsandall_app/settings.py
+++ b/rowsandall_app/settings.py
@@ -146,6 +146,8 @@ WSGI_APPLICATION = 'rowsandall_app.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
+CONN_MAX_AGE = 0
+
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
From 6bad876967b34e303b1100224187d8e1bb470288 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Mon, 17 Jun 2019 20:28:39 +0200
Subject: [PATCH 7/9] edits
---
.../templates/plannedsession_multicreate.html | 2 +-
.../plannedsessions_multiclone_select.html | 7 ++++++
rowers/views/planviews.py | 22 ++++++++++++++++++-
3 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/rowers/templates/plannedsession_multicreate.html b/rowers/templates/plannedsession_multicreate.html
index 53418ea0..581e8a85 100644
--- a/rowers/templates/plannedsession_multicreate.html
+++ b/rowers/templates/plannedsession_multicreate.html
@@ -20,7 +20,7 @@
{{ teamform.as_table }}
-
+
diff --git a/rowers/templates/plannedsessions_multiclone_select.html b/rowers/templates/plannedsessions_multiclone_select.html
index cfbddce6..674dd7a3 100644
--- a/rowers/templates/plannedsessions_multiclone_select.html
+++ b/rowers/templates/plannedsessions_multiclone_select.html
@@ -64,7 +64,11 @@
+{% if team %}
+Clone Multiple Sessions for {{ team.name }}
+{% else %}
Clone Multiple Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}
+{% endif %}
-
@@ -73,6 +77,9 @@
+
+ {{ teamform.as_table }}
+
diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py
index e1804a74..440ed4dd 100644
--- a/rowers/views/planviews.py
+++ b/rowers/views/planviews.py
@@ -182,7 +182,7 @@ def plannedsession_multiclone_view(
startdate,enddate = get_dates_timeperiod(request)
-
+ teamid = get_team(request)
if request.method == 'POST' and 'daterange' in request.POST:
dateform = DateRangeForm(request.POST)
@@ -245,6 +245,17 @@ def plannedsession_multiclone_view(
"startdate","preferreddate","enddate").exclude(
sessiontype='race')
+ if teamid:
+ sps = sps.filter(team__in=[teamid])
+ try:
+ team = Team.objects.get(id=teamid)
+ if team.manager != request.user:
+ team = None
+ except Team.DoesNotExist:
+ team = None
+ else:
+ team = None
+
query = request.GET.get('q')
if query:
query_list = query.split()
@@ -285,6 +296,13 @@ def plannedsession_multiclone_view(
'enddate':enddate,
})
+ if len(Team.objects.filter(manager=request.user))>=1:
+ teamform = RowerTeamForm(request.user)
+ if teamid:
+ teamform = RowerTeamForm(request.user,initial={'team':teamid})
+ else:
+ teamform = None
+
return render(request, 'plannedsessions_multiclone_select.html',
{'plannedsessions':sps,
'breadcrumbs':breadcrumbs,
@@ -297,6 +315,8 @@ def plannedsession_multiclone_view(
'rower':r,
'active':'nav-plan',
'timeperiod':timeperiod,
+ 'team':team,
+ 'teamform':teamform,
}
)
From 7c34784eaf54d54332771f87815ae041a8e58154 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Mon, 17 Jun 2019 20:36:56 +0200
Subject: [PATCH 8/9] date forms now working
---
rowers/forms.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/rowers/forms.py b/rowers/forms.py
index 1462bae1..f5d0e68b 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -514,15 +514,20 @@ class DateRangeForm(forms.Form):
startdate = forms.DateField(
initial=timezone.now()-datetime.timedelta(days=365),
# widget=SelectDateWidget(years=range(1990,2050)),
- widget=AdminDateWidget(),
+ widget=AdminDateWidget(format='%Y-%m-%d'),
label='Start Date')
enddate = forms.DateField(
initial=timezone.now(),
- widget=AdminDateWidget(),
+ widget=AdminDateWidget(format='%Y-%m-%d'),
label='End Date')
class Meta:
fields = ['startdate','enddate']
+ input_formats=("%Y-%m-%d")
+ dateTimeOptions = {
+ 'format': '%Y-%m-%d',
+ 'autoclose': True,
+ }
class FitnessMetricForm(forms.Form):
startdate = forms.DateField(
From e308c3e9f6881dbc9f196e86bf3302bbd8522490 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Mon, 17 Jun 2019 20:45:53 +0200
Subject: [PATCH 9/9] fixing #482
---
rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12523 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz
index 1c0e69ca852071e405e3fc63682dc61fea877c9b..ed8f09c48d11a0eba9e68d2f9db5e4814c584c03 100644
GIT binary patch
delta 16
XcmaEz_&SkYzMF$%!#(zm>`x2;Jk18X
delta 16
XcmaEz_&SkYzMF$%y%5_*_9q4aH~9ta