edit and create team sessions
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib.admin.widgets import FilteredSelectMultiple
|
from django.contrib.admin.widgets import FilteredSelectMultiple
|
||||||
from rowers.models import Workout
|
from rowers.models import Workout,Rower,Team
|
||||||
from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension
|
from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension
|
||||||
from django.contrib.auth.forms import UserCreationForm
|
from django.contrib.auth.forms import UserCreationForm
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
@@ -629,3 +629,26 @@ class WorkoutSessionSelectForm(forms.Form):
|
|||||||
widget = forms.CheckboxSelectMultiple,
|
widget = forms.CheckboxSelectMultiple,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class PlannedSessionTeamForm(forms.Form):
|
||||||
|
team = forms.ModelMultipleChoiceField(
|
||||||
|
queryset=Team.objects.all(),
|
||||||
|
required=False,
|
||||||
|
widget=forms.CheckboxSelectMultiple())
|
||||||
|
|
||||||
|
def __init__(self, user, *args, **kwargs):
|
||||||
|
super(PlannedSessionTeamForm,self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self.fields['team'].queryset = Team.objects.filter(manager=user)
|
||||||
|
|
||||||
|
|
||||||
|
class PlannedSessionTeamMemberForm(forms.Form):
|
||||||
|
members = forms.ModelMultipleChoiceField(
|
||||||
|
queryset=Rower.objects.all(),
|
||||||
|
widget=forms.CheckboxSelectMultiple())
|
||||||
|
|
||||||
|
def __init__(self, thesession, *args, **kwargs):
|
||||||
|
super(PlannedSessionTeamMemberForm,self).__init__(*args,**kwargs)
|
||||||
|
|
||||||
|
self.fields['members'].queryset = thesession.rower.all()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -523,8 +523,11 @@ class Rower(models.Model):
|
|||||||
verbose_name='Show Notes for Favorite Charts')
|
verbose_name='Show Notes for Favorite Charts')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.user.username
|
return self.user.firstname+' '+self.user.last_name
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.user.first_name+' '+self.user.last_name
|
||||||
|
|
||||||
def clean_email(self):
|
def clean_email(self):
|
||||||
return self.user.email.lower()
|
return self.user.email.lower()
|
||||||
|
|
||||||
|
|||||||
@@ -215,8 +215,19 @@ def get_sessions(r,startdate=date.today(),
|
|||||||
rower__in=[r],
|
rower__in=[r],
|
||||||
startdate__lte=enddate,
|
startdate__lte=enddate,
|
||||||
enddate__gte=startdate,
|
enddate__gte=startdate,
|
||||||
).order_by("startdate","enddate")
|
).order_by("startdate","enddate")
|
||||||
|
|
||||||
|
return sps
|
||||||
|
|
||||||
|
def get_sessions_manager(manager,startdate=date.today(),
|
||||||
|
enddate=date.today()+timezone.timedelta(+1000)):
|
||||||
|
|
||||||
|
sps = PlannedSession.objects.filter(
|
||||||
|
manager=manager,
|
||||||
|
startdate__lte=enddate,
|
||||||
|
enddate__gte=startdate,
|
||||||
|
).order_by("startdate","enddate").exclude(team__isnull=True)
|
||||||
|
|
||||||
return sps
|
return sps
|
||||||
|
|
||||||
def get_workouts_session(r,ps):
|
def get_workouts_session(r,ps):
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="grid_12 alpha">
|
<div class="grid_12 alpha">
|
||||||
{% include "planningbuttons.html" %}
|
{% include "planningbuttons.html" %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid_12 alpha">
|
<div class="grid_12 alpha">
|
||||||
<div id="left" class="grid_6 alpha">
|
<div id="left" class="grid_6 alpha">
|
||||||
<h1>Create Session for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
<h1>Create Session for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
</table>
|
</table>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||||
<input class="button green" type="submit" value="Submit">
|
<input class="button green" type="submit" value="Save">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -39,15 +39,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if user.is_authenticated and user|is_manager %}
|
{% if user.is_authenticated and user|is_manager %}
|
||||||
<div class="grid_2 dropdown">
|
<div class="grid_2">
|
||||||
<button class="grid_2 alpha button green small dropbtn">
|
<a class="button green small alpha" href="/rowers/sessions/teamedit/{{ thesession.id }}/{{ timeperiod}}">
|
||||||
Change Rower
|
Assign to my Teams
|
||||||
</button>
|
</a>
|
||||||
<div class="dropdown-content">
|
|
||||||
{% for member in user|team_rowers %}
|
|
||||||
<a class="button green small" href="/rowers/sessions/create/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -117,6 +117,57 @@
|
|||||||
You have no planned workouts for this period. Planned workouts are created
|
You have no planned workouts for this period. Planned workouts are created
|
||||||
by your coach if you are part of a team. You can create your own
|
by your coach if you are part of a team. You can create your own
|
||||||
planned workouts by purchasing the "Coach" or "Self-Coach" plans.
|
planned workouts by purchasing the "Coach" or "Self-Coach" plans.
|
||||||
|
{% endif %}
|
||||||
|
{% if unmatchedworkouts %}
|
||||||
|
<h1>Workouts that are not linked to any session</h1>
|
||||||
|
<table width="90%" class="listtable shortpadded">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width:80"> Date</th>
|
||||||
|
<th> Time</th>
|
||||||
|
<th> Name</th>
|
||||||
|
<th> Type</th>
|
||||||
|
<th> Distance </th>
|
||||||
|
<th> Duration </th>
|
||||||
|
<th> Avg HR </th>
|
||||||
|
<th> Max HR </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for workout in unmatchedworkouts %}
|
||||||
|
<tr>
|
||||||
|
<td> {{ workout.date|date:"Y-m-d" }} </td>
|
||||||
|
<td> {{ workout.starttime|date:"H:i" }} </td>
|
||||||
|
{% if workout.user.user == user or user == team.manager %}
|
||||||
|
{% if workout.name != '' %}
|
||||||
|
<td>
|
||||||
|
<a href={% url rower.defaultlandingpage id=workout.id %}>
|
||||||
|
{{ workout.name }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
{% else %}
|
||||||
|
<td>
|
||||||
|
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
|
||||||
|
</a></td>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if workout.name != '' %}
|
||||||
|
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td>
|
||||||
|
{% else %}
|
||||||
|
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
<td> {{ workout.workouttype }} </td>
|
||||||
|
<td> {{ workout.distance }}m</td>
|
||||||
|
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||||
|
<td> {{ workout.averagehr }} </td>
|
||||||
|
<td> {{ workout.maxhr }} </td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -59,10 +59,10 @@
|
|||||||
{% for member in user|team_rowers %}
|
{% for member in user|team_rowers %}
|
||||||
<a class="button green small" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
<a class="button green small" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="grid_12 alpha">
|
<div class="grid_12 alpha">
|
||||||
<p>Select one session on the left, and one or more workouts on the right
|
<p>Select one session on the left, and one or more workouts on the right
|
||||||
to match the workouts to the session. For tests and training sessions,
|
to match the workouts to the session. For tests and training sessions,
|
||||||
@@ -92,8 +92,6 @@
|
|||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input class="button green" type="submit" value="Submit">
|
<input class="button green" type="submit" value="Submit">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
121
rowers/templates/plannedsessionteamcreate.html
Normal file
121
rowers/templates/plannedsessionteamcreate.html
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% block title %}New Planned Session{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
{% include "planningbuttons.html" %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
<div id="left" class="grid_6 alpha">
|
||||||
|
<h1>Create Team Session</h1>
|
||||||
|
</div>
|
||||||
|
<div id="timeperiod" class="grid_2 dropdown">
|
||||||
|
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||||
|
<div class="dropdown-content">
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||||
|
Today
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||||
|
This Week
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||||
|
This Month
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||||
|
Last Week
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||||
|
Last Month
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||||
|
{% if form.errors %}
|
||||||
|
<p style="color: red;">
|
||||||
|
Please correct the error{{ form.errors|pluralize }} below.
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
<div id="right" class="grid_6 alpha">
|
||||||
|
<h1>Select Team</h1>
|
||||||
|
<p>
|
||||||
|
<table>
|
||||||
|
{{ teamform.as_table }}
|
||||||
|
</table></p>
|
||||||
|
{% if plannedsessions %}
|
||||||
|
<h1>Team Plan Sessions</h1>
|
||||||
|
<p>
|
||||||
|
<table class="listtable shortpadded" width="80%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>After</th>
|
||||||
|
<th>Before</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
<th> </th>
|
||||||
|
<th>Edit</th>
|
||||||
|
<th>Clone</th>
|
||||||
|
<th>Delete</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for ps in plannedsessions %}
|
||||||
|
<tr>
|
||||||
|
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||||
|
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||||
|
<td>
|
||||||
|
{% if ps.name != '' %}
|
||||||
|
<a class="small"
|
||||||
|
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="small"
|
||||||
|
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td> {{ ps.sessionvalue }} </td>
|
||||||
|
<td> {{ ps.sessionunit }} </td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="grid_6 omega">
|
||||||
|
<h1>New Session</h1>
|
||||||
|
<table>
|
||||||
|
{{ form.as_table }}
|
||||||
|
</table>
|
||||||
|
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||||
|
<input class="button green" type="submit" value="Save">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
137
rowers/templates/plannedsessionteamedit.html
Normal file
137
rowers/templates/plannedsessionteamedit.html
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% block title %}New Planned Session{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
{% include "planningbuttons.html" %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
<div id="left" class="grid_6 alpha">
|
||||||
|
<h1>Edit Team Session</h1>
|
||||||
|
</div>
|
||||||
|
<div id="timeperiod" class="grid_2 dropdown">
|
||||||
|
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||||
|
<div class="dropdown-content">
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||||
|
Today
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||||
|
This Week
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||||
|
This Month
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||||
|
Last Week
|
||||||
|
</a>
|
||||||
|
<a class="button gray small alpha"
|
||||||
|
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||||
|
Last Month
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid_12 alpha">
|
||||||
|
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||||
|
{% if form.errors %}
|
||||||
|
<p style="color: red;">
|
||||||
|
Please correct the error{{ form.errors|pluralize }} below.
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
<div id="right" class="grid_6 alpha">
|
||||||
|
<h1>Select Team</h1>
|
||||||
|
<p>
|
||||||
|
Selecting a team assigns this session to all members of the team.
|
||||||
|
Unselecting a team does not remove rowers
|
||||||
|
who are already assigned to this session. Use the Rowers selection for that.
|
||||||
|
</p><p>
|
||||||
|
<table>
|
||||||
|
{{ teamform.as_table }}
|
||||||
|
</table></p>
|
||||||
|
<h1>Select Rowers</h1>
|
||||||
|
<p>
|
||||||
|
<table>
|
||||||
|
{{ rowersform.as_table }}
|
||||||
|
</table>
|
||||||
|
</p>
|
||||||
|
{% if plannedsessions %}
|
||||||
|
<h1>Team Plan Sessions</h1>
|
||||||
|
<p>
|
||||||
|
<table class="listtable shortpadded" width="80%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>After</th>
|
||||||
|
<th>Before</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
<th> </th>
|
||||||
|
<th>Edit</th>
|
||||||
|
<th>Clone</th>
|
||||||
|
<th>Delete</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for ps in plannedsessions %}
|
||||||
|
<tr>
|
||||||
|
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||||
|
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||||
|
<td>
|
||||||
|
{% if ps.name != '' %}
|
||||||
|
<a class="small"
|
||||||
|
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="small"
|
||||||
|
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td> {{ ps.sessionvalue }} </td>
|
||||||
|
<td> {{ ps.sessionunit }} </td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="grid_6 omega">
|
||||||
|
<h1>Session {{ plannedsession.name }}</h1>
|
||||||
|
<table>
|
||||||
|
{{ form.as_table }}
|
||||||
|
</table>
|
||||||
|
<div class="grid_1 prefix_2 alpha">
|
||||||
|
<a class="red button small" href="/rowers/sessions/{{ plannedsession.id }}/deleteconfirm">Delete</a>
|
||||||
|
</div>
|
||||||
|
<div class="grid_1">
|
||||||
|
<a class="gray button small" href="/rowers/sessions/{{ plannedsession.id }}/clone">Clone</a>
|
||||||
|
</div>
|
||||||
|
<div id="formbutton" class="grid_1 suffix_1 omega">
|
||||||
|
<input class="button green" type="submit" value="Save">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid_2 suffix_6 omega">
|
<div class="grid_2">
|
||||||
<p>
|
<p>
|
||||||
{% if timeperiod and rower %}
|
{% if timeperiod and rower %}
|
||||||
<a class="button gray small" href="/rowers/sessions/create/{{ timeperiod }}/rower/{{ rower.id }}">Add Session</a>
|
<a class="button gray small" href="/rowers/sessions/create/{{ timeperiod }}/rower/{{ rower.id }}">Add Session</a>
|
||||||
@@ -32,3 +32,15 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="grid_2 omega">
|
||||||
|
{% if user.is_authenticated and user|is_manager %}
|
||||||
|
{% if timeperiod %}
|
||||||
|
<a class="button gray small" href="/rowers/sessions/teamcreate/{{ timeperiod }}">Add Team Session</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="button gray small" href="/rowers/session/teamcreate">Add Team Session</a>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -398,6 +398,18 @@ urlpatterns = [
|
|||||||
url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2),
|
url(r'^workout/compare/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>[\w\ ]+.*)/$',views.workout_comparison_view2),
|
||||||
url(r'^test\_callback',views.rower_process_testcallback),
|
url(r'^test\_callback',views.rower_process_testcallback),
|
||||||
url(r'^workout/(?P<id>\d+)/test\_strokedata$',views.strokedataform),
|
url(r'^workout/(?P<id>\d+)/test\_strokedata$',views.strokedataform),
|
||||||
|
|
||||||
|
url(r'^sessions/teamcreate$',views.plannedsession_teamcreate_view),
|
||||||
|
url(r'^sessions/teamcreate/(?P<timeperiod>[\w\ ]+.*)$',
|
||||||
|
views.plannedsession_teamcreate_view),
|
||||||
|
url(r'^sessions/teamcreate/(?P<timeperiod>[\w\ ]+.*)/team/(?P<teamid>\d+)$',
|
||||||
|
views.plannedsession_teamcreate_view),
|
||||||
|
url(r'^sessions/teamcreate/team/(?P<teamid>\d+)$',
|
||||||
|
views.plannedsession_teamcreate_view),
|
||||||
|
|
||||||
|
url(r'^sessions/teamedit/(?P<sessionid>\d+)$',views.plannedsession_teamedit_view),
|
||||||
|
url(r'^sessions/teamedit/(?P<sessionid>\d+)/(?P<timeperiod>[\w\ ]+.*)$',views.plannedsession_teamedit_view),
|
||||||
|
|
||||||
url(r'^sessions/create$',views.plannedsession_create_view),
|
url(r'^sessions/create$',views.plannedsession_create_view),
|
||||||
url(r'^sessions/create/rower/(?P<rowerid>\d+)$',
|
url(r'^sessions/create/rower/(?P<rowerid>\d+)$',
|
||||||
views.plannedsession_create_view),
|
views.plannedsession_create_view),
|
||||||
|
|||||||
236
rowers/views.py
236
rowers/views.py
@@ -30,7 +30,8 @@ from rowers.forms import (
|
|||||||
LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,
|
LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,
|
||||||
TeamUploadOptionsForm,WorkFlowLeftPanelForm,WorkFlowMiddlePanelForm,
|
TeamUploadOptionsForm,WorkFlowLeftPanelForm,WorkFlowMiddlePanelForm,
|
||||||
WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement,
|
WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement,
|
||||||
LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm
|
LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm,
|
||||||
|
PlannedSessionTeamForm,PlannedSessionTeamMemberForm,
|
||||||
)
|
)
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
@@ -11809,6 +11810,208 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
|
|||||||
'timeperiod':timeperiod,
|
'timeperiod':timeperiod,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Manager creates sessions for entire team
|
||||||
|
@user_passes_test(iscoachmember,login_url="/rowers/planmembership/",
|
||||||
|
redirect_field_name=None)
|
||||||
|
def plannedsession_teamcreate_view(request,timeperiod='thisweek',
|
||||||
|
teamid=0):
|
||||||
|
|
||||||
|
|
||||||
|
teams = Team.objects.filter(manager=request.user)
|
||||||
|
teamchoices = [(team.id, team.name) for team in teams]
|
||||||
|
teaminitial = [str(teams[0].id)]
|
||||||
|
|
||||||
|
startdate,enddate = get_dates_timeperiod(timeperiod)
|
||||||
|
|
||||||
|
sps = []
|
||||||
|
for team in teams:
|
||||||
|
res = get_sessions_manager(request.user,startdate=startdate,enddate=enddate)
|
||||||
|
sps += res
|
||||||
|
|
||||||
|
sps = list(set(sps))
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
sessioncreateform = PlannedSessionForm(request.POST)
|
||||||
|
sessionteamselectform = PlannedSessionTeamForm(
|
||||||
|
request.user,request.POST
|
||||||
|
)
|
||||||
|
if sessioncreateform.is_valid():
|
||||||
|
cd = sessioncreateform.cleaned_data
|
||||||
|
startdate = cd['startdate']
|
||||||
|
enddate = cd['enddate']
|
||||||
|
sessiontype = cd['sessiontype']
|
||||||
|
sessionmode = cd['sessionmode']
|
||||||
|
criterium = cd['criterium']
|
||||||
|
sessionvalue = cd['sessionvalue']
|
||||||
|
sessionunit = cd['sessionunit']
|
||||||
|
comment = cd['comment']
|
||||||
|
name = cd['name']
|
||||||
|
|
||||||
|
if sessionunit == 'min':
|
||||||
|
sessionmode = 'time'
|
||||||
|
elif sessionunit in ['km','m']:
|
||||||
|
sessionmode = 'distance'
|
||||||
|
|
||||||
|
ps = PlannedSession(
|
||||||
|
name=name,
|
||||||
|
startdate=startdate,
|
||||||
|
enddate=enddate,
|
||||||
|
sessiontype=sessiontype,
|
||||||
|
sessionmode=sessionmode,
|
||||||
|
sessionvalue=sessionvalue,
|
||||||
|
sessionunit=sessionunit,
|
||||||
|
comment=comment,
|
||||||
|
criterium=criterium,
|
||||||
|
manager=request.user)
|
||||||
|
|
||||||
|
ps.save()
|
||||||
|
|
||||||
|
# some logic when to add all selected rowers
|
||||||
|
if sessionteamselectform.is_valid():
|
||||||
|
cd = sessionteamselectform.cleaned_data
|
||||||
|
teams = cd['team']
|
||||||
|
for team in teams:
|
||||||
|
add_team_session(team,ps)
|
||||||
|
rs = Rower.objects.filter(team__in=[team])
|
||||||
|
for r in rs:
|
||||||
|
add_rower_session(r,ps)
|
||||||
|
|
||||||
|
|
||||||
|
url = reverse(plannedsession_teamcreate_view,
|
||||||
|
kwargs = {
|
||||||
|
'timeperiod':timeperiod,
|
||||||
|
})
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
|
else:
|
||||||
|
sessioncreateform = PlannedSessionForm()
|
||||||
|
sessionteamselectform = PlannedSessionTeamForm(
|
||||||
|
request.user
|
||||||
|
)
|
||||||
|
|
||||||
|
return render(request,'plannedsessionteamcreate.html',
|
||||||
|
{
|
||||||
|
'teams':get_my_teams(request.user),
|
||||||
|
'form':sessioncreateform,
|
||||||
|
'teamform':sessionteamselectform,
|
||||||
|
'timeperiod':timeperiod,
|
||||||
|
'plannedsessions':sps,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Manager edits sessions for entire team
|
||||||
|
@user_passes_test(iscoachmember,login_url="/rowers/planmembership/",
|
||||||
|
redirect_field_name=None)
|
||||||
|
def plannedsession_teamedit_view(request,timeperiod='thisweek',
|
||||||
|
sessionid=0):
|
||||||
|
|
||||||
|
try:
|
||||||
|
ps = PlannedSession.objects.get(id=sessionid)
|
||||||
|
except PlannedSession.DoesNotExist:
|
||||||
|
raise Http404("This session doesn't exist")
|
||||||
|
if not ps.manager == request.user:
|
||||||
|
raise Http404("You are not the manager of this session")
|
||||||
|
|
||||||
|
teams = Team.objects.filter(manager=request.user)
|
||||||
|
teamchoices = [(team.id, team.name) for team in teams]
|
||||||
|
|
||||||
|
teaminitial = ps.team.all()
|
||||||
|
|
||||||
|
startdate,enddate = get_dates_timeperiod(timeperiod)
|
||||||
|
|
||||||
|
sps = []
|
||||||
|
rowers = []
|
||||||
|
for team in teams:
|
||||||
|
res = get_sessions_manager(request.user,startdate=startdate,enddate=enddate)
|
||||||
|
sps += res
|
||||||
|
rowers += Rower.objects.filter(team__in=[team])
|
||||||
|
|
||||||
|
rowers = list(set(rowers))
|
||||||
|
|
||||||
|
|
||||||
|
sps = list(set(sps))
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
sessioncreateform = PlannedSessionForm(request.POST,instance=ps)
|
||||||
|
sessionteamselectform = PlannedSessionTeamForm(
|
||||||
|
request.user,request.POST
|
||||||
|
)
|
||||||
|
sessionrowerform = PlannedSessionTeamMemberForm(ps,request.POST)
|
||||||
|
if sessioncreateform.is_valid():
|
||||||
|
cd = sessioncreateform.cleaned_data
|
||||||
|
|
||||||
|
if cd['sessionunit'] == 'min':
|
||||||
|
cd['sessionmode'] = 'time'
|
||||||
|
elif cd['sessionunit'] in ['km','m']:
|
||||||
|
cd['sessionmode'] = 'distance'
|
||||||
|
|
||||||
|
|
||||||
|
res,message = update_plannedsession(ps,cd)
|
||||||
|
|
||||||
|
if res:
|
||||||
|
messages.info(request,message)
|
||||||
|
else:
|
||||||
|
messages.error(request,message)
|
||||||
|
|
||||||
|
|
||||||
|
# some logic when to add all selected rowers
|
||||||
|
if sessionteamselectform.is_valid():
|
||||||
|
cd = sessionteamselectform.cleaned_data
|
||||||
|
selectedteams = cd['team']
|
||||||
|
for team in teams:
|
||||||
|
if team in selectedteams:
|
||||||
|
add_team_session(team,ps)
|
||||||
|
rs = Rower.objects.filter(team__in=[team])
|
||||||
|
for r in rs:
|
||||||
|
add_rower_session(r,ps)
|
||||||
|
else:
|
||||||
|
remove_team_session(team,ps)
|
||||||
|
else:
|
||||||
|
selectedteams = []
|
||||||
|
|
||||||
|
|
||||||
|
if sessionrowerform.is_valid():
|
||||||
|
cd = sessionrowerform.cleaned_data
|
||||||
|
selectedrowers = cd['members']
|
||||||
|
for r in rowers:
|
||||||
|
if r in selectedrowers:
|
||||||
|
add_rower_session(r,ps)
|
||||||
|
else:
|
||||||
|
remove_rower_session(r,ps)
|
||||||
|
for t in selectedteams:
|
||||||
|
if t in r.team.all():
|
||||||
|
add_rower_session(r,ps)
|
||||||
|
|
||||||
|
|
||||||
|
url = reverse(plannedsession_teamedit_view,
|
||||||
|
kwargs = {
|
||||||
|
'sessionid':sessionid,
|
||||||
|
'timeperiod':timeperiod,
|
||||||
|
})
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
|
else:
|
||||||
|
sessioncreateform = PlannedSessionForm(instance=ps)
|
||||||
|
sessionteamselectform = PlannedSessionTeamForm(
|
||||||
|
request.user
|
||||||
|
)
|
||||||
|
sessionteamselectform.fields['team'].initial = teaminitial
|
||||||
|
sessionrowerform = PlannedSessionTeamMemberForm(
|
||||||
|
ps
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
sessionrowerform.fields['members'].initial = ps.rower.all()
|
||||||
|
|
||||||
|
return render(request,'plannedsessionteamedit.html',
|
||||||
|
{
|
||||||
|
'plannedsession':ps,
|
||||||
|
'teams':get_my_teams(request.user),
|
||||||
|
'form':sessioncreateform,
|
||||||
|
'teamform':sessionteamselectform,
|
||||||
|
'rowersform':sessionrowerform,
|
||||||
|
'timeperiod':timeperiod,
|
||||||
|
'plannedsessions':sps,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
|
def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
|
||||||
|
|
||||||
@@ -11840,7 +12043,12 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
|
|||||||
completiondate[ps.id] = date
|
completiondate[ps.id] = date
|
||||||
else:
|
else:
|
||||||
completiondate[ps.id] = ''
|
completiondate[ps.id] = ''
|
||||||
|
|
||||||
|
unmatchedworkouts = Workout.objects.filter(
|
||||||
|
user=r,
|
||||||
|
plannedsession=None,
|
||||||
|
date__gte=startdate,date__lte=enddate)
|
||||||
|
|
||||||
return render(request,'plannedsessions.html',
|
return render(request,'plannedsessions.html',
|
||||||
{
|
{
|
||||||
'teams':get_my_teams(request.user),
|
'teams':get_my_teams(request.user),
|
||||||
@@ -11850,6 +12058,7 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
|
|||||||
'completeness':completeness,
|
'completeness':completeness,
|
||||||
'actualvalue':actualvalue,
|
'actualvalue':actualvalue,
|
||||||
'completiondate':completiondate,
|
'completiondate':completiondate,
|
||||||
|
'unmatchedworkouts':unmatchedworkouts,
|
||||||
})
|
})
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
@@ -11926,7 +12135,10 @@ def plannedsessions_manage_view(request,timeperiod='thisweek',rowerid=0,
|
|||||||
else:
|
else:
|
||||||
selectedworkouts = []
|
selectedworkouts = []
|
||||||
|
|
||||||
|
if len(selectedworkouts)==0:
|
||||||
|
for w in ws:
|
||||||
|
remove_workout_plannedsession(w,ps)
|
||||||
|
|
||||||
if selectedworkouts:
|
if selectedworkouts:
|
||||||
workouts = Workout.objects.filter(user=r,id__in=selectedworkouts)
|
workouts = Workout.objects.filter(user=r,id__in=selectedworkouts)
|
||||||
for w in ws:
|
for w in ws:
|
||||||
@@ -11997,6 +12209,9 @@ def plannedsession_clone_view(request,id=0,rowerid=0,
|
|||||||
if ps.manager != request.user:
|
if ps.manager != request.user:
|
||||||
raise Http404("You are not allowed to clone this planned session")
|
raise Http404("You are not allowed to clone this planned session")
|
||||||
|
|
||||||
|
rowers = ps.rower.all()
|
||||||
|
teams = ps.team.all()
|
||||||
|
|
||||||
ps.pk = None
|
ps.pk = None
|
||||||
|
|
||||||
deltadays = ps.enddate-ps.startdate
|
deltadays = ps.enddate-ps.startdate
|
||||||
@@ -12007,7 +12222,10 @@ def plannedsession_clone_view(request,id=0,rowerid=0,
|
|||||||
|
|
||||||
ps.save()
|
ps.save()
|
||||||
|
|
||||||
add_rower_session(r,ps)
|
for rower in rowers:
|
||||||
|
add_rower_session(rower,ps)
|
||||||
|
for team in teams:
|
||||||
|
add_team_session(team,ps)
|
||||||
|
|
||||||
url = reverse(plannedsession_edit_view,
|
url = reverse(plannedsession_edit_view,
|
||||||
kwargs = {
|
kwargs = {
|
||||||
@@ -12024,7 +12242,7 @@ def plannedsession_clone_view(request,id=0,rowerid=0,
|
|||||||
@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/",
|
@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/",
|
||||||
redirect_field_name=None)
|
redirect_field_name=None)
|
||||||
def plannedsession_edit_view(request,id=0,timeperiod='thisweek',rowerid=0):
|
def plannedsession_edit_view(request,id=0,timeperiod='thisweek',rowerid=0):
|
||||||
|
|
||||||
if rowerid==0:
|
if rowerid==0:
|
||||||
r = getrower(request.user)
|
r = getrower(request.user)
|
||||||
else:
|
else:
|
||||||
@@ -12046,6 +12264,14 @@ def plannedsession_edit_view(request,id=0,timeperiod='thisweek',rowerid=0):
|
|||||||
if ps.manager != request.user:
|
if ps.manager != request.user:
|
||||||
raise Http404("You are not allowed to edit this planned session")
|
raise Http404("You are not allowed to edit this planned session")
|
||||||
|
|
||||||
|
if ps.team.all() or len(ps.rower.all())>1:
|
||||||
|
url = reverse(plannedsession_teamedit_view,
|
||||||
|
kwargs={
|
||||||
|
'timeperiod':timeperiod,
|
||||||
|
'sessionid':id,
|
||||||
|
})
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
sessioncreateform = PlannedSessionForm(request.POST,instance=ps)
|
sessioncreateform = PlannedSessionForm(request.POST,instance=ps)
|
||||||
if sessioncreateform.is_valid():
|
if sessioncreateform.is_valid():
|
||||||
|
|||||||
Reference in New Issue
Block a user