From 10519ca558e08996ab283dbf595a9265da969244 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 8 Feb 2019 11:39:25 +0100 Subject: [PATCH 1/3] refund policy updated --- rowers/forms.py | 1 + rowers/templates/billing.html | 3 +- rowers/templates/legal.html | 82 ++++++++++++++++++++++++++-- rowers/templates/paidplans.html | 6 +- rowers/templates/paymentconfirm.html | 6 +- rowers/templates/privacypolicy.html | 5 +- rowers/templates/refunds.html | 33 ++++++++--- rowers/views/paymentviews.py | 12 +++- 8 files changed, 129 insertions(+), 19 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index ffef4328..88ce4888 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -44,6 +44,7 @@ class BillingForm(forms.Form): max_digits=8) plan = forms.IntegerField(widget=forms.HiddenInput()) payment_method_nonce = forms.CharField(max_length=255,required=True) + tac= forms.BooleanField(required=True,initial=False) # login form diff --git a/rowers/templates/billing.html b/rowers/templates/billing.html index d6035180..ef442cb3 100644 --- a/rowers/templates/billing.html +++ b/rowers/templates/billing.html @@ -22,7 +22,8 @@ as a price per year. You can downgrade or cancel your plan at any time, through the settings page. Please refer to our terms and conditions for our - payments and refunds policy. Accepted payment methods are the payment methods offered + payments and refunds policy. + Accepted payment methods are the payment methods offered by Braintree through us. If you have any questions about our payments and refunds policy, please contact diff --git a/rowers/templates/legal.html b/rowers/templates/legal.html index 037e3253..66bc90fa 100644 --- a/rowers/templates/legal.html +++ b/rowers/templates/legal.html @@ -3,6 +3,52 @@ {% block title %}Legal{% endblock title %} {% block main %} +

Welcome to Rowsandall

+ +

Welcome to Rowsandall. We want you to know and understand your rights and our rights relating + to the provision o fthe Services (as defined below). Please review them carefully. + Here are a few highlights: +

+ +

+

+

+

Terms and Conditions

Credit

@@ -32,7 +78,12 @@

-

Acceptable use

+

Acceptable use

+ +

You must not use this website to copy, store, host, transmit, sned, use, publish or + distribute any material which is illegal, obscene, defamatory, threatening, harassing, abusive, + or hateful or that advocates violence. +

You must not use this website in any way that causes, or may cause, damage to the website or impairment of the availability or accessibility of the website; or in any way which is unlawful, illegal, fraudulent or harmful, or in connection with any unlawful, illegal, fraudulent or harmful purpose or activity.

@@ -51,7 +102,7 @@

rowsandall.com may disable your user ID and password in rowsandall.com’s sole discretion without notice or explanation.

-

User content

+

User content

In these terms and conditions, your user content means material (including without limitation text, images, audio material, video material and audio-visual material) that you submit to this website, for whatever purpose.

@@ -78,7 +129,7 @@

Nothing on this website constitutes, or is meant to constitute, advice of any kind. If you require advice in relation to any legal, financial or medica] matter you should consult an appropriate professional.

-

Limitations of liability

+

Limitations of liability

rowsandall.com will not be liable to you (whether under the law of contact, the law of torts or otherwise) in relation to the contents of, or use of, or otherwise in connection with, this website: @@ -136,6 +187,27 @@

If a provision of these terms and conditions is determined by any court or other competent authority to be unlawful and/or unenforceable, the other provisions will continue in effect. If any unlawful and/or unenforceable provision would be lawful or enforceable if part of it were deleted, that part will be deemed to be deleted, and the rest of the provision will continue in effect.

+

Termination

+ +

+ You agree that Rowsandall may, under certain circumstances and without prior notice, + immediately terminate your accountand/or access to the site. Cause for such termination + shall include, but not be limited to, (a) breaches or violations of the Terms or + other incorporated agreements, policies, or guidelines, (b) requests by law enforcement + or other government agencies, (c) a request by you (self-initiated account deletions), + (d) discontinuance or material modification to the services (or any portion thereof), (e) + unexpected technical or security issues or problems, f) extended periods of inactivity, + and/or (g) nonpayment of any fees owed by you in connection with the Services. + Termination of your account may include (x) removal of access to all offerings within the + Services, (y) deletion of your information, files and Content associated with your account, + and (z) barring of further use of the Services. Further, you agree that all terminations + for cause shall be made in Rowsandall’s sole discretion and that Strava shall not be liable + to you or any third party for any termination of your account or access to the Services. + The following Sections shall survive termination of your account + and/or the Terms: Member Content Submitted to the Services, Proprietary Rights, + Your Feedback, Disclaimer of Warranties and Liability, Indemnity, Applicable Laws and General. +

