Merge branch 'feature/multiplanningform' into develop
This commit is contained in:
@@ -614,6 +614,12 @@ class BaseFavoriteFormSet(BaseFormSet):
|
||||
if not yparam2:
|
||||
yparam2 = 'None'
|
||||
|
||||
class BasePlannedSessionFormSet(BaseFormSet):
|
||||
def clean(self):
|
||||
if any(self.serrors):
|
||||
return
|
||||
|
||||
|
||||
# Check if workout is owned by this user
|
||||
def checkworkoutuser(user,workout):
|
||||
try:
|
||||
@@ -918,6 +924,37 @@ class PlannedSessionForm(ModelForm):
|
||||
'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
|
||||
class Workout(models.Model):
|
||||
|
||||
146
rowers/templates/plannedsession_multicreate.html
Normal file
146
rowers/templates/plannedsession_multicreate.html
Normal 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> </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 %}
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<div class="grid_12 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 id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<td>
|
||||
{% if ps.manager == request.user %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||
href="/rowers/sessions/{{ ps.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }} ">Edit</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
{% endif %}
|
||||
</p>
|
||||
</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">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
{% if timeperiod %}
|
||||
|
||||
@@ -419,6 +419,17 @@ urlpatterns = [
|
||||
url(r'^sessions/create/(?P<timeperiod>[\w\ ]+.*)$',
|
||||
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/(?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),
|
||||
|
||||
106
rowers/views.py
106
rowers/views.py
@@ -60,13 +60,17 @@ from rowers.models import (
|
||||
RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData,
|
||||
Team,TeamForm,TeamInviteForm,TeamInvite,TeamRequest,
|
||||
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 import metrics
|
||||
import rowers.uploads as uploads
|
||||
from django.forms.formsets import formset_factory
|
||||
from django.forms import modelformset_factory
|
||||
import StringIO
|
||||
from django.contrib.auth.decorators import login_required,user_passes_test
|
||||
from time import strftime,strptime,mktime,time,daylight
|
||||
@@ -8807,7 +8811,6 @@ def workout_uploadimage_view(request,id):
|
||||
|
||||
if f is not None:
|
||||
filename,path_and_filename = handle_uploaded_image(f)
|
||||
print path_and_filename,'aap'
|
||||
try:
|
||||
width,height = Image.open(path_and_filename).size
|
||||
except:
|
||||
@@ -11643,8 +11646,6 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
|
||||
else:
|
||||
forminitial = {}
|
||||
|
||||
print forminitial
|
||||
|
||||
sessioncreateform = PlannedSessionForm(initial=forminitial)
|
||||
|
||||
startdate,enddate = get_dates_timeperiod(timeperiod)
|
||||
@@ -11659,6 +11660,101 @@ def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
|
||||
'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
|
||||
@user_passes_test(iscoachmember,login_url="/rowers/planmembership/",
|
||||
redirect_field_name=None)
|
||||
|
||||
Reference in New Issue
Block a user