From aca8f28457ccfd8c7a594a95467c769862cee9b5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 1 Feb 2020 15:25:52 +0100 Subject: [PATCH] adding template edit functionality --- rowers/models.py | 29 +++ rowers/templates/plannedsessioncreate.html | 4 + .../templates/plannedsessionteamcreate.html | 4 + .../templates/plannedsessiontemplateedit.html | 197 ++++++++++++++++++ rowers/templates/plannedsessionview.html | 6 +- rowers/urls.py | 1 + rowers/views/planviews.py | 115 +++++++++- rowers/views/statements.py | 2 +- 8 files changed, 346 insertions(+), 12 deletions(-) create mode 100644 rowers/templates/plannedsessiontemplateedit.html 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 }}

    +
    + {% 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 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,