diff --git a/rowers/.#urls.py b/rowers/.#urls.py deleted file mode 120000 index 5317f650..00000000 --- a/rowers/.#urls.py +++ /dev/null @@ -1 +0,0 @@ -sander@rowsandall-2.17364:1733469196 \ No newline at end of file diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 9ea9dfc0..b10dd241 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -86,9 +86,8 @@ class Command(BaseCommand): rowers = Rower.objects.filter(c2_auto_import=True) for r in rowers: # pragma: no cover try: - if user_is_not_basic(r.user) or user_is_coachee(r.user): - c2integration = C2Integration(r.user) - _ = c2integration.get_workouts() + c2integration = C2Integration(r.user) + _ = c2integration.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) @@ -97,9 +96,8 @@ class Command(BaseCommand): rowers = Rower.objects.filter(rp3_auto_import=True) for r in rowers: # pragma: no cover try: - if user_is_not_basic(r.user) or user_is_coachee(r.user): - rp3_integration = RP3Integration(r.user) - _ = rp3_integration.get_workouts() + 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) @@ -108,25 +106,14 @@ class Command(BaseCommand): rowers = Rower.objects.filter(nk_auto_import=True) for r in rowers: # pragma: no cover try: - if user_is_not_basic(r.user) or user_is_coachee(r.user): - dologging("nklog.log","NK Auto import set for rower {id}".format(id=r.user.id)) - nk_integration = NKIntegration(r.user) - _ = nk_integration.get_workouts() + dologging("nklog.log","NK Auto import set for rower {id}".format(id=r.user.id)) + nk_integration = NKIntegration(r.user) + _ = nk_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(intervals_auto_import=True) - #for r in rowers: - # try: - # if user_is_not_basic(r.user) or user_is_coachee(r.user): - # intervals_integration = IntervalsIntegration(r.user) - # _ = intervals_integration.get_workouts() - # except: - # 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)) self.stdout.write(self.style.SUCCESS( 'Successfully processed email attachments')) diff --git a/rowers/middleware.py b/rowers/middleware.py index 7c1a0164..2f038606 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -105,7 +105,7 @@ class RowerPlanMiddleWare(object): self.get_response = get_response def __call__(self, request): - if request.user.is_authenticated and request.user.rower.rowerplan not in ['basic', 'freecoach']: + if request.user.is_authenticated and request.user.rower.rowerplan != 'basic': if request.user.rower.paymenttype == 'single': if request.user.rower.planexpires < timezone.now().date(): # pragma: no cover messg = 'Your paid plan has expired. We have reset you to a free basic plan.' diff --git a/rowers/models.py b/rowers/models.py index 80c83d27..32f4a5a5 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1326,8 +1326,6 @@ class Rower(models.Model): for group in self.coachinggroups.all(): try: coach = Rower.objects.get(mycoachgroup=group) - if coach.rowerplan == 'freecoach': # pragma: no cover - self.coachinggroups.remove(group) except Rower.DoesNotExist: # pragma: no cover pass except ValueError: @@ -1350,7 +1348,7 @@ class Rower(models.Model): return coaches def can_coach(self): - if self.rowerplan not in ['coach', 'freecoach']: + if self.rowerplan != 'pro': return False rs = Rower.objects.filter(coachinggroups__in=[self.mycoachgroup]) diff --git a/rowers/permissions.py b/rowers/permissions.py index 634932b3..ac4d6095 100644 --- a/rowers/permissions.py +++ b/rowers/permissions.py @@ -35,7 +35,7 @@ class IsRowerOrNot(permissions.BasePermission): class IsPlanOrHigher(permissions.BasePermission): def has_object_permission(self, request, view, obj): # pragma: no cover r = Rower.objects.get(user=request.user) - return r not in ['basic', 'pro', 'freecoach'] + return r.rowerplan == 'pro' class IsCompetitorOrNot(permissions.BasePermission): diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 9e1a0ed9..77230db9 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -831,12 +831,12 @@ def add_team_session(t, ps): def add_rower_session(r, ps): teams = Team.objects.filter(manager=ps.manager) members = Rower.objects.filter(team__in=teams).distinct() - if r in members and r.rowerplan != 'freecoach': + if r in members: ps.rower.add(r) ps.save() return 1 - elif ps.manager.rower == r and r.rowerplan != 'freecoach': + elif ps.manager.rower == r: ps.rower.add(r) ps.save() diff --git a/rowers/rower_rules.py b/rowers/rower_rules.py index df24bfa1..c55b77df 100644 --- a/rowers/rower_rules.py +++ b/rowers/rower_rules.py @@ -8,7 +8,7 @@ from django.utils import timezone """ USER permissions -- There are 5 types of user: basic, pro, plan, coach, freecoach +- There are 2 types of user: basic, pro - These methods exist on user - user.rower - user.is_anonymous diff --git a/rowers/tasks.py b/rowers/tasks.py index 866d25bc..1db9fc03 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -418,10 +418,10 @@ def create_sessions_from_json_async(plansteps, rower, startdate, manager, planby teams = Team.objects.filter(manager=ps.manager) members = Rower.objects.filter(team__in=teams).distinct() - if rower in members and rower.rowerplan != 'freecoach': + if rower in members: ps.rower.add(rower) ps.save() - elif ps.manager.rower == rower and rower.rowerplan != 'freecoach': + elif ps.manager.rower == rower: ps.rower.add(rower) ps.save() diff --git a/rowers/teams.py b/rowers/teams.py index 94f3307b..bf99b147 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -245,7 +245,7 @@ def create_coaching_request(coach, user): # pragma: no cover while code in codes: # pragma: no cover code = uuid.uuid4().hex[:10].upper() - if 'coach' in coach.rowerplan: + if coach.rowerplan == 'pro': rekwest = CoachRequest(coach=coach, user=user, code=code) rekwest.save() diff --git a/rowers/templates/paidplans.html b/rowers/templates/paidplans.html index 36cc5f20..ac5b848b 100644 --- a/rowers/templates/paidplans.html +++ b/rowers/templates/paidplans.html @@ -59,13 +59,13 @@ ✔ - All other rowing metrics (Work per Stroke, Average and Peak Force, Drive Length, Catch and Finish Angle, Slip and Wash, Peak Force Angle, and more) -   + Advanced Analysis (Critical Power, Stats, Box Chart, Trend Flex) + ✔ ✔ - Advanced Analysis (Critical Power, Stats, Box Chart, Trend Flex) -   + All other rowing metrics (Work per Stroke, Average and Peak Force, Drive Length, Catch and Finish Angle, Slip and Wash, Peak Force Angle, and more) + partly ✔ diff --git a/rowers/tests/test_aavirtualevents.py b/rowers/tests/test_aavirtualevents.py index 92e978fd..7c4b3836 100644 --- a/rowers/tests/test_aavirtualevents.py +++ b/rowers/tests/test_aavirtualevents.py @@ -22,7 +22,7 @@ class VirtualEventViewTest(MyTestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True, surveydone=True,gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() diff --git a/rowers/tests/test_api.py b/rowers/tests/test_api.py index 14f0429a..6a460a81 100644 --- a/rowers/tests/test_api.py +++ b/rowers/tests/test_api.py @@ -56,7 +56,7 @@ class StravaPrivacy(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach',subscription_id=1) + rowerplan='pro',subscription_id=1) self.r.stravatoken = '12' self.r.stravarefreshtoken = '123' @@ -77,7 +77,7 @@ class StravaPrivacy(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach',clubsize=3) + rowerplan='pro',clubsize=3) self.r3 = Rower.objects.create(user=self.u3, birthdate=faker.profile()['birthdate'], diff --git a/rowers/tests/test_async_tasks.py b/rowers/tests/test_async_tasks.py index f7af8923..7833de30 100644 --- a/rowers/tests/test_async_tasks.py +++ b/rowers/tests/test_async_tasks.py @@ -32,7 +32,7 @@ class AsyncTaskTests(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/test_aworkouts.py b/rowers/tests/test_aworkouts.py index c18a60bd..a323aa19 100644 --- a/rowers/tests/test_aworkouts.py +++ b/rowers/tests/test_aworkouts.py @@ -39,7 +39,7 @@ class ListWorkoutTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) @@ -144,7 +144,7 @@ class WorkoutViewTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.c2 = Client() # for anonymous diff --git a/rowers/tests/test_braintree.py b/rowers/tests/test_braintree.py index 3d32d19c..88654e4b 100644 --- a/rowers/tests/test_braintree.py +++ b/rowers/tests/test_braintree.py @@ -67,7 +67,7 @@ class BraintreeUnits(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach',subscription_id=1) + rowerplan='pro',subscription_id=1) self.pp = PaidPlan.objects.create(price=0,paymentprocessor='braintree') diff --git a/rowers/tests/test_courses.py b/rowers/tests/test_courses.py index 346cca15..753b6fe1 100644 --- a/rowers/tests/test_courses.py +++ b/rowers/tests/test_courses.py @@ -18,7 +18,7 @@ class CourseUnitTest(TestCase): 'koeinsloot') self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', ) self.nu = datetime.datetime.now() @@ -130,7 +130,7 @@ class CoursesTest(TestCase): 'koeinsloot') self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', ) self.nu = datetime.datetime.now() diff --git a/rowers/tests/test_cpchart.py b/rowers/tests/test_cpchart.py index 3c6fd404..3c2b771a 100644 --- a/rowers/tests/test_cpchart.py +++ b/rowers/tests/test_cpchart.py @@ -23,7 +23,7 @@ class CPChartTest(TestCase): gdproptin=True, ftpset=True,surveydone=True,sex='male', weightcategory='hwt', gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') r = self.u.rower age = calculate_age(r.birthdate) diff --git a/rowers/tests/test_emails.py b/rowers/tests/test_emails.py index ae26ef5e..bbf2ea80 100644 --- a/rowers/tests/test_emails.py +++ b/rowers/tests/test_emails.py @@ -26,7 +26,7 @@ class EmailUpload(TestCase): birthdate = faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') nu = datetime.datetime.now() @@ -208,7 +208,7 @@ class EmailTests(TestCase): birthdate = faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') nu = datetime.datetime.now() a2 = 'media/mailbox_attachments/colin3.csv' diff --git a/rowers/tests/test_empower.py b/rowers/tests/test_empower.py index ce52ff4e..1ac099b9 100644 --- a/rowers/tests/test_empower.py +++ b/rowers/tests/test_empower.py @@ -14,7 +14,7 @@ class EmpowerTest(TestCase): 'sander@ds.ds', 'koeinsloot', ) - r = Rower.objects.create(user=u,rowerplan='coach',gdproptin=True, ftpset=True,surveydone=True, + r = Rower.objects.create(user=u,rowerplan='pro',gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now()) self.c = Client() diff --git a/rowers/tests/test_flexchart.py b/rowers/tests/test_flexchart.py index 455eb1d8..50deb370 100644 --- a/rowers/tests/test_flexchart.py +++ b/rowers/tests/test_flexchart.py @@ -14,7 +14,7 @@ class WorkoutViewTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', showfavoritechartnotes=True) self.c = Client() diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index f7b3a933..df48f11e 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -47,7 +47,7 @@ class RojaboObjects(DjangoTestCase): self.r.rojabo_refreshtoken = 'ab' self.r.rojabo_tokenexpirydate = arrow.get(datetime.datetime.now()+datetime.timedelta(days=1)).datetime self.r.defaulttimezone = 'Europe/Prague' - self.r.rowerplan = 'plan' + self.r.rowerplan = 'pro' self.r.save() self.u2 = User.objects.create_user('john2', @@ -134,7 +134,7 @@ class GarminObjects(DjangoTestCase): ) self.r.garmintoken = 'dfdzf' self.r.garminrefreshtoken = 'fsls' - self.r.rowerplan = 'plan' + self.r.rowerplan = 'pro' self.r.save() self.c.login(username='john',password='koeinsloot') diff --git a/rowers/tests/test_misc.py b/rowers/tests/test_misc.py index ff841c3e..391a3c86 100644 --- a/rowers/tests/test_misc.py +++ b/rowers/tests/test_misc.py @@ -18,7 +18,7 @@ class MiscTests(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach',subscription_id=1) + rowerplan='pro',subscription_id=1) self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/test_permissions.py b/rowers/tests/test_permissions.py index 4ee00a3b..9e587cdd 100644 --- a/rowers/tests/test_permissions.py +++ b/rowers/tests/test_permissions.py @@ -26,7 +26,7 @@ class PlanningPermissionsCoach(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', clubsize=10, ) self.ucoachpassword = faker.word() @@ -97,184 +97,8 @@ class PlanningPermissionsCoach(TestCase): def test_coachee_can_sync(self): self.assertTrue(user_is_coachee(self.ucoachee)) + -@override_settings(TESTING=True) -class PermissionsFreeCoach(TestCase): - def setUp(self): - self.c = Client() - ## Users - Pro, Basic, Free Coach & Self Coach - - self.ufreecoach = UserFactory(username='coachuser') - self.rfreecoach = Rower.objects.create(user=self.ufreecoach, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='freecoach',clubsize=100) - - self.coachinggroup = CoachingGroup.objects.create() - self.rfreecoach.mycoachgroup = self.coachinggroup - self.rfreecoach.save() - self.factory = RequestFactory() - self.password = faker.word() - self.ufreecoach.set_password(self.password) - self.ufreecoach.save() - - self.uplan = UserFactory(username='planuser') - self.rplan = Rower.objects.create(user=self.uplan, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') - - self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan) - self.factory = RequestFactory() - self.password = faker.word() - self.uplan.set_password(self.password) - self.uplan.save() - - self.upro = UserFactory(username='prouser') - self.rpro = Rower.objects.create(user=self.upro, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='pro') - - self.upro_workouts = WorkoutFactory.create_batch(5, user=self.rpro) - self.factory = RequestFactory() - self.password = faker.word() - self.upro.set_password(self.password) - self.upro.save() - - self.uplan2 = UserFactory(username='planuser2') - self.rplan2 = Rower.objects.create(user=self.uplan2, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') - - self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2) - self.factory = RequestFactory() - self.password = faker.word() - self.uplan2.set_password(self.password) - self.uplan2.save() - - self.upro2 = UserFactory(username='prouser2') - self.rpro2 = Rower.objects.create(user=self.upro2, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='pro') - - self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2) - self.factory = RequestFactory() - self.password = faker.word() - self.upro2.set_password(self.password) - self.upro2.save() - - self.ubasic = UserFactory(username='basicuser') - self.rbasic = Rower.objects.create(user=self.ubasic, - birthdate=faker.profile()['birthdate'], - gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='basic') - - self.ubasic_workouts = WorkoutFactory.create_batch(5, user=self.rbasic) - self.factory = RequestFactory() - self.ubasicpassword = faker.word() - self.ubasic.set_password(self.ubasicpassword) - self.ubasic.save() - - - - ## TeamFreeCoach - - self.teamfreecoach = Team.objects.create( - name=faker.word()+'3', - notes=faker.text(), - manager=self.ufreecoach) - - ## Coach can have any number of groups - def test_coach_groupmanager(self): - team1 = Team.objects.create( - name = 'FirstTeam', - notes = faker.text(), - manager = self.ufreecoach, - ) - - self.assertEqual(team1.manager,self.ufreecoach) - - team2 = Team.objects.create( - name = 'SecondTeam', - notes = faker.text(), - manager = self.ufreecoach, - ) - - self.assertEqual(team2.manager,self.ufreecoach) - - - team3 = Team.objects.create( - name = 'ThirdTeam', - notes = faker.text(), - manager = self.ufreecoach, - ) - - self.assertEqual(team3.manager,self.ufreecoach) - - - - ## Free coach can create more than one group - def test_plan_groupmanager(self): - team1 = Team.objects.create( - name = 'FirstTeam', - notes = faker.text(), - manager = self.ufreecoach, - ) - - self.assertEqual(team1.manager,self.ufreecoach) - - team2 = Team.objects.create( - name = 'SecondTeam', - notes = faker.text(), - manager = self.ufreecoach, - ) - - self.assertEqual(team2.manager,self.ufreecoach) - - - - ## Free Coach can create planned sessions and team planned sessions - ## Self Coach and higher can create planned sessions and team planned sessions - def test_plan_create_session(self): - ps = PlannedSession.objects.create( - manager=self.ufreecoach, - name=faker.word(), - comment=faker.text() - ) - self.assertEqual(ps.manager,self.ufreecoach) - - def test_coach_create_session(self): - ps = PlannedSession.objects.create( - manager=self.ufreecoach, - name=faker.word(), - comment=faker.text() - ) - self.assertEqual(ps.manager,self.ufreecoach) - - - ## Basic cannot join groups led by Free Coach - def test_add_basic_pro_or_plan(self): - with transaction.atomic(): - with self.assertRaises(ValidationError): - self.rbasic.team.add(self.teamfreecoach) - - - ## Free Coach user cannot have workouts - def test_add_workout_freecoach(self): - result = get_random_file(filename='rowers/tests/testdata/erg1.csv') - with transaction.atomic(): - with self.assertRaises(ValidationError): - self.werg1 = WorkoutFactory(user=self.rfreecoach, - csvfilename=result['filename'], - starttime=result['starttime'], - startdatetime=result['startdatetime'], - duration=result['duration'], - distance=result['totaldist'], - workouttype = 'rower', - ) @override_settings(TESTING=True) class PermissionsBasicsTests(TestCase): @@ -286,7 +110,7 @@ class PermissionsBasicsTests(TestCase): self.rcoach = Rower.objects.create(user=self.ucoach, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='coach',clubsize=10) + rowerplan='pro',clubsize=10) self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach) self.coachinggroup = CoachingGroup.objects.create() @@ -301,7 +125,7 @@ class PermissionsBasicsTests(TestCase): self.rplan = Rower.objects.create(user=self.uplan, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan) self.factory = RequestFactory() @@ -325,7 +149,7 @@ class PermissionsBasicsTests(TestCase): self.rplan2 = Rower.objects.create(user=self.uplan2, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2) self.factory = RequestFactory() @@ -341,7 +165,7 @@ class PermissionsBasicsTests(TestCase): self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2) self.factory = RequestFactory() - self.password = faker.word() + self.upro2password = faker.word() self.upro2.set_password(self.password) self.upro2.save() @@ -366,15 +190,6 @@ class PermissionsBasicsTests(TestCase): notes=faker.text(), manager=self.upro2) - self.teamplan = Team.objects.create( - name=faker.word()+'2', - notes=faker.text(), - manager=self.uplan2) - - self.teamcoach = Team.objects.create( - name=faker.word()+'3', - notes=faker.text(), - manager=self.ucoach) # Requirements @@ -411,12 +226,11 @@ class PermissionsBasicsTests(TestCase): ## Basic athletes can be member of Coach led group def test_add_coach(self): - self.rbasic.team.add(self.teamcoach) - self.assertIn(self.teamcoach,self.rbasic.team.all()) + self.rbasic.team.add(self.teampro) + self.assertIn(self.teampro,self.rbasic.team.all()) - ## Self coach can create one group - ## Self coach cannot create more than one group + ## Pro member can create more than one group def test_plan_groupmanager(self): team1 = Team.objects.create( name = 'FirstTeam', @@ -426,32 +240,24 @@ class PermissionsBasicsTests(TestCase): self.assertEqual(team1.manager,self.uplan) - with self.assertRaises(ValidationError): - team2 = Team.objects.create( - name = 'SecondTeam', - notes = faker.text(), - manager = self.uplan, - ) + team2 = Team.objects.create( + name = 'SecondTeam', + notes = faker.text(), + manager = self.uplan, + ) + + self.assertEqual(team2.manager,self.uplan) ## Pro users (and higher) can join group led by other Pro (or higher) user def test_add_proplan_pro_or_plan(self): - self.rpro.team.add(self.teamplan) - self.assertIn(self.teamplan,self.rpro.team.all()) - self.rpro.team.add(self.teampro) self.assertIn(self.teampro,self.rpro.team.all()) - self.rplan.team.add(self.teamplan) - self.assertIn(self.teamplan,self.rplan.team.all()) - self.rplan.team.add(self.teampro) self.assertIn(self.teampro,self.rplan.team.all()) - self.rcoach.team.add(self.teamplan) - self.assertIn(self.teamplan,self.rcoach.team.all()) - self.rcoach.team.add(self.teampro) self.assertIn(self.teampro,self.rcoach.team.all()) @@ -476,8 +282,7 @@ class PermissionsBasicsTests(TestCase): ) self.assertEqual(ps.manager,self.ucoach) - ## Pro can have one group - ## Pro cannot create more than one group + ## Pro can have more than one group def test_pro_groupmanager(self): team1 = Team.objects.create( name = 'FirstTeam', @@ -487,22 +292,23 @@ class PermissionsBasicsTests(TestCase): self.assertEqual(team1.manager,self.upro) - with self.assertRaises(ValidationError): - team2 = Team.objects.create( - name = 'SecondTeam', - notes = faker.text(), - manager = self.upro, - ) + team2 = Team.objects.create( + name = 'SecondTeam', + notes = faker.text(), + manager = self.upro, + ) + self.assertEqual(team2.manager,self.upro) - ## Pro or Basic cannot create planned sessions or team planned sessions + ## Basic cannot create planned sessions or team planned sessions def test_pro_create_plannedsession(self): - with self.assertRaises(ValidationError): - ps = PlannedSession.objects.create( - manager=self.upro, - name = faker.word(), - comment = faker.text() - ) + ps = PlannedSession.objects.create( + manager=self.upro, + name = faker.word(), + comment = faker.text() + ) + + self.assertEqual(ps.manager,self.upro) def test_basic_create_plannedsession(self): with self.assertRaises(ValidationError): @@ -512,15 +318,6 @@ class PermissionsBasicsTests(TestCase): comment = faker.text() ) - ## Basic cannot join groups led by Pro or Self Coach - def test_add_basic_pro_or_plan(self): - with transaction.atomic(): - with self.assertRaises(ValidationError): - self.rbasic.team.add(self.teamplan) - - with transaction.atomic(): - with self.assertRaises(ValidationError): - self.rbasic.team.add(self.teampro) ## Basic cannot manage a group @@ -546,7 +343,7 @@ class PermissionsViewTests(TestCase): self.rcoach = Rower.objects.create(user=self.ucoach, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='coach',clubsize=10) + rowerplan='pro',clubsize=10) self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach) self.coachinggroup = CoachingGroup.objects.create() @@ -561,7 +358,7 @@ class PermissionsViewTests(TestCase): self.rplan = Rower.objects.create(user=self.uplan, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan) self.factory = RequestFactory() @@ -585,7 +382,7 @@ class PermissionsViewTests(TestCase): self.rplan2 = Rower.objects.create(user=self.uplan2, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2) self.factory = RequestFactory() @@ -628,17 +425,12 @@ class PermissionsViewTests(TestCase): notes=faker.text(), manager=self.upro2) - self.teamplan = Team.objects.create( - name=faker.word()+'2', - notes=faker.text(), - manager=self.uplan2) self.teamcoach = Team.objects.create( name=faker.word()+'3', notes=faker.text(), manager=self.ucoach) - ## only ubasic can view ubasic_workouts[0] which is private def test_view_workout(self): login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -756,7 +548,7 @@ class PermissionsViewTests(TestCase): ## Coach can edit on behalf of athlete if permitted # 1, Preferences def test_coach_edit_athlete_prefs(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) self.rbasic.coachinggroups.add(self.coachinggroup) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -768,7 +560,7 @@ class PermissionsViewTests(TestCase): self.assertEqual(response.status_code,200) def test_coach_edit_athlete_prefs_not(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -780,7 +572,7 @@ class PermissionsViewTests(TestCase): # 2, Favorite Charts def test_coach_edit_athlete_settings(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) self.rbasic.coachinggroups.add(self.coachinggroup) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -792,7 +584,7 @@ class PermissionsViewTests(TestCase): self.assertEqual(response.status_code,200) def test_coach_edit_athlete_settings_not(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -804,7 +596,7 @@ class PermissionsViewTests(TestCase): # 3, Export Settings def test_coach_edit_athlete_exportsettings(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) self.rbasic.coachinggroups.add(self.coachinggroup) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -816,7 +608,7 @@ class PermissionsViewTests(TestCase): self.assertEqual(response.status_code,200) def test_coach_edit_athlete_exportsettings_not(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -828,7 +620,7 @@ class PermissionsViewTests(TestCase): # 4, Account settings def test_coach_edit_athlete_account(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) self.rbasic.coachinggroups.add(self.coachinggroup) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -840,7 +632,7 @@ class PermissionsViewTests(TestCase): self.assertEqual(response.status_code,200) def test_coach_edit_athlete_account_not(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -853,7 +645,7 @@ class PermissionsViewTests(TestCase): ## Coach can run analytics for athlete @patch('rowers.dataprep.read_cols_df_sql', side_effect = mocked_read_df_cols_sql_multistats) def test_coach_edit_athlete_analysis(self,mocked_df): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) self.rbasic.coachinggroups.add(self.coachinggroup) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) @@ -874,7 +666,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.dataprep.read_cols_df_sql', side_effect = mocked_read_df_cols_sql_multistats) def test_coach_edit_athlete_analysis_not(self,mocked_df): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -892,7 +684,7 @@ class PermissionsViewTests(TestCase): @patch('rowers.dataprep.read_cols_df_sql', side_effect = mocked_read_df_cols_sql_multistats) def test_coach_edit_athlete_analysis_not2(self,mocked_df): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) self.assertTrue(login) @@ -961,7 +753,7 @@ class PermissionsViewTests(TestCase): def test_coach_edit_athlete_uploadnot(self,mocked_sqlalchemy,mocked_read_data): self.rbasic.team.add(self.teamcoach) - login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) + login = self.c.login(username=self.upro2.username, password=self.upro2password) self.assertTrue(login) url = reverse('team_workout_upload_view') @@ -1001,9 +793,9 @@ class PermissionsViewTests(TestCase): ## Coach can edit athlete's workout def test_coach_edit_athlete_workout(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) - login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) + login = self.c.login(username=self.upro2.username, password=self.upro2password) self.assertTrue(login) url = reverse('workout_edit_view', @@ -1015,9 +807,11 @@ class PermissionsViewTests(TestCase): ## Coach can see list of workouts of athlete def test_coach_athlete_workout_list(self): - self.rbasic.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) + # check if rbasic is in teampro + self.assertIn(self.teampro,self.rbasic.team.all()) - login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword) + login = self.c.login(username=self.upro2.username, password=self.upro2password) self.assertTrue(login) url = reverse('workouts_view', @@ -1137,7 +931,7 @@ class PermissionsViewTests(TestCase): ## Self Coach cannot edit on behalf of athlete def test_plan_edit_athlete_settings(self): - self.rpro.team.add(self.teamplan) + self.rpro.team.add(self.teampro) login = self.c.login(username=self.uplan2.username, password=self.uplan2password) self.assertTrue(login) @@ -1145,12 +939,12 @@ class PermissionsViewTests(TestCase): url = reverse('rower_prefs_view',kwargs={'userid':self.ubasic.id}) response = self.c.get(url) - self.assertEqual(response.status_code,403) + self.assertEqual(response.status_code,200) ## Self Coach cannot run analytics on behalf of athlete @patch('rowers.dataprep.read_cols_df_sql', side_effect = mocked_read_df_cols_sql_multistats) def test_plan_edit_athlete_analysis(self,mocked_df): - self.rpro.team.add(self.teamplan) + self.rpro.team.add(self.teampro) login = self.c.login(username=self.uplan2.username, password=self.uplan2password) self.assertTrue(login) @@ -1164,13 +958,13 @@ class PermissionsViewTests(TestCase): response = self.c.get(url) - self.assertEqual(response.status_code,403) + self.assertEqual(response.status_code,200) ## Self Coach cannot upload on behalf of athlete @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_read_data): - self.rpro.team.add(self.teamplan) + self.rpro.team.add(self.teampro) login = self.c.login(username=self.uplan2.username, password=self.uplan2password) self.assertTrue(login) @@ -1178,11 +972,10 @@ class PermissionsViewTests(TestCase): url = reverse('team_workout_upload_view') response = self.c.get(url) - self.assertEqual(response.status_code,403) + self.assertEqual(response.status_code,200) - ## Pro can have one group - ## Pro cannot create more than one group + ## Pro can have more than one group def test_pro_groups_create(self): login = self.c.login(username=self.upro.username, password=self.upropassword) self.assertTrue(login) @@ -1228,7 +1021,7 @@ class PermissionsViewTests(TestCase): self.assertTrue(form.is_valid()) - expected_url = reverse('paidplans_view') + expected_url = reverse('rower_teams_view') response = self.c.post(url,form_data,follow=True) self.assertRedirects(response, @@ -1289,75 +1082,11 @@ class PermissionsViewTests(TestCase): self.assertEqual(response.status_code,403) - ## Self Coach cannot upload on behalf of athlete - @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) - def test_plan_edit_athlete_upload(self,mocked_sqlalchemy,mocked_read_data): - self.rpro.team.add(self.teamplan) - - login = self.c.login(username=self.uplan2.username, password=self.uplan2password) - self.assertTrue(login) - - url = reverse('team_workout_upload_view') - - response = self.c.get(url,follow=True) - self.assertEqual(response.status_code,200) - - expected_url = reverse('paidplans_view') - self.assertRedirects(response, - expected_url = expected_url, - status_code=302,target_status_code=200) - - - ## Pro users can see team members' workout, but not edit - def test_pro_edit_athlete_workout(self): - self.rpro.team.add(self.teampro) - self.rpro2.team.add(self.teampro) - - login = self.c.login(username=self.upro2.username, password=self.upro2password) - self.assertTrue(login) - - url = reverse('workout_edit_view', - kwargs={'id':encoder.encode_hex(self.upro_workouts[0].id)} - ) - - response = self.c.get(url) - self.assertEqual(response.status_code,403) - - url = reverse('workout_view', - kwargs={'id':encoder.encode_hex(self.upro_workouts[0].id)} - ) - - response = self.c.get(url) - self.assertEqual(response.status_code,200) - - - ## Self Coach users can see team members' workout, but not edit - def test_plan_edit_athlete_workout(self): - self.rpro.team.add(self.teamplan) - - login = self.c.login(username=self.uplan2.username, password=self.uplan2password) - self.assertTrue(login) - - url = reverse('workout_edit_view', - kwargs={'id':encoder.encode_hex(self.ubasic_workouts[0].id)} - ) - - response = self.c.get(url) - self.assertEqual(response.status_code,403) - - url = reverse('workout_view', - kwargs={'id':encoder.encode_hex(self.ubasic_workouts[0].id)} - ) - - response = self.c.get(url) - self.assertEqual(response.status_code,200) - ## Basic users can see team members' workout, but not edit def test_basic_edit_athlete_workout(self): - self.rbasic.team.add(self.teamcoach) - self.rplan2.team.add(self.teamcoach) + self.rbasic.team.add(self.teampro) + self.rplan2.team.add(self.teampro) login = self.c.login(username=self.ubasic.username, password=self.ubasicpassword) self.assertTrue(login) @@ -1421,7 +1150,7 @@ class PermissionsViewTests(TestCase): expected_url = expected_url, status_code=302,target_status_code=200) - ## Basic cannot join groups from Pro or Self Coach users (redirects to paid plans) + ## Basic can join groups from Pro def test_team_member_request_basic_pro(self): login = self.c.login(username=self.ubasic.username,password=self.ubasicpassword) self.assertTrue(login) @@ -1435,12 +1164,12 @@ class PermissionsViewTests(TestCase): response = self.c.get(url,follow=True) self.assertEqual(response.status_code,200) - expected_url = reverse('paidplans_view') + expected_url = reverse('team_view',kwargs={'team_id':self.teampro.id}) + self.assertRedirects(response, expected_url = expected_url, status_code=302,target_status_code=200) - @override_settings(TESTING=True) class PermissionsCoachingTests(TestCase): def setUp(self): @@ -1451,7 +1180,7 @@ class PermissionsCoachingTests(TestCase): self.rcoach = Rower.objects.create(user=self.ucoach, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='coach',clubsize=10) + rowerplan='pro',clubsize=10) self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach) self.coachinggroup = CoachingGroup.objects.create() @@ -1466,7 +1195,7 @@ class PermissionsCoachingTests(TestCase): self.rplan = Rower.objects.create(user=self.uplan, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan) self.factory = RequestFactory() @@ -1490,7 +1219,7 @@ class PermissionsCoachingTests(TestCase): self.rplan2 = Rower.objects.create(user=self.uplan2, birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True,gdproptindate=timezone.now(), - rowerplan='plan') + rowerplan='pro') self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2) self.factory = RequestFactory() @@ -1524,22 +1253,13 @@ class PermissionsCoachingTests(TestCase): - ## TeamPro, TeamCoach, TeamSelfCoach + ## TeamPro, Teampro, TeamSelfCoach self.teampro = Team.objects.create( name=faker.word()+'1', notes=faker.text(), manager=self.upro2) - self.teamplan = Team.objects.create( - name=faker.word()+'2', - notes=faker.text(), - manager=self.uplan2) - - self.teamcoach = Team.objects.create( - name=faker.word()+'3', - notes=faker.text(), - manager=self.ucoach) def test_athlete_request_athlete_revoke(self): login = self.c.login(username=self.ubasic.username,password=self.ubasicpassword) diff --git a/rowers/tests/test_races.py b/rowers/tests/test_races.py index 4b7ca70a..c3cf8f52 100644 --- a/rowers/tests/test_races.py +++ b/rowers/tests/test_races.py @@ -60,7 +60,7 @@ class ChallengesTest(TestCase): birthdate=datetime.datetime.now()-datetime.timedelta(days=25*365), gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.u2 = UserFactory() self.r2 = Rower.objects.create(user=self.u2, @@ -1089,7 +1089,7 @@ class IndoorChallengesTest(TestCase): birthdate=datetime.datetime.now()-datetime.timedelta(days=25*365), gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/test_simplefunctions.py b/rowers/tests/test_simplefunctions.py index 59753174..b45c7ad9 100644 --- a/rowers/tests/test_simplefunctions.py +++ b/rowers/tests/test_simplefunctions.py @@ -42,7 +42,7 @@ class SimpleViewTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True, surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/test_team.py b/rowers/tests/test_team.py index 9deb3639..28bdce90 100644 --- a/rowers/tests/test_team.py +++ b/rowers/tests/test_team.py @@ -43,7 +43,7 @@ class TeamTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', user=u, clubsize=3 ) @@ -402,7 +402,7 @@ class TeamTestLowLevel(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', user=u, clubsize=3 ) diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index 2546d575..bdd23a6f 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -35,7 +35,7 @@ class OtherUnitTests(TestCase): gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), defaulttimezone='US/Pacific', - rowerplan='coach') + rowerplan='pro') # Test get_dates_timeperiod @@ -172,7 +172,7 @@ class PlannedSessionTests(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) @@ -430,7 +430,7 @@ class DataPrepTests(TestCase): gdproptin=True, ftpset=True,surveydone=True, sex='male', gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.r.birthdate = timezone.now()-datetime.timedelta(days=25*365) self.r.defaulttimezone = 'Europe/Amsterdam' @@ -649,7 +649,7 @@ class InteractivePlotTests(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/test_units.py b/rowers/tests/test_units.py index b540eeb3..3c627fe3 100644 --- a/rowers/tests/test_units.py +++ b/rowers/tests/test_units.py @@ -27,7 +27,7 @@ class ForceUnits(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.user_workouts = WorkoutFactory.create_batch(12, user=self.r) @@ -171,7 +171,7 @@ class TestForceUnit(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(14, user=self.r) diff --git a/rowers/tests/test_uploads.py b/rowers/tests/test_uploads.py index f93418e8..62e6e309 100644 --- a/rowers/tests/test_uploads.py +++ b/rowers/tests/test_uploads.py @@ -21,7 +21,7 @@ class ViewTest(TestCase): 'koeinsloot') self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach', + rowerplan='pro', ) add_defaultfavorites(self.r) diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py index 5e30c26c..f08b1e9d 100644 --- a/rowers/tests/test_urls.py +++ b/rowers/tests/test_urls.py @@ -119,7 +119,6 @@ class URLTests(TestCase): '/rowers/me/workflowdefault/', '/rowers/partners/', '/rowers/physics/', - '/rowers/planrequired/', '/rowers/register/', '/rowers/register/thankyou/', '/rowers/sessions/', diff --git a/rowers/tests/test_user.py b/rowers/tests/test_user.py index 77ed9f00..935bc7bb 100644 --- a/rowers/tests/test_user.py +++ b/rowers/tests/test_user.py @@ -82,7 +82,7 @@ class UserPreferencesTest(TestCase): birthdate=faker.profile()['birthdate'], gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now(), - rowerplan='coach') + rowerplan='pro') self.c = Client() self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 54dd88b6..7207adec 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/urls.py b/rowers/urls.py index ccb49dc7..73370658 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -845,8 +845,6 @@ urlpatterns = [ name='downgrade_checkouts'), re_path(r'^purchasecheckouts/$', views.purchase_checkouts_view, name='purchase_checkouts_view'), - re_path(r'^planrequired/', views.planrequired_view, - name='planrequired_view'), re_path(r'^starttrial/$', views.start_trial_view, name='start_trial_view'), re_path(r'^startplantrial/$', views.start_plantrial_view, name='start_plantrial_view'), @@ -856,8 +854,8 @@ urlpatterns = [ template_name='legal.html'), name='legal'), re_path(r'^register/$', views.rower_register_view, name='rower_register_view'), - re_path(r'^coachregister/$', views.freecoach_register_view, - name='freecoach_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/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 80a893b5..9a1375ff 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -27,11 +27,6 @@ defaultoptions = { } -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user," - " please log in to access this functionality", - redirect_field_name=None) @permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) @@ -897,11 +892,6 @@ def statsdata(workouts, options): def comparisondata(workouts, options): - #try: - # workouts = workouts.exclude(workoutsource='strava') - #except AttributeError: # pragma: no cover - # workouts = [w for w in workouts if w.workoutsource != 'strava'] - includereststrokes = options['includereststrokes'] xparam = options['xaxis'] yparam1 = options['yaxis1'] @@ -1013,10 +1003,6 @@ def boxplotdata(workouts, options): return(script, div) -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) @permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def analysis_view_data(request, userid=0): is_ajax = request_is_ajax(request) @@ -1087,17 +1073,10 @@ def analysis_view_data(request, userid=0): }) -def planrequired_view(request): - messages.info( - request, "This functionality requires Coach or Self-Coach membership") - - return HttpResponseRedirect(reverse('paidplans_view')) -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) +@login_required() +@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def create_marker_workouts_view(request, userid=0, startdate=timezone.now()-timezone.timedelta(days=42), enddate=timezone.now()): @@ -1119,10 +1098,8 @@ def create_marker_workouts_view(request, userid=0, return HttpResponseRedirect(url) -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) +@login_required() +@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def goldmedalscores_view(request, userid=0, startdate=timezone.now()-timezone.timedelta(days=365), enddate=timezone.now()): @@ -1184,10 +1161,6 @@ def goldmedalscores_view(request, userid=0, }) -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) @permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def trainingzones_view(request, userid=0): r = getrequestrower(request, userid=userid) @@ -1255,6 +1228,7 @@ def trainingzones_view(request, userid=0): @login_required() +@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def trainingzones_view_data(request, userid=0): r = getrequestrower(request, userid=userid) @@ -1296,10 +1270,6 @@ def trainingzones_view_data(request, userid=0): }) -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) @permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def performancemanager_view(request, userid=0, mode='rower', startdate=timezone.now()-timezone.timedelta(days=365), @@ -2060,10 +2030,6 @@ class AlertDelete(DeleteView): return obj -@user_passes_test(ispromember, login_url="/rowers/paidplans", - message="This functionality requires a Pro plan or higher." - " If you are already a Pro user, please log in to access this functionality", - redirect_field_name=None) @permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) def history_view(request, userid=0): r = getrequestrower(request, userid=userid) diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index de8cc5be..2d578685 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -101,7 +101,6 @@ def javascript_log(request): return JSONResponse(status=200, data = {'status': 'true', 'message': message}) @login_required() -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) def strokedataform(request, id=0): id = encoder.decode_hex(id) @@ -265,7 +264,6 @@ def api_get_dataframe(startdatetime, df): @login_required() -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) def strokedataform_v2(request, id=0): id = encoder.decode_hex(id) @@ -496,7 +494,6 @@ def strokedata_rowingdata(request): @csrf_exempt @api_view(["POST"]) -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) def strokedata_rowingdata_apikey(request): """ @@ -547,7 +544,6 @@ def strokedata_rowingdata_apikey(request): @csrf_exempt @api_view(["POST"]) -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) @parser_classes([FITParser]) def strokedata_fit(request): @@ -647,7 +643,6 @@ def strokedata_fit(request): @csrf_exempt #@login_required() @api_view(["POST"]) -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) @parser_classes([XMLParser]) def strokedata_tcx(request): @@ -768,7 +763,6 @@ def strokedata_tcx(request): @csrf_exempt @api_view(["POST"]) #@login_required() -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) def strokedatajson_v3(request): """ @@ -913,7 +907,6 @@ def strokedatajson_v3(request): # Return the GET stroke data according to the API definition @csrf_exempt #@login_required() -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @api_view(["GET", "POST"]) @permission_classes([IsAuthenticated]) def strokedatajson_v2(request, id): @@ -1073,7 +1066,6 @@ def strokedatajson_v2(request, id): @csrf_exempt #@login_required() -@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @api_view(['GET', 'POST']) @permission_classes([IsAuthenticated]) def strokedatajson(request, id=0): diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index 8fbad999..84cc04fe 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -980,7 +980,7 @@ def rower_register_view(request): # User registration -def freecoach_register_view(request): # pragma: no cover +def coach_register_view(request): # pragma: no cover nextpage = request.GET.get('next', '/rowers/me/teams/') if nextpage == '': # pragma: no cover diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 0300d385..0ef93cf6 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -318,7 +318,7 @@ def plannedsession_multiclone_view( add_rower_session(rower, ps) for team in teams: add_team_session(team, ps) - for rower in team.rower.all().exclude(rowerplan='freecoach'): + for rower in team.rower.all(): add_rower_session(rower, ps) startdatestring = shiftstartdate.strftime('%Y-%m-%d') @@ -974,7 +974,7 @@ def plannedsession_teamcreate_view(request, for team in teams: add_team_session(team, ps) rs = Rower.objects.filter( - team__in=[team]).exclude(rowerplan='freecoach') + team__in=[team]) for r in rs: add_rower_session(r, ps) @@ -1297,17 +1297,14 @@ def plannedsessions_coach_view(request, rteams = therower.team.filter(viewing='allmembers') sps = get_sessions(therower, startdate=startdate, enddate=enddate) - if therower.rowerplan != 'freecoach': - rowers = [therower] - else: # pragma: no cover - rowers = [] + rowers = [therower] for ps in sps: if is_coach(request.user) or is_coachtrial(request.user): - rowers += ps.rower.all().exclude(rowerplan='freecoach') + rowers += ps.rower.all() else: # pragma: no cover rowers += ps.rower.filter( - team__in=rteams).exclude(rowerplan='freecoach') + team__in=rteams) rowers = list(set(rowers)) @@ -1861,7 +1858,7 @@ def plannedsession_clone_view(request, id=0, userid=0): add_rower_session(r, ps) for team in teams: add_team_session(team, ps) - for rower in team.rower.all().exclude(rowerplan='freecoach'): + for rower in team.rower.all(): add_rower_session(rower, ps) url = reverse(plannedsession_edit_view, diff --git a/rowers/views/teamviews.py b/rowers/views/teamviews.py index 019e259d..82c693c8 100644 --- a/rowers/views/teamviews.py +++ b/rowers/views/teamviews.py @@ -240,16 +240,6 @@ def rower_teams_view(request): # pragma: no cover user__in=invitedathletes).exclude( user=request.user ).exclude(coachinggroups__in=[request.user.rower.mycoachgroup]) - elif request.user.rower.rowerplan == 'freecoach': # pragma: no cover - potentialathletes = Rower.objects.filter( - team__in=myteams).exclude( - user__in=invitedathletes).exclude( - user=request.user - ).exclude( - coachinggroups__in=[request.user.rower.mycoachgroup] - ).exclude( - rowerplan__in=['basic', 'freecoach'] - ) else: potentialathletes = [] diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index f482d0d6..03434755 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -2101,7 +2101,7 @@ def workouts_bulk_actions(request): teams = Team.objects.filter(manager=request.user) assignchoices.fields["rowers"].queryset = Rower.objects.filter( team__in=teams - ).distinct().order_by("user__last_name", "user__first_name").exclude(rowerplan='freecoach') + ).distinct().order_by("user__last_name", "user__first_name") assignchoices.fields["rowers"].initial = [] form = WorkoutMultipleCompareForm() form.fields["workouts"].queryset = Workout.objects.filter(id__in=[w.id for w in workouts]) @@ -5191,9 +5191,6 @@ def workout_upload_view(request, r = getrower(request.user) if r.imports_are_private: uploadoptions['makeprivate'] = True - if r.rowerplan == 'freecoach': # pragma: no cover - url = reverse('team_workout_upload_view') - return HttpResponseRedirect(url) breadcrumbs = [ { @@ -5622,7 +5619,7 @@ def workout_upload_view(request, # This is the main view for processing uploaded files -@user_passes_test(iscoachmember, login_url="/rowers/paidplans", redirect_field_name=None, +@user_passes_test(ispromember, login_url="/rowers/paidplans", redirect_field_name=None, message="This functionality requires a Coach plan or higher") def team_workout_upload_view(request, userid=0, message="", successmessage="", @@ -5659,11 +5656,7 @@ def team_workout_upload_view(request, userid=0, message="", rowerform.fields.pop('email') rowers = Rower.objects.filter( coachinggroups__in=[r.mycoachgroup] - ).exclude( - rowerplan='freecoach' ).distinct() - if r.rowerplan == 'freecoach': # pragma: no cover - rowers = rowers.exclude(rowerplan='basic') rowerform.fields['user'].queryset = User.objects.filter( rower__in=rowers).distinct() @@ -5803,11 +5796,7 @@ def team_workout_upload_view(request, userid=0, message="", rowers = Rower.objects.filter( coachinggroups__in=[r.mycoachgroup] - ).exclude( - rowerplan='freecoach' ).distinct() - if r.rowerplan == 'freecoach': # pragma: no cover - rowers = rowers.exclude(rowerplan='basic') rowerform.fields['user'].queryset = User.objects.filter( rower__in=rowers).distinct()