From c28a2606b9488bb3aafbecf35ccee8768fbbacf4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 4 Dec 2025 19:35:44 +0100 Subject: [PATCH 1/5] eerste set wijzigingen --- rowers/braintreestuff.py | 59 +++++++++++++++++++++++++------ rowers/templates/frontpage.html | 9 +---- rowers/templates/landingpage.html | 10 ------ rowers/urls.py | 5 --- templates/newbase.html | 29 +++------------ templates/newbasefront.html | 17 ++------- 6 files changed, 56 insertions(+), 73 deletions(-) diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 145a766d..92a10f28 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -418,35 +418,72 @@ def create_subscription(rower, data): return False, 0 # pragma: no cover - def cancel_subscription(rower, id): themessages = [] errormessages = [] + + # 1. Fetch subscription first so we can read paid_through_date try: - _ = gateway.subscription.cancel(id) - themessages.append("Subscription canceled") - except: # pragma: no cover + subscription = gateway.subscription.find(id) + paid_through = subscription.paid_through_date # may be None + except Exception: errormessages.append( "We could not find the subscription record in our customer database." - " We have notified the site owner, who will contact you.") + " We have notified the site owner, who will contact you." + ) - name = '{f} {l}'.format(f=rower.user.first_name, - l=rower.user.last_name) + name = f"{rower.user.first_name} {rower.user.last_name}" - _ = myqueue(queuehigh, - handle_send_email_failed_cancel, - name, rower.user.email, rower.user.username, id) + _ = myqueue( + queuehigh, + handle_send_email_failed_cancel, + name, + rower.user.email, + rower.user.username, + id, + ) return False, themessages, errormessages + # 2. Attempt cancellation + try: + _ = gateway.subscription.cancel(id) + themessages.append("Subscription canceled") + except Exception: # pragma: no cover + errormessages.append( + "We could not find the subscription record in our customer database." + " We have notified the site owner, who will contact you." + ) + + name = f"{rower.user.first_name} {rower.user.last_name}" + + _ = myqueue( + queuehigh, + handle_send_email_failed_cancel, + name, + rower.user.email, + rower.user.username, + id, + ) + + return False, themessages, errormessages + + # 3. Update rower object (using paid_through_date) basicplans = PaidPlan.objects.filter(price=0, paymentprocessor='braintree') rower.paidplan = basicplans[0] + + # teamplanexpires stays "now" (as you had it) rower.teamplanexpires = timezone.now() - rower.planexpires = timezone.now() + + # planexpires becomes the user's real, fully paid end date + # fallback = now() if Braintree somehow returns None + rower.planexpires = paid_through or timezone.now() + rower.clubsize = 0 rower.rowerplan = 'basic' rower.subscription_id = None rower.save() + themessages.append("Your plan was reset to basic") return True, themessages, errormessages diff --git a/rowers/templates/frontpage.html b/rowers/templates/frontpage.html index 7b10cdc4..0b12898e 100644 --- a/rowers/templates/frontpage.html +++ b/rowers/templates/frontpage.html @@ -44,14 +44,7 @@ {% if user.is_anonymous %}
  • -
  • - -

    -
    SIGN UP FREE
    -

    -
    -
  • -
  • +
  • diff --git a/rowers/templates/landingpage.html b/rowers/templates/landingpage.html index cb68078a..23d9b9ba 100644 --- a/rowers/templates/landingpage.html +++ b/rowers/templates/landingpage.html @@ -209,13 +209,6 @@ - {% if not user.is_authenticated %} -
    -

    SIGN UP

    -

    I am a rower

    -

    I am a rowing coach

    -
    - {% endif %}
    @@ -353,9 +346,6 @@ using my NK empower oarlock for about a month now, and I‘m really
  • Contact
  • -
  • - Paid Plans -
  • Legal
  • diff --git a/rowers/urls.py b/rowers/urls.py index b2942bf8..934c9fe7 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -832,7 +832,6 @@ urlpatterns = [ name='payment_completed_view'), re_path(r'^downgradecompleted/$', views.downgrade_completed_view, name='downgrade_completed_view'), - re_path(r'^paidplans/$', views.paidplans_view, name='paidplans_view'), re_path(r'^me/cancelsubscriptions/$', views.plan_stop_view, name='plan_stop_view'), re_path(r'^me/cancelsubscription/(?P[\w\ ]+.*)/$', @@ -847,10 +846,6 @@ urlpatterns = [ re_path(r'^starttrial/$', views.start_trial_view, name='start_trial_view'), re_path(r'^legal', TemplateView.as_view( template_name='legal.html'), name='legal'), - re_path(r'^register/$', views.rower_register_view, - name='rower_register_view'), - re_path(r'^coachregister/$', views.coach_register_view, - name='coach_register_view'), path('activate///', views.useractivate, name='useractivate'), re_path(r'^register/thankyou/$', TemplateView.as_view( template_name='registerthankyou.html'), name='registerthankyou'), diff --git a/templates/newbase.html b/templates/newbase.html index 4c606e18..788ebb9b 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -165,11 +165,6 @@ {% else %} -
  • - - - -
  • @@ -230,7 +225,7 @@ {% if user.rower.planexpires|date_dif|ddays < 4 %}
  • - You have {{ user.rower.planexpires|date_dif|ddays }} days left of your one year subscription. Please renew on or before {{ user.rower.planexpires }} or your plan will be reset to Basic. Click here to renew your membership.

    + You have {{ user.rower.planexpires|date_dif|ddays }} days left of your one year subscription. Please renew on or before {{ user.rower.planexpires }} or your plan will be reset to Basic.

  • {% endif %} {% endif %} @@ -239,14 +234,14 @@ {% if user.rower.plantrialexpires and user.rower.plantrialexpires|is_future_date and user.rower.rowerplan != 'plan' %}
  • - {{ user.rower.protrialexpires|date_dif|ddays }} days left of your Self-Coach trial - Would you like to upgrade now? + {{ user.rower.protrialexpires|date_dif|ddays }} days left of your Self-Coach trial

  • {% else %} {% if user.rower.rowerplan == 'basic' %}
  • - {{ user.rower.protrialexpires|date_dif|ddays }} days left of your Pro trial - Would you like to upgrade now? + {{ user.rower.protrialexpires|date_dif|ddays }} days left of your Pro trial

  • {% endif %} @@ -255,7 +250,7 @@ {% if user.rower.coachtrialexpires and user.rower.coachtrialexpires|is_future_date and user.rower.rowerplan != 'coach' %}
  • - {{ user.rower.coachtrialexpires|date_dif|ddays }} days left of your Coach trial - Would you like to upgrade now? + {{ user.rower.coachtrialexpires|date_dif|ddays }} days left of your Coach trial

  • {% endif %} @@ -336,13 +331,7 @@
    - {% if user.is_authenticated and user.rower.rowerplan == 'basic' %} - - {% elif user.is_authenticated and user.rower.rowerplan == 'pro' %} + {% if user.is_authenticated and user.rower.rowerplan == 'pro' %}
    Thank you for supporting Rowsandall.com! @@ -409,14 +398,6 @@ -
  • -

    Support Us

    - -
  • Legal

  • -
  • -

    Paid Plans

    - -
  • Legal

      From 42fa0740a6d8e5d2f8de8b96eb3c0ec689406254 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 7 Dec 2025 14:08:53 +0100 Subject: [PATCH 2/5] getting tests to pass --- rowers/tests/atest_newusers.py | 181 ++++++++ rowers/tests/atest_payments.py | 795 +++++++++++++++++++++++++++++++++ 2 files changed, 976 insertions(+) create mode 100644 rowers/tests/atest_newusers.py create mode 100644 rowers/tests/atest_payments.py diff --git a/rowers/tests/atest_newusers.py b/rowers/tests/atest_newusers.py new file mode 100644 index 00000000..138643cb --- /dev/null +++ b/rowers/tests/atest_newusers.py @@ -0,0 +1,181 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +#from __future__ import print_function +from .statements import * + +nu = datetime.datetime.now() + +#@pytest.mark.django_db +@override_settings(TESTING=True) +class NewUserRegistrationTest(TestCase): + def setUp(self): + self.c = Client() + redis_connection.publish('tasks','KILL') + + def tearDown(self): + try: + os.remove('rowsandall_workouts_2018-01-01_2019-01-01.csv') + except: + pass + + @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) + def test_newuser(self,mock_workout_summaries): + form_data = { + 'first_name':'Jan', + 'last_name':'Roeiert', + 'email':'jan@loop.nl', + 'username':'janderoeiert', + 'password1':'Aapindewei2', + 'password2':'Aapindewei2', + 'url': '', + 'tos':True, + 'weightcategory':'hwt', + 'adaptiveclass': 'None', + 'sex':'male', + 'next':'/rowers/list-workouts', + 'birthdate':datetime.datetime(year=1970,month=4,day=2) + } + + form = RegistrationFormSex(form_data) + self.assertTrue(form.is_valid()) + + response = self.c.post('/rowers/register/', form_data, follow=True) + self.assertEqual(response.status_code,200) + + # set opt-in + user = User.objects.get(username='janderoeiert') + user.rower.gdpr_optin = True + user.rower.ftpset = True + user.set_password('Aapindewei2') + user.is_active = True + user.save() + user.rower.save() + + login = self.c.login(username=user.username,password='Aapindewei2') + self.assertTrue(login) + + + url = '/rowers/list-workouts/' + + response = self.c.get(url) + + expected = '/rowers/me/gdpr-optin/?next=/rowers/list-workouts/' + + self.assertRedirects(response, + expected_url=expected, + status_code=302,target_status_code=200) + + url = '/rowers/me/gdpr-optin-confirm/?next=/rowers/list-workouts/' + + response = self.c.get(url) + + expected = '/rowers/list-workouts/' + self.assertRedirects(response, + expected_url=expected, + status_code=302,target_status_code=200) + + + url = '/rowers/exportallworkouts/' + + response = self.c.get(url,follow=True) + + + self.assertTrue(response.status_code,200) + + + form_data = { + 'startdate':'2018-01-01', + 'enddate':'2019-01-01' + } + + response = self.c.post(url,form_data) + + self.assertTrue(response.status_code,200) + + + + url = '/rowers/me/delete/' + + form_data = { + 'delete_user':True, + } + + response = self.c.post(url,form_data,follow=True) + self.assertRedirects(response, + expected_url='/login/', + status_code=302,target_status_code=200) + + @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) + def test_newuser_false(self,mock_workout_summaries): + form_data = { + 'first_name':'Jan', + 'last_name':'Roeiert', + 'email':'jan@loop.nl', + 'username':'janderoeiert', + 'password1':'aapindewei2', + 'password2':'aapindewei2', + 'tos':True, + 'url': '', + 'weightcategory':'hwt', + 'adaptiveclass': 'None', + 'sex':'male', + 'next':'/rowers/list-workouts', + 'birthdate':datetime.datetime(year=1970,month=4,day=2) + } + + form = RegistrationFormSex(form_data) + self.assertFalse(form.is_valid()) + + @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) + def test_newuser_honeypot(self,mock_workout_summaries): + form_data = { + 'first_name':'Jan', + 'last_name':'Roeiert', + 'email':'jan@loop.nl', + 'username':'janderoeiert', + 'password1':'Aapindewei2', + 'password2':'Aapindewei2', + 'url': 'http://example.com', + 'tos':True, + 'weightcategory':'hwt', + 'adaptiveclass': 'None', + 'sex':'male', + 'next':'/rowers/list-workouts', + 'birthdate':datetime.datetime(year=1970,month=4,day=2) + } + + form = RegistrationFormSex(form_data) + self.assertFalse(form.is_valid()) + + # still post it, should redirect to the registration page + response = self.c.post('/rowers/register/', form_data, follow=True) + self.assertEqual(response.status_code,200) + self.assertRedirects(response, + expected_url='/rowers/register/', + status_code=302,target_status_code=200) + + @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) + def test_newuser_disposable(self,mock_workout_summaries): + form_data = { + 'first_name':'Jan', + 'last_name':'Roeiert', + 'email':'jan@powerscrews.com', + 'username':'janderoeiert', + 'password1':'Aapindewei2', + 'password2':'Aapindewei2', + 'url': '', + 'tos':True, + 'weightcategory':'hwt', + 'adaptiveclass': 'None', + 'sex':'male', + 'next':'/rowers/list-workouts', + 'birthdate':datetime.datetime(year=1970,month=4,day=2) + } + + form = RegistrationFormSex(form_data) + self.assertFalse(form.is_valid()) + + diff --git a/rowers/tests/atest_payments.py b/rowers/tests/atest_payments.py new file mode 100644 index 00000000..9423217c --- /dev/null +++ b/rowers/tests/atest_payments.py @@ -0,0 +1,795 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from .statements import * + +nu = datetime.datetime.now() + +from django_countries import countries + +from rowers.braintreestuff import mocktest + +import urllib + +class PaymentTest(TestCase): + def setUp(self): + + # settings.DEBUG = True + + p1 = PaidPlan( + shortname='free', + name='Basic', + external_id='a', + price=0, + clubsize=0, + paymentprocessor='braintree', + paymenttype='single', + ) + + p1.save() + + p2 = PaidPlan( + shortname='pro_recurring', + name='Pro (recurring)', + external_id='b', + price=15, + clubsize=0, + paymentprocessor='braintree', + paymenttype='single', + ) + + p2.save() + + p3 = PaidPlan( + shortname='pro_single', + name='Pro (single)', + external_id='c', + price=20, + clubsize=0, + paymentprocessor='braintree', + paymenttype='single', + ) + + p3.save() + + self.c = Client() + self.password = faker.word() + + s = b"""filename: britishrowing.json +name: British Rowing Training Plan Beginner Week 1 +trainingDays: + - order: 1 + workouts: + - workoutName: Week 1 Session 1 + steps: + - stepId: 0 + wkt_step_name: Warmup + durationType: Time + durationValue: 300000 + intensity: Warmup + description: "" + - stepId: 1 + wkt_step_name: Intervals + durationType: Time + durationValue: 60000 + intensity: Active + description: "" + - stepId: 2 + wkt_step_name: Interval Rest + durationType: Time + durationValue: 60000 + intensity: Rest + description: "" + - stepId: 3 + wkt_step_name: Rep + durationType: RepeatUntilStepsCmplt + durationValue: 1 + targetValue: 5 + - stepId: 4 + wkt_step_name: Cooldown + durationType: Time + durationValue: 300000 + intensity: Cooldown + description: "" + sport: "" + description: "" + - order: 4 + workouts: + - workoutName: Week 1 Session 2 + steps: + - stepId: 0 + wkt_step_name: Warmup + durationType: Time + durationValue: 300000 + intensity: Warmup + description: "" + - stepId: 1 + wkt_step_name: Interval + durationType: Time + durationValue: 300000 + intensity: Active + description: "" + - stepId: 2 + wkt_step_name: Interval Rest + durationType: Time + durationValue: 180000 + intensity: Rest + description: "" + - stepId: 3 + wkt_step_name: Rep + durationType: RepeatUntilStepsCmplt + durationValue: 1 + targetValue: 5 + - stepId: 4 + wkt_step_name: Cooldown + durationType: Time + durationValue: 300000 + intensity: Cooldown + description: "" + sport: "" + description: "" +duration: 7 +description: "" +""" + + self.file_data = {'yaml': SimpleUploadedFile('britishrowing.yml', s)} + + with open('media/temp.yml','wb') as f: + f.write(s) + + self.instantplan = InstantPlan( + uuid = "79b0dacf-9b49-4f33-9acf-e2e6734e22dc", + url = "https://thepeteplan.wordpress.com/beginner-training/", + name = faker.word(), + goal = faker.word(), + duration = 42, + description = faker.word(), + target = faker.word(), + hoursperweek = 3, + sessionsperweek = 3, + price = 0, + yaml = 'temp.yml', + ) + + self.instantplan.save() + + # def tearDown(self): + # settings.DEBUG = False + + @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_braintree_webhook(self,mocked_gateway,mocked_myqueue): + url = reverse('braintree_webhook_view') + response = self.c.get(url) + + self.assertEqual(response.status_code, 200) + + form_data = { + 'bt_signature': 'aap', + 'bt_payload': 'noot,' + } + + response = self.c.post(url,form_data) + self.assertEqual(response.status_code, 200) + + @patch('rowers.views.braintreestuff.create_customer',side_effect=mock_create_customer) + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_billing_view(self,mocked_create_customer,mocked_gateway,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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() + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/billing/' + + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + plans = PaidPlan.objects.filter(price__gt=0).order_by('price') + plan = plans[0] + + country=faker.country() + countrycode = 'NL' + for code, name in list(countries): + if name.lower() == country.lower(): + countrycode = code + + form_data = { + 'street_address':faker.street_address(), + 'city':faker.city(), + 'postal_code':faker.postalcode(), + 'country':countrycode, + 'plan':plan.id, + } + + form = RowerBillingAddressForm(form_data) + self.assertTrue(form.is_valid()) + + form = PlanSelectForm(form_data,paymentprocessor='braintree') + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data, follow=True) + self.assertEqual(response.status_code, 200) + + expected_url = '/rowers/checkout/'+str(plan.id)+'/' + + self.assertRedirects(response, + expected_url=expected_url, + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_upgrade_view(self,mocked_gateway,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + r.save() + r.country = 'NL' + r.customer_id = 34 + r.subscription_id = 34 + r.save() + u.set_password(self.password) + u.save() + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/upgrade/' + + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + plans = PaidPlan.objects.filter(price__gt=0).order_by('price') + plan = plans[0] + + country=faker.country() + countrycode = 'NL' + for code, name in list(countries): + if name.lower() == country.lower(): + countrycode = code + + form_data = { + 'street_address':faker.street_address(), + 'city':faker.city(), + 'postal_code':faker.postalcode(), + 'country':countrycode, + 'plan':plan.id, + } + + form = RowerBillingAddressForm(form_data) + self.assertTrue(form.is_valid()) + + form = PlanSelectForm(form_data,paymentprocessor='braintree') + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data, follow=True) + self.assertEqual(response.status_code, 200) + + expected_url = '/rowers/upgradecheckout/'+str(plan.id)+'/' + + self.assertRedirects(response, + expected_url=expected_url, + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_down_view(self,mocked_gateway,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + r.save() + r.country = 'NL' + r.customer_id = 34 + r.subscription_id = 34 + r.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + r.paidplan = plan + r.save() + u.set_password(self.password) + u.save() + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/downgrade/' + + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + country=faker.country() + countrycode = 'NL' + for code, name in list(countries): + if name.lower() == country.lower(): + countrycode = code + + form_data = { + 'street_address':faker.street_address(), + 'city':faker.city(), + 'postal_code':faker.postalcode(), + 'country':countrycode, + 'plan':plans[0].id, + } + + form = RowerBillingAddressForm(form_data) + self.assertTrue(form.is_valid()) + + form = PlanSelectForm(form_data,paymentprocessor='braintree') + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data, follow=True) + self.assertEqual(response.status_code, 200) + + expected_url = '/rowers/downgradecheckout/'+str(plans[0].id)+'/' + + self.assertRedirects(response, + expected_url=expected_url, + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_planstop_view(self,mocked_gateway,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + r.save() + r.country = 'NL' + r.customer_id = 34 + r.subscription_id = 34 + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + r.paidplan = plan + r.save() + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/me/cancelsubscriptions/' + + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + + @patch('rowers.views.braintreestuff.gateway', side_effect=MockBraintreeGateway) + @patch('rowers.idoklad.create_invoice',side_effect=mocked_invoiceid) + @patch('rowers.utils.myqueue') + def test_purchase_trainingplan_view(self, mocked_gateway,mocked_invoiceid, mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + r.save() + r.country = 'NL' + r.customer_id = 34 + r.subscription_id = 34 + r.save() + u.set_password(self.password) + u.save() + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = reverse('buy_trainingplan_view',kwargs={'id':self.instantplan.id}) + + response = self.c.get(url) + self.assertEqual(response.status_code, 200) + + enddate = datetime.datetime.now()+datetime.timedelta(days=30) + startdate = datetime.datetime.now() + + form_data = { + 'enddate':enddate.strftime('%Y-%m-%d'), + 'startdate':startdate.strftime('%Y-%m-%d'), + 'notes': 'no notes', + 'datechoice': 'enddate', + 'name': 'no name', + } + + response = self.c.post(url,form_data) + + pars = { + 'name': 'no name', + 'enddate':enddate.strftime('%Y-%m-%d'), + 'notes': 'no notes', + 'status': True, + 'rower':r.id, + } + params = urllib.parse.urlencode(pars) + expected_url = reverse('confirm_trainingplan_purchase_view',kwargs={'id':self.instantplan.id}) + expected_url = expected_url + "?%s" % params + + self.assertRedirects(response,expected_url=expected_url,status_code=302, target_status_code=200) + + url = expected_url + + response = self.c.get(url, follow=True) + self.assertEqual(response.status_code, 200) + + url = reverse('purchase_checkouts_view') + + form_data = { + 'amount': '25.00', + 'plan': self.instantplan.id, + 'payment_method_nonce': 'aap', + 'tac': 'tac', + 'paymenttype': 'CreditCard', + 'notes': 'no notes', + 'enddate':enddate.strftime('%Y-%m-%d'), + 'status': True, + } + + form = TrainingPlanBillingForm(form_data) + if not form.is_valid(): + print(form.errors) + self.assertTrue(form.is_valid()) + + response = self.c.post(url,form_data, follow=True) + + self.assertEqual(response.status_code, 200) + + expected_url = reverse('plannedsessions_view') + startdate = enddate-datetime.timedelta(days=self.instantplan.duration) + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') + expected_url = expected_url+'?when='+timeperiod + + self.assertRedirects(response, + expected_url=expected_url, + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) + @patch('rowers.braintreestuff.myqueue') + def test_planstobasic_view(self,mocked_gateway,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + r.save() + r.country = 'NL' + r.customer_id = 34 + r.subscription_id = 34 + r.save() + u.set_password(self.password) + u.save() + + plans = PaidPlan.objects.all().order_by('price') + plan = plans[1] + + r.paidplan = plan + r.save() + + login = self.c.login(username=u.username, password=self.password) + self.assertTrue(login) + + url = '/rowers/me/cancelsubscription/34/' + + response = self.c.get(url, follow=True) + self.assertEqual(response.status_code, 200) + self.assertRedirects(response, + expected_url='/rowers/me/cancelsubscriptions/', + status_code=302, target_status_code=200) + + @patch('rowers.tests.test_payments.mocktest', side_effect=mock_mocktest) + @patch('rowers.braintreestuff.myqueue') + def test_patch(self, mock_mocktest,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + paymentprocessor='braintree', + street_address=faker.street_address(), + city=faker.city(), + postal_code=faker.postalcode(), + country=faker.country(), + ) + + u.set_password(self.password) + u.save() + r.save() + result = mocktest(r) + self.assertEqual(result,'121') + + @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) + @patch('rowers.braintreestuff.myqueue') + def test_checkouts_view(self,mock_subscription,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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', + 'paymenttype': 'CreditCard' + } + + form = BillingForm(form_data) + self.assertTrue(form.is_valid()) + + 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/paymentcompleted/?amount=20.00', + status_code=302, target_status_code=200) + + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + @patch('rowers.braintreestuff.myqueue') + def test_upgrade_checkouts_view(self,mock_subscription,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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', + 'paymenttype': 'CreditCard', + '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/paymentcompleted/?amount=20.00', + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + @patch('rowers.braintreestuff.myqueue') + def test_downgrade_checkouts_view(self,mock_subscription,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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') + + form_data = { + 'amount': '15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + 'paymenttype': 'CreditCard', + '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/downgradecompleted/', + status_code=302, target_status_code=200) + + @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) + @patch('rowers.braintreestuff.myqueue') + def test_checkouts_view(self,mock_subscription,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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', + 'paymenttype': 'CreditCard', + 'tac': True, + } + + form = BillingForm(form_data) + if not form.is_valid(): + print(form.errors) + self.assertTrue(form.is_valid()) + + 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) + + expected_url = '/rowers/paymentcompleted/?amount=20.00' + + self.assertRedirects(response, + expected_url=expected_url, + status_code=302, target_status_code=200) + + + @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) + @patch('rowers.braintreestuff.myqueue') + def test_upgrade_checkouts_view(self,mock_subscription,mocked_myqueue): + u = UserFactory() + r = Rower.objects.create(user=u, + birthdate=faker.profile()['birthdate'], + gdproptin=True, ftpset=True, surveydone=True, + gdproptindate=timezone.now(), + rowerplan='pro', + 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') + + form_data = { + 'amount': '15.00', + 'plan': plans[1].id, + 'payment_method_nonce': 'aap', + 'paymenttype': 'CreditCard', + 'tac': True, } + + 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/paymentcompleted/?amount=20.00', + status_code=302, target_status_code=200) From f91b41da36aa4efb40398aeea6e93bf395327a9f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 7 Dec 2025 14:09:03 +0100 Subject: [PATCH 3/5] getting tests to pass --- rowers/tests/mocks.py | 11 + rowers/tests/test_braintree.py | 3 +- rowers/tests/test_newusers.py | 181 ------ rowers/tests/test_payments.py | 795 -------------------------- rowers/tests/test_permissions.py | 2 - rowers/tests/test_urls.py | 2 - rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes rowers/tests/viewnames.csv | 16 - 8 files changed, 13 insertions(+), 997 deletions(-) delete mode 100644 rowers/tests/test_newusers.py delete mode 100644 rowers/tests/test_payments.py diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 63e4440b..398968ac 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -557,6 +557,7 @@ class gatewayresult(): # pragma: no cover self.transaction = vtransaction() self.payment_method = vpayment_method() self.subscription = vsubscription() + self.paid_through_date = datetime.datetime.now()+datetime.timedelta(days=365) self.customer = kwargs.pop('customer',customer()) def __unicode__(): @@ -615,6 +616,7 @@ class transaction(): # pragma: no cover 'id': 12 } self.created_at = datetime.datetime.now() + self.paid_through_date = datetime.datetime.now()+datetime.timedelta(days=365) self.currency_iso_code = 'EUR' class vtransaction(): # pragma: no cover @@ -627,6 +629,7 @@ class vtransaction(): # pragma: no cover 'id': 12 } self.created_at = datetime.datetime.now() + self.paid_through_date = datetime.datetime.now()+datetime.timedelta(days=365) self.currency_iso_code = 'EUR' class vsubscription(): # pragma: no cover @@ -636,9 +639,13 @@ class vsubscription(): # pragma: no cover def cancel(*args, **kwargs): return gatewayresult(is_success=True) + def find(*args, **kwargs): + return subscription() + def __init__(self, *args, **kwargs): self.id = '121' self.billing_period_end_date = (datetime.datetime.now()+datetime.timedelta(days=365)).date() + self.paid_through_date = (datetime.datetime.now()+datetime.timedelta(days=365)).date() self.status = 'Active' self.plan_id = 12 self.price = 15 @@ -654,9 +661,13 @@ class subscription(): # pragma: no cover def cancel(*args, **kwargs): return gatewayresult(is_success=True) + def find(*args, **kwargs): + return subscription() + def __init__(self, *args, **kwargs): self.id = '121' self.billing_period_end_date = (datetime.datetime.now()+datetime.timedelta(days=365)).date() + self.paid_through_date = (datetime.datetime.now()+datetime.timedelta(days=365)).date() self.transactions = [vtransaction()] self.status = 'Active' self.plan_id = 12 diff --git a/rowers/tests/test_braintree.py b/rowers/tests/test_braintree.py index 88654e4b..1a6a41bd 100644 --- a/rowers/tests/test_braintree.py +++ b/rowers/tests/test_braintree.py @@ -79,7 +79,8 @@ class BraintreeUnits(TestCase): @patch('rowers.idoklad.requests.post',side_effect=mocked_requests) @patch('rowers.braintreestuff.gateway', side_effect=MockBraintreeGateway) @patch('rowers.braintreestuff.myqueue') - def test_process_webhook(self,mock_token, mock_get,mockpost,mocked_gateway,mocked_myqueue): + @patch('rowers.braintreestuff.cancel_subscription', side_effect=mock_cancel_subscription) + def test_process_webhook(self,mock_token, mock_get,mockpost,mocked_gateway,mocked_myqueue,mock_cancel_subscription): n = notification() res = process_webhook(n) self.assertEqual(res,1) diff --git a/rowers/tests/test_newusers.py b/rowers/tests/test_newusers.py deleted file mode 100644 index 138643cb..00000000 --- a/rowers/tests/test_newusers.py +++ /dev/null @@ -1,181 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - -#from __future__ import print_function -from .statements import * - -nu = datetime.datetime.now() - -#@pytest.mark.django_db -@override_settings(TESTING=True) -class NewUserRegistrationTest(TestCase): - def setUp(self): - self.c = Client() - redis_connection.publish('tasks','KILL') - - def tearDown(self): - try: - os.remove('rowsandall_workouts_2018-01-01_2019-01-01.csv') - except: - pass - - @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) - def test_newuser(self,mock_workout_summaries): - form_data = { - 'first_name':'Jan', - 'last_name':'Roeiert', - 'email':'jan@loop.nl', - 'username':'janderoeiert', - 'password1':'Aapindewei2', - 'password2':'Aapindewei2', - 'url': '', - 'tos':True, - 'weightcategory':'hwt', - 'adaptiveclass': 'None', - 'sex':'male', - 'next':'/rowers/list-workouts', - 'birthdate':datetime.datetime(year=1970,month=4,day=2) - } - - form = RegistrationFormSex(form_data) - self.assertTrue(form.is_valid()) - - response = self.c.post('/rowers/register/', form_data, follow=True) - self.assertEqual(response.status_code,200) - - # set opt-in - user = User.objects.get(username='janderoeiert') - user.rower.gdpr_optin = True - user.rower.ftpset = True - user.set_password('Aapindewei2') - user.is_active = True - user.save() - user.rower.save() - - login = self.c.login(username=user.username,password='Aapindewei2') - self.assertTrue(login) - - - url = '/rowers/list-workouts/' - - response = self.c.get(url) - - expected = '/rowers/me/gdpr-optin/?next=/rowers/list-workouts/' - - self.assertRedirects(response, - expected_url=expected, - status_code=302,target_status_code=200) - - url = '/rowers/me/gdpr-optin-confirm/?next=/rowers/list-workouts/' - - response = self.c.get(url) - - expected = '/rowers/list-workouts/' - self.assertRedirects(response, - expected_url=expected, - status_code=302,target_status_code=200) - - - url = '/rowers/exportallworkouts/' - - response = self.c.get(url,follow=True) - - - self.assertTrue(response.status_code,200) - - - form_data = { - 'startdate':'2018-01-01', - 'enddate':'2019-01-01' - } - - response = self.c.post(url,form_data) - - self.assertTrue(response.status_code,200) - - - - url = '/rowers/me/delete/' - - form_data = { - 'delete_user':True, - } - - response = self.c.post(url,form_data,follow=True) - self.assertRedirects(response, - expected_url='/login/', - status_code=302,target_status_code=200) - - @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) - def test_newuser_false(self,mock_workout_summaries): - form_data = { - 'first_name':'Jan', - 'last_name':'Roeiert', - 'email':'jan@loop.nl', - 'username':'janderoeiert', - 'password1':'aapindewei2', - 'password2':'aapindewei2', - 'tos':True, - 'url': '', - 'weightcategory':'hwt', - 'adaptiveclass': 'None', - 'sex':'male', - 'next':'/rowers/list-workouts', - 'birthdate':datetime.datetime(year=1970,month=4,day=2) - } - - form = RegistrationFormSex(form_data) - self.assertFalse(form.is_valid()) - - @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) - def test_newuser_honeypot(self,mock_workout_summaries): - form_data = { - 'first_name':'Jan', - 'last_name':'Roeiert', - 'email':'jan@loop.nl', - 'username':'janderoeiert', - 'password1':'Aapindewei2', - 'password2':'Aapindewei2', - 'url': 'http://example.com', - 'tos':True, - 'weightcategory':'hwt', - 'adaptiveclass': 'None', - 'sex':'male', - 'next':'/rowers/list-workouts', - 'birthdate':datetime.datetime(year=1970,month=4,day=2) - } - - form = RegistrationFormSex(form_data) - self.assertFalse(form.is_valid()) - - # still post it, should redirect to the registration page - response = self.c.post('/rowers/register/', form_data, follow=True) - self.assertEqual(response.status_code,200) - self.assertRedirects(response, - expected_url='/rowers/register/', - status_code=302,target_status_code=200) - - @patch('rowers.dataprep.workout_summary_to_df',side_effect=mock_workout_summaries) - def test_newuser_disposable(self,mock_workout_summaries): - form_data = { - 'first_name':'Jan', - 'last_name':'Roeiert', - 'email':'jan@powerscrews.com', - 'username':'janderoeiert', - 'password1':'Aapindewei2', - 'password2':'Aapindewei2', - 'url': '', - 'tos':True, - 'weightcategory':'hwt', - 'adaptiveclass': 'None', - 'sex':'male', - 'next':'/rowers/list-workouts', - 'birthdate':datetime.datetime(year=1970,month=4,day=2) - } - - form = RegistrationFormSex(form_data) - self.assertFalse(form.is_valid()) - - diff --git a/rowers/tests/test_payments.py b/rowers/tests/test_payments.py deleted file mode 100644 index 9423217c..00000000 --- a/rowers/tests/test_payments.py +++ /dev/null @@ -1,795 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - -from .statements import * - -nu = datetime.datetime.now() - -from django_countries import countries - -from rowers.braintreestuff import mocktest - -import urllib - -class PaymentTest(TestCase): - def setUp(self): - - # settings.DEBUG = True - - p1 = PaidPlan( - shortname='free', - name='Basic', - external_id='a', - price=0, - clubsize=0, - paymentprocessor='braintree', - paymenttype='single', - ) - - p1.save() - - p2 = PaidPlan( - shortname='pro_recurring', - name='Pro (recurring)', - external_id='b', - price=15, - clubsize=0, - paymentprocessor='braintree', - paymenttype='single', - ) - - p2.save() - - p3 = PaidPlan( - shortname='pro_single', - name='Pro (single)', - external_id='c', - price=20, - clubsize=0, - paymentprocessor='braintree', - paymenttype='single', - ) - - p3.save() - - self.c = Client() - self.password = faker.word() - - s = b"""filename: britishrowing.json -name: British Rowing Training Plan Beginner Week 1 -trainingDays: - - order: 1 - workouts: - - workoutName: Week 1 Session 1 - steps: - - stepId: 0 - wkt_step_name: Warmup - durationType: Time - durationValue: 300000 - intensity: Warmup - description: "" - - stepId: 1 - wkt_step_name: Intervals - durationType: Time - durationValue: 60000 - intensity: Active - description: "" - - stepId: 2 - wkt_step_name: Interval Rest - durationType: Time - durationValue: 60000 - intensity: Rest - description: "" - - stepId: 3 - wkt_step_name: Rep - durationType: RepeatUntilStepsCmplt - durationValue: 1 - targetValue: 5 - - stepId: 4 - wkt_step_name: Cooldown - durationType: Time - durationValue: 300000 - intensity: Cooldown - description: "" - sport: "" - description: "" - - order: 4 - workouts: - - workoutName: Week 1 Session 2 - steps: - - stepId: 0 - wkt_step_name: Warmup - durationType: Time - durationValue: 300000 - intensity: Warmup - description: "" - - stepId: 1 - wkt_step_name: Interval - durationType: Time - durationValue: 300000 - intensity: Active - description: "" - - stepId: 2 - wkt_step_name: Interval Rest - durationType: Time - durationValue: 180000 - intensity: Rest - description: "" - - stepId: 3 - wkt_step_name: Rep - durationType: RepeatUntilStepsCmplt - durationValue: 1 - targetValue: 5 - - stepId: 4 - wkt_step_name: Cooldown - durationType: Time - durationValue: 300000 - intensity: Cooldown - description: "" - sport: "" - description: "" -duration: 7 -description: "" -""" - - self.file_data = {'yaml': SimpleUploadedFile('britishrowing.yml', s)} - - with open('media/temp.yml','wb') as f: - f.write(s) - - self.instantplan = InstantPlan( - uuid = "79b0dacf-9b49-4f33-9acf-e2e6734e22dc", - url = "https://thepeteplan.wordpress.com/beginner-training/", - name = faker.word(), - goal = faker.word(), - duration = 42, - description = faker.word(), - target = faker.word(), - hoursperweek = 3, - sessionsperweek = 3, - price = 0, - yaml = 'temp.yml', - ) - - self.instantplan.save() - - # def tearDown(self): - # settings.DEBUG = False - - @patch('rowers.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_braintree_webhook(self,mocked_gateway,mocked_myqueue): - url = reverse('braintree_webhook_view') - response = self.c.get(url) - - self.assertEqual(response.status_code, 200) - - form_data = { - 'bt_signature': 'aap', - 'bt_payload': 'noot,' - } - - response = self.c.post(url,form_data) - self.assertEqual(response.status_code, 200) - - @patch('rowers.views.braintreestuff.create_customer',side_effect=mock_create_customer) - @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_billing_view(self,mocked_create_customer,mocked_gateway,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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() - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = '/rowers/billing/' - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - plans = PaidPlan.objects.filter(price__gt=0).order_by('price') - plan = plans[0] - - country=faker.country() - countrycode = 'NL' - for code, name in list(countries): - if name.lower() == country.lower(): - countrycode = code - - form_data = { - 'street_address':faker.street_address(), - 'city':faker.city(), - 'postal_code':faker.postalcode(), - 'country':countrycode, - 'plan':plan.id, - } - - form = RowerBillingAddressForm(form_data) - self.assertTrue(form.is_valid()) - - form = PlanSelectForm(form_data,paymentprocessor='braintree') - self.assertTrue(form.is_valid()) - - response = self.c.post(url,form_data, follow=True) - self.assertEqual(response.status_code, 200) - - expected_url = '/rowers/checkout/'+str(plan.id)+'/' - - self.assertRedirects(response, - expected_url=expected_url, - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_upgrade_view(self,mocked_gateway,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - r.save() - r.country = 'NL' - r.customer_id = 34 - r.subscription_id = 34 - r.save() - u.set_password(self.password) - u.save() - - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = '/rowers/upgrade/' - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - plans = PaidPlan.objects.filter(price__gt=0).order_by('price') - plan = plans[0] - - country=faker.country() - countrycode = 'NL' - for code, name in list(countries): - if name.lower() == country.lower(): - countrycode = code - - form_data = { - 'street_address':faker.street_address(), - 'city':faker.city(), - 'postal_code':faker.postalcode(), - 'country':countrycode, - 'plan':plan.id, - } - - form = RowerBillingAddressForm(form_data) - self.assertTrue(form.is_valid()) - - form = PlanSelectForm(form_data,paymentprocessor='braintree') - self.assertTrue(form.is_valid()) - - response = self.c.post(url,form_data, follow=True) - self.assertEqual(response.status_code, 200) - - expected_url = '/rowers/upgradecheckout/'+str(plan.id)+'/' - - self.assertRedirects(response, - expected_url=expected_url, - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_down_view(self,mocked_gateway,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - r.save() - r.country = 'NL' - r.customer_id = 34 - r.subscription_id = 34 - r.save() - - plans = PaidPlan.objects.all().order_by('price') - plan = plans[1] - - r.paidplan = plan - r.save() - u.set_password(self.password) - u.save() - - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = '/rowers/downgrade/' - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - country=faker.country() - countrycode = 'NL' - for code, name in list(countries): - if name.lower() == country.lower(): - countrycode = code - - form_data = { - 'street_address':faker.street_address(), - 'city':faker.city(), - 'postal_code':faker.postalcode(), - 'country':countrycode, - 'plan':plans[0].id, - } - - form = RowerBillingAddressForm(form_data) - self.assertTrue(form.is_valid()) - - form = PlanSelectForm(form_data,paymentprocessor='braintree') - self.assertTrue(form.is_valid()) - - response = self.c.post(url,form_data, follow=True) - self.assertEqual(response.status_code, 200) - - expected_url = '/rowers/downgradecheckout/'+str(plans[0].id)+'/' - - self.assertRedirects(response, - expected_url=expected_url, - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_planstop_view(self,mocked_gateway,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - r.save() - r.country = 'NL' - r.customer_id = 34 - r.subscription_id = 34 - r.save() - u.set_password(self.password) - u.save() - - plans = PaidPlan.objects.all().order_by('price') - plan = plans[1] - - r.paidplan = plan - r.save() - - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = '/rowers/me/cancelsubscriptions/' - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - - @patch('rowers.views.braintreestuff.gateway', side_effect=MockBraintreeGateway) - @patch('rowers.idoklad.create_invoice',side_effect=mocked_invoiceid) - @patch('rowers.utils.myqueue') - def test_purchase_trainingplan_view(self, mocked_gateway,mocked_invoiceid, mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - r.save() - r.country = 'NL' - r.customer_id = 34 - r.subscription_id = 34 - r.save() - u.set_password(self.password) - u.save() - - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = reverse('buy_trainingplan_view',kwargs={'id':self.instantplan.id}) - - response = self.c.get(url) - self.assertEqual(response.status_code, 200) - - enddate = datetime.datetime.now()+datetime.timedelta(days=30) - startdate = datetime.datetime.now() - - form_data = { - 'enddate':enddate.strftime('%Y-%m-%d'), - 'startdate':startdate.strftime('%Y-%m-%d'), - 'notes': 'no notes', - 'datechoice': 'enddate', - 'name': 'no name', - } - - response = self.c.post(url,form_data) - - pars = { - 'name': 'no name', - 'enddate':enddate.strftime('%Y-%m-%d'), - 'notes': 'no notes', - 'status': True, - 'rower':r.id, - } - params = urllib.parse.urlencode(pars) - expected_url = reverse('confirm_trainingplan_purchase_view',kwargs={'id':self.instantplan.id}) - expected_url = expected_url + "?%s" % params - - self.assertRedirects(response,expected_url=expected_url,status_code=302, target_status_code=200) - - url = expected_url - - response = self.c.get(url, follow=True) - self.assertEqual(response.status_code, 200) - - url = reverse('purchase_checkouts_view') - - form_data = { - 'amount': '25.00', - 'plan': self.instantplan.id, - 'payment_method_nonce': 'aap', - 'tac': 'tac', - 'paymenttype': 'CreditCard', - 'notes': 'no notes', - 'enddate':enddate.strftime('%Y-%m-%d'), - 'status': True, - } - - form = TrainingPlanBillingForm(form_data) - if not form.is_valid(): - print(form.errors) - self.assertTrue(form.is_valid()) - - response = self.c.post(url,form_data, follow=True) - - self.assertEqual(response.status_code, 200) - - expected_url = reverse('plannedsessions_view') - startdate = enddate-datetime.timedelta(days=self.instantplan.duration) - timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') - expected_url = expected_url+'?when='+timeperiod - - self.assertRedirects(response, - expected_url=expected_url, - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.gateway',side_effect=MockBraintreeGateway) - @patch('rowers.braintreestuff.myqueue') - def test_planstobasic_view(self,mocked_gateway,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - r.save() - r.country = 'NL' - r.customer_id = 34 - r.subscription_id = 34 - r.save() - u.set_password(self.password) - u.save() - - plans = PaidPlan.objects.all().order_by('price') - plan = plans[1] - - r.paidplan = plan - r.save() - - login = self.c.login(username=u.username, password=self.password) - self.assertTrue(login) - - url = '/rowers/me/cancelsubscription/34/' - - response = self.c.get(url, follow=True) - self.assertEqual(response.status_code, 200) - self.assertRedirects(response, - expected_url='/rowers/me/cancelsubscriptions/', - status_code=302, target_status_code=200) - - @patch('rowers.tests.test_payments.mocktest', side_effect=mock_mocktest) - @patch('rowers.braintreestuff.myqueue') - def test_patch(self, mock_mocktest,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - paymentprocessor='braintree', - street_address=faker.street_address(), - city=faker.city(), - postal_code=faker.postalcode(), - country=faker.country(), - ) - - u.set_password(self.password) - u.save() - r.save() - result = mocktest(r) - self.assertEqual(result,'121') - - @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) - @patch('rowers.braintreestuff.myqueue') - def test_checkouts_view(self,mock_subscription,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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', - 'paymenttype': 'CreditCard' - } - - form = BillingForm(form_data) - self.assertTrue(form.is_valid()) - - 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/paymentcompleted/?amount=20.00', - status_code=302, target_status_code=200) - - - @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) - @patch('rowers.braintreestuff.myqueue') - def test_upgrade_checkouts_view(self,mock_subscription,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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', - 'paymenttype': 'CreditCard', - '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/paymentcompleted/?amount=20.00', - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) - @patch('rowers.braintreestuff.myqueue') - def test_downgrade_checkouts_view(self,mock_subscription,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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') - - form_data = { - 'amount': '15.00', - 'plan': plans[1].id, - 'payment_method_nonce': 'aap', - 'paymenttype': 'CreditCard', - '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/downgradecompleted/', - status_code=302, target_status_code=200) - - @patch('rowers.views.braintreestuff.create_subscription', side_effect=mock_create_subscription) - @patch('rowers.braintreestuff.myqueue') - def test_checkouts_view(self,mock_subscription,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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', - 'paymenttype': 'CreditCard', - 'tac': True, - } - - form = BillingForm(form_data) - if not form.is_valid(): - print(form.errors) - self.assertTrue(form.is_valid()) - - 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) - - expected_url = '/rowers/paymentcompleted/?amount=20.00' - - self.assertRedirects(response, - expected_url=expected_url, - status_code=302, target_status_code=200) - - - @patch('rowers.views.braintreestuff.update_subscription', side_effect=mock_update_subscription) - @patch('rowers.braintreestuff.myqueue') - def test_upgrade_checkouts_view(self,mock_subscription,mocked_myqueue): - u = UserFactory() - r = Rower.objects.create(user=u, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True, surveydone=True, - gdproptindate=timezone.now(), - rowerplan='pro', - 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') - - form_data = { - 'amount': '15.00', - 'plan': plans[1].id, - 'payment_method_nonce': 'aap', - 'paymenttype': 'CreditCard', - 'tac': True, } - - 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/paymentcompleted/?amount=20.00', - status_code=302, target_status_code=200) diff --git a/rowers/tests/test_permissions.py b/rowers/tests/test_permissions.py index d802cced..8fd2271b 100644 --- a/rowers/tests/test_permissions.py +++ b/rowers/tests/test_permissions.py @@ -880,8 +880,6 @@ class PermissionsViewTests(TestCase): self.assertTrue(form.is_valid()) - expected_url = reverse('paidplans_view') - response = self.c.post(url,form_data,follow=True) # check that it does not redirect and status code is 200 diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index f08b1e9d..a460ab48 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -119,8 +119,6 @@ class URLTests(TestCase): '/rowers/me/workflowdefault/', '/rowers/partners/', '/rowers/physics/', - '/rowers/register/', - '/rowers/register/thankyou/', '/rowers/sessions/', '/rowers/sessions/coach/', '/rowers/sessions/create/', diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 35a8b0a4dbfa00437dce016b9e775bfe90f17157..07216da9544b8e21a7b18e836aeb2f00858dc9bf 100644 GIT binary patch delta 16 XcmbO#KUJPxzMF%CuiA7YdmldlB-#W$ delta 16 XcmbO#KUJPxzMF&N&oY^f?0x(IE8zt_ diff --git a/rowers/tests/viewnames.csv b/rowers/tests/viewnames.csv index 8218f6f2..4db4bdab 100644 --- a/rowers/tests/viewnames.csv +++ b/rowers/tests/viewnames.csv @@ -137,23 +137,7 @@ 178,225,sendmail,feedback form,TRUE,200,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 180,232,laboratory_view,lab,TRUE,302,basic,200,302,basic,403,403,coach,200,403,FALSE,TRUE,FALSE,TRUE,TRUE, 181,233,errormessage_view,not used,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -182,237,payment_confirm_view,confirm payment,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -183,238,upgrade_confirm_view,confirm upgrade,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -184,240,downgrade_confirm_view,confirm downgrade,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -185,241,billing_view,confirm billing,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -186,242,upgrade_view,confirm upgrade,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -187,243,downgrade_view,confirm downgrade,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -188,244,payment_completed_view,payment completed,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -189,245,downgrade_completed_view,downgrade completed,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -190,246,paidplans_view,paid plans,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, -191,247,plan_stop_view,stop plan,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 192,248,plan_tobasic_view,reset to basic,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -193,249,checkouts_view,checkout,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -194,250,upgrade_checkouts_view,upgrade checkout,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -195,251,downgrade_checkouts_view,downgrade checkout,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -197,253,start_trial_view,payments,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -198,254,start_plantrial_view,paid plans,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -199,256,rower_register_view,register rower,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 201,259,workout_workflow_view,workout workflow vieq,TRUE,302,basic,200,200,basic,200,200,coach,200,200,FALSE,FALSE,TRUE,TRUE,TRUE, 202,260,workout_flexchart3_view,flex chart,TRUE,302,basic,200,403,basic,200,200,coach,200,200,FALSE,FALSE,TRUE,TRUE,TRUE, 203,264,rower_process_testcallback,test callback,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, From b1e279bba925a02eb018eb74cd4d8fa78a63dbb3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 8 Dec 2025 15:56:45 +0100 Subject: [PATCH 4/5] tested --- rowers/tests/test_urls.py | 1 - rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes 2 files changed, 1 deletion(-) diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index a460ab48..a7d5a292 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -77,7 +77,6 @@ class URLTests(TestCase): '/rowers/404/', '/rowers/500/', '/rowers/502/', - '/rowers/about/', '/rowers/workout/addmanual/', '/rowers/ajax_agegroup/45/hwt/male/1/', '/rowers/analysis/', diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 07216da9544b8e21a7b18e836aeb2f00858dc9bf..04942d0d069176de1ea40abc7170242e2966f747 100644 GIT binary patch delta 15 WcmbO#KUJPhzMF$%Z{tR`etrNYN(8(B delta 15 WcmbO#KUJPhzMF%CuX-a}KR*B=5(EbT From a346671161c24c456eda0542e9eadeba9e4e1189 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 8 Dec 2025 18:34:24 +0100 Subject: [PATCH 5/5] adding notification --- rowers/management/commands/processemail.py | 18 +++++++++--------- rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes templates/newbase.html | 6 ++++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index b10dd241..b0235bfb 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -93,15 +93,15 @@ class Command(BaseCommand): lines = traceback.format_exception(exc_type, exc_value, exc_traceback) dologging('processemail.log', ''.join('!! ' + line for line in lines)) - rowers = Rower.objects.filter(rp3_auto_import=True) - for r in rowers: # pragma: no cover - try: - rp3_integration = RP3Integration(r.user) - _ = rp3_integration.get_workouts() - except: # pragma: no cover - exc_type, exc_value, exc_traceback = sys.exc_info() - lines = traceback.format_exception(exc_type, exc_value, exc_traceback) - dologging('processemail.log', ''.join('!! ' + line for line in lines)) + #rowers = Rower.objects.filter(rp3_auto_import=True) + #for r in rowers: # pragma: no cover + # try: + # rp3_integration = RP3Integration(r.user) + # _ = rp3_integration.get_workouts() + # except: # pragma: no cover + # exc_type, exc_value, exc_traceback = sys.exc_info() + # lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + # dologging('processemail.log', ''.join('!! ' + line for line in lines)) rowers = Rower.objects.filter(nk_auto_import=True) for r in rowers: # pragma: no cover diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 04942d0d069176de1ea40abc7170242e2966f747..16fe22bc723a214f91548c6338669a31656c92e9 100644 GIT binary patch delta 16 XcmbO#KUJPxzMF%?nag}5dmldlBe4Vn delta 16 XcmbO#KUJPxzMF$%Z=>l(_C9_9DaQoz diff --git a/templates/newbase.html b/templates/newbase.html index 788ebb9b..f8818b2b 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -220,6 +220,12 @@

      {% endif %} +
    • +

      + Rowsandall functionality will be transferred to Intervals.icu during 2026. + For more details, read this announcement. +

      +
    • {% if user.rower.planexpires and user.rower|notfree and user.rower.paymenttype == 'single'%} {% if user.rower.planexpires|is_future_date %} {% if user.rower.planexpires|date_dif|ddays < 4 %}