diff --git a/management/context_processors.py b/management/context_processors.py index 05d4dd0..a1d77a4 100644 --- a/management/context_processors.py +++ b/management/context_processors.py @@ -126,6 +126,7 @@ _NAV_SECTIONS = { "invoice_list": "invoice_list", "form_list": "form_list", "submission_list": "form_list", + "evaluations": "evaluations", "club_settings": "club_settings", "onboarding_requirement_list": "onboarding_requirement_list", "onboarding_requirement_create": "onboarding_requirement_list", @@ -171,6 +172,7 @@ _TOP_SECTION = { "discount_list": "finance", "invoice_list": "finance", "form_list": "settings", + "evaluations": "settings", "club_settings": "settings", "onboarding_requirement_list": "settings", "role_list": "settings", diff --git a/management/templates/management/_nav_items.html b/management/templates/management/_nav_items.html index 902596c..f85ca98 100644 --- a/management/templates/management/_nav_items.html +++ b/management/templates/management/_nav_items.html @@ -100,6 +100,12 @@ {% trans "Positions" %} {% endif %} {% trans "Referee levels" %} + {% comment %} + Deliberately not behind a waffle flag like Forms above -- this is a standing + "not built yet" reminder, so it stays visible rather than disappearing until + someone remembers to flip a flag on. See management.views.EvaluationsComingSoonView. + {% endcomment %} + {% trans "Evaluations" %} {% trans "Soon" %} {% if is_club_admin %} {% if forms_enabled %} {% trans "Forms" %} diff --git a/management/tests.py b/management/tests.py index a484d63..0bccba4 100644 --- a/management/tests.py +++ b/management/tests.py @@ -6716,6 +6716,42 @@ class FeatureGatedSectionsTests(ManagementTestBase): self.assertNotContains(response, "Forms") +class EvaluationsComingSoonViewTests(ManagementTestBase): + """Placeholder nav entry/page for player evaluations (design: ARCHITECTURE.md + §5.8) -- see management.views.EvaluationsComingSoonView.""" + + def make_plain_staff(self, email="physio-eval@example.com"): + staff_user = User.objects.create_user(email=email, password="pw-secret-123") + staff_member = Member.objects.create(user=staff_user, first_name="Pat", last_name="Physio") + ClubMembership.objects.create(club=self.club, member=staff_member, season=self.season, status=ClubMembership.StatusChoices.ACTIVE) + team = Team.objects.create(club=self.club, name="Physio Team", short_name="PHY") + position = Position.objects.create(club=self.club, name="Physio", short_name="PH", staff_position=True, management_position=False) + StaffAssignment.objects.create(team=team, member=staff_member, season=self.season, position=position) + return staff_user + + def test_member_admin_can_reach_it(self): + self.client.force_login(self.admin_user) + + response = self.club_get("evaluations") + + self.assertEqual(response.status_code, 200) + self.assertContains(response, "Player evaluations") + + def test_plain_staff_gets_403(self): + self.client.force_login(self.make_plain_staff()) + + response = self.club_get("evaluations") + + self.assertEqual(response.status_code, 403) + + def test_nav_shows_the_placeholder_unconditionally_no_flag_needed(self): + self.client.force_login(self.admin_user) + + response = self.club_get("club_settings") + + self.assertContains(response, "Evaluations") + + RBIHF_SAMPLE_HTML = """