From 42426cdda2cacf3d2392ccbc38ee06a73cbfafe5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 8 Feb 2018 15:31:23 +0100 Subject: [PATCH] fine tuning --- rowers/admin.py | 2 +- rowers/models.py | 19 +-- rowers/templates/planmembership.html | 57 +++++++ rowers/templates/plannedsessioncreate.html | 156 +++++++++++-------- rowers/templates/plannedsessionedit.html | 168 +++++++++++++-------- rowers/templates/planningbuttons.html | 2 +- rowers/templates/promembership.html | 8 +- rowers/urls.py | 17 ++- rowers/views.py | 109 ++++++++++--- 9 files changed, 376 insertions(+), 162 deletions(-) create mode 100644 rowers/templates/planmembership.html diff --git a/rowers/admin.py b/rowers/admin.py index 4f50d1ee..e1094553 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -49,7 +49,7 @@ class PlannedSessionAdmin(admin.ModelAdmin): class GraphImageAdmin(admin.ModelAdmin): list_display = ('creationdatetime','workout','filename') - + admin.site.unregister(User) admin.site.register(User,UserAdmin) admin.site.register(Workout,WorkoutAdmin) diff --git a/rowers/models.py b/rowers/models.py index 678920bb..d6316883 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -797,7 +797,7 @@ class PlannedSession(models.Model): ) criteriumchoices = ( - ('none','None'), + ('none','Approximately'), ('minimum','At Least'), ('exact','Exactly'), ) @@ -879,6 +879,9 @@ class PlannedSession(models.Model): return stri +# Date input utility +class DateInput(forms.DateInput): + input_type = 'date' class PlannedSessionForm(ModelForm): class Meta: @@ -888,19 +891,16 @@ class PlannedSessionForm(ModelForm): 'name', 'sessiontype', 'sessionmode', + 'criterium', 'sessionvalue', 'sessionunit', 'comment', ] widgets = { 'comment': forms.Textarea, - 'startdate': SelectDateWidget( - years=range( - timezone.now().year-1,timezone.now().year+2)), - 'enddate': SelectDateWidget( - years=range( - timezone.now().year-1,timezone.now().year+2)), - } + 'startdate': DateInput(), + 'enddate': DateInput(), + } # Workout @@ -1140,9 +1140,6 @@ def auto_delete_image_on_delete(sender,instance, **kwargs): else: print "couldn't find the file "+instance.filename -# Date input utility -class DateInput(forms.DateInput): - input_type = 'date' # Form to update Workout data class WorkoutForm(ModelForm): diff --git a/rowers/templates/planmembership.html b/rowers/templates/planmembership.html new file mode 100644 index 00000000..55d599e8 --- /dev/null +++ b/rowers/templates/planmembership.html @@ -0,0 +1,57 @@ + + {% extends "base.html" %} + {% block title %}About us{% endblock title %} + {% block content %} + +
+

Coach and Self-Coach Membership

+ +

You have arrived at this page, because you tried to create a + training plan for yourself.

+ +

Currently, training planning is restricted to "coach" members with + "team" functionality.

+ +

If you are interested in becoming a coach and planning sessions + for a group of rowers on rowsandall.com, contact me through the contact + form. +

+ +

If you would like to find a coach who helps you plan your training + through rowsandall.com, contact me throught the contact form.

+ +

For self-coached rowers who would like to add the training planning + functionality, we will soon establish a "Self-Coach" plan, which will enable you to do so.

+ + +
+ +
+

What training planning functionality do we offer?

+ +

Over the spring of 2018, we will gradually expand this functionality. + Our current roadmap is to deploy the following and more: + +

+

+

+ +
+ + + {% endblock content %} diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index 5e9364ae..dd376e3e 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -8,69 +8,105 @@ {% include "planningbuttons.html" %} -
-

Create a new Planned Session

+
+
+

Create Session for {{ rower.user.first_name }} {{ rower.user.last_name }}

+
+ +
+
+
- {% if form.errors %} -

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

- {% endif %} - - - {{ form.as_table }} -
- {% csrf_token %} -
+ {% if form.errors %} +

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

+ {% endif %} + + + {{ form.as_table }} +
+ {% csrf_token %} +
-
-
- +
+
+ - + +
{% endblock %} diff --git a/rowers/templates/plannedsessionedit.html b/rowers/templates/plannedsessionedit.html index af81d9b5..7990d726 100644 --- a/rowers/templates/plannedsessionedit.html +++ b/rowers/templates/plannedsessionedit.html @@ -8,72 +8,116 @@ {% include "planningbuttons.html" %} +

Edit Session {{ thesession.name }}

