From 9137b1991477ab825390becfb931837b3b51c414 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 25 Mar 2021 08:18:06 +0100 Subject: [PATCH] some fixes and more user friendly form to buy instantplan --- rowers/forms.py | 34 +++++++++++++++++++++++++++++++ rowers/templates/instantplan.html | 8 ++++++++ rowers/views/paymentviews.py | 23 ++++++++++++++------- rowers/views/planviews.py | 31 ++++++++++++++-------------- rowers/views/statements.py | 2 +- 5 files changed, 74 insertions(+), 24 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 8606abe2..639631a4 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -58,6 +58,40 @@ class FlexibleDecimalField(forms.DecimalField): value = value.replace('.', '').replace(',', '.') return super(FlexibleDecimalField, self).to_python(value) +class InstantPlanSelectForm(forms.Form): + datechoices = ( + ('start date','startdate'), + ('end date', 'enddate'), + ('target','target') + ) + name = forms.CharField(max_length=255,label='Plan Name',required=False) + startdate = forms.DateField( + initial=timezone.now()-datetime.timedelta(days=15), + # widget=SelectDateWidget(years=range(1990,2050)), + widget=AdminDateWidget(), #format='%Y-%m-%d'), + label='Start Date') + enddate = forms.DateField( + initial=timezone.now(), + widget=AdminDateWidget(), #format='%Y-%m-%d'), + label='End Date') + target = forms.ChoiceField(required=False) + datechoice = forms.ChoiceField(choices=datechoices,initial='enddate',label='Plan by target, start or end date') + notes = forms.CharField(required=False, + max_length=200,label='Course Notes', + widget=forms.Textarea) + + def __init__(self, *args, **kwargs): + targets = kwargs.pop('targets',None) + super(InstantPlanSelectForm, self).__init__(*args, **kwargs) + if targets: + targetchoices = [(x.id,x) for x in targets] + targetchoices.append((None,'---')) + self.fields['target'].choices = targetchoices + else: + self.fields.pop('target') + + + # Video Analysis creation form class VideoAnalysisCreateForm(forms.Form): name = forms.CharField(max_length=255,label='Analysis Name',required=False) diff --git a/rowers/templates/instantplan.html b/rowers/templates/instantplan.html index 1f4a07e4..af8f4498 100644 --- a/rowers/templates/instantplan.html +++ b/rowers/templates/instantplan.html @@ -33,6 +33,7 @@

Price: {{ plan.price }}€

{% endif %} + {% if form %}
  • When you submit this form, a training plan will be created based on {{ plan.name }}, ending at your target date, @@ -58,6 +59,13 @@ {% endif %}

  • + {% else %} +
  • +

    + Log in to install this plan to your training calendar. +

    +
  • + {% endif %}
  • Plan Details

    diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index d5640c89..47c3e22b 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -109,7 +109,7 @@ def buy_trainingplan_view(request,id=0): if request.method == 'POST': billingaddressform = RowerBillingAddressForm(instance=r) - form = TrainingPlanForm(request.POST,user=request.user) + form = InstantPlanSelectForm(request.POST) if billingaddressform.is_valid(): cd = billingaddressform.cleaned_data for attr, value in cd.items(): @@ -121,8 +121,10 @@ def buy_trainingplan_view(request,id=0): cd = form.cleaned_data enddate = cd['enddate'] + startdate = cd['startdate'] notes = cd['notes'] - status = cd['status'] + datechoice = form.cleaned_data['datechoice'] + status = True # get target and set enddate try: @@ -138,8 +140,12 @@ def buy_trainingplan_view(request,id=0): except KeyError: target = None - if target: + if target and datechoice == 'target': enddate = target.date + elif datechoice == 'startdate': + enddate = startdate+datetime.timedelta(days=plan.duration) + else: + startdate = enddate-datetime.timedelta(days=plan.duration) pars = { 'name':cd['name'], @@ -154,7 +160,7 @@ def buy_trainingplan_view(request,id=0): return HttpResponseRedirect(url) else: - form = TrainingPlanForm(user=request.user) + form = InstantPlanForm() billingaddressform = RowerBillingAddressForm(instance=r) return render(request, @@ -243,9 +249,12 @@ def purchase_checkouts_view(request): url = reverse("purchase_checkouts_view") return HttpResponseRedirect(url) - url = reverse('rower_view_instantplan',kwargs={ - 'id':plan.uuid, - }) + url = reverse('rower_select_instantplan') + if 'plan' in request.POST: + plan = plan = InstantPlan.objects.get(id=request.POST['plan']) + url = reverse('rower_view_instantplan',kwargs={ + 'id':plan.uuid, + }) return HttpResponseRedirect(url) @user_passes_test(can_plan,login_url="/rowers/paidplans", diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 633d9d0e..7cba202d 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -2517,14 +2517,15 @@ def rower_view_instantplan(request,id='',userid=0): date__gte=datetime.date.today(), ).order_by("-date") - if request.method == 'POST': + if request.method == 'POST' and not request.user.is_anonymous: if not can_plan(request.user): messages.error(request,'You must be on a paid plan to use this functionality') url = reverse('rower_view_instantplan',kwargs={ 'id':id, }) return HttpResponseRedirect(url) - form = TrainingPlanForm(request.POST,user=request.user) + form = InstantPlanSelectForm(request.POST) + if form.is_valid(): plansteps = response.json() @@ -2541,17 +2542,17 @@ def rower_view_instantplan(request,id='',userid=0): except KeyError: target = None enddate = form.cleaned_data['enddate'] + startdate = form.cleaned_data['startdate'] notes = form.cleaned_data['notes'] - status = form.cleaned_data['status'] - if target: + datechoice = form.cleaned_data['datechoice'] + status = True + if target and datechoice == 'target': enddate = target.date + elif datechoice == 'startdate': + enddate = startdate+datetime.timedelta(days=plan.duration) + else: + startdate = enddate-datetime.timedelta(days=plan.duration) - startdate = enddate-datetime.timedelta(days=plan.duration+1) - - try: - athletes = form.cleaned_data['rowers'] - except KeyError: - athletes = [r] p = TrainingPlan( name=name, @@ -2563,10 +2564,7 @@ def rower_view_instantplan(request,id='',userid=0): ) p.save() - - for athlete in athletes: - if can_plan_user(request.user,athlete): - p.rowers.add(athlete) + p.rowers.add(r) create_sessions_from_json(plansteps,athletes,startdate,r.user) @@ -2577,9 +2575,10 @@ def rower_view_instantplan(request,id='',userid=0): return HttpResponseRedirect(url) + elif not request.user.is_anonymous: + form = InstantPlanSelectForm(targets=targets) else: - form = TrainingPlanForm(targets=targets,initial={'status':True,'rowers':[r]}, - user=request.user) + form = None breadcrumbs = [ { diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 28430fae..e2dd74d9 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -77,7 +77,7 @@ from rowers.forms import ( VideoAnalysisCreateForm,WorkoutSingleSelectForm, VideoAnalysisMetricsForm,SurveyForm,HistorySelectForm, StravaChartForm,FitnessFitForm,PerformanceManagerForm, - TrainingPlanBillingForm, + TrainingPlanBillingForm,InstantPlanSelectForm ) from django.urls import reverse, reverse_lazy