diff --git a/rowers/models.py b/rowers/models.py index d06ab70e..e412de4f 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2301,6 +2301,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 }}

    +
    + {% if form.errors %} +

    + Please correct the error{{ form.errors|pluralize }} below. +

    + {% endif %} +

    + + {{ form.as_table }} +
    +

    + {% csrf_token %} +
    + +
    +

    + Delete +

    + +
    + +
  • +
  • +

    Templates

    +

    + Click on session name to clone to current period +

    + + + + + + + + + + + + {% for ps in sessiontemplates %} + + + + + + + + {% endfor %} + +
    NameValue EditDelete
    + {% if ps.name != '' %} + {{ ps.name }} + {% else %} + Unnamed Session + {% endif %} + {{ ps.sessionvalue }} {{ ps.sessionunit }} + Edit Template + + Delete +
    +
  • +
+ +{% 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 8450a408..dc813203 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -668,6 +668,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 2548c41f..48985c74 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -685,7 +685,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 = [ @@ -873,8 +875,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( @@ -1436,8 +1438,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 @@ -1497,8 +1499,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) @permission_required('plannedsession.change_session',fn=get_session_by_pk,raise_exception=True) @user_passes_test(can_plan, login_url="/rowers/paidplans/", @@ -1525,7 +1620,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 @permission_required('plannedsession.change_session',fn=get_session_by_pk,raise_exception=True) @@ -1663,8 +1760,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() @permission_required('plannedsession.view_session',fn=get_session_by_pk,raise_exception=True) diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 19deb0cf..e6a6e7e6 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -120,7 +120,7 @@ from rowers.models import ( WorkoutComment,WorkoutCommentForm,RowerExportForm, CalcAgePerformance, PowerTimeFitnessMetric,BlogPost, - PlannedSessionForm, + PlannedSessionForm,PlannedSessionTemplateForm, PlannedSessionFormSmall,GeoCourseEditForm,VirtualRace, VirtualRaceForm,VirtualRaceResultForm,RowerImportExportForm, IndoorVirtualRaceResultForm,IndoorVirtualRaceResult,