From 3ff114a307ccb5c7c83e6c7b8cfe0eb186257e4f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Dec 2018 22:53:07 +0100 Subject: [PATCH] upgrade done --- rowers/braintreestuff.py | 43 ++++++++++ rowers/forms.py | 16 +++- rowers/templates/paymentconfirm.html | 2 +- rowers/templates/upgrade.html | 49 +++++++++++ rowers/templates/upgradeconfirm.html | 122 +++++++++++++++++++++++++++ rowers/urls.py | 13 +-- rowers/views.py | 87 ++++++++++++++++++- 7 files changed, 324 insertions(+), 8 deletions(-) create mode 100644 rowers/templates/upgrade.html create mode 100644 rowers/templates/upgradeconfirm.html diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 1410476b..900423b6 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -85,6 +85,49 @@ def make_payment(rower,data): else: return 0,'' +def update_subscription(rower,data): + planid = data['plan'] + plan = PaidPlan.objects.get(id=planid) + nonce_from_the_client = data['payment_method_nonce'] + amount = data['amount'] + amount = '{amount:.2f}'.format(amount=amount) + print amount,'aap' + + gatewaydata = { + "price": amount, + "plan_id": plan.external_id, + "payment_method_nonce": nonce_from_the_client, + "options": { + "prorate_charges":True, + }, + } + + if plan.paymenttype == 'single': + gatewaydata['number_of_billing_cycles'] = 1 + else: + gatewaydata['never_expires'] = True + + result = gateway.subscription.update( + rower.subscription_id, + gatewaydata + ) + + if result.is_success: + rower.paidplan = plan + rower.planexpires = result.subscription.billing_period_end_date + rower.teamplanexpires = result.subscription.billing_period_end_date + rower.clubsize = plan.clubsize + rower.paymenttype = plan.paymenttype + rower.rowerplan = plan.shortname + rower.subscription_id = result.subscription.id + rower.save() + return True + else: + return False + + return False + + def create_subscription(rower,data): planid = data['plan'] plan = PaidPlan.objects.get(id=planid) diff --git a/rowers/forms.py b/rowers/forms.py index c7a35b9d..84b0536d 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -720,12 +720,26 @@ class PlanSelectForm(forms.Form): def __init__(self, *args, **kwargs): paymentprocessor = kwargs.pop('paymentprocessor',None) + rower = kwargs.pop('rower',None) super(PlanSelectForm, self).__init__(*args, **kwargs) self.fields['plan'].empty_label = None if paymentprocessor: self.fields['plan'].queryset = PaidPlan.objects.filter( paymentprocessor=paymentprocessor - ).exclude(shortname="basic").order_by("price","clubsize","shortname") + ).exclude( + shortname="basic" + ).order_by( + "price","clubsize","shortname" + ) + if rower: + amount = rower.paidplan.price + self.fields['plan'].queryset = PaidPlan.objects.filter( + paymentprocessor=rower.paymentprocessor + ).exclude( + price__lte=amount + ).order_by( + "price","clubsize","shortname" + ) class CourseSelectForm(forms.Form): course = forms.ModelChoiceField(queryset=GeoCourse.objects.all()) diff --git a/rowers/templates/paymentconfirm.html b/rowers/templates/paymentconfirm.html index 4bb14355..693d2588 100644 --- a/rowers/templates/paymentconfirm.html +++ b/rowers/templates/paymentconfirm.html @@ -41,7 +41,7 @@ City{{ user.rower.city }} - Posstal Code{{ user.rower.postal_code }} + Postal Code{{ user.rower.postal_code }} Country{{ user.rower.country }} diff --git a/rowers/templates/upgrade.html b/rowers/templates/upgrade.html new file mode 100644 index 00000000..42b04f13 --- /dev/null +++ b/rowers/templates/upgrade.html @@ -0,0 +1,49 @@ +{% extends "newbase.html" %} +{% block title %}Rowsandall Paid Membership{% endblock title %} +{% load rowerfilters %} +{% block main %} + +

Upgrade

+ +
+ +
+ +{% endblock %} + +{% block sidebar %} +{% include 'menu_profile.html' %} +{% endblock %} + diff --git a/rowers/templates/upgradeconfirm.html b/rowers/templates/upgradeconfirm.html new file mode 100644 index 00000000..d064c78b --- /dev/null +++ b/rowers/templates/upgradeconfirm.html @@ -0,0 +1,122 @@ +{% extends "newbase.html" %} +{% block title %}Rowsandall Paid Membership{% endblock title %} +{% load rowerfilters %} +{% block main %} + +

Confirm Your Payment

+ +

Order Overview

