diff --git a/src/teams/tests/test_base_views.py b/src/teams/tests/test_base_views.py index b18f84d81..04fa88ad3 100644 --- a/src/teams/tests/test_base_views.py +++ b/src/teams/tests/test_base_views.py @@ -22,7 +22,7 @@ def setUpTestData(cls) -> None: super().setUpTestData() cls.categories = cls.bootstrap.create_camp_info_categories(camp=cls.camp, teams=cls.teams) - cls.bootstrap.create_camp_info_items(camp=cls.camp,categories=cls.categories) + cls.bootstrap.create_camp_info_items(camp=cls.camp, categories=cls.categories) permission_content_type = ContentType.objects.get_for_model(CampPermission) cls.users[4].user_permissions.add( @@ -31,40 +31,53 @@ def setUpTestData(cls) -> None: codename="noc_team_lead", ), ) + def test_team_general_view(self) -> None: """Test the team general view.""" - url = reverse("teams:general", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:general", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 def test_team_list_view(self) -> None: """Test the team list view.""" - url = reverse("teams:list", kwargs={ - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:list", + kwargs={ + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 def test_team_manage_view(self) -> None: """Test the team manage view.""" self.client.force_login(self.users[4]) - url = reverse("teams:manage", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:manage", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 def test_team_join_leave_view(self) -> None: """Test the team member join and leave view.""" self.client.force_login(self.users[0]) - url = reverse("teams:join", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:join", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 @@ -86,10 +99,13 @@ def test_team_join_leave_view(self) -> None: self.assertEqual(len(matches), 1, "member was able to join twice.") # Try to join a team that does not need members - url = reverse("teams:join", kwargs={ - "team_slug": self.teams["orga"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:join", + kwargs={ + "team_slug": self.teams["orga"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url, follow=True) content = response.content.decode() @@ -99,10 +115,13 @@ def test_team_join_leave_view(self) -> None: self.assertEqual(len(matches), 1, "member was able to join a team which does not need members.") # Test leaving the team. - url = reverse("teams:leave", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:leave", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 @@ -117,10 +136,13 @@ def test_team_join_leave_view(self) -> None: def test_team_approve_remove_views(self) -> None: """Test team member approve and remove views.""" self.client.force_login(self.users[8]) - url = reverse("teams:join", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:join", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.post(path=url) assert response.status_code == 302 @@ -128,11 +150,14 @@ def test_team_approve_remove_views(self) -> None: self.client.force_login(self.users[4]) # Approve the team member - url = reverse("teams:member_approve", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "pk": member.pk, - }) + url = reverse( + "teams:member_approve", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "pk": member.pk, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 @@ -143,13 +168,15 @@ def test_team_approve_remove_views(self) -> None: matches = [s for s in rows if "Team member approved" in str(s)] self.assertEqual(len(matches), 1, "failed to approve a team member.") - # Remove the team member - url = reverse("teams:member_remove", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "pk": member.pk, - }) + url = reverse( + "teams:member_remove", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "pk": member.pk, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 diff --git a/src/teams/tests/test_guide_views.py b/src/teams/tests/test_guide_views.py index 2fb8ffb3a..4ee5a2aa3 100644 --- a/src/teams/tests/test_guide_views.py +++ b/src/teams/tests/test_guide_views.py @@ -16,7 +16,6 @@ def setUpTestData(cls) -> None: # first add users and other basics super().setUpTestData() - def test_team_guide_views_permission(self) -> None: """Test the team guide view.""" self.client.force_login(self.users[0]) @@ -38,4 +37,3 @@ def test_team_guide_views_permission(self) -> None: url = reverse("teams:guide_print", kwargs={"team_slug": self.teams["noc"].slug, "camp_slug": self.camp.slug}) response = self.client.get(path=url, follow=True) assert response.status_code == 200 - diff --git a/src/teams/tests/test_info_views.py b/src/teams/tests/test_info_views.py index f9f49083c..bdceedc5b 100644 --- a/src/teams/tests/test_info_views.py +++ b/src/teams/tests/test_info_views.py @@ -22,7 +22,7 @@ def setUpTestData(cls) -> None: super().setUpTestData() cls.categories = cls.bootstrap.create_camp_info_categories(camp=cls.camp, teams=cls.teams) - cls.bootstrap.create_camp_info_items(camp=cls.camp,categories=cls.categories) + cls.bootstrap.create_camp_info_items(camp=cls.camp, categories=cls.categories) permission_content_type = ContentType.objects.get_for_model(CampPermission) cls.users[4].user_permissions.add( @@ -34,33 +34,42 @@ def setUpTestData(cls) -> None: def test_team_info_view_permissions(self) -> None: """Test the team info view permissions.""" - self.client.force_login(self.users[0]) # Non noc team member + self.client.force_login(self.users[0]) # Non noc team member # Test access control to the views - url = reverse("teams:info_categories", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:info_categories", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 403 def test_team_info_views(self) -> None: """Test the team info views.""" - self.client.force_login(self.users[4]) # Noc teamlead + self.client.force_login(self.users[4]) # Noc teamlead # Test info categories page - url = reverse("teams:info_categories", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:info_categories", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(url) assert response.status_code == 200 # Test info categories create page - url = reverse("teams:info_item_create", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "category_anchor": self.categories["noc"].anchor, - }) + url = reverse( + "teams:info_item_create", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "category_anchor": self.categories["noc"].anchor, + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -72,18 +81,21 @@ def test_team_info_views(self) -> None: "body": "Some test info", "anchor": "test", "weight": 100, - }, + }, follow=True, ) assert response.status_code == 200 # Test info categories edit page - url = reverse("teams:info_item_update", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "category_anchor": self.categories["noc"].anchor, - "item_anchor": "test", - }) + url = reverse( + "teams:info_item_update", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "category_anchor": self.categories["noc"].anchor, + "item_anchor": "test", + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -95,18 +107,21 @@ def test_team_info_views(self) -> None: "body": "Some test info", "anchor": "test", "weight": 101, - }, + }, follow=True, ) assert response.status_code == 200 # Test info categories delete page - url = reverse("teams:info_item_delete", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "category_anchor": self.categories["noc"].anchor, - "item_anchor": "test", - }) + url = reverse( + "teams:info_item_delete", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "category_anchor": self.categories["noc"].anchor, + "item_anchor": "test", + }, + ) response = self.client.get(url) assert response.status_code == 200 diff --git a/src/teams/tests/test_shift_views.py b/src/teams/tests/test_shift_views.py index a7fb212af..be5e7ce1c 100644 --- a/src/teams/tests/test_shift_views.py +++ b/src/teams/tests/test_shift_views.py @@ -29,35 +29,55 @@ def setUpTestData(cls) -> None: ), ) + def test_team_shift_requires_login(self) -> None: + """Test viewing users team shifts requires to be signed in""" + url = reverse( + "teams:user_shifts", + kwargs={ + "camp_slug": self.camp.slug, + }, + ) + response = self.client.get(url) + self.assertRedirects(response, f"/login/?next={url}") + def test_team_shift_view_permissions(self) -> None: """Test the team shift view permissions.""" - self.client.force_login(self.users[0]) # Non noc team member + self.client.force_login(self.users[0]) # Non noc team member # Test access control to the views - url = reverse("teams:shift_create", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:shift_create", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 302 def test_team_user_shift_view(self) -> None: """Test the user shift view.""" - self.client.force_login(self.users[4]) # Noc teamlead - url = reverse("teams:user_shifts", kwargs={ - "camp_slug": self.camp.slug, - }) + self.client.force_login(self.users[4]) # Noc teamlead + url = reverse( + "teams:user_shifts", + kwargs={ + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 def test_team_shift_views(self) -> None: """Test the team shift views.""" - self.client.force_login(self.users[4]) # Noc teamlead + self.client.force_login(self.users[4]) # Noc teamlead # Test creating a shift - url = reverse("teams:shift_create", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:shift_create", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -67,7 +87,7 @@ def test_team_shift_views(self) -> None: "from_datetime": self.camp.buildup.lower.date(), "to_datetime": self.camp.buildup.lower + timezone.timedelta(hours=1), "people_required": 1, - }, + }, follow=True, ) assert response.status_code == 200 @@ -84,7 +104,7 @@ def test_team_shift_views(self) -> None: "from_datetime": self.camp.buildup.lower, "to_datetime": self.camp.buildup.lower, "people_required": 1, - }, + }, follow=True, ) assert response.status_code == 200 @@ -101,7 +121,7 @@ def test_team_shift_views(self) -> None: "from_datetime": self.camp.buildup.lower + timezone.timedelta(hours=1), "to_datetime": self.camp.buildup.lower, "people_required": 1, - }, + }, follow=True, ) assert response.status_code == 200 @@ -112,10 +132,13 @@ def test_team_shift_views(self) -> None: self.assertEqual(len(matches), 1, "team shift Start can not be before to end") # Test Creating multiple shifts - url = reverse("teams:shift_create_multiple", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:shift_create_multiple", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -127,7 +150,7 @@ def test_team_shift_views(self) -> None: "shift_length": 60, "number_of_shifts": 10, "people_required": 5, - }, + }, follow=True, ) assert response.status_code == 200 @@ -143,11 +166,14 @@ def test_team_shift_views(self) -> None: shift_id = int(shift_link["href"].split("/")[5]) # Test the update view - url = reverse("teams:shift_update", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "pk": shift_id, - }) + url = reverse( + "teams:shift_update", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "pk": shift_id, + }, + ) from_datetime = self.camp.buildup.lower to_datetime = from_datetime + timezone.timedelta(hours=2) @@ -160,7 +186,7 @@ def test_team_shift_views(self) -> None: "from_datetime": from_datetime, "to_datetime": to_datetime, "people_required": 2, - }, + }, follow=True, ) assert response.status_code == 200 @@ -171,11 +197,14 @@ def test_team_shift_views(self) -> None: self.assertEqual(row, "2", "team shift people required count does not return 2 entries after update") # Test the delete view - url = reverse("teams:shift_delete", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - "pk": shift_id, - }) + url = reverse( + "teams:shift_delete", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + "pk": shift_id, + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -188,7 +217,7 @@ def test_team_shift_views(self) -> None: def test_team_shift_actions(self) -> None: """Test the team shift actions.""" - self.client.force_login(self.users[4]) # Noc teamlead + self.client.force_login(self.users[4]) # Noc teamlead team_shift_1 = TeamShift( team=self.teams["noc"], @@ -209,11 +238,14 @@ def test_team_shift_actions(self) -> None: ) team_shift_2.save() - url = reverse("teams:shift_member_take", kwargs={ - "team_slug": team_shift_1.team.slug, - "camp_slug": self.camp.slug, - "pk": team_shift_1.pk, - }) + url = reverse( + "teams:shift_member_take", + kwargs={ + "team_slug": team_shift_1.team.slug, + "camp_slug": self.camp.slug, + "pk": team_shift_1.pk, + }, + ) response = self.client.get( path=url, follow=True, @@ -225,11 +257,14 @@ def test_team_shift_actions(self) -> None: matches = [s for s in rows if "Unassign me" in str(s)] self.assertEqual(len(matches), 1, "team shift assign failed") - url = reverse("teams:shift_member_take", kwargs={ - "team_slug": team_shift_1.team.slug, - "camp_slug": self.camp.slug, - "pk": team_shift_2.pk, - }) + url = reverse( + "teams:shift_member_take", + kwargs={ + "team_slug": team_shift_1.team.slug, + "camp_slug": self.camp.slug, + "pk": team_shift_2.pk, + }, + ) response = self.client.get( path=url, follow=True, @@ -241,11 +276,14 @@ def test_team_shift_actions(self) -> None: matches = [s for s in rows if "overlapping" in str(s)] self.assertEqual(len(matches), 1, "team shift double assign failed to fail") - url = reverse("teams:shift_member_drop", kwargs={ - "team_slug": team_shift_1.team.slug, - "camp_slug": self.camp.slug, - "pk": team_shift_1.pk, - }) + url = reverse( + "teams:shift_member_drop", + kwargs={ + "team_slug": team_shift_1.team.slug, + "camp_slug": self.camp.slug, + "pk": team_shift_1.pk, + }, + ) response = self.client.get( path=url, diff --git a/src/teams/tests/test_task_views.py b/src/teams/tests/test_task_views.py index 80ca34690..b22168a22 100644 --- a/src/teams/tests/test_task_views.py +++ b/src/teams/tests/test_task_views.py @@ -29,30 +29,39 @@ def setUpTestData(cls) -> None: def test_team_task_view_permissions(self) -> None: """Test the team shift view permissions.""" - self.client.force_login(self.users[0]) # Non noc team member + self.client.force_login(self.users[0]) # Non noc team member # Test access control to the views - url = reverse("teams:task_create", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:task_create", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 403 def test_team_task_views(self) -> None: """Test the team task views.""" - self.client.force_login(self.users[4]) # Noc team tasker - url = reverse("teams:tasks", kwargs={ - "camp_slug": self.camp.slug, - "team_slug": self.teams["noc"].slug, - }) + self.client.force_login(self.users[4]) # Noc team tasker + url = reverse( + "teams:tasks", + kwargs={ + "camp_slug": self.camp.slug, + "team_slug": self.teams["noc"].slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 # Test creating a shift - url = reverse("teams:task_create", kwargs={ - "team_slug": self.teams["noc"].slug, - "camp_slug": self.camp.slug, - }) + url = reverse( + "teams:task_create", + kwargs={ + "team_slug": self.teams["noc"].slug, + "camp_slug": self.camp.slug, + }, + ) response = self.client.get(url) assert response.status_code == 200 @@ -63,7 +72,7 @@ def test_team_task_views(self) -> None: "description": "Test task description", "when_0": self.camp.buildup.lower, "when_1": self.camp.buildup.upper, - }, + }, follow=True, ) assert response.status_code == 200 @@ -71,10 +80,13 @@ def test_team_task_views(self) -> None: task = response.context["task"] # Test if the task got to the list. - url = reverse("teams:tasks", kwargs={ - "camp_slug": self.camp.slug, - "team_slug": self.teams["noc"].slug, - }) + url = reverse( + "teams:tasks", + kwargs={ + "camp_slug": self.camp.slug, + "team_slug": self.teams["noc"].slug, + }, + ) response = self.client.get(path=url) content = response.content.decode() soup = BeautifulSoup(content, "html.parser") @@ -82,11 +94,14 @@ def test_team_task_views(self) -> None: self.assertEqual(len(rows), 1, "team task list does not return 1 entries after create") # Test updating a task. - url = reverse("teams:task_update", kwargs={ - "camp_slug": self.camp.slug, - "team_slug": self.teams["noc"].slug, - "slug": task.slug, - }) + url = reverse( + "teams:task_update", + kwargs={ + "camp_slug": self.camp.slug, + "team_slug": self.teams["noc"].slug, + "slug": task.slug, + }, + ) response = self.client.get(path=url) assert response.status_code == 200 @@ -99,34 +114,37 @@ def test_team_task_views(self) -> None: "when_0": self.camp.buildup.lower, "when_1": self.camp.buildup.upper, "completed": True, - }, + }, follow=True, ) assert response.status_code == 200 # Test submitting a comment - url = reverse("teams:task_detail", kwargs={ - "camp_slug": self.camp.slug, - "team_slug": self.teams["noc"].slug, - "slug": task.slug, - }) + url = reverse( + "teams:task_detail", + kwargs={ + "camp_slug": self.camp.slug, + "team_slug": self.teams["noc"].slug, + "slug": task.slug, + }, + ) response = self.client.post( - path=url, - data={ - "comment": "Some test comment", - }, - follow=True, - ) + path=url, + data={ + "comment": "Some test comment", + }, + follow=True, + ) assert response.status_code == 200 response = self.client.post( - path=url, - data={ - "comment": "", - }, - follow=True, - ) + path=url, + data={ + "comment": "", + }, + follow=True, + ) assert response.status_code == 200 # Test if the page returned a failure diff --git a/src/teams/views/base.py b/src/teams/views/base.py index 6f6adc7cd..3d2b3d375 100644 --- a/src/teams/views/base.py +++ b/src/teams/views/base.py @@ -1,4 +1,5 @@ """Base view for teams.""" + from __future__ import annotations import logging @@ -33,6 +34,7 @@ class TeamListView(CampViewMixin, ListView): """View for the list of teams.""" + template_name = "team_list.html" model = Team context_object_name = "teams" @@ -47,7 +49,7 @@ def get_queryset(self, *args, **kwargs) -> QuerySet: # also the getting of team leads and their profiles do not use the prefetching # :( /tyk - def get_context_data(self, *, object_list: list|None =None, **kwargs) -> dict: + def get_context_data(self, *, object_list: list | None = None, **kwargs) -> dict: """Method for adding user_teams to the context.""" context = super().get_context_data(object_list=object_list, **kwargs) if self.request.user.is_authenticated: @@ -59,6 +61,7 @@ def get_context_data(self, *, object_list: list|None =None, **kwargs) -> dict: class TeamGeneralView(CampViewMixin, IsTeamPermContextMixin, DetailView): """General view for a team.""" + template_name = "team_general.html" context_object_name = "team" model = Team @@ -75,6 +78,7 @@ def get_context_data(self, **kwargs) -> dict: class TeamManageView(CampViewMixin, EnsureTeamLeadMixin, IsTeamPermContextMixin, UpdateView): """View for mananaging team members.""" + model = Team template_name = "team_manage.html" fields = ( @@ -113,6 +117,7 @@ def form_valid(self, form: Form) -> HttpResponseRedirect: class FixIrcAclView(LoginRequiredMixin, CampViewMixin, IsTeamPermContextMixin, UpdateView): """View for fixing IRC ACL's.""" + template_name = "fix_irc_acl.html" model = Team fields = () diff --git a/src/teams/views/guide.py b/src/teams/views/guide.py index e2f510a09..4fbb52608 100644 --- a/src/teams/views/guide.py +++ b/src/teams/views/guide.py @@ -1,4 +1,5 @@ """Views for the guide of the teams application.""" + from __future__ import annotations from django.contrib.auth.mixins import LoginRequiredMixin @@ -13,6 +14,7 @@ class TeamGuideView(LoginRequiredMixin, CampViewMixin, UserPassesTestMixin, IsTeamPermContextMixin, DetailView): """View for the team guide.""" + template_name = "team_guide.html" context_object_name = "team" model = Team @@ -38,4 +40,5 @@ class TeamGuidePrintView(TeamGuideView): Includes permissions from TeamGuideView """ + template_name = "team_guide_print.html" diff --git a/src/teams/views/info.py b/src/teams/views/info.py index 06ee4153b..bbef1e3a7 100644 --- a/src/teams/views/info.py +++ b/src/teams/views/info.py @@ -1,4 +1,5 @@ """View for managing the team info pages.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -21,6 +22,7 @@ if TYPE_CHECKING: from django.forms import Form + class InfoCategoriesListView( TeamViewMixin, TeamInfopagerPermissionMixin, @@ -28,6 +30,7 @@ class InfoCategoriesListView( ListView, ): """Info Categories list view.""" + model = InfoCategory template_name = "team_info_categories.html" slug_field = "anchor" @@ -41,6 +44,7 @@ class InfoItemCreateView( CreateView, ): """Info item create view.""" + model = InfoItem template_name = "team_info_item_form.html" fields = ("headline", "body", "anchor", "weight") @@ -86,6 +90,7 @@ class InfoItemUpdateView( UpdateView, ): """Info item update view.""" + model = InfoItem template_name = "team_info_item_form.html" fields = ("headline", "body", "anchor", "weight") @@ -115,6 +120,7 @@ class InfoItemDeleteView( DeleteView, ): """View for deleting a info item.""" + model = InfoItem template_name = "team_info_item_delete_confirm.html" slug_field = "anchor" diff --git a/src/teams/views/members.py b/src/teams/views/members.py index 40a8f2365..54a382ea9 100644 --- a/src/teams/views/members.py +++ b/src/teams/views/members.py @@ -1,4 +1,5 @@ """Views for team members.""" + from __future__ import annotations import logging @@ -32,6 +33,7 @@ class TeamMembersView(CampViewMixin, IsTeamPermContextMixin, DetailView): """List view for team members.""" + template_name = "team_members.html" context_object_name = "team" model = Team @@ -41,6 +43,7 @@ class TeamMembersView(CampViewMixin, IsTeamPermContextMixin, DetailView): class TeamJoinView(LoginRequiredMixin, CampViewMixin, UpdateView): """View displayed when joining a team.""" + template_name = "team_join.html" model = Team fields = () @@ -78,6 +81,7 @@ def form_valid(self, form: Form) -> HttpResponseRedirect: class TeamLeaveView(LoginRequiredMixin, CampViewMixin, UpdateView): """View for leaving a team.""" + template_name = "team_leave.html" model = Team fields = () @@ -112,6 +116,7 @@ class TeamMemberRemoveView( UpdateView, ): """View for removing a team member.""" + template_name = "teammember_remove.html" model = TeamMember fields = () @@ -144,6 +149,7 @@ class TeamMemberApproveView( UpdateView, ): """View to approve team member.""" + template_name = "teammember_approve.html" model = TeamMember fields = () diff --git a/src/teams/views/mixins.py b/src/teams/views/mixins.py index 2ffc3388f..53db83a61 100644 --- a/src/teams/views/mixins.py +++ b/src/teams/views/mixins.py @@ -1,4 +1,5 @@ """Mixins for the teams application views.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -16,6 +17,7 @@ from django.http import HttpRequest from django.http import HttpResponse + class EnsureTeamLeadMixin: """Use to make sure request.user has team lead permission for the team specified by kwargs['team_slug'].""" @@ -53,6 +55,7 @@ def dispatch(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: class TeamViewMixin(CampViewMixin): """View mixin for all Team views.""" + def setup(self, *args, **kwargs) -> None: """Method for setting team object.""" super().setup(*args, **kwargs) diff --git a/src/teams/views/shifts.py b/src/teams/views/shifts.py index 5a361d8ae..d86197163 100644 --- a/src/teams/views/shifts.py +++ b/src/teams/views/shifts.py @@ -1,4 +1,5 @@ """View for shifts in teams application.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -40,6 +41,7 @@ class ShiftListView(LoginRequiredMixin, CampViewMixin, IsTeamPermContextMixin, ListView): """Shift list view.""" + model = TeamShift template_name = "team_shift_list.html" context_object_name = "shifts" @@ -66,7 +68,7 @@ def date_choices(camp: Camp) -> list: minute_choices = [] # To begin with we assume a shift can not be shorter than an hour shift_minimum_length = 60 - while index * shift_minimum_length < 60: # noqa: PLR2004 + while index * shift_minimum_length < 60: # noqa: PLR2004 minutes = int(index * shift_minimum_length) minute_choices.append(minutes) index += 1 @@ -94,12 +96,14 @@ def get_time_choices(date: str) -> list: class ShiftForm(forms.ModelForm): """Form for shifts.""" + class Meta: """Meta.""" + model = TeamShift fields = ("from_datetime", "to_datetime", "people_required") - def __init__(self, instance: TeamShift|None=None, **kwargs) -> None: + def __init__(self, instance: TeamShift | None = None, **kwargs) -> None: """Method for setting up the form.""" camp = kwargs.pop("camp") super().__init__(instance=instance, **kwargs) @@ -151,6 +155,7 @@ def save(self, commit=True) -> TeamShift: class ShiftCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamLeadMixin, IsTeamPermContextMixin, CreateView): """View for creating a single shift.""" + model = TeamShift template_name = "team_shift_form.html" form_class = ShiftForm @@ -184,6 +189,7 @@ def get_success_url(self) -> str: class ShiftUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamLeadMixin, IsTeamPermContextMixin, UpdateView): """View for updating a single shift.""" + model = TeamShift template_name = "team_shift_form.html" form_class = ShiftForm @@ -209,6 +215,7 @@ def get_success_url(self) -> str: class ShiftDeleteView(LoginRequiredMixin, CampViewMixin, EnsureTeamLeadMixin, IsTeamPermContextMixin, DeleteView): """View for deleting a shift.""" + model = TeamShift template_name = "team_shift_confirm_delete.html" active_menu = "shifts" @@ -230,7 +237,8 @@ def get_success_url(self) -> str: class MultipleShiftForm(forms.Form): """Form for creating multple shifts.""" - def __init__(self, instance: dict|None=None, **kwargs) -> None: + + def __init__(self, instance: dict | None = None, **kwargs) -> None: """Method for form init setting camp to kwargs.""" camp = kwargs.pop("camp") super().__init__(**kwargs) @@ -249,6 +257,7 @@ def __init__(self, instance: dict|None=None, **kwargs) -> None: class ShiftCreateMultipleView(LoginRequiredMixin, CampViewMixin, EnsureTeamLeadMixin, IsTeamPermContextMixin, FormView): """View for creating multiple shifts.""" + template_name = "team_shift_form.html" form_class = MultipleShiftForm active_menu = "shifts" @@ -304,6 +313,7 @@ def get_context_data(self, **kwargs) -> dict: class MemberTakesShift(LoginRequiredMixin, CampViewMixin, View): """View for adding a user to a shift.""" + http_methods = ("get",) def get(self, request: HttpRequest, **kwargs) -> HttpResponseRedirect: @@ -342,6 +352,7 @@ def get(self, request: HttpRequest, **kwargs) -> HttpResponseRedirect: class MemberDropsShift(LoginRequiredMixin, CampViewMixin, View): """View for remove a user from a shift.""" + http_methods = ("get",) def get(self, request: HttpRequest, **kwargs) -> HttpResponseRedirect: @@ -358,8 +369,9 @@ def get(self, request: HttpRequest, **kwargs) -> HttpResponseRedirect: return HttpResponseRedirect(reverse("teams:shifts", kwargs=kwargs)) -class UserShifts(CampViewMixin, TemplateView): +class UserShifts(LoginRequiredMixin, CampViewMixin, TemplateView): """View for showing shifts for current user.""" + template_name = "team_user_shifts.html" def get_context_data(self, **kwargs) -> dict: diff --git a/src/teams/views/tasks.py b/src/teams/views/tasks.py index ffe960275..4c413c9c9 100644 --- a/src/teams/views/tasks.py +++ b/src/teams/views/tasks.py @@ -1,4 +1,5 @@ """All views for the teams task application.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -25,8 +26,10 @@ if TYPE_CHECKING: from django.http import HttpRequest + class TeamTasksView(CampViewMixin, IsTeamPermContextMixin, DetailView): """List view of the team tasks.""" + template_name = "team_tasks.html" context_object_name = "team" model = Team @@ -36,14 +39,17 @@ class TeamTasksView(CampViewMixin, IsTeamPermContextMixin, DetailView): class TaskCommentForm(forms.ModelForm): """Form for commenting on a Task.""" + class Meta: """Meta.""" + model = TaskComment fields = ("comment",) class TaskDetailView(TeamViewMixin, IsTeamPermContextMixin, DetailView): """Task detail view.""" + template_name = "task_detail.html" context_object_name = "task" model = TeamTask @@ -75,8 +81,10 @@ def post(self, request: HttpRequest, **kwargs) -> HttpResponseRedirect: class TaskForm(forms.ModelForm): """Form for creating or edditing Tasks.""" + class Meta: """Meta.""" + model = TeamTask fields = ("name", "description", "when", "completed") @@ -97,6 +105,7 @@ class TaskCreateView( CreateView, ): """View for creating a team task.""" + model = TeamTask template_name = "task_form.html" form_class = TaskForm @@ -131,6 +140,7 @@ class TaskUpdateView( UpdateView, ): """Update task view used for updating tasks.""" + model = TeamTask template_name = "task_form.html" form_class = TaskForm