Private
Public Access
1
0

Merge branch 'feature/multiplanningform' into develop

This commit is contained in:
Sander Roosendaal
2018-02-13 21:57:59 +01:00
7 changed files with 300 additions and 7 deletions

View File

@@ -614,6 +614,12 @@ class BaseFavoriteFormSet(BaseFormSet):
if not yparam2: if not yparam2:
yparam2 = 'None' yparam2 = 'None'
class BasePlannedSessionFormSet(BaseFormSet):
def clean(self):
if any(self.serrors):
return
# Check if workout is owned by this user # Check if workout is owned by this user
def checkworkoutuser(user,workout): def checkworkoutuser(user,workout):
try: try:
@@ -918,6 +924,37 @@ class PlannedSessionForm(ModelForm):
'enddate': AdminDateWidget(), 'enddate': AdminDateWidget(),
} }
class PlannedSessionFormSmall(ModelForm):
class Meta:
model = PlannedSession
fields = ['startdate',
'enddate',
'name',
'sessiontype',
'sessionmode',
'criterium',
'sessionvalue',
'sessionunit',
'manager',
'comment',
]
dateTimeOptions = {
'format': 'yyyy-mm-dd',
'autoclose': True,
}
widgets = {
'startdate': DateInput(attrs={'size':10}),
'enddate': DateInput(attrs={'size':10}),
'name': forms.TextInput(attrs={'size':10}),
'comment': forms.TextInput(attrs={'size':10}),
'sessionvalue': forms.TextInput(attrs={'style':'width:3em',
'type':'number'}),
'manager': forms.HiddenInput(),
}
# Workout # Workout
class Workout(models.Model): class Workout(models.Model):

View File