+

Entire agreement

These terms and conditions constitute the entire agreement between you and rowsandall.com in relation to your use of this website, and supersede all previous agreements in respect of your use of this website.

@@ -145,7 +217,7 @@

These terms and conditions will be governed by and construed in accordance with Czech Law and any disputes relating to these terms and conditions will be subject to the exclusive jurisdiction of the courts of The Czech Republic.

-

rowsandall.com’s details

+

rowsandall.com’s details

The rowsandall.com site is owned by Rowsandall s.r.o., Nové sady 988/2, Staré Brno, 602 00 Brno, Czech Republic (company identification number 070 48 572)

@@ -156,7 +228,7 @@ {% include "refunds.html" %} -

Privacy Policy

+

Privacy Policy

{% include "privacypolicy.html" %} diff --git a/rowers/templates/paidplans.html b/rowers/templates/paidplans.html index cd174ccd..0b2f55cb 100644 --- a/rowers/templates/paidplans.html +++ b/rowers/templates/paidplans.html @@ -302,7 +302,11 @@

Terms and Conditions, Contact Information

-

Our paid plans follow the Terms and Conditions.

+

+ Before purchasing any of our paid plans, you must + review and acknowledge our Terms and Conditions, + and Refunds and Returns Policy +

Payments are made to "Rowsandall s.r.o.", with the following contact information:

Rowsandall s.r.o.
diff --git a/rowers/templates/paymentconfirm.html b/rowers/templates/paymentconfirm.html index 149a1355..d757f65a 100644 --- a/rowers/templates/paymentconfirm.html +++ b/rowers/templates/paymentconfirm.html @@ -93,6 +93,11 @@ +

+ I have taken note of the + Refund and Cancellation + Policy and agree with the Terms of Service. +

{% csrf_token %} @@ -101,7 +106,6 @@ {% include 'braintreedropin.html' %} - {% endblock %} {% block sidebar %} diff --git a/rowers/templates/privacypolicy.html b/rowers/templates/privacypolicy.html index 944660ed..d90051f8 100644 --- a/rowers/templates/privacypolicy.html +++ b/rowers/templates/privacypolicy.html @@ -116,7 +116,7 @@ posts.

-

Data Deletion

+

Membership Cancellation and Data Deletion

If you have previously consented to allow rowsandall.com to store and process your personal data in accordance with this privacy policy, and you wish to withdraw your conent, @@ -237,7 +237,7 @@ edit your heart rate and power settings, as well as functional threshold information and the account information accessible on your settings page under the header "Account Information". The team manager is not able to access or change your passwords, team memberships, favorite charts, export settings, workflow layout, or secret tokens. Also, the team manager is not able to download all your data, - not can he deactivate or delete your account. + nor can he deactivate or delete your account.

@@ -274,6 +274,7 @@ has suitable GDPR compliant measures in place.

+

Inactive Users - accounts are deleted after 18 months

diff --git a/rowers/templates/refunds.html b/rowers/templates/refunds.html index faf7140d..ff8cb547 100644 --- a/rowers/templates/refunds.html +++ b/rowers/templates/refunds.html @@ -1,5 +1,5 @@ -

Thank you for shopping at Rowsandall.

+

Thank you for shopping at Rowsandall.

Digital products

@@ -9,19 +9,36 @@ of the plan, you can cancel the recurring payment. We do not issue refunds for payments regarding the current plan period.

-

We do not issue refunds for digital products once the order is - confirmed and the product is sent.

+

If you are not 100% satisfied with your purchase, you can get a refund or + exhchange the product for another one. +

+ +

You can return a product for up to 30 days from the date you purchased it. + To be eligible for a refund, you need to contact us using the contact information + below. To improve our service, we ask you to explain how the product did not meet + your expectations. If your refund is approved, we will initiate a refund to your + credit card (or original method of payment). You will receive the credit within + a certain amount of days, depending on your card issuer's policies. +

We recommend contacting us for assistance if you experience any issues receiving our products.

-

Upgrades and Downgrades

+

Upgrades and Downgrades, Cancellations

-Upgrades and downgrades between paid plans are effective immediately, but the billing cycle -is not changed. Upgrades are charged a pro-rated amount for the current billing cycle. Downgrades -will result in a credit on our accounts, leading to a lower charge at the beginning of the -subsequent billing cycle. +

+ Upgrades and downgrades between paid plans are effective immediately, but the billing cycle + is not changed. Upgrades are charged a pro-rated amount for the current billing cycle. Downgrades + will result in a credit on our accounts, leading to a lower charge at the beginning of the + subsequent billing cycle. +

+ +

