From 86890a8a73fde6eb2dfd8d5c493b2c6fa4e630a7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 4 Sep 2022 17:53:16 +0200 Subject: [PATCH] fixes for coach trial --- rowers/models.py | 7 +++++ rowers/rower_rules.py | 13 +++++++-- rowers/tasks.py | 15 ++++++++++ rowers/teams.py | 27 ++++++++---------- rowers/templates/document_form.html | 42 ++++++++++++++-------------- rowers/templates/menu_analytics.html | 2 +- rowers/templates/menu_workouts.html | 2 +- rowers/templatetags/rowerfilters.py | 11 ++++++-- rowers/tests/test_api.py | 1 + rowers/urls.py | 6 ++++ rowers/views/analysisviews.py | 2 +- rowers/views/importviews.py | 6 ++-- rowers/views/paymentviews.py | 2 +- rowers/views/statements.py | 11 +++++--- rowers/views/workoutviews.py | 4 +-- 15 files changed, 97 insertions(+), 54 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index a5ea5506..7446bb36 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -531,6 +531,13 @@ class TeamInviteForm(ModelForm): user = UserFullnameChoiceField(queryset=User.objects.all(), required=False) email = forms.EmailField(required=False) + def __init__(self, *args, **kwargs): + userid = kwargs.pop('userid',0) + super(TeamInviteForm, self).__init__(*args, **kwargs) + if userid: + self.fields['user'].initial = userid + + class Meta: model = TeamInvite fields = ['user', 'email'] diff --git a/rowers/rower_rules.py b/rowers/rower_rules.py index c323369f..9a9327a7 100644 --- a/rowers/rower_rules.py +++ b/rowers/rower_rules.py @@ -138,6 +138,12 @@ def is_staff(user): # pragma: no cover @rules.predicate def is_coach(user): + if user is None: + return False + if user.is_anonymous: + return False + if user.rower.coachtrialexpires >= timezone.now().date(): + return True return user.rower.rowerplan in ['coach', 'freecoach'] @@ -157,6 +163,9 @@ def is_planmember(user): except AttributeError: # pragma: no cover return False + if user.rower.coachtrialexpires >= timezone.now().date(): + return True + return r.rowerplan in ['coach', 'plan'] # freecoach? @@ -198,7 +207,7 @@ def is_coachtrial(user): return False # pragma: no cover -ispromember = is_promember | is_protrial +ispromember = is_promember | is_protrial | is_coach | is_coachtrial can_have_teams = ispromember | is_coach | is_coachtrial @@ -251,7 +260,7 @@ def is_plantrial(user): isplanmember = is_planmember | is_plantrial -iscoachmember = is_coach | is_coachtrial +iscoachmember = is_coachtrial | is_coach @rules.predicate diff --git a/rowers/tasks.py b/rowers/tasks.py index 1b44555d..4c6ed903 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -314,6 +314,21 @@ def summaryfromsplitdata(splitdata, data, filename, sep='|', workouttype='rower' return sums, sa, results +@app.task +def handle_remove_workouts_team(ws, t, debug=False, **kwargs): + for w in ws: + w.team.remove(t) + + return 1 + +@app.task +def handle_add_workouts_team(ws, t, debug=False, **kwargs): + + for w in ws: + w.team.add(t) + + return 1 + @app.task def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs): authorizationstring = str('Bearer ' + workout.user.tptoken) diff --git a/rowers/teams.py b/rowers/teams.py index 83f214cf..0218ce8f 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -42,20 +42,7 @@ queuehigh = django_rq.get_queue('low') inviteduration = 14 # days - -def handle_remove_workouts_team(ws, t): - for w in ws: - w.team.remove(t) - - return 1 - - -def handle_add_workouts_team(ws, t): - - for w in ws: - w.team.add(t) - - return 1 +from rowers.tasks import handle_remove_workouts_team, handle_add_workouts_team def update_team(t, name, manager, private, notes, viewing): @@ -128,10 +115,17 @@ def add_member(id, rower): except ValidationError as e: # pragma: no cover return(0, "Couldn't add member: "+str(e.message)) + # if team manager is coach + if is_coach(t.manager): + result = add_coach(t.manager.rower, rower) + # code to add all workouts ws = Workout.objects.filter(user=rower) - _ = handle_add_workouts_team(ws, t) + _ = myqueue( + queuehigh, + handle_add_workouts_team, + ws, t) # code to add plannedsessions plannedsessions = PlannedSession.objects.filter( @@ -154,7 +148,8 @@ def remove_member(id, rower): # remove the team from rower's workouts: ws = Workout.objects.filter(user=rower, team=t) - _ = handle_remove_workouts_team(ws, t) + + _ = myqueue(queuehigh,handle_remove_workouts_team,ws, t) # set_teamplanexpires(rower) return (id, 'Member removed') diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 2a6befb5..85d7be01 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -25,7 +25,7 @@

Upload Workout File

- {% if user.is_authenticated and user|is_manager %} + {% if user.is_authenticated and user|coach_rowers %}

Looking for Team Manager Upload?

{% endif %} @@ -50,7 +50,7 @@

{{ optionsform.as_table }} - +

@@ -60,7 +60,7 @@ If you check "make private", this workout will not be visible to your followers and will not show up in your teams' workouts list. With the Landing Page option, you can select to which (workout related) page you will be taken after a successfull upload.

- +

If you don't have a workout file but have written down the splits, you can create a workout file yourself from this template @@ -68,7 +68,7 @@

Select Files with the File button or drag them on the marked area

- + @@ -91,16 +91,16 @@ $( document ).ready(function() { || $(this).val() == 'churchboat' ) { $('#id_boattype').toggle(true); - } else { + } else { $('#id_boattype').toggle(false); - $('#id_boattype').val('1x'); + $('#id_boattype').val('1x'); } }); -$('#id_workouttype').change(); +$('#id_workouttype').change(); }); - +