diff --git a/rowers/models.py b/rowers/models.py
index 6d9b7ac9..01f49265 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -2342,6 +2342,35 @@ class PlannedSessionForm(ModelForm):
self.fields['sessiontype'].choices = regularsessiontypechoices
+class PlannedSessionTemplateForm(ModelForm):
+
+ class Meta:
+ model = PlannedSession
+ fields = [
+ 'name',
+ 'sessiontype',
+ 'sessionmode',
+ 'criterium',
+ 'sessionvalue',
+ 'sessionunit',
+ 'course',
+ 'comment',
+ ]
+
+ dateTimeOptions = {
+ 'format': 'yyyy-mm-dd',
+ 'autoclose': True,
+ }
+
+ widgets = {
+ 'comment': forms.Textarea,
+ }
+
+ def __init__(self,*args,**kwargs):
+ super(PlannedSessionTemplateForm, self).__init__(*args, **kwargs)
+ self.fields['course'].queryset = GeoCourse.objects.all().order_by("country","name")
+ self.fields['sessiontype'].choices = regularsessiontypechoices
+
def get_course_timezone(course):
polygons = GeoPolygon.objects.filter(course = course)
points = GeoPoint.objects.filter(polygon = polygons[0])
diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html
index 5c5f7ff1..fc6ac992 100644
--- a/rowers/templates/plannedsessioncreate.html
+++ b/rowers/templates/plannedsessioncreate.html
@@ -108,6 +108,7 @@
Name |
Value |
|
+ Edit |
Delete |
@@ -125,6 +126,9 @@
{{ ps.sessionvalue }} |
{{ ps.sessionunit }} |
+
+ Edit Template
+ |
Delete
|
diff --git a/rowers/templates/plannedsessionteamcreate.html b/rowers/templates/plannedsessionteamcreate.html
index 2cba5493..55dabe13 100644
--- a/rowers/templates/plannedsessionteamcreate.html
+++ b/rowers/templates/plannedsessionteamcreate.html
@@ -115,6 +115,7 @@
Name |
Value |
|
+ Edit |
Delete |
@@ -132,6 +133,9 @@
{{ ps.sessionvalue }} |
{{ ps.sessionunit }} |
+
+ Edit Template
+ |
Delete
|
diff --git a/rowers/templates/plannedsessiontemplateedit.html b/rowers/templates/plannedsessiontemplateedit.html
new file mode 100644
index 00000000..34dde816
--- /dev/null
+++ b/rowers/templates/plannedsessiontemplateedit.html
@@ -0,0 +1,197 @@
+{% extends "newbase.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+
+{% block title %}Update Template Session{% endblock %}
+
+{% block main %}
+Edit Session Template
+
+
+
+
+ -
+
{{ thesession.name }}
+
+
+
+ -
+
Templates
+
+ Click on session name to clone to current period
+
+
+
+
+ | Name |
+ Value |
+ |
+ Edit |
+ Delete |
+
+
+
+ {% for ps in sessiontemplates %}
+
+ |
+ {% if ps.name != '' %}
+ {{ ps.name }}
+ {% else %}
+ Unnamed Session
+ {% endif %}
+ |
+ {{ ps.sessionvalue }} |
+ {{ ps.sessionunit }} |
+
+ Edit Template
+ |
+
+ Delete
+ |
+
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+{% include 'menu_plan.html' %}
+{% endblock %}
+
+
+{% block scripts %}
+
+
+
+{% endblock %}
diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html
index a8d0ad65..e6e9666d 100644
--- a/rowers/templates/plannedsessionview.html
+++ b/rowers/templates/plannedsessionview.html
@@ -16,6 +16,8 @@
Edit Session
+ /
+ Save to template
{% endif %}
Session {{ psdict.name.1 }}
@@ -157,11 +159,11 @@
Course
{{ coursediv|safe }}
-
+
{{ coursescript|safe }}
{% endif %}
-
+
diff --git a/rowers/urls.py b/rowers/urls.py
index 7146d4da..8d652646 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -666,6 +666,7 @@ urlpatterns = [
views.plannedsession_multicreate_view,
name='plannedsession_multicreate_view'),
re_path(r'^sessions/(?P\d+)/edit/$',views.plannedsession_edit_view),
+ re_path(r'^sessions/(?P\d+)/templateedit/',views.plannedsession_templateedit_view),
re_path(r'^sessions/(?P\d+)/maketemplate/$',views.plannedsession_totemplate_view),
re_path(r'^sessions/(?P\d+)/compare/$',
views.plannedsession_compare_view,
diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py
index 05910fbc..7dabf62f 100644
--- a/rowers/views/planviews.py
+++ b/rowers/views/planviews.py
@@ -704,7 +704,9 @@ def plannedsession_teamcreate_view(request,
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
- return HttpResponseRedirect(url)
+ next = request.GET.get('next', url)
+
+ return HttpResponseRedirect(next)
else:
timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d')
breadcrumbs = [
@@ -897,8 +899,8 @@ def plannedsession_teamedit_view(request,
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
-
- return HttpResponseRedirect(url)
+ next = request.GET.get('next', url)
+ return HttpResponseRedirect(next)
else:
sessioncreateform = PlannedSessionForm(instance=ps)
sessionteamselectform = PlannedSessionTeamForm(
@@ -1465,8 +1467,8 @@ def plannedsession_clone_view(request,id=0,userid=0):
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
-
- return HttpResponseRedirect(url)
+ next = request.GET.get('next', url)
+ return HttpResponseRedirect(next)
# Clone an existing planned session
# need clarity on cloning behavior time shift
@@ -1531,8 +1533,101 @@ def plannedsession_teamclone_view(request,id=0):
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
+ next = request.GET.get('next', url)
+ return HttpResponseRedirect(next)
+
+@user_passes_test(hasplannedsessions, login_url="/rowers/paidplans/",
+message="This functionality requires a Coach or Self-Coach plan",
+redirect_field_name=None)
+def plannedsession_templateedit_view(request,id=0):
+ r = getrequestrower(request)
+ startdate,enddate = get_dates_timeperiod(request)
+ try:
+ trainingplan = TrainingPlan.objects.filter(
+ startdate__lte = startdate,
+ rowers = r,
+ enddate__gte = enddate)[0]
+ except IndexError:
+ trainingplan = None
+
+ try:
+ ps = PlannedSession.objects.get(id=id)
+ except PlannedSession.DoesNotExist:
+ raise Http404("Planned Session does not exist")
+
+ if ps.manager != request.user:
+ raise PermissionDenied("You are not allowed to edit this planned session")
+
+ if ps.sessiontype in ['race','indoorrace']:
+ raise PermissionDenied("You are not allowed to edit this planned session because it is a race")
+
+ if not ps.is_template:
+ ps.pk = None
+ ps.id = None
+ ps.is_template = True
+ ps.startdate = datetime.date(1970,1,1)
+ ps.enddate = datetime.date(1970,1,1)
+ ps.team.clear()
+ ps.save()
+
+ sessioncreateform = PlannedSessionTemplateForm(instance=ps)
+
+ if request.method == 'POST':
+ sessioncreateform = PlannedSessionTemplateForm(request.POST,instance=ps)
+ 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)
+
+ url = reverse(plannedsession_templateedit_view,
+ kwargs = {
+ 'id':int(ps.id),
+ })
+
+ startdatestring = startdate.strftime('%Y-%m-%d')
+ enddatestring = enddate.strftime('%Y-%m-%d')
+ url += '?when='+startdatestring+'/'+enddatestring
+ next = request.GET.get('next', url)
+ return HttpResponseRedirect(next)
+
+ breadcrumbs = [
+ {
+ 'url': reverse(plannedsessions_view),
+ 'name': 'Sessions'
+ },
+ {
+ 'url':reverse(plannedsession_templateedit_view,
+ kwargs={
+ 'id':id,
+ }
+ ),
+ 'name': 'Edit'
+ }
+ ]
+
+ sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True)
+
+ return render(request,'plannedsessiontemplateedit.html',
+ {
+ 'teams':get_my_teams(request.user),
+ 'plan': trainingplan,
+ 'breadcrumbs': breadcrumbs,
+ 'form': sessioncreateform,
+ 'active':'nav-plan',
+ 'thesession': ps,
+ 'sessiontemplates': sessiontemplates,
+ 'rower': r,
+ })
- return HttpResponseRedirect(url)
@user_passes_test(hasplannedsessions, login_url="/rowers/paidplans/",
message="This functionality requires a Coach or Self-Coach plan",
@@ -1564,7 +1659,9 @@ def plannedsession_totemplate_view(request,id=0):
enddatestring = enddate.strftime('%Y-%m-%d')
url += '?when='+startdatestring+'/'+enddatestring
- return HttpResponseRedirect(url)
+ next = request.GET.get('next', url)
+
+ return HttpResponseRedirect(next)
# Edit an existing planned session
@user_passes_test(hasplannedsessions,login_url="/rowers/paidplans/",
@@ -1715,8 +1812,8 @@ def plannedsession_detach_view(request,id=0,psid=0):
remove_workout_plannedsession(w,ps)
url = reverse(plannedsession_view,kwargs={'id':psid})
-
- return HttpResponseRedirect(url)
+ next = request.GET.get('next', url)
+ return HttpResponseRedirect(next)
@login_required()
def plannedsession_view(request,id=0,userid=0):
diff --git a/rowers/views/statements.py b/rowers/views/statements.py
index aab50741..25a27c9c 100644
--- a/rowers/views/statements.py
+++ b/rowers/views/statements.py
@@ -107,7 +107,7 @@ from rowers.models import (
WorkoutComment,WorkoutCommentForm,RowerExportForm,
CalcAgePerformance,
PowerTimeFitnessMetric,BlogPost,
- PlannedSessionForm,
+ PlannedSessionForm,PlannedSessionTemplateForm,
PlannedSessionFormSmall,GeoCourseEditForm,VirtualRace,
VirtualRaceForm,VirtualRaceResultForm,RowerImportExportForm,
IndoorVirtualRaceResultForm,IndoorVirtualRaceResult,