Skip to content

Commit

Permalink
fix: Clear page permission cache on page create (#6866)
Browse files Browse the repository at this point in the history
* Clear page permission cache on page create
* Correct changelog entry
* Update test_add_page.py
* Update CHANGELOG.rst

Co-authored-by: Mark Walker <theshow@gmail.com>
  • Loading branch information
g3rb3n and marksweb committed Oct 12, 2022
1 parent 9e3c579 commit e59c179
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 2 deletions.
5 changes: 3 additions & 2 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ Changelog
unreleased
==========

* Allow to partially override ``CMS_CACHE_DURATIONS``
* Add support for tel: and mailto: URIs in Advanced Page Settings redirect field.
* Make javascript dark mode functions available to popups as CMS.API.getColorScheme
and CMS.API.setColorScheme
* Unlocalize page and node ids when rendering the page tree in the admin (#7175)
* Add support for tel: and mailto: URIs in Advanced Page Settings redirect field.
* Allow to partially override ``CMS_CACHE_DURATIONS``
* Fixed permission denied error after page create (#6866)

3.11.0 (2022-08-02)
===================
Expand Down
1 change: 1 addition & 0 deletions cms/models/pagemodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,7 @@ def save(self, **kwargs):
self.changed_by = get_current_user_name()

if created:
clear_permission_cache()
self.created_by = self.changed_by
super().save(**kwargs)
if created and get_cms_setting('PERMISSION'):
Expand Down
87 changes: 87 additions & 0 deletions cms/tests/test_add_page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import logging

from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site

from cms import api
from cms.models import PagePermission
from cms.test_utils.testcases import CMSTestCase

logger = logging.getLogger(__name__)
User = get_user_model()
language = "en"


class AddPageTestCase(CMSTestCase):

def add_permission(self, app_label, model, codename):
content_type = ContentType.objects.get(
app_label=app_label,
model=model,
)
permission = {
"codename": codename,
"content_type": content_type,
}
permission = Permission.objects.get(**permission)
self.group.permissions.add(permission)

def setUp(self):
template = settings.CMS_TEMPLATES[0][0]
site = Site.objects.get(pk=1)
page = api.create_page("Title", template, language, site=site)
self.page = page

group = Group.objects.create(name="editors")
self.group = group

user = User.objects.create_user("editor", password="password", email='editor@example.com')
user.is_staff = True
user.groups.add(group)
user.save()
self.user = user

self.add_permission("cms", "page", "add_page")
self.add_permission("cms", "page", "change_page")
self.add_permission("cms", "page", "delete_page")
self.add_permission("cms", "page", "publish_page")
self.add_permission("cms", "page", "view_page")

PagePermission.objects.create(group=group, page=page)

def tearDown(self):
self.group.delete()
self.user.delete()

def test_add_page(self):
self.client.force_login(self.user)

response = self.client.get('/{}/admin/'.format(language))
self.assertEqual(response.status_code, 200)

response = self.client.get("/{}/admin/cms/page/".format(language))
self.assertEqual(response.status_code, 200)

response = self.client.get("/{}/admin/cms/page/add/?parent_node={}".format(language, self.page.node.pk))
self.assertEqual(response.status_code, 200)

data = {
"language": language,
"source": "",
"title": "test",
"slug": "test",
"menu_title": "",
"page_title": "",
"meta_description": "",
"parent_node": self.page.node.pk,
"_continue": "Save and continue editing"
}
response = self.client.post("/{}/admin/cms/page/add/?language={}&parent_node={}".format(language, language, self.page.node.pk), data)
self.assertEqual(response.status_code, 302)

location = response.get('Location')
response = self.client.get(location)
self.assertEqual(response.status_code, 200)

0 comments on commit e59c179

Please sign in to comment.