+ + + + + + + +{% endblock %} + +{% block sidebar %} +{% include 'menu_profile.html' %} +{% endblock %} + diff --git a/rowers/urls.py b/rowers/urls.py index 73bb2bd9..646ac0cf 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -439,12 +439,15 @@ urlpatterns = [ url(r'^laboratory/$', views.laboratory_view,name='laboratory'), url(r'^promembership', TemplateView.as_view(template_name='promembership.html'),name='promembership'), url(r'^checkout/(?P\d+)$',views.payment_confirm_view), - url(r'^billing',views.billing_view,name='billing'), - url(r'^paymentcompleted',views.payment_completed_view), - url(r'^paidplans',views.paidplans_view,name='paidplans'), - url(r'^me/cancelsubscriptions',views.plan_stop_view), + url(r'^upgradecheckout/(?P\d+)$',views.upgrade_confirm_view), + url(r'^billing$',views.billing_view,name='billing'), + url(r'^upgrade$',views.upgrade_view,name='upgrade'), + url(r'^paymentcompleted$',views.payment_completed_view), + url(r'^paidplans$',views.paidplans_view,name='paidplans'), + url(r'^me/cancelsubscriptions$',views.plan_stop_view), url(r'^me/cancelsubscription/(?P[\w\ ]+.*)$',views.plan_tobasic_view), - url(r'^checkouts',views.checkouts_view,name='checkouts'), + url(r'^checkouts$',views.checkouts_view,name='checkouts'), + url(r'^upgradecheckouts$',views.upgrade_checkouts_view,name='upgrade_checkouts'), url(r'^planrequired',views.planrequired_view), url(r'^starttrial$',views.start_trial_view), url(r'^startplantrial$',views.start_plantrial_view), diff --git a/rowers/views.py b/rowers/views.py index dda94c0d..d384d6ba 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1109,6 +1109,40 @@ def billing_view(request): 'planselectform':planselectform, }) +@login_required() +def upgrade_view(request): + r = getrequestrower(request) + + if request.method == 'POST': + billingaddressform = RowerBillingAddressForm(request.POST) + planselectform = PlanSelectForm(request.POST,paymentprocessor='braintree') + if billingaddressform.is_valid(): + cd = billingaddressform.cleaned_data + for attr, value in cd.items(): + setattr(r, attr, value) + r.save() + + if planselectform.is_valid(): + plan = planselectform.cleaned_data['plan'] + if billingaddressform.is_valid(): + url = reverse(upgrade_confirm_view, + kwargs={ + 'planid':plan.id + }) + return HttpResponseRedirect(url) + + else: + billingaddressform = RowerBillingAddressForm(instance=r) + planselectform = PlanSelectForm(paymentprocessor='braintree', + rower=r) + + return render(request, + 'upgrade.html', + {'rower':r, + 'billingaddressform':billingaddressform, + 'planselectform':planselectform, + }) + @login_required() def plan_stop_view(request): r = getrequestrower(request) @@ -1148,6 +1182,27 @@ def plan_tobasic_view(request,id=0): +@login_required() +def upgrade_confirm_view(request,planid = 0): + try: + plan = PaidPlan.objects.get(id=planid) + except PaidPlan.DoesNotExist: + messages.error(request,"Something went wrong. Please try again.") + url = reverse(billing_view) + return HttpResponseRedirect(url) + + r = getrequestrower(request) + + client_token = braintreestuff.get_client_token(r) + + return render(request, + "upgradeconfirm.html", + { + 'plan':plan, + 'client_token':client_token, + 'rower':r, + }) + @login_required() def payment_confirm_view(request,planid = 0): try: @@ -1197,7 +1252,37 @@ def checkouts_view(request): url = reverse(billing_view) return HttpResponseRedirect(url) - url = reverse(payments_view) + url = reverse(paidplans_view) + return HttpResponseRedirect(url) + +@login_required() +def upgrade_checkouts_view(request): + + r = getrequestrower(request) + + if request.method != 'POST': + url = reverse(paidplans_view) + return HttpResponseRedirect(url) + + form = BillingForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + success = braintreestuff.update_subscription(r,data) + if success: + messages.info(request,"Your payment has succeeded and your plan has been updated") + url = reverse(payment_completed_view) + return HttpResponseRedirect(url) + else: + messages.error(request,"There was a problem with your payment") + url = reverse(upgrade_view) + return HttpResponseRedirect(url) + + else: + messages.error(request,"There was an error in the payment form") + url = reverse(upgrade_view) + return HttpResponseRedirect(url) + + url = reverse(paidplans_view) return HttpResponseRedirect(url)