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'