diff --git a/rowers/models.py b/rowers/models.py
index b4426431..b02e4889 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -633,7 +633,7 @@ class PaidPlan(models.Model):
)
class CoachingGroup(models.Model):
- pass
+ name = models.CharField(default='group',max_length=30,null=True,blank=True)
# Extension of User with rowing specific data
class Rower(models.Model):
@@ -1003,13 +1003,15 @@ def checkworkoutuser(user,workout):
return False
try:
r = Rower.objects.get(user=user)
- coaches = rower_get_coaches(user.rower)
if workout.user == r:
return True
- elif coaches:
- for coach in coaches:
- if user.rower == coach and workout.privacy == 'visible':
- return True
+ coaches = []
+ for group in workout.user.coachinggroups.all():
+ coach = Rower.objects.get(mycoachgroup=group)
+ coaches.append(coach)
+ for coach in coaches:
+ if user.rower == coach and workout.privacy == 'visible':
+ return True
else:
return False
except Rower.DoesNotExist:
@@ -1022,11 +1024,13 @@ def checkaccessuser(user,rower):
r = Rower.objects.get(user=user)
if rower == r:
return True
- coaches = rower_get_coaches(rower)
- if coaches:
- for coach in coaches:
- if user.rower == coach:
- return True
+ coaches = []
+ for group in rower.coachinggroups.all():
+ coach = Rower.objects.get(mycoachgroup=group)
+ coaches.append(coach)
+ for coach in coaches:
+ if user.rower == coach:
+ return True
else:
return False
except Rower.DoesNotExist:
diff --git a/rowers/teams.py b/rowers/teams.py
index 91b9e75d..ad9ed73e 100644
--- a/rowers/teams.py
+++ b/rowers/teams.py
@@ -17,7 +17,8 @@ queuelow = django_rq.get_queue('low')
queuehigh = django_rq.get_queue('low')
from rowers.models import (
- Rower, Workout, Team, TeamInvite,User,TeamRequest, CoachRequest, CoachOffer
+ Rower, Workout, Team, TeamInvite,User,TeamRequest, CoachRequest, CoachOffer,
+ CoachingGroup
)
from rowers.tasks import (
@@ -105,15 +106,14 @@ def remove_team(id):
def add_coach(coach,rower):
# get coaching group
- try:
- coachgroup = coach.mycoachgroup
- except CoachingGroup.DoesNotExist:
- coachgroup = CoachingGroup()
+ coachgroup = coach.mycoachgroup
+ if coachgroup is None:
+ coachgroup = CoachingGroup(name=coach.user.first_name)
coachgroup.save()
coach.mycoachgroup = coachgroup
coach.save()
- rower.coachinggroups.add(coach)
+ rower.coachinggroups.add(coach.mycoachgroup)
return (1,"Added Coach")
@@ -159,7 +159,7 @@ def remove_coach(coach,rower):
def rower_get_coaches(rower):
coaches = []
- for group in rower.coachinggroups:
+ for group in rower.coachinggroups.all():
coach = Rower.objects.get(mycoachgroup=group)
coaches.append(coach)
@@ -167,7 +167,7 @@ def rower_get_coaches(rower):
def coach_getcoachees(coach):
- return Rower.objects.filter(coachinggroups__in=[coach.mycoachgroup])
+ return Rower.objects.filter(coachinggroups__in=[coach.mycoachgroup]).distinct()
def coach_remove_athlete(coach,rower):
try:
diff --git a/rowers/templates/teams.html b/rowers/templates/teams.html
index d31b6ae4..59570f7d 100644
--- a/rowers/templates/teams.html
+++ b/rowers/templates/teams.html
@@ -313,7 +313,7 @@
Offer Coaching
+ href="/rowers/me/coachoffer/{{ a.user.id }}/">Offer Coaching
|
{% endfor %}
diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py
index be4413fb..c37c0e6a 100644
--- a/rowers/templatetags/rowerfilters.py
+++ b/rowers/templatetags/rowerfilters.py
@@ -376,15 +376,11 @@ def team_rowers(user):
return []
+from rowers.teams import coach_getcoachees
+
@register.filter
def coach_rowers(user):
- try:
- members = Rower.objects.filter(coaches__in=user.rower).distinct().order_by(
- "user__last_name","user__last_name"
- )
- return members
- except TypeError:
- return []
+ return coach_getcoachees(user.rower)
@register.filter
def verbosetimeperiod(timeperiod):
diff --git a/rowers/tests/test_permissions.py b/rowers/tests/test_permissions.py
index cda4b9e5..72c43ff1 100644
--- a/rowers/tests/test_permissions.py
+++ b/rowers/tests/test_permissions.py
@@ -23,6 +23,9 @@ class PermissionsBasicsTests(TestCase):
rowerplan='coach')
self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach)
+ self.coachinggroup = CoachingGroup.objects.create()
+ self.rcoach.mycoachgroup = self.coachinggroup
+ self.rcoach.save()
self.factory = RequestFactory()
self.password = faker.word()
self.ucoach.set_password(self.password)
@@ -280,6 +283,9 @@ class PermissionsViewTests(TestCase):
rowerplan='coach')
self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach)
+ self.coachinggroup = CoachingGroup.objects.create()
+ self.rcoach.mycoachgroup = self.coachinggroup
+ self.rcoach.save()
self.factory = RequestFactory()
self.ucoachpassword = faker.word()
self.ucoach.set_password(self.ucoachpassword)
@@ -458,7 +464,7 @@ class PermissionsViewTests(TestCase):
## Coach can edit on behalf of athlete if permitted
def test_coach_edit_athlete_settings(self):
self.rbasic.team.add(self.teamcoach)
- self.rbasic.coaches.add(self.rcoach)
+ self.rbasic.coachinggroups.add(self.coachinggroup)
login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword)
self.assertTrue(login)
@@ -483,7 +489,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(self,mocked_df):
self.rbasic.team.add(self.teamcoach)
- self.rbasic.coaches.add(self.rcoach)
+ self.rbasic.coachinggroups.add(self.coachinggroup)
login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword)
self.assertTrue(login)
@@ -523,7 +529,8 @@ class PermissionsViewTests(TestCase):
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
def test_coach_edit_athlete_upload(self,mocked_sqlalchemy,mocked_getsmallrowdata_db):
self.rbasic.team.add(self.teamcoach)
- self.rbasic.coaches.add(self.rcoach)
+ self.rbasic.coachinggroups.add(self.coachinggroup)
+
login = self.c.login(username=self.ucoach.username, password=self.ucoachpassword)
self.assertTrue(login)
diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz
index 7256d941..39549454 100644
Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ
diff --git a/rowers/views/teamviews.py b/rowers/views/teamviews.py
index 77827712..27427c69 100644
--- a/rowers/views/teamviews.py
+++ b/rowers/views/teamviews.py
@@ -185,14 +185,16 @@ def rower_teams_view(request,message='',successmessage=''):
invitedathletes = [rekwest.user for rekwest in mycoachoffers]
invitedcoaches = [rekwest.coach for rekwest in mycoachrequests]
- coaches = rower_get_coaches(r)
+ coaches = teams.rower_get_coaches(r)
potentialcoaches = [t.manager for t in memberteams if t.manager not in coaches ]
potentialcoaches = [c for c in potentialcoaches if c.rower not in invitedcoaches]
coachees = teams.coach_getcoachees(r)
potentialathletes = Rower.objects.filter(
team__in=myteams).exclude(
- user__in=invitedathletes).exclude(user=request.user)
+ user__in=invitedathletes).exclude(
+ user=request.user
+ ).exclude(coachinggroups__in=[request.user.rower.mycoachgroup])
# clubsize = teams.count_invites(request.user)+teams.count_club_members(request.user)
@@ -336,16 +338,16 @@ def offer_coaching_view(request,userid):
coach = getrequestrower(request)
- res,text = teams.create_coaching_invite(coach,u)
+ res,text = teams.create_coaching_offer(coach,u)
if res:
- message.info(request,text)
+ messages.info(request,text)
else:
messages.error(request,text)
url = reverse('rower_teams_view')
- return HttpResponseRedirecet(url)
+ return HttpResponseRedirect(url)
@login_required()
def reject_revoke_coach_request(request,id=0):
@@ -662,7 +664,7 @@ def rower_accept_coachoffer_view(request,code=None):
if code:
res, text = teams.process_coachoffer_code(request.user,code)
if res:
- message.info(request,text)
+ messages.info(request,text)
else:
messages.error(request,text)
diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py
index e6528084..557927aa 100644
--- a/rowers/views/workoutviews.py
+++ b/rowers/views/workoutviews.py
@@ -1,5 +1,5 @@
from statements import *
-
+import rowers.teams as teams
# Show the EMpower Oarlock generated Stroke Profile
@user_passes_test(ispromember,login_url="/rowers/paidplans/",
@@ -4235,7 +4235,7 @@ def team_workout_upload_view(request,message="",
rowerform = TeamInviteForm(request.POST)
rowerform.fields.pop('email')
- rowers = Rower.objects.filter(coaches__in=[request.user.rower]).distinct()
+ rowers = Rower.objects.filter(coachinggroups__in=[r.mycoachgroup]).distinct()
rowerform.fields['user'].queryset = User.objects.filter(rower__in=rowers).distinct()
if form.is_valid():
f = request.FILES['file']
@@ -4246,7 +4246,7 @@ def team_workout_upload_view(request,message="",
workouttype = form.cleaned_data['workouttype']
if rowerform.is_valid():
u = rowerform.cleaned_data['user']
- if u and request.user.rower in u.rower.coaches.all():
+ if u and request.user.rower in teams.rower_get_coaches(u.rower):
r = getrower(u)
else:
message = 'Please select a rower'