@@ -0,0 +1,146 @@
{% 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 Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</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/multicreate/today/rower/{{ rower.id }}">
Today
</a>
<a class="button gray small alpha"
href="/rowers/sessions/multicreate/thisweek/rower/{{ rower.id }}">
This Week
</a>
<a class="button gray small alpha"
href="/rowers/sessions/multicreate/thismonth/rower/{{ rower.id }}">
This Month
</a>
<a class="button gray small alpha"
href="/rowers/sessions/multicreate/lastweek/rower/{{ rower.id }}">
Last Week
</a>
<a class="button gray small alpha"
href="/rowers/sessions/multicreate/lastmonth/rower/{{ rower.id }}">
Last Month
</a>
</div>
</div>
{% if user.is_authenticated and user|is_manager %}
<div class="grid_2 dropdown">
<button class="grid_2 alpha button green small dropbtn">
Change Rower
</button>
<div class="dropdown-content">
{% for member in user|team_rowers %}
<a class="button green small" href="/rowers/sessions/multicreate/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
{% endfor %}
</div>
</div>
{% endif %}
</div>
<div class="grid_12 alpha">
<p>
On this page, you can create and edit sessions for an entire time
period.
</p>
<form id="ps-form-table" method="post">
{% csrf_token %}
{{ ps_formset.management_form }}
<table width="100%">
<thead>
<tr>
<th>&nbsp;</th>
{% for field in ps_formset.0.visible_fields %}
<td>{{ field.label_tag }}</td>
{% endfor %}
</tr>
</thead>
<tbody>
{% for form in ps_formset %}
<tr id="id_form_row">
<td> {{ forloop.counter }}
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
{{ form.id }}
{% for field in form.hidden_fields %}
{{ field }}
{% endfor %}
{% for field in form.visible_fields %}
<td>
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
<a class="button gray small grid_2" href="/rowers/sessions/multicreate/thisweek/rower/{{ rower.id }}/extra/{{ extrasessions }}">Add More</a>
<button class="button green small grid_2" type="submit">Submit</button>
</form>
</div>
{% endblock %}
{% block scripts %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="/static/js/jquery.formset.js"></script>
<script>
$(document).ready(function(){
$('#ps-form-table tbody tr').formset({
addText: ''
});
$("td #id_sessionmode").change(function() {
if (this.value == 'TRIMP') {
$("td #id_sessionunit").prop("value","None");
}
if (this.value == 'distance') {
$("td #id_sessionunit").prop("value","m");
}
if (this.value == 'time') {
$("td #id_sessionunit").prop("value","min");
}
if (this.value == 'rScore') {
$("td #id_sessionunit").prop("value","None");
}
});
$("td #id_sessiontype").change(function() {
if (this.value == 'session') {
$("td #id_criterium").prop("value","none");
}
if (this.value == 'test') {
$("td #id_criterium").prop("value","exact");
}
if (this.value == 'challenge') {
$("td #id_criterium").prop("value","minimum");
}
}
);
});
</script>
{% endblock %}

View File

@@ -11,7 +11,7 @@
<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 Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
</div> </div>
<div id="timeperiod" class="grid_2 dropdown"> <div id="timeperiod" class="grid_2 dropdown">
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button> <button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>

View File

@@ -102,7 +102,7 @@
<td> <td>
{% if ps.manager == request.user %} {% if ps.manager == request.user %}
<a class="small" <a class="small"
href="/rowers/sessions/{{ ps.id }}/edit">Edit</a> href="/rowers/sessions/{{ ps.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }} ">Edit</a>
{% else %} {% else %}
&nbsp; &nbsp;
{% endif %} {% endif %}

View File

@@ -32,6 +32,9 @@
{% endif %} {% endif %}
</p> </p>
</div> </div>
<div class="grid_2">
<a class="button gray small" href="/rowers/sessions/multicreate/{{ timeperiod }}/rower/{{ rower.id }}">Bulk Session Edit ({{ timeperiod|verbosetimeperiod }})</a>
</div>
<div class="grid_2"> <div class="grid_2">
{% if user.is_authenticated and user|is_manager %} {% if user.is_authenticated and user|is_manager %}
{% if timeperiod %} {% if timeperiod %}

View File

@@ -419,6 +419,17 @@ urlpatterns = [
url(r'^sessions/create/(?P<timeperiod>[\w\ ]+.*)$', url(r'^sessions/create/(?P<timeperiod>[\w\ ]+.*)$',
views.plannedsession_create_view), views.plannedsession_create_view),
url(r'^sessions/multicreate$',views.plannedsession_multicreate_view),
url(r'^sessions/multicreate/(?P<timeperiod>[\w\ ]+.*)/rower/(?P<rowerid>\d+)/extra/(?P<extrasessions>\d+)$',
views.plannedsession_multicreate_view),
url(r'^sessions/multicreate/rower/(?P<rowerid>\d+)$',
views.plannedsession_multicreate_view),
url(
r'^sessions/multicreate/(?P<timeperiod>[\w\ ]+.*)/rower/(?P<rowerid>\d+)$',
views.plannedsession_multicreate_view),
url(r'^sessions/multicreate/(?P<timeperiod>[\w\ ]+.*)$',
views.plannedsession_multicreate_view),
url(r'^sessions/(?P<id>\d+)/edit$',views.plannedsession_edit_view), url(r'^sessions/(?P<id>\d+)/edit$',views.plannedsession_edit_view),
url(r'^sessions/(?P<id>\d+)/edit/(?P<timeperiod>[\w\ ]+.*)/rower/(?P<rowerid>\d+)$',views.plannedsession_edit_view), url(r'^sessions/(?P<id>\d+)/edit/(?P<timeperiod>[\w\ ]+.*)/rower/(?P<rowerid>\d+)$',views.plannedsession_edit_view),
url(r'^sessions/(?P<id>\d+)/edit/(?P<timeperiod>[\w\ ]+.*)$',views.plannedsession_edit_view), url(r'^sessions/(?P<id>\d+)/edit/(?P<timeperiod>[\w\ ]+.*)$',views.plannedsession_edit_view),

View File

@@ -60,13 +60,17 @@ from rowers.models import (
RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData, RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData,
Team,TeamForm,TeamInviteForm,TeamInvite,TeamRequest, Team,TeamForm,TeamInviteForm,TeamInvite,TeamRequest,
WorkoutComment,WorkoutCommentForm,RowerExportForm, WorkoutComment,WorkoutCommentForm,RowerExportForm,
CalcAgePerformance,PowerTimeFitnessMetric,PlannedSessionForm CalcAgePerformance,PowerTimeFitnessMetric,PlannedSessionForm,
PlannedSessionFormSmall,
)
from rowers.models import (
FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet
) )
from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement
from rowers.metrics import rowingmetrics,defaultfavoritecharts from rowers.metrics import rowingmetrics,defaultfavoritecharts
from rowers import metrics from rowers import metrics
import rowers.uploads as uploads import rowers.uploads as uploads
from django.forms.formsets import formset_factory from django.forms.formsets import formset_factory
from django.forms import modelformset_factory
import StringIO import StringIO
from django.contrib.auth.decorators import login_required,user_passes_test from django.contrib.auth.decorators import login_required,user_passes_test
from time import strftime,strptime,mktime,time,daylight from time import strftime,strptime,mktime,time,daylight
@@ -8807,7 +8811,6 @@ def workout_uploadimage_view(request,id):
if f is not None: if f is not None:
filename,path_and_filename = handle_uploaded_image(f) filename,path_and_filename = handle_uploaded_image(f)
print path_and_filename,'aap'
try: try:
width,height = Image.open(path_and_filename).size width,height = Image.open(path_and_filename).size
except: except:
@@ -11643,8 +11646,6 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
else: else:
forminitial = {} forminitial = {}
print forminitial
sessioncreateform = PlannedSessionForm(initial=forminitial) sessioncreateform = PlannedSessionForm(initial=forminitial)
startdate,enddate = get_dates_timeperiod(timeperiod) startdate,enddate = get_dates_timeperiod(timeperiod)
@@ -11659,6 +11660,101 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
'timeperiod':timeperiod, 'timeperiod':timeperiod,
}) })
@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/",
redirect_field_name=None)
def plannedsession_multicreate_view(request,timeperiod='thisweek',
teamid=0,rowerid=0,extrasessions=0):
extrasessions=int(extrasessions)
if rowerid==0:
r = getrower(request.user)
else:
try:
r = Rower.objects.get(id=rowerid)
except Rower.DoesNotExist:
raise Http404("This rower doesn't exist")
if not checkaccessuser(request.user,r):
raise PermissionDenied("You don't have access to this plan")
startdate,enddate = get_dates_timeperiod(timeperiod)
sps = get_sessions(r,startdate=startdate,enddate=enddate)
m = Rower.objects.get(user=request.user)
if m.rowerplan == 'coach':
teams = Team.objects.filter(manager=request.user)
members = Rower.objects.filter(team__in=teams).distinct()
if r in members:
qset = PlannedSession.objects.filter(
rower__in=[r],
startdate__lte=enddate,
enddate__gte=startdate,
).order_by("startdate","enddate")
else:
qset = []
if not qset:
qset = PlannedSession.objects.filter(
rower__in=[r],
manager = request.user,
startdate__lte=enddate,
enddate__gte=startdate,
).order_by("startdate","enddate")
initial = {
'startdate':startdate,
'enddate':enddate,
'sessionvalue':60,
'manager':request.user,
'name': 'NEW SESSION'
}
initials = [initial for i in range(extrasessions)]
PlannedSessionFormSet = modelformset_factory(
PlannedSession,
form=PlannedSessionFormSmall,
can_delete=True,
extra=extrasessions,
)
if request.method == "POST":
ps_formset = PlannedSessionFormSet(queryset = qset,
data = request.POST)
if ps_formset.is_valid():
instances = ps_formset.save(commit=False)
for ps in instances:
ps.save()
add_rower_session(r,ps)
for obj in ps_formset.deleted_objects:
obj.delete()
else:
print ps_formset.errors
url = reverse(plannedsession_multicreate_view,
kwargs = {
'rowerid':r.id,
'timeperiod':timeperiod
}
)
return HttpResponseRedirect(url)
ps_formset = PlannedSessionFormSet(queryset = qset,
initial=initials)
context = {
'ps_formset':ps_formset,
'rower':r,
'timeperiod':timeperiod,
'teams':get_my_teams(request.user),
'extrasessions': extrasessions+1
}
return render(request,'plannedsession_multicreate.html',context)
# Manager creates sessions for entire team # Manager creates sessions for entire team
@user_passes_test(iscoachmember,login_url="/rowers/planmembership/", @user_passes_test(iscoachmember,login_url="/rowers/planmembership/",
redirect_field_name=None) redirect_field_name=None)