improved (fixed) rules and two additional tests for permissions
This commit is contained in:
@@ -941,6 +941,7 @@ class CoachOffer(models.Model):
|
|||||||
|
|
||||||
from django.db.models.signals import m2m_changed
|
from django.db.models.signals import m2m_changed
|
||||||
|
|
||||||
|
|
||||||
def check_teams_on_change(sender, **kwargs):
|
def check_teams_on_change(sender, **kwargs):
|
||||||
instance = kwargs.pop('instance', None)
|
instance = kwargs.pop('instance', None)
|
||||||
action = kwargs.pop('action', None)
|
action = kwargs.pop('action', None)
|
||||||
@@ -1282,6 +1283,18 @@ class TrainingTarget(models.Model):
|
|||||||
|
|
||||||
return stri
|
return stri
|
||||||
|
|
||||||
|
def check_trainingtarget_on_change(sender,**kwargs):
|
||||||
|
instance = kwargs.pop('instance',None)
|
||||||
|
action = kwargs.pop('action',None)
|
||||||
|
pk_set = kwargs.pop('pk_set',None)
|
||||||
|
if action == 'pre_add':
|
||||||
|
for id in pk_set:
|
||||||
|
rower = Rower.objects.get(id=id)
|
||||||
|
if not can_plan_user(instance.manager.user,rower):
|
||||||
|
raise ValidationError("You cannot add this rower. Not your coachee")
|
||||||
|
|
||||||
|
m2m_changed.connect(check_trainingtarget_on_change, sender=TrainingTarget.rowers.through)
|
||||||
|
|
||||||
class TrainingTargetForm(ModelForm):
|
class TrainingTargetForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TrainingTarget
|
model = TrainingTarget
|
||||||
@@ -1356,6 +1369,8 @@ class TrainingPlan(models.Model):
|
|||||||
"Basic user cannot have a training plan"
|
"Basic user cannot have a training plan"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if self.enddate < self.startdate:
|
if self.enddate < self.startdate:
|
||||||
startdate = self.startdate
|
startdate = self.startdate
|
||||||
enddate = self.enddate
|
enddate = self.enddate
|
||||||
@@ -1365,6 +1380,13 @@ class TrainingPlan(models.Model):
|
|||||||
if not self.enddate <= self.startdate:
|
if not self.enddate <= self.startdate:
|
||||||
super(TrainingPlan,self).save(*args, **kwargs)
|
super(TrainingPlan,self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
# only add athletes that are allowed to be added
|
||||||
|
for rower in self.rowers.all():
|
||||||
|
if can_plan_user(manager.user,rower):
|
||||||
|
self.rowers.add(rower)
|
||||||
|
else:
|
||||||
|
self.rowers.remove(rower)
|
||||||
|
|
||||||
if self.status:
|
if self.status:
|
||||||
otherplans = TrainingPlan.objects.filter(
|
otherplans = TrainingPlan.objects.filter(
|
||||||
status=True).exclude(
|
status=True).exclude(
|
||||||
@@ -1401,6 +1423,18 @@ class TrainingPlan(models.Model):
|
|||||||
else:
|
else:
|
||||||
createmacrofillers(self)
|
createmacrofillers(self)
|
||||||
|
|
||||||
|
def check_trainingplan_on_change(sender, **kwargs):
|
||||||
|
instance = kwargs.pop('instance',None)
|
||||||
|
action = kwargs.pop('action',None)
|
||||||
|
pk_set = kwargs.pop('pk_set',None)
|
||||||
|
if action == 'pre_add':
|
||||||
|
for id in pk_set:
|
||||||
|
rower = Rower.objects.get(id=id)
|
||||||
|
if not can_plan_user(instance.manager.user,rower):
|
||||||
|
raise ValidationError("You cannot add this rower. Not your coachee")
|
||||||
|
|
||||||
|
m2m_changed.connect(check_trainingplan_on_change, sender=TrainingPlan.rowers.through)
|
||||||
|
|
||||||
|
|
||||||
class TrainingPlanForm(ModelForm):
|
class TrainingPlanForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ USER permissions
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# not tested
|
# used in can_plan_user
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def user_is_not_basic(user):
|
def user_is_not_basic(user):
|
||||||
if user.rower.rowerplan != 'basic':
|
if user.rower.rowerplan != 'basic':
|
||||||
@@ -156,7 +156,7 @@ def can_add_team(user):
|
|||||||
|
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def can_add_plan(user):
|
def can_add_plan(user):
|
||||||
return isplanmember(user)
|
return isplanmember(user) or is_coach(user)
|
||||||
|
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def can_add_workout(user):
|
def can_add_workout(user):
|
||||||
@@ -189,7 +189,6 @@ def can_add_session(user):
|
|||||||
|
|
||||||
# User / Coach relationships (Rower object)
|
# User / Coach relationships (Rower object)
|
||||||
|
|
||||||
# not tested
|
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def can_plan(user):
|
def can_plan(user):
|
||||||
return user.rower.rowerplan in ['plan','coach','freecoach']
|
return user.rower.rowerplan in ['plan','coach','freecoach']
|
||||||
@@ -197,6 +196,9 @@ def can_plan(user):
|
|||||||
# checks if rower is coach of user
|
# checks if rower is coach of user
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def is_coach_user(usercoach,userrower):
|
def is_coach_user(usercoach,userrower):
|
||||||
|
if not is_coach(usercoach):
|
||||||
|
return False
|
||||||
|
|
||||||
if usercoach == userrower:
|
if usercoach == userrower:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -221,8 +223,7 @@ def is_rower_team_member(user,rower):
|
|||||||
if user.rower == rower:
|
if user.rower == rower:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# below not tested
|
teams = rower.team.all()
|
||||||
teams = user.rower.team.all()
|
|
||||||
|
|
||||||
for team in teams:
|
for team in teams:
|
||||||
if team.private == 'open':
|
if team.private == 'open':
|
||||||
@@ -247,22 +248,30 @@ def can_add_workout_member(user,rower):
|
|||||||
# check if user can plan for the rower
|
# check if user can plan for the rower
|
||||||
@rules.predicate
|
@rules.predicate
|
||||||
def can_plan_user(user,rower):
|
def can_plan_user(user,rower):
|
||||||
if not isplanmember(user):
|
# user must have planning permission
|
||||||
|
if not can_plan(user):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
# if has planning permission, can always plan for himself
|
||||||
r = user.rower
|
if rower == user.rower:
|
||||||
except AttributeError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if rower == r:
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# below not tested
|
teams = user.rower.get_managed_teams()
|
||||||
team_managers = [t.manager for t in rower.team.all() and can_plan(t.manager)]
|
# free coach, plan etc cannot plan for basic
|
||||||
if user_is_not_basic(user):
|
if not is_paid_coach(user) and user_is_not_basic(user):
|
||||||
|
for t in teams:
|
||||||
|
if rower in t.rower.all():
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
return user in team_managers
|
return user in team_managers
|
||||||
|
|
||||||
|
# paying coach can plan for all kinds of rowers
|
||||||
|
if is_paid_coach(user):
|
||||||
|
for t in teams:
|
||||||
|
if rower in t.rower.all():
|
||||||
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
rules.add_perm('rower.add_plan',can_plan_user) # replaces checkaccessplanuser
|
rules.add_perm('rower.add_plan',can_plan_user) # replaces checkaccessplanuser
|
||||||
|
|||||||
@@ -15,6 +15,86 @@ import rowers.teams as teams
|
|||||||
import rowers.plannedsessions as plannedsessions
|
import rowers.plannedsessions as plannedsessions
|
||||||
from rowers.rower_rules import is_coach_user
|
from rowers.rower_rules import is_coach_user
|
||||||
|
|
||||||
|
@override_settings(TESTING=True)
|
||||||
|
class PlanningPermissionsCoach(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.c = Client()
|
||||||
|
|
||||||
|
self.ucoach = UserFactory()
|
||||||
|
self.rcoach = Rower.objects.create(
|
||||||
|
user=self.ucoach,
|
||||||
|
birthdate=faker.profile()['birthdate'],
|
||||||
|
gdproptin=True,surveydone=True,
|
||||||
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='coach',
|
||||||
|
clubsize=10,
|
||||||
|
)
|
||||||
|
self.ucoachpassword = faker.word()
|
||||||
|
self.ucoach.set_password(self.ucoachpassword)
|
||||||
|
self.ucoach.save()
|
||||||
|
|
||||||
|
self.ucoachee = UserFactory()
|
||||||
|
self.rcoachee = Rower.objects.create(
|
||||||
|
user=self.ucoachee,
|
||||||
|
birthdate=faker.profile()['birthdate'],
|
||||||
|
gdproptin=True,surveydone=True,
|
||||||
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='basic'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.coachgroup = CoachingGroup.objects.create(name=self.ucoach.first_name)
|
||||||
|
self.rcoach.mycoachgroup = self.coachgroup
|
||||||
|
self.rcoach.save()
|
||||||
|
|
||||||
|
self.team = Team.objects.create(
|
||||||
|
name=faker.word()+'3',
|
||||||
|
notes=faker.text(),
|
||||||
|
manager=self.ucoach)
|
||||||
|
|
||||||
|
# coachee is in coach's team
|
||||||
|
self.rcoachee.team.add(self.team)
|
||||||
|
|
||||||
|
# coachee is coached by coach
|
||||||
|
self.rcoachee.coachinggroups.add(self.rcoach.mycoachgroup)
|
||||||
|
self.rcoachee.save()
|
||||||
|
|
||||||
|
self.ugroupmember = UserFactory()
|
||||||
|
self.rgroupmember = Rower.objects.create(
|
||||||
|
user=self.ugroupmember,
|
||||||
|
birthdate=faker.profile()['birthdate'],
|
||||||
|
gdproptin=True,surveydone=True,
|
||||||
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='basic'
|
||||||
|
)
|
||||||
|
|
||||||
|
# groupmember is in coach's team (but not coached)
|
||||||
|
self.rgroupmember.team.add(self.team)
|
||||||
|
|
||||||
|
|
||||||
|
# def test_target(self):
|
||||||
|
|
||||||
|
def test_trainingplan(self):
|
||||||
|
plan = TrainingPlan(
|
||||||
|
name='test plan',
|
||||||
|
manager=self.ucoach.rower,
|
||||||
|
)
|
||||||
|
plan.save()
|
||||||
|
|
||||||
|
# can add self and coachee
|
||||||
|
plan.rowers.add(self.ucoach.rower)
|
||||||
|
plan.rowers.add(self.ucoachee.rower)
|
||||||
|
|
||||||
|
# test 1
|
||||||
|
athletes = plan.rowers.all()
|
||||||
|
self.assertTrue(self.ucoach.rower in athletes)
|
||||||
|
self.assertTrue(self.ucoachee.rower in athletes)
|
||||||
|
|
||||||
|
# can add groupmember if not basic
|
||||||
|
plan.rowers.add(self.rgroupmember)
|
||||||
|
athletes = plan.rowers.all()
|
||||||
|
self.assertTrue(self.rgroupmember in athletes)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(TESTING=True)
|
@override_settings(TESTING=True)
|
||||||
class PermissionsFreeCoach(TestCase):
|
class PermissionsFreeCoach(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -884,6 +964,37 @@ class PermissionsViewTests(TestCase):
|
|||||||
response = self.c.get(url)
|
response = self.c.get(url)
|
||||||
self.assertEqual(response.status_code,403)
|
self.assertEqual(response.status_code,403)
|
||||||
|
|
||||||
|
## Coach can see list of workouts of athlete
|
||||||
|
def test_coach_athlete_workout_list(self):
|
||||||
|
self.rbasic.team.add(self.teamcoach)
|
||||||
|
print(self.rbasic.team.all())
|
||||||
|
print(self.teamcoach)
|
||||||
|
|
||||||
|
login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword)
|
||||||
|
self.assertTrue(login)
|
||||||
|
|
||||||
|
url = reverse('workouts_view',
|
||||||
|
kwargs={'rowerid':self.rbasic.id})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
response = self.c.get(url)
|
||||||
|
print(url,response.status_code)
|
||||||
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
url = reverse('workouts_view',
|
||||||
|
kwargs={'userid':self.ubasic.id})
|
||||||
|
|
||||||
|
response = self.c.get(url)
|
||||||
|
print(url,response.status_code)
|
||||||
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
url = reverse('workouts_view')
|
||||||
|
|
||||||
|
response = self.c.get(url)
|
||||||
|
print(url,response.status_code)
|
||||||
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
## Self coach can create one group
|
## Self coach can create one group
|
||||||
## Self coach cannot create more than one group
|
## Self coach cannot create more than one group
|
||||||
def test_plan_groups_create(self):
|
def test_plan_groups_create(self):
|
||||||
|
|||||||
@@ -5,7 +5,17 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
#from __future__ import print_function
|
#from __future__ import print_function
|
||||||
from .statements import *
|
from .statements import *
|
||||||
nu = datetime.datetime.now()
|
nu = datetime.datetime.now()self.ucoach = UserFactory()
|
||||||
|
self.rcoach = Rower.objects.create(
|
||||||
|
user=self.ucoach,
|
||||||
|
birthdate=faker.profile()['birthdate'],
|
||||||
|
gdproptin=True,surveydone=True,
|
||||||
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='coach'
|
||||||
|
)
|
||||||
|
self.ucoachpassword = faker.word()
|
||||||
|
self.uchoach.set_password(self.ucoachpassword)
|
||||||
|
self.ucoach.save()
|
||||||
from rowers.utils import allmonths,allsundays
|
from rowers.utils import allmonths,allsundays
|
||||||
|
|
||||||
import rowers.plannedsessions as plannedsessions
|
import rowers.plannedsessions as plannedsessions
|
||||||
@@ -125,7 +135,6 @@ class TrainingPlanTest(TestCase):
|
|||||||
|
|
||||||
for url in urls:
|
for url in urls:
|
||||||
if 'planbyweeks' in url and not tested:
|
if 'planbyweeks' in url and not tested:
|
||||||
print(url)
|
|
||||||
response = self.c.get(url,follow=True)
|
response = self.c.get(url,follow=True)
|
||||||
self.assertEqual(response.status_code,200)
|
self.assertEqual(response.status_code,200)
|
||||||
tested = True
|
tested = True
|
||||||
|
|||||||
Reference in New Issue
Block a user