diff --git a/aircox/tests/test_permissions.py b/aircox/tests/test_permissions.py index 2a2b51c..fad4316 100644 --- a/aircox/tests/test_permissions.py +++ b/aircox/tests/test_permissions.py @@ -1,5 +1,6 @@ import pytest from django.contrib.auth.models import User, Group +from django.urls import reverse @pytest.mark.django_db() @@ -21,7 +22,16 @@ def test_group_can_change_program(user, client, program): assert program_editors in Group.objects.all() assert not user.has_perm("aircox.%s" % program.change_permission_codename) user.groups.add(program_editors) - user.save() user = User.objects.get(pk=user.pk) # reload user in order to have permissions set assert program_editors in user.groups.all() assert user.has_perm("aircox.%s" % program.change_permission_codename) + + +@pytest.mark.django_db() +def test_group_change_program(user, client, program): + client.force_login(user) + response = client.get(reverse("program-edit", kwargs={"slug": program.slug})) + assert response.status_code == 403 + user.groups.add(program.editors) + response = client.get(reverse("program-edit", kwargs={"slug": program.slug})) + assert response.status_code == 200 diff --git a/aircox/urls.py b/aircox/urls.py index 0ad7df6..d732fd1 100755 --- a/aircox/urls.py +++ b/aircox/urls.py @@ -92,6 +92,11 @@ urls = [ views.ProgramDetailView.as_view(), name="program-detail", ), + path( + _("program//edit/"), + views.ProgramUpdateView.as_view(), + name="program-edit", + ), path( _("programs//episodes/"), views.EpisodeListView.as_view(), diff --git a/aircox/views/page.py b/aircox/views/page.py index 7a0ef42..6d1a929 100644 --- a/aircox/views/page.py +++ b/aircox/views/page.py @@ -138,3 +138,7 @@ class PageDetailView(BasePageDetailView): comment.page = self.object comment.save() return self.get(request, *args, **kwargs) + + +class PageUpdateView(PageDetailView): + pass diff --git a/aircox/views/program.py b/aircox/views/program.py index fb36d7d..9a82fab 100644 --- a/aircox/views/program.py +++ b/aircox/views/program.py @@ -1,8 +1,10 @@ from django.urls import reverse +from django.contrib.auth.mixins import UserPassesTestMixin + from ..models import Page, Program, StaticPage from .mixins import ParentMixin -from .page import PageDetailView, PageListView +from .page import PageDetailView, PageListView, PageUpdateView __all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"] @@ -27,6 +29,18 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView): return super().get_sidebar_queryset().filter(parent=self.program) +class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView): + model = Program + + def get_sidebar_queryset(self): + return super().get_sidebar_queryset().filter(parent=self.program) + + def test_func(self): + program = self.get_object() + print("XXX, aircox.%s" % program.change_permission_codename) + return self.request.user.has_perm("aircox.%s" % program.change_permission_codename) + + class ProgramListView(PageListView): model = Program attach_to_value = StaticPage.ATTACH_TO_PROGRAMS