passing tests again - now with coachinggroups
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
<td>
|
||||
<a
|
||||
class="button small green"
|
||||
href="/rowers/me/coacheerequest/{{ a.user.id }}/">Offer Coaching</a>
|
||||
href="/rowers/me/coachoffer/{{ a.user.id }}/">Offer Coaching</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
Binary file not shown.
@@ -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)
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user