+
+ +
+
+
- {% if form.errors %} -

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

- {% endif %} - - - {{ form.as_table }} -
- {% csrf_token %} -
- Delete -
-
- -
-
- + {% if form.errors %} +

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

+ {% endif %} + + + {{ form.as_table }} +
+ {% csrf_token %} +
+ Delete +
+
+ Clone +
+
+ +
+
+ - + + {% endblock %} diff --git a/rowers/templates/planningbuttons.html b/rowers/templates/planningbuttons.html index e167fc85..52d12a55 100644 --- a/rowers/templates/planningbuttons.html +++ b/rowers/templates/planningbuttons.html @@ -13,7 +13,7 @@

{% if timeperiod and rower %} - Manage Sessions + Manage Sessions {% elif timeperiod %} Manage Sessions {% else %} diff --git a/rowers/templates/promembership.html b/rowers/templates/promembership.html index 6ca7312f..bb89c13d 100644 --- a/rowers/templates/promembership.html +++ b/rowers/templates/promembership.html @@ -2,9 +2,9 @@ {% extends "base.html" %} {% block title %}About us{% endblock title %} {% block content %} -

Pro Membership

+

Pro Membership

Donations are welcome to keep this web site going. To help cover the hosting costs, I have created a Pro membership option (for only 15 EURO per year). Once I process your @@ -27,7 +27,7 @@ You will be taken to the secure PayPal payment site.

-

Recurring Payment

+

Recurring Payment

You need a Paypal account for this

@@ -40,7 +40,7 @@ You will be taken to the secure PayPal payment site.
-

One Year Subscription

+

One Year Subscription

Only a credit card needed. Will not automatically renew

@@ -49,7 +49,7 @@ You will be taken to the secure PayPal payment site.
-

Payment Processing

+

Payment Processing

