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 @@
| 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
+
+
+ -
+
+
+
+
+ | Plan | {{ plan.name }} |
+
+
+ | Payment Type | {{ plan.paymenttype }} |
+
+
+ | Plan Duration | 1 year starting today |
+
+
+ | Total | € {{ plan.price|currency }}
+ {% if plan.paymenttype == 'recurring' %}
+ /year
+ {% endif %}
+ |
+
+
+
+
+
+
+
+
+ | Street Address | {{ user.rower.street_address }} |
+
+
+ | City | {{ user.rower.city }} |
+
+
+ | Postal Code | {{ user.rower.postal_code }} |
+
+
+ | Country | {{ user.rower.country }}
+ |
+
+
+
+
+
+ -
+
+ Change Upgrade
+
+ -
+
+
+ -
+
+ Your upgrade will be effective immediately. For the current billing
+ cycle, you will be charged for a prorated amount. For example, when
+ you upgrade from a 15€ plan to a 65€ plan (a difference of
+ 50€) in the 6th month of the 12 month billing cycle, you
+ will be charged 35€.
+
+
+
+
+
+
+
+
+{% 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)
|