+ With the exception of an approved refund within 30 days of purchase (see above), we do not + issue refunds upon cancellation of the plan. If you are eligible for a refund, contact + us within 30 days of your purchase. +

Contact us

diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index 0e7b88f9..5183ca27 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -316,6 +316,7 @@ def checkouts_view(request): return HttpResponseRedirect(url) form = BillingForm(request.POST) + print request.POST if form.is_valid(): data = form.cleaned_data success,amount = braintreestuff.create_subscription(r,data) @@ -329,7 +330,16 @@ def checkouts_view(request): messages.error(request,"There was a problem with your payment") url = reverse(billing_view) return HttpResponseRedirect(url) - + elif 'tac' not in request.POST: + try: + planid = int(request.POST['plan']) + url = reverse('payment_confirm_view',kwargs={'planid':planid}) + messages.error(request,"You must review and acknowledge the terms and conditions") + return HttpResponseRedirect(url) + except IndexError: + messages.error(request,"There was an error in the payment form") + url = reverse('billing_view') + return HttpResponseRedirect(url) else: messages.error(request,"There was an error in the payment form") url = reverse(billing_view) From 319ce56e07bd2cd48a510cfd1a20d60831689270 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 8 Feb 2019 12:39:31 +0100 Subject: [PATCH 2/3] added downgrades & upgrades --- rowers/templates/downgradeconfirm.html | 5 + rowers/templates/upgradeconfirm.html | 5 + rowers/tests/test_payments.py | 136 +++++++++++++++++++++++++ rowers/views/paymentviews.py | 23 ++++- 4 files changed, 167 insertions(+), 2 deletions(-) diff --git a/rowers/templates/downgradeconfirm.html b/rowers/templates/downgradeconfirm.html index 1e027c34..4b76a6d9 100644 --- a/rowers/templates/downgradeconfirm.html +++ b/rowers/templates/downgradeconfirm.html @@ -72,6 +72,11 @@ +

+ I have taken note of the + Refund and Cancellation + Policy and agree with the Terms of Service. +

{% csrf_token %} diff --git a/rowers/templates/upgradeconfirm.html b/rowers/templates/upgradeconfirm.html index 2427117a..e3b0aa98 100644 --- a/rowers/templates/upgradeconfirm.html +++ b/rowers/templates/upgradeconfirm.html @@ -93,6 +93,11 @@ +

+ I have taken note of the + Refund and Cancellation + Policy and agree with the Terms of Service. +