After you do the payment, we will manually change your membership to "Pro". Depending on our availability, this may take some time (typically one working day). Don't hesitate to contact us diff --git a/rowers/urls.py b/rowers/urls.py index 153b2b54..2d42ea30 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -382,6 +382,7 @@ urlpatterns = [ url(r'^videos', TemplateView.as_view(template_name='videos.html'),name='videos'), url(r'^analysis', TemplateView.as_view(template_name='analysis.html'),name='analysis'), url(r'^promembership', TemplateView.as_view(template_name='promembership.html'),name='promembership'), + url(r'^planmembership', TemplateView.as_view(template_name='planmembership.html'),name='planmembership'), url(r'^paypaltest', TemplateView.as_view(template_name='paypaltest.html'),name='paypaltest'), url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'), url(r'^register$',views.rower_register_view), @@ -397,11 +398,25 @@ urlpatterns = [ url(r'^test\_callback',views.rower_process_testcallback), url(r'^workout/(?P\d+)/test\_strokedata$',views.strokedataform), url(r'^sessions/create$',views.plannedsession_create_view), + url(r'^sessions/create/rower/(?P\d+)$', + views.plannedsession_create_view), + url( + r'^sessions/create/(?P[\w\ ]+.*)/rower/(?P\d+)$', + views.plannedsession_create_view), + url(r'^sessions/create/(?P[\w\ ]+.*)$', + views.plannedsession_create_view), + url(r'^sessions/(?P\d+)/edit$',views.plannedsession_edit_view), + url(r'^sessions/(?P\d+)/edit/(?P[\w\ ]+.*)/rower/(?P\d+)$',views.plannedsession_edit_view), + url(r'^sessions/(?P\d+)/edit/(?P[\w\ ]+.*)$',views.plannedsession_edit_view), + + url(r'^sessions/(?P\d+)/clone$',views.plannedsession_clone_view), + url(r'^sessions/(?P\d+)/clone/(?P[\w\ ]+.*)/rower/(?P\d+)$',views.plannedsession_clone_view), + url(r'^sessions/(?P\d+)/clone/(?P[\w\ ]+.*)$',views.plannedsession_clone_view), + url(r'^sessions/(?P\d+)$',views.plannedsession_view), url(r'^sessions/(?P\d+)/deleteconfirm$',views.plannedsession_deleteconfirm_view), url(r'^sessions/(?P\d+)/delete$',views.plannedsession_delete_view), - url(r'^sessions/manage/session/(?P\d+)$', views.plannedsessions_manage_view), url(r'^sessions/manage/rower/(?P\d+)/session/(?P\d+)$', diff --git a/rowers/views.py b/rowers/views.py index 647b59af..503ecdf4 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -11710,11 +11710,19 @@ def agegrouprecordview(request,sex='male',weightcategory='hwt', }) # Individual user creates training for himself -@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/", +@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", redirect_field_name=None) -def plannedsession_create_view(request): +def plannedsession_create_view(request,timeperiod='today',rowerid=0): - r = getrower(request.user) + 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 Http404("You don't have access to this plan") if request.method == 'POST': sessioncreateform = PlannedSessionForm(request.POST) @@ -11724,6 +11732,7 @@ def plannedsession_create_view(request): enddate = cd['enddate'] sessiontype = cd['sessiontype'] sessionmode = cd['sessionmode'] + criterium = cd['criterium'] sessionvalue = cd['sessionvalue'] sessionunit = cd['sessionunit'] comment = cd['comment'] @@ -11743,6 +11752,7 @@ def plannedsession_create_view(request): sessionvalue=sessionvalue, sessionunit=sessionunit, comment=comment, + criterium=criterium, manager=request.user) ps.save() @@ -11754,13 +11764,15 @@ def plannedsession_create_view(request): else: sessioncreateform = PlannedSessionForm() - sps = get_sessions(r) + startdate,enddate = get_dates_timeperiod(timeperiod) + sps = get_sessions(r,startdate=startdate,enddate=enddate) return render(request,'plannedsessioncreate.html', { 'teams':get_my_teams(request.user), 'form':sessioncreateform, 'plannedsessions':sps, + 'rower':r, }) @login_required() @@ -11909,12 +11921,22 @@ def plannedsessions_manage_view(request,timeperiod='today',rowerid=0, }) -# Edit an existing planned session -@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/", +# Clone an existing planned session +@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", redirect_field_name=None) -def plannedsession_edit_view(request,id=0): +def plannedsession_clone_view(request,id=0,rowerid=0, + timeperiod='today'): + 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 Http404("You don't have access to this plan") - r = getrower(request.user) + startdate,enddate = get_dates_timeperiod(timeperiod) try: ps = PlannedSession.objects.get(id=id) @@ -11922,26 +11944,65 @@ def plannedsession_edit_view(request,id=0): raise Http404("Planned Session does not exist") if ps.manager != request.user: - raise Http404("You are not allowed to delete this planned session") + raise Http404("You are not allowed to clone this planned session") + + ps.pk = None + + ps.startdate = timezone.now() + ps.enddate = timezone.now() + ps.name += ' (copy)' + + ps.save() + + add_rower_session(r,ps) + + url = reverse(plannedsession_edit_view, + kwargs = { + 'id':ps.id, + 'timeperiod':timeperiod, + 'rowerid':r.id, + } + ) + + return HttpResponseRedirect(url) + + +# Edit an existing planned session +@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/", + redirect_field_name=None) +def plannedsession_edit_view(request,id=0,timeperiod='today',rowerid=0): + + 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 Http404("You don't have access to this plan") + + startdate,enddate = get_dates_timeperiod(timeperiod) + + + try: + ps = PlannedSession.objects.get(id=id) + except PlannedSession.DoesNotExist: + raise Http404("Planned Session does not exist") + + if ps.manager != request.user: + raise Http404("You are not allowed to edit this planned session") if request.method == 'POST': sessioncreateform = PlannedSessionForm(request.POST,instance=ps) if sessioncreateform.is_valid(): cd = sessioncreateform.cleaned_data - startdate = cd['startdate'] - enddate = cd['enddate'] - sessiontype = cd['sessiontype'] - sessionmode = cd['sessionmode'] - sessionvalue = cd['sessionvalue'] - sessionunit = cd['sessionunit'] - if sessionunit == 'min': - sessionmode = 'time' - elif sessionunit in ['km','m']: - sessionmode = 'distance' + if cd['sessionunit'] == 'min': + cd['sessionmode'] = 'time' + elif cd['sessionunit'] in ['km','m']: + cd['sessionmode'] = 'distance' - comment = cd['comment'] - name = cd['name'] res,message = update_plannedsession(ps,cd) @@ -11953,12 +12014,14 @@ def plannedsession_edit_view(request,id=0): url = reverse(plannedsession_edit_view, kwargs={ 'id':int(ps.id), + 'timeperiod':timeperiod, + 'rowerid':r.id, }) return HttpResponseRedirect(url) else: sessioncreateform = PlannedSessionForm(instance=ps) - sps = get_sessions(r) + sps = get_sessions(r,startdate=startdate,enddate=enddate) return render(request,'plannedsessionedit.html', { @@ -11966,6 +12029,8 @@ def plannedsession_edit_view(request,id=0): 'form':sessioncreateform, 'plannedsessions':sps, 'thesession':ps, + 'rower':r, + 'timeperiod':timeperiod, })