Private
Public Access
1
0

Merge branch 'release/v10.00'

This commit is contained in:
Sander Roosendaal
2019-06-17 20:46:51 +02:00
15 changed files with 175 additions and 10 deletions
+24
View File
@@ -117,6 +117,30 @@ from scipy.signal import savgol_filter
import datetime 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']<int(rower.pw_at))
maskmid = (df['power']>=rower.pw_at) & (df['power']<int(rower.pw_an))
maskhigh = (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): def get_latlon(id):
try: try:
+21 -2
View File
@@ -358,6 +358,7 @@ class TeamUploadOptionsForm(forms.Form):
class Meta: class Meta:
fields = ['make_plot','plottype'] fields = ['make_plot','plottype']
# This form is used on the Workout Split page # This form is used on the Workout Split page
class WorkoutSplitForm(forms.Form): class WorkoutSplitForm(forms.Form):
splitchoices = ( splitchoices = (
@@ -513,15 +514,20 @@ class DateRangeForm(forms.Form):
startdate = forms.DateField( startdate = forms.DateField(
initial=timezone.now()-datetime.timedelta(days=365), initial=timezone.now()-datetime.timedelta(days=365),
# widget=SelectDateWidget(years=range(1990,2050)), # widget=SelectDateWidget(years=range(1990,2050)),
widget=AdminDateWidget(), widget=AdminDateWidget(format='%Y-%m-%d'),
label='Start Date') label='Start Date')
enddate = forms.DateField( enddate = forms.DateField(
initial=timezone.now(), initial=timezone.now(),
widget=AdminDateWidget(), widget=AdminDateWidget(format='%Y-%m-%d'),
label='End Date') label='End Date')
class Meta: class Meta:
fields = ['startdate','enddate'] fields = ['startdate','enddate']
input_formats=("%Y-%m-%d")
dateTimeOptions = {
'format': '%Y-%m-%d',
'autoclose': True,
}
class FitnessMetricForm(forms.Form): class FitnessMetricForm(forms.Form):
startdate = forms.DateField( startdate = forms.DateField(
@@ -1201,6 +1207,19 @@ class WorkoutRaceSelectForm(forms.Form):
# self.fields['evaluate_after'] = # 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): class PlannedSessionTeamForm(forms.Form):
team = forms.ModelMultipleChoiceField( team = forms.ModelMultipleChoiceField(
queryset=Team.objects.all(), queryset=Team.objects.all(),
+3
View File
@@ -11,6 +11,8 @@ import pandas as pd
from scipy import optimize from scipy import optimize
from django.utils import timezone from django.utils import timezone
from math import log10
nometrics = [ nometrics = [
'originalvelo', 'originalvelo',
'cumdist', 'cumdist',
@@ -359,6 +361,7 @@ This value should be fairly constant across all stroke rates.""",
) )
def calc_trimp(df,sex,hrmax,hrmin,hrftp): def calc_trimp(df,sex,hrmax,hrmin,hrftp):
if sex == 'male': if sex == 'male':
f = 1.92 f = 1.92
+3
View File
@@ -2982,6 +2982,9 @@ def auto_delete_image_on_delete(sender,instance, **kwargs):
print("couldn't find the file "+instance.filename) print("couldn't find the file "+instance.filename)
# Form to update Workout data # Form to update Workout data
class WorkoutForm(ModelForm): class WorkoutForm(ModelForm):
# duration = forms.TimeInput(format='%H:%M:%S.%f') # duration = forms.TimeInput(format='%H:%M:%S.%f')
+4
View File
@@ -486,6 +486,10 @@ def remove_rower_session(r,ps):
return 1 return 1
def get_team(request):
teamid = request.GET.get('team')
return teamid
def get_dates_timeperiod(request,startdatestring='',enddatestring='', def get_dates_timeperiod(request,startdatestring='',enddatestring='',
defaulttimeperiod='thisweek'): defaulttimeperiod='thisweek'):
# set start end date according timeperiod # set start end date according timeperiod
+25 -5
View File
@@ -61,11 +61,6 @@
<i class="far fa-calendar-plus fa-fw"></i>&nbsp;Add Session <i class="far fa-calendar-plus fa-fw"></i>&nbsp;Add Session
</a> </a>
</li> </li>
<li id="plan-teamsession">
<a href="/rowers/sessions/teamcreate/?when={{ timeperiod }}">
<i class="fas fa-whistle fa-fw"></i>&nbsp;Add Group Session
</a>
</li>
<li id="plan-microcycle"> <li id="plan-microcycle">
<a href="/rowers/sessions/multicreate/?when={{ timeperiod }}"> <a href="/rowers/sessions/multicreate/?when={{ timeperiod }}">
<i class="fas fa-expand fa-fw"></i>Plan Microcycle <i class="fas fa-expand fa-fw"></i>Plan Microcycle
@@ -78,6 +73,31 @@
</li> </li>
</ul> </ul>
</li> </li>
{% if request.user|user_teams %}
<li class="has-children" id="teamplan">
<input type="checkbox" name="group-plan" id="group-teamplan">
<label for="group-teamplan">
<i class="fas fa-calendar-plus fa-fw"></i>&nbsp;Plan Group Sessions
</label>
<ul>
<li id="plan-teamsession">
<a href="/rowers/sessions/teamcreate/?when={{ timeperiod }}">
<i class="fas fa-whistle fa-fw"></i>&nbsp;Add Group Session
</a>
</li>
<li id="plan-microcycle">
<a href="/rowers/sessions/multicreate/?when={{ timeperiod }}&team={{ request.user|user_team1 }}">
<i class="fas fa-expand fa-fw"></i>Plan Group Microcycle
</a>
</li>
<li id="plan-microcycle">
<a href="/rowers/sessions/multiclone/user/{{ rower.user.id }}/?when={{ timeperiod }}">
<i class="fas fa-layer-plus fa-fw"></i>Clone Multiple Group Sessions
</a>
</li>
</ul>
</li>
{% endif %}
</ul><!-- cd-accordion-menu --> </ul><!-- cd-accordion-menu -->
<p>&nbsp;</p> <p>&nbsp;</p>
@@ -5,7 +5,11 @@
{% block title %}Plan entire microcycle{% endblock %} {% block title %}Plan entire microcycle{% endblock %}
{% block main %} {% block main %}
{% if team %}
<h1>Create Group Sessions for {{ team.name }}</h1>
{% else %}
<h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1> <h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
{% endif %}
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
@@ -14,6 +18,9 @@
<table> <table>
{{ dateform.as_table }} {{ dateform.as_table }}
</table> </table>
<table>
{{ teamform.as_table }}
</table>
<input type="Submit" value="Set Date Range"> <input type="Submit" value="Set Date Range">
</form> </form>
</p> </p>
@@ -66,9 +73,15 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% if team %}
<a href="/rowers/sessions/multicreate/user/{{ rower.user.id }}/extra/{{ extrasessions }}/?when={{ timeperiod }}&team={{ team.id }}">
Add More
</a>
{% else %}
<a href="/rowers/sessions/multicreate/user/{{ rower.user.id }}/extra/{{ extrasessions }}/?when={{ timeperiod }}"> <a href="/rowers/sessions/multicreate/user/{{ rower.user.id }}/extra/{{ extrasessions }}/?when={{ timeperiod }}">
Add More Add More
</a> </a>
{% endif %}
or or
<a href="/rowers/sessions/multiclone/user/{{ rower.user.id }}/?when={{ timeperiod }}"> <a href="/rowers/sessions/multiclone/user/{{ rower.user.id }}/?when={{ timeperiod }}">
Clone multiple sessions Clone multiple sessions
@@ -64,7 +64,11 @@
</script> </script>
{% if team %}
<h1>Clone Multiple Sessions for {{ team.name }}</h1>
{% else %}
<h1>Clone Multiple Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1> <h1>Clone Multiple Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
{% endif %}
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
@@ -73,6 +77,9 @@
<table> <table>
{{ dateform.as_table }} {{ dateform.as_table }}
</table> </table>
<table>
{{ teamform.as_table }}
</table>
<input type="Submit" value="Set Date Range"> <input type="Submit" value="Set Date Range">
</form> </form>
</p> </p>
+8
View File
@@ -142,6 +142,10 @@
</tr> </tr>
<tr> <tr>
<td colspan="4"> <td colspan="4">
<a href="/rowers/macrocycle/{{ macrocycle.0.id }}/planbymonths/user/{{ rower.user.id }}">
Replan by Months
</a>
/
<a href='/rowers/sessions/user/{{ rower.user.id }}?when={{ macrocycle.0.startdate|date:"Y-m-d" }}/{{ macrocycle.0.enddate|date:"Y-m-d" }}'>view sessions</a> <a href='/rowers/sessions/user/{{ rower.user.id }}?when={{ macrocycle.0.startdate|date:"Y-m-d" }}/{{ macrocycle.0.enddate|date:"Y-m-d" }}'>view sessions</a>
</td> </td>
</tr> </tr>
@@ -263,6 +267,10 @@
</tr> </tr>
<tr> <tr>
<td colspan="4"> <td colspan="4">
<a href="/rowers/mesocycle/{{ mesocycle.0.id }}/planbyweeks/user/{{ rower.user.id }}">
Replan by Weeks
</a>
/
<a href='/rowers/sessions/user/{{ rower.user.id }}?when={{ mesocycle.0.startdate|date:"Y-m-d" }}/{{ mesocycle.0.enddate|date:"Y-m-d" }}'>view sessions</a> <a href='/rowers/sessions/user/{{ rower.user.id }}?when={{ mesocycle.0.startdate|date:"Y-m-d" }}/{{ mesocycle.0.enddate|date:"Y-m-d" }}'>view sessions</a>
</td> </td>
</tr> </tr>
+12
View File
@@ -355,6 +355,18 @@ def user_teams(user):
return teams 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 @register.filter
def announcements(request): def announcements(request):
announcements = SiteAnnouncement.objects.filter( announcements = SiteAnnouncement.objects.filter(
Binary file not shown.
+47 -2
View File
@@ -182,7 +182,7 @@ def plannedsession_multiclone_view(
startdate,enddate = get_dates_timeperiod(request) startdate,enddate = get_dates_timeperiod(request)
teamid = get_team(request)
if request.method == 'POST' and 'daterange' in request.POST: if request.method == 'POST' and 'daterange' in request.POST:
dateform = DateRangeForm(request.POST) dateform = DateRangeForm(request.POST)
@@ -245,6 +245,17 @@ def plannedsession_multiclone_view(
"startdate","preferreddate","enddate").exclude( "startdate","preferreddate","enddate").exclude(
sessiontype='race') 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') query = request.GET.get('q')
if query: if query:
query_list = query.split() query_list = query.split()
@@ -285,6 +296,13 @@ def plannedsession_multiclone_view(
'enddate':enddate, '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', return render(request, 'plannedsessions_multiclone_select.html',
{'plannedsessions':sps, {'plannedsessions':sps,
'breadcrumbs':breadcrumbs, 'breadcrumbs':breadcrumbs,
@@ -297,6 +315,8 @@ def plannedsession_multiclone_view(
'rower':r, 'rower':r,
'active':'nav-plan', 'active':'nav-plan',
'timeperiod':timeperiod, 'timeperiod':timeperiod,
'team':team,
'teamform':teamform,
} }
) )
@@ -454,6 +474,7 @@ def plannedsession_multicreate_view(request,
startdate,enddate = get_dates_timeperiod(request) startdate,enddate = get_dates_timeperiod(request)
teamid = get_team(request)
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
@@ -472,6 +493,16 @@ def plannedsession_multicreate_view(request,
).order_by("startdate","preferreddate","enddate").exclude( ).order_by("startdate","preferreddate","enddate").exclude(
sessiontype='race') 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 = { initial = {
@@ -500,6 +531,8 @@ def plannedsession_multicreate_view(request,
for ps in instances: for ps in instances:
ps.save() ps.save()
add_rower_session(r,ps) add_rower_session(r,ps)
if team:
add_team_session(team,ps)
messages.info(request,"Saved changes for Planned Session "+str(ps)) messages.info(request,"Saved changes for Planned Session "+str(ps))
for obj in ps_formset.deleted_objects: for obj in ps_formset.deleted_objects:
messages.info(request,"Deleted Planned Session "+str(obj)) messages.info(request,"Deleted Planned Session "+str(obj))
@@ -516,6 +549,9 @@ def plannedsession_multicreate_view(request,
enddatestring = enddate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring url += '?when='+startdatestring+'/'+enddatestring
if team:
url += '&team={teamid}'.format(teamid=team.id)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
ps_formset = PlannedSessionFormSet(queryset = qset, ps_formset = PlannedSessionFormSet(queryset = qset,
@@ -537,16 +573,25 @@ def plannedsession_multicreate_view(request,
'enddate':enddate '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 = { context = {
'ps_formset':ps_formset, 'ps_formset':ps_formset,
'breadcrumbs':breadcrumbs, 'breadcrumbs':breadcrumbs,
'rower':r, 'rower':r,
'active':'nav-plan', 'active':'nav-plan',
'dateform':dateform, 'dateform':dateform,
'teamform':teamform,
'plan':trainingplan, 'plan':trainingplan,
'timeperiod':timeperiod, 'timeperiod':timeperiod,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
'extrasessions': extrasessions+1 'extrasessions': extrasessions+1,
'team':team,
} }
+1 -1
View File
@@ -81,7 +81,7 @@ from rowers.forms import (
FusionMetricChoiceForm,BoxPlotChoiceForm,MultiFlexChoiceForm, FusionMetricChoiceForm,BoxPlotChoiceForm,MultiFlexChoiceForm,
TrendFlexModalForm,WorkoutSplitForm,WorkoutJoinParamForm, TrendFlexModalForm,WorkoutSplitForm,WorkoutJoinParamForm,
AnalysisOptionsForm, AnalysisChoiceForm, AnalysisOptionsForm, AnalysisChoiceForm,
PlannedSessionMultipleCloneForm,SessionDateShiftForm, PlannedSessionMultipleCloneForm,SessionDateShiftForm,RowerTeamForm,
) )
from rowers.models import ( from rowers.models import (
Workout, User, Rower, WorkoutForm,FavoriteChart, Workout, User, Rower, WorkoutForm,FavoriteChart,
+5
View File
@@ -1305,6 +1305,11 @@ def workouts_view(request,message='',successmessage='',
for w in workoutsnohr: for w in workoutsnohr:
res = dataprep.workout_trimp(w) 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: if query:
query_list = query.split() query_list = query.split()
workouts = workouts.filter( workouts = workouts.filter(
+2
View File
@@ -146,6 +146,8 @@ WSGI_APPLICATION = 'rowsandall_app.wsgi.application'
# Database # Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases # https://docs.djangoproject.com/en/1.9/ref/settings/#databases
CONN_MAX_AGE = 0
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',