{% csrf_token %} diff --git a/rowers/tests/test_payments.py b/rowers/tests/test_payments.py index 61a9e5c6..794416d5 100644 --- a/rowers/tests/test_payments.py +++ b/rowers/tests/test_payments.py @@ -366,6 +366,7 @@ class PaymentTest(TestCase): 'amount':'15.00', 'plan': plans[1].id, 'payment_method_nonce': 'aap', + 'tac':'tac', } form = BillingForm(form_data) @@ -410,6 +411,7 @@ class PaymentTest(TestCase): 'amount':'15.00', 'plan': plans[1].id, 'payment_method_nonce': 'aap', + 'tac':'tac', } form = BillingForm(form_data) @@ -453,6 +455,7 @@ class PaymentTest(TestCase): 'amount':'15.00', 'plan': plans[1].id, 'payment_method_nonce': 'aap', + 'tac':'tac', } form = BillingForm(form_data) @@ -470,3 +473,136 @@ class PaymentTest(TestCase): expected_url = '/rowers/downgradecompleted/', status_code=302,target_status_code=200) + @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) + def test_checkouts_view(self,mock_subscription): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach', + paymentprocessor='braintree', + street_address = faker.street_address(), + city = faker.city(), + postal_code = faker.postalcode(), + country = faker.country(), + ) + + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + form_data = { + 'amount':'15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + } + + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/checkouts/' + + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url = '/rowers/checkout/{planid}'.format( + planid=plans[1].id), + status_code=302,target_status_code=200) + + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + def test_upgrade_checkouts_view(self,mock_subscription): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach', + paymentprocessor='braintree', + street_address = faker.street_address(), + city = faker.city(), + postal_code = faker.postalcode(), + country = faker.country(), + ) + + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + form_data = { + 'amount':'15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + # 'tac':'tac', + } + + form = BillingForm(form_data) + self.assertTrue(form.is_valid()) + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/upgradecheckouts/' + + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url = '/rowers/upgradecheckout/{planid}'.format( + planid=plans[1].id), + status_code=302,target_status_code=200) + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + def test_downgrade_checkouts_view(self,mock_subscription): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach', + paymentprocessor='braintree', + street_address = faker.street_address(), + city = faker.city(), + postal_code = faker.postalcode(), + country = faker.country(), + ) + + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + form_data = { + 'amount':'15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + # 'tac':'tac', + } + + form = BillingForm(form_data) + self.assertTrue(form.is_valid()) + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/downgradecheckouts/' + + response = self.c.post(url, form_data,follow=True) + self.assertEqual(response.status_code,200) + + self.assertRedirects(response, + expected_url = '/rowers/downgradecheckout/{planid}'.format( + planid=plans[1].id), + status_code=302,target_status_code=200) + diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index 5183ca27..2f680fe6 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -316,7 +316,6 @@ def checkouts_view(request): return HttpResponseRedirect(url) form = BillingForm(request.POST) - print request.POST if form.is_valid(): data = form.cleaned_data success,amount = braintreestuff.create_subscription(r,data) @@ -333,7 +332,7 @@ def checkouts_view(request): elif 'tac' not in request.POST: try: planid = int(request.POST['plan']) - url = reverse('payment_confirm_view',kwargs={'planid':planid}) + url = reverse('downgrade_confirm_view',kwargs={'planid':planid}) messages.error(request,"You must review and acknowledge the terms and conditions") return HttpResponseRedirect(url) except IndexError: @@ -376,6 +375,16 @@ def upgrade_checkouts_view(request): url = reverse(upgrade_view) return HttpResponseRedirect(url) + elif 'tac' not in request.POST: + try: + planid = int(request.POST['plan']) + url = reverse('upgrade_confirm_view',kwargs={'planid':planid}) + messages.error(request,"You must review and acknowledge the terms and conditions") + return HttpResponseRedirect(url) + except IndexError: + messages.error(request,"There was an error in the payment form") + url = reverse('billing_view') + return HttpResponseRedirect(url) else: messages.error(request,"There was an error in the payment form") url = reverse(upgrade_view) @@ -409,6 +418,16 @@ def downgrade_checkouts_view(request): messages.error(request,"There was a problem with your transaction") url = reverse(upgrade_view) return HttpResponseRedirect(url) + elif 'tac' not in request.POST: + try: + planid = int(request.POST['plan']) + url = reverse('payment_confirm_view',kwargs={'planid':planid}) + messages.error(request,"You must review and acknowledge the terms and conditions") + return HttpResponseRedirect(url) + except IndexError: + messages.error(request,"There was an error in the payment form") + url = reverse('billing_view') + return HttpResponseRedirect(url) else: messages.error(request,"There was an error in the payment form") From fa9632afb1492ae38b0d350693081275d3654608 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 8 Feb 2019 13:01:19 +0100 Subject: [PATCH 3/3] testing refund acknowledgement --- rowers/datautils.py | 11 ++++++----- rowers/templates/payment_completed.html | 3 ++- rowers/templates/paymentconfirm.html | 2 +- rowers/templates/upgradeconfirm.html | 2 +- rowers/tests/test_payments.py | 12 +++++++----- rowers/tests/testdata/testdata.csv.gz | Bin 11457 -> 11426 bytes rowers/views/paymentviews.py | 4 ++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/rowers/datautils.py b/rowers/datautils.py index b19a7597..4048fd24 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -304,15 +304,16 @@ def getmaxwattinterval(tt,ww,i): if len(w_roll): # now goes with # data points - should be fixed seconds indexmax = w_roll.idxmax(axis=1) - indexmaxpos = indexmax.get_loc(indexmax) + # indexmaxpos = indexmax.get_loc(indexmax) + indexmaxpos = indexmax try: - t_0 = tt.iloc[indexmaxpos] - t_1 = tt.iloc[indexmaxpos-i] - deltas = tt.iloc[indexmaxpos-i:indexmaxpos].diff().dropna() + t_0 = tt.ix[indexmaxpos] + t_1 = tt.ix[indexmaxpos-i] + deltas = tt.ix[indexmaxpos-i:indexmaxpos].diff().dropna() testres = 1.0e-3*deltas.max() < 30. if testres: deltat = 1.0e-3*(t_0-t_1) - wmax = w_roll.iloc[indexmaxpos] + wmax = w_roll.ix[indexmaxpos] #if wmax > 800 or wmax*5.0e-4*deltat > 800.0: # wmax = 0 else: diff --git a/rowers/templates/payment_completed.html b/rowers/templates/payment_completed.html index dbfc9c9a..653907dc 100644 --- a/rowers/templates/payment_completed.html +++ b/rowers/templates/payment_completed.html @@ -24,7 +24,8 @@ as a price per year. You can downgrade or cancel your plan at any time, through the settings page. Please refer to our terms and conditions for our - payments and refunds policy. Accepted payment methods are the payment methods offered + payments and refunds policy. + Accepted payment methods are the payment methods offered by Braintree through us. If you have any questions about our payments and refunds policy, please contact diff --git a/rowers/templates/paymentconfirm.html b/rowers/templates/paymentconfirm.html index d757f65a..1f616834 100644 --- a/rowers/templates/paymentconfirm.html +++ b/rowers/templates/paymentconfirm.html @@ -20,7 +20,7 @@

- Payments will be procesed by Braintree (A PayPal service): + Payments will be processed by Braintree (A PayPal service):

diff --git a/rowers/templates/upgradeconfirm.html b/rowers/templates/upgradeconfirm.html index e3b0aa98..ec4221c3 100644 --- a/rowers/templates/upgradeconfirm.html +++ b/rowers/templates/upgradeconfirm.html @@ -20,7 +20,7 @@

- Payments will be procesed by Braintree (A PayPal service): + Payments will be processed by Braintree (A PayPal service):

diff --git a/rowers/tests/test_payments.py b/rowers/tests/test_payments.py index 794416d5..ab67cfb7 100644 --- a/rowers/tests/test_payments.py +++ b/rowers/tests/test_payments.py @@ -501,6 +501,8 @@ class PaymentTest(TestCase): 'payment_method_nonce': 'aap', } + form = BillingForm(form_data) + self.assertTrue(not form.is_valid()) login = self.c.login(username=u.username, password=self.password) self.assertTrue(login) @@ -511,7 +513,7 @@ class PaymentTest(TestCase): self.assertEqual(response.status_code,200) self.assertRedirects(response, - expected_url = '/rowers/checkout/{planid}'.format( + expected_url = '/rowers/checkout/{planid}/'.format( planid=plans[1].id), status_code=302,target_status_code=200) @@ -546,7 +548,7 @@ class PaymentTest(TestCase): } form = BillingForm(form_data) - self.assertTrue(form.is_valid()) + self.assertTrue(not form.is_valid()) login = self.c.login(username=u.username, password=self.password) self.assertTrue(login) @@ -557,7 +559,7 @@ class PaymentTest(TestCase): self.assertEqual(response.status_code,200) self.assertRedirects(response, - expected_url = '/rowers/upgradecheckout/{planid}'.format( + expected_url = '/rowers/upgradecheckout/{planid}/'.format( planid=plans[1].id), status_code=302,target_status_code=200) @@ -591,7 +593,7 @@ class PaymentTest(TestCase): } form = BillingForm(form_data) - self.assertTrue(form.is_valid()) + self.assertTrue(not form.is_valid()) login = self.c.login(username=u.username, password=self.password) self.assertTrue(login) @@ -602,7 +604,7 @@ class PaymentTest(TestCase): self.assertEqual(response.status_code,200) self.assertRedirects(response, - expected_url = '/rowers/downgradecheckout/{planid}'.format( + expected_url = '/rowers/downgradecheckout/{planid}/'.format( planid=plans[1].id), status_code=302,target_status_code=200) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 7dc55d87c477e548aa76296844e2bf2104abde41..58b6f988584997088913c77aec29bc418eb0152f 100644 GIT binary patch literal 11426 zcmV;TEM3zdiwFn;Z(Uph|8!+@bYx+4VJ>5Hb^v{S+pcWKb=`Y?1s@fl(XQ*Ps>j5N zkpO`q*a7kw(9(g!NF)XFNVfC!8Dq>^t7`3iY{(`zdw2I7Yu3D9YX9)lAHMwS>wo_6 zdVTl(@4x==*B`$A+kgMVzrMcv)AxVYzyJL64?lg?PyZD! z{rcq({Mhx0|Mv4QKm5O+fBO3UpT7Iek6*ri`Q=x<_>W(I`T37uT8uyb?)%^STmOdt zgx8aumAY%55Io>UQ}*Kzy0Nhzkc~2Uw-=M zum9)ctNu7YZs7m$<@Z1T^~*2+cKqUh{rt-xfA{4V|NVEr`M*E^(?9VSzx(q2A3wkPTfF)2z~rBQxj*_}e*XUJexh%G<==nf3;%wh`uQ(k zafDyLT;RX^`@j77PhWm{{r)dM{_j744 zkT!<-&Q%c73vld}$~)m(=ey!fbK%G)jB(~y#@iac{ax_hn(+JH`0<(n-#Y%0qTV}3 zwO&VVc;6Uri?!wP%5%O4-hm%0p9$1LzR}G5PR$we8t++NIS~OqlR(+If)6&KX{o=; z3luBSfUIpWzK8>>@ma(u*>uKcKj1OdZ zh@3$iGBrx9$s7tOg?2&dK)j&fwazoD0}q%CEbr^QN_q_*A!HM5wgsg)k}(%oDv@*{ z!5ix=1yD+x;>xTOQX?#7v^FWbO{9WtEcL=dR=y#ft-tYWqo`hN0hZ!e@Fn2J8_xwW zKocoiQD`VCeJ;M>t)q5`Q|^%TjAv>&6-Y^Gl`NYQ7!$G3HyV4-Bs86B*`X;$b!d}1 zyU;+cDYX!L$l?H+oc)xBZ8T(PZ<1-Eftb}ftW|tEL5;zKvIVB{qw@xnvyGTq1&0%4dzMjgPzB6L zb4==W7p*XFFwmdrRt6uMZv)*1GXop;#s@ZQ_+gM}G$Q29^pm2C4?@Wb;y3?rQ=drm%Q$|D?HaUSq zGJ0>GoNSFOaHj=MFqO6-2Pa<7YpEu z-~8qp-{1?Z10fZeV^V2`4`)D{6rc*`hwnR3b6YNRKMlC(>_A+m)oE@X*u^?1~nD}QfBLri$?Ud;v1?MPl_RJb4_g<4yw8N zPgQbJpga8%D?n{DTOfmX(?BjzkSpg@S)7{W>us5Ot8LN%Wc(K*fM^4v4^|;osc;~2 ztkp?|v<){^Zb`e*_)^i`bn`d$g2h*}!=eKA%`1D+(L>7wEAi-a+^}G`XT_nxBNfOS z97~#1LFiSE!(lZi8Pc}kg|1qtpkwesAccr#=mhKK+^Wn7tSV0sj2uFh4pd!+vsZmG z-_qX6MX+MhuiF zd!@1S2oh02r1xO>Si~%-&W2TojQ_jKk?9b}XEk)&APzgO(sFGbCcYoGfoGTuo`|TX zQw(`qcPQS9CGjF6rI-|ySA8`^dmSO9sU+TpIz3h9p+)^yn z=IMwVm=jwynfDx>WXRjR!?%wWZsWuo4-|@W!K&Yc#n?uoRZod;%M*6#;VoK>a}8lX z4QcKSeFr|*01;<6<(zYJnjvrdjzjLnag`TiT!<4QVz*j7UAT%LVwMoY>emOm+V(pV z_PqTLEN_LV&!Q-5Ya-rAxbi!+*rXZqw(wBCC0mt7htR9TfkLDNLib#J70iVw${hUBY$gp?|dQ@L>!{8&Yry zS4Kbv{cRIT--PVb$mc~flx^g}zv{T~B1|u6AzIW!7l~Rq`K4G3;XYFw`ScBI9PBDv z5nF_9fL{cbgI!2MA^u2!C0)}=hO(_Zkyl=61xu(VuEu^lr5S}@Cwd^l^mRJr^tgHA{ojy@zB2F z#uWeZvWo&+cZuaY^d#A-i z7-=zk!cS#!EY%ZOVHCpH4%quAj;&yRc<8^y9-*nV21|;ELLh}43@VKj4M8_Bi($=4 zhO$llP?HUraE<@C#lWDT?-&spvBI*~3A+MKOKvC&%JCN*+hrz>um=Lp*_q zvLKLYY4$=91M@1ATL&hZq2Bf$-}W{)tb8$bSfIM9BM^csxn_t;hIx>Kw|pb2pPOMN z?eMuLh!d;D4}J|M6Rk{I)*78;sCmO;8OC8{Pm2qFx)Pb$PF!i>>a19NaztK^>|QU( zM_3;Ra<$TEvypJs$mj;54|W5t>c(UmX@*)hFvWphpI5TScNSZjY)RKa4nN4c{C1Vi z?{+3I57V%MAq01-X&vqxPi!(k%uXRD<)rx`mL^HKtMTvHWIto_p!UY)|clOVE7X@s(ZI$uDIo6wB2|)$i4vwrKOC7D!ZW)ed zvSP`AwJw^W-bNpm`l_Q=FH%x@$MpWhE=vfQLUEE}WsJbaH#1swpLQfYsjP@w8*9$& zag5C3V0*)-n+ex&lA+Fxi%RVc5cv?2oXgRjpjZCEuhqa%` zXX{k@4^$O72$+Rj2Z!5KE5Rd+Vrbji(+~(#Qkix3S1WNj?cPpQN!bCtXDizUT^VgY zJ)^O3c_nDQAE@eBsCdRlh5pLW z<`H~(qV1(~rrM)0kleAC(M=%BR?b0KBpKSa^R)X8tMHUq3ux_vRr}M-7ezRbD_Qw` zWkU5%XH93Hj}W@T_eI39BdNDMOKjve5H`XUw~CVtZJT)pZ;~mMrQx>l9*e6GGtvpG zE?A5M>`rH|x>DUG%QNnZOgA7%!Y(FkCRE$T*W~TY#71u$Z+#}MsH@B)93-={ z>(#5t#z*^H9IVom-IMB-6%iyHvJUJ`N7kqA9-dE2Dz#1X!)BO)ZbBBOb>>Mg=ovpzvs<|ISgCY~*hCRm_s z%GMBZtjK9T(v5V%Vol+5Ew!xJhS9SfL06iHQ@d*-j1TN5^9_=MekvMli)Lus#8=fJ zh>MLKqeQbkQ=MJ)1H0;Cm&MJl6+GY4m1X4b&<0s6yz^wYj?%>_8bKRkRoc}eSl$t; z!M2TW+0!$&os((W1bN-c&QiNdIGzPLESNS+Te_a5CB6OZAB=)?gn-X^Het{90hlC` z!M2HS&9k$lc4!wArkY~~zz3|Pw3B8V?+~nSRO05!2JQ&e8s`dN+fAu-XMSM{opT>u zV-DbwNCw+hzOk_BxDub4b$j#PQc zWVs?L6L@mT<9om32fW;b6!6K*bUrq8zx&!bKC&A7$Qj z*HcH*A?|4!oF5DnWS;F7P;VLGz00@}?ZQQp!M34?;jilyeS{1=u))AoeepBmA};k9 zk;mG2WM%op<&~w&MnHTM6ft+Uwsz+;b8fCpRvE~AkqoviJ%gm`xHzGw0NrL;J*J*d zTzTQ*Im*uF0qp7tI?z=1Tiu+z5~MzP79Lou?HtP`y16hq&} zeq?XEB=x1|V9d(dlIenPN1}1V!pFO;yF0k9(Y@=E)EkZL5q6F75!CI1gle$DL!&x1lXwO74{i;~ zRqb2sGZK1Z-ID4EVsJ*ZGq7Z1A}kWO7R}JNv4;kxg{x?cadLX@j)G5iSzW*egRKX! zd^>HoUv>BVap(w5A!BS*Zu`Yb2O?>@>|UH==-b-Q>}{8%{%D-kO{7yQSxs8DL%Is9 zEF=U0l(}zq@~a)vwS6PJT*M*bVA?5N59bIriDu~A-m}@_c9kvCl$qP~)jx?lf)=pE zItvAvnf?wY=5pF;Ic=B|HTaJ|tuu7?loE(0X?7=9}41F7XXkc7fqiN7_a8ApX zKDKh2iL!w4d!C_v-hNwS!L@B*4};I+i<#xF3f~gpH3iI^X6U!YM{J8g&4FKl6X@rY;VrC>blE#FA%RT~Q{5A20M^Pf)MF}4jbxX5gAz1}vj>Q*-jJ2?b zZO{R@r=%&;KAmD1X~P;`uU8=?XO6?Nrc;ILc8@~ES{YH{F@~G_tKPMXC8K(5yH9Zr z82ie>clCWZ5CnZ}k_Jirh)yw#+t^R0Aa3kg0Vfhb_kK>+eD%SsxnRN24O#p8EvMZd zvW3SkkS~}lA7E~ob0!bj8p$b!Q8ui~nR~(VNf_iNOeW1`tDIIH^Na;h9-Ce2MiU8Ajc>>@urr^cR{{<{?S!%I$DNO#2z+ zz}G^E9%l83RvRCw)f?E%GvkzD#Mqc)2%8pSdR+pRjz0d+aRDVCiila89yb5hfOS24x`PL3x5sFpO>K zp?`G=7py01P4zX?m7~pmqDm|>l1_R}nfl(2oMRlOz8;}!?cDf)&z=uc&%&ri_y}w| z%`msAXGeUoYibG%iNf?c3~k1Rt0*XJ3UWADk+w};LC(0OD?M|x#KwP*nN>pLT>Rjq z>?2779FYuj+xlWxY+pGSml@m7;@#}H=Tli6-oVCd%Gi%`w$82=Reh8%2a7lyW6A2A zK`UeYP`v~kkqmQNd+MLVV))g_gSmoea_T^(>L=?Z`88$h?Tn$lHM?Yf>o{QO(V4yKUVVjxE&w+! z*1{8BDc)kAhJ=`g4Wa9{v*&0EzbOOr`jJ%)ik)j>P z=-J)T%ZAvu${JTatI&-TyEXX^6!3^8T@{Zy_BQ<(sw`MY@zM;3p^#fLgc!im`{RXZi~-QX=)LY!>aAA z21dSyLOGRsqpE$OQX@O=u@?uHV?3H@$Jh&Ue{N~AZGBEK4Gw0&xoJ`9q8jwY3!AO^ z?5vDP)&i`*{BOIK-Gr^Np3ROG-^21XGtAvOo^3JBo6dJV8bVNDkiA&~=NV_KS=|jz z!ASZqqCww#L91TO^0V&39&QixHvx2&aua-z90T zKvbJD7y=}!L0^1fQ{t$_NMNhVb)u_0vDJ%h&DrMI_#T=6`H;1?lrwvS{AOE3)X|_` zOxTQB8b=CE{a7wUUD!x9=!+LNj?`+&S0lHIFH*F+j^*CO6}HZrJH@T5E|^rg{CJ{X zbUF-eDctT%Y6RRxr^n2Y9|DO6eeVUW_^=6%U!%a1q%~OCw63?=#<){w0yo)^AvmZc;$F@wBbd_3 za9HCw)5N9>IYF|AGw_c0V%+fY$zAC&?!jp0ov|#-t%+0Hk4ldKiE7X{FKmePmcaQ^ zI2#Fggr%qtT`;x>Btd*g9qK&wG#zuJb+?XkM79IFk?S!x3KPc><*FeM;StfGFTS8P zp8?L?TVf4L1!h%4U?K!}}rCkmLZ*U|V^vxHz zaq*4YOArETYFZ;7jrF-FI=j$mzjF@^7}2#=F>ry{>HzlO^d^^B8YQr>B@{WJ&wiZ1 z%|$h&y;lnl{C38%zy`juE65bKe4BIq#&$S{HDfVtd-)^4eQ@sZ@@IrAL?Ro~Ua_6C zUdPJkTBaeb8EOrnANr6lbo{!b0(9v^Uq;R&O^!4+T8C4;T3;e?(}Lo(Q9q4x0%#JPH6D@TiW7hK?>3i3`C5gt>niK;P@ z3NAt`wNRuv(NlBD8_J!D~oDK_wp?#4sLL!3myb+wgs--d6ihrRuI9_GuZ7_ zpX%U_JF|gsv+GwxB#c!dx7hkC}FFI?Gra7JMPsetAn$t zz4AxaXD7P&sKD4LNTQH^moxG`3NXSWnjzhLxG$m_{eL68~%fh4HocmIS zdx}|XV{cEysPm76!SgHe%_FLiWh+*njYx|ec+t$PR97aAyH ze485q8TbQRacmsFO1_u-SbLatdHksfzWYdFKH%Pm(S~vXj(rm@At7YsoVh=zNQQLp zK7L`o zF-$}v8`8a=%Q(UN(^=aC)qBp_i^>d?Zl9W5-aJy`6XeH$?jdh#IvuSiW2Fe$fyQ7X%)6t(Tq(_`VyV0aPnHcRK| z>0{qbfJ8K;ygdWw3OxK>QC3u0IV}rk^Bf{>?E2{@10KSS%?G)zbgN%$k9SIwa~`oz zw#GPgJJRSM_H2YmR71+!H)vs0*w}}Zxr0B>OBq@|Pc^ggM{VFYwcGk$fl@rKKNyF7 zn-z8=xA7cPKW5*AM?^!)+cT84@tHM+&KYDfES43EjQK(0?265^?Obr(VsTqIdn`jB zHb+8=pjXzHmq+!S@^cwNkVH15yj=rt99U+gt7p_zrK!vQ?kswt>$k-9Pd4uIsaITo zOI(surS0Z$+klnBp~9fm*gfIOwupw5w{PH3hsVDh2}9Q1RXc5K4SW04yBO6$0KC*l<8x&MT5?Uf+~W*ONqg3P(2<*^u&f4-C0n>Ns6J%NS|xeIQdHNsArl#mYr+&WcC_1hD~dx9w;TbMh*_1li5Nfsv(u_A=v11q2q|N zDX≧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 bE%OG|dV_eM5SB%T-Ol@e0koFQfOh}@SgjW_ diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index 2f680fe6..f72c16ca 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -332,7 +332,7 @@ def checkouts_view(request): elif 'tac' not in request.POST: try: planid = int(request.POST['plan']) - url = reverse('downgrade_confirm_view',kwargs={'planid':planid}) + url = reverse('payment_confirm_view',kwargs={'planid':planid}) messages.error(request,"You must review and acknowledge the terms and conditions") return HttpResponseRedirect(url) except IndexError: @@ -421,7 +421,7 @@ def downgrade_checkouts_view(request): elif 'tac' not in request.POST: try: planid = int(request.POST['plan']) - url = reverse('payment_confirm_view',kwargs={'planid':planid}) + url = reverse('downgrade_confirm_view',kwargs={'planid':planid}) messages.error(request,"You must review and acknowledge the terms and conditions") return HttpResponseRedirect(url) except IndexError: