import json from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import site from django.contrib.admin.utils import flatten_fieldsets from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.contrib.sites.models import Site from django.http import Http404, HttpResponseBadRequest, HttpResponseNotFound from django.test.utils import override_settings from django.utils.encoding import force_str, smart_str from djangocms_text.cms_plugins import TextPlugin from djangocms_text.models import Text from cms import api from cms.admin.forms import ChangePageForm from cms.api import add_plugin, create_page, create_page_content from cms.constants import TEMPLATE_INHERITANCE_MAGIC from cms.models import PageContent, PageUrl, UserSettings from cms.models.pagemodel import Page from cms.models.permissionmodels import GlobalPagePermission, PagePermission from cms.models.placeholdermodel import Placeholder from cms.test_utils import testcases as base from cms.test_utils.testcases import ( URL_CMS_PAGE_DELETE, URL_CMS_PAGE_PUBLISHED, CMSTestCase, ) from cms.toolbar.utils import get_object_edit_url from cms.utils.conf import get_cms_setting from cms.utils.i18n import get_language_list from cms.utils.urlutils import admin_reverse class AdminTestsBase(CMSTestCase): @property def page_admin_class(self): return site._registry[Page] @property def pagecontent_admin_class(self): return site._registry[PageContent] def _get_guys(self, admin_only=False, use_global_permissions=True): admin_user = self.get_superuser() if admin_only: return admin_user staff_user = self._get_staff_user(use_global_permissions) return admin_user, staff_user def _get_staff_user(self, use_global_permissions=True): USERNAME = "test" if get_user_model().USERNAME_FIELD == "email": normal_guy = get_user_model().objects.create_user(USERNAME, "test@test.com", "test@test.com") else: normal_guy = get_user_model().objects.create_user(USERNAME, "test@test.com", USERNAME) normal_guy.is_staff = True normal_guy.is_active = True perms = Permission.objects.filter( codename__in=["change_page", "change_title", "add_page", "add_title", "delete_page", "delete_title"] ) normal_guy.save() normal_guy.user_permissions.set(perms) if use_global_permissions: gpp = GlobalPagePermission.objects.create( user=normal_guy, can_change=True, can_delete=True, can_publish=True, can_change_advanced_settings=False, can_change_permissions=False, can_move_page=True, ) gpp.sites.set(Site.objects.all()) return normal_guy class AdminTestCase(AdminTestsBase): def test_extension_not_in_admin(self): admin_user, staff = self._get_guys() with self.login_user_context(admin_user): request = self.get_request(self.get_pages_admin_list_uri("en")) response = site.index(request) self.assertNotContains(response, "/mytitleextension/") self.assertNotContains(response, "/mypageextension/") @override_settings(CMS_PERMISSION=False) def test_2apphooks_with_same_namespace(self): PAGE1 = "Test Page" PAGE2 = "Test page 2" APPLICATION_URLS = "project.sampleapp.urls" admin_user, normal_guy = self._get_guys() current_site = Site.objects.get(pk=1) # The admin creates the page page = create_page(PAGE1, "nav_playground.html", "en", site=current_site, created_by=admin_user) page2 = create_page(PAGE2, "nav_playground.html", "en", site=current_site, created_by=admin_user) page.application_urls = APPLICATION_URLS page.application_namespace = "space1" page.save() page2.application_urls = APPLICATION_URLS page2.save() # The admin edits the page (change the page name for ex.) page_data = { "title": PAGE2, "slug": page2.get_slug("en"), "template": page2.template, "application_urls": "SampleApp", "application_namespace": "space1", } with self.login_user_context(admin_user): resp = self.client.post(base.URL_CMS_PAGE_ADVANCED_CHANGE % page.pk, page_data) self.assertEqual(resp.status_code, 302) self.assertEqual(Page.objects.filter(application_namespace="space1").count(), 1) resp = self.client.post(base.URL_CMS_PAGE_ADVANCED_CHANGE % page2.pk, page_data) self.assertEqual(resp.status_code, 200) page_data["application_namespace"] = "space2" resp = self.client.post(base.URL_CMS_PAGE_ADVANCED_CHANGE % page2.pk, page_data) self.assertEqual(resp.status_code, 302) def test_delete(self): admin_user = self.get_superuser() create_page("home", "nav_playground.html", "en", created_by=admin_user) page = create_page("delete-page", "nav_playground.html", "en", created_by=admin_user) create_page("child-page", "nav_playground.html", "en", created_by=admin_user, parent=page) body = page.get_placeholders("en").get(slot="body") add_plugin(body, "TextPlugin", "en", body="text") with self.login_user_context(admin_user): data = {"post": "yes"} response = self.client.post(URL_CMS_PAGE_DELETE % page.pk, data, follow=True) self.assertRedirects(response, self.get_pages_admin_list_uri("en")) def test_delete_diff_language(self): admin_user = self.get_superuser() create_page("home", "nav_playground.html", "en", created_by=admin_user) page = create_page("delete-page", "nav_playground.html", "en", created_by=admin_user) create_page("child-page", "nav_playground.html", "de", created_by=admin_user, parent=page) body = page.get_placeholders("en").get(slot="body") add_plugin(body, "TextPlugin", "en", body="text") with self.login_user_context(admin_user): data = {"post": "yes"} response = self.client.post(URL_CMS_PAGE_DELETE % page.pk, data, follow=True) # follow=True, since page changelist redirects to page content changelist self.assertRedirects(response, self.get_pages_admin_list_uri("en")) def test_search_fields(self): superuser = self.get_superuser() from django.contrib.admin import site with self.login_user_context(superuser): for model, admin_instance in site._registry.items(): if model._meta.app_label != "cms": continue if not admin_instance.search_fields: continue url = admin_reverse("cms_%s_changelist" % model._meta.model_name) response = self.client.get("%s?q=1" % url, follow=True) # Page redirects to PageContent errmsg = response.content self.assertEqual(response.status_code, 200, errmsg) def test_pagetree_filtered(self): superuser = self.get_superuser() create_page("root-page", "nav_playground.html", "en", created_by=superuser) with self.login_user_context(superuser): url = admin_reverse("cms_pagecontent_changelist") response = self.client.get("%s?template__exact=nav_playground.html" % url) errmsg = response.content self.assertEqual(response.status_code, 200, errmsg) def test_create_translation_copies_template(self): admin_user = self.get_superuser() page = create_page("create-translation", "col_two.html", "de", created_by=admin_user) with self.login_user_context(admin_user): response = self.client.post( self.get_page_add_uri("en", page), data={"title": "create-translation-en", "slug": "create-translation-en", "cms_page": page.pk}, ) self.assertRedirects(response, self.get_pages_admin_list_uri("en")) self.assertEqual(page.get_content_obj("en").template, "col_two.html") def test_create_translation_copies_template_on_default_page_language_update(self): admin_user = self.get_superuser() page = create_page("create-translation", "nav_playground.html", "en", created_by=admin_user) with self.login_user_context(admin_user): data = {"title": "test page 2", "slug": "page-test-2", "template": "col_two.html"} self.client.post( self.get_page_change_uri("en", page), data=data, ) response = self.client.post( self.get_page_add_uri("de", page), data={"title": "create-translation-de", "slug": "create-translation-de", "cms_page": page.pk}, ) self.assertRedirects(response, self.get_pages_admin_list_uri("de")) self.assertEqual(page.get_content_obj("de").template, "col_two.html") def test_create_translation_copies_template_with_inheritance(self): """ Test that template inheritance flag is properly copied when creating translations """ admin_user = self.get_superuser() page = create_page("inherit-template", "nav_playground.html", "en", created_by=admin_user) with self.login_user_context(admin_user): data = {"title": "test page", "slug": "test-page", "template": TEMPLATE_INHERITANCE_MAGIC} self.client.post( self.get_page_change_uri("en", page), data=data, ) response = self.client.post( self.get_page_add_uri("de", page), data={"title": "inherit-de", "slug": "inherit-de", "cms_page": page.pk}, ) self.assertRedirects(response, self.get_pages_admin_list_uri("de")) self.assertEqual(page.get_content_obj("de").template, TEMPLATE_INHERITANCE_MAGIC) def test_create_translation_always_copies_template_from_default_language_regardless_of_amount_of_languages(self): admin_user = self.get_superuser() # Create a page in default language ("fr") page = create_page("create-translation", "nav_playground.html", "fr", created_by=admin_user) with self.login_user_context(admin_user): data = { "title": "create-translation-de", "slug": "create-translation-de", "cms_page": page.pk, "template": "col_two.html", } response = self.client.post( self.get_page_add_uri("de", page), data=data, ) data = {"title": "create-translation-en", "slug": "create-translation-en", "cms_page": page.pk} response = self.client.post( self.get_page_add_uri("en", page), data=data, ) self.assertRedirects(response, self.get_pages_admin_list_uri("en")) self.assertEqual(page.get_content_obj("en").template, "nav_playground.html") def test_delete_translation(self): admin_user = self.get_superuser() page = create_page("delete-page-translation", "nav_playground.html", "en", created_by=admin_user) create_page_content("de", "delete-page-translation-2", page, slug="delete-page-translation-2") create_page_content("es-mx", "delete-page-translation-es", page, slug="delete-page-translation-es") data = {"post": "yes"} with self.login_user_context(admin_user): response = self.client.get(self.get_page_delete_translation_uri("de", page)) self.assertEqual(response.status_code, 200) response = self.client.post(self.get_page_delete_translation_uri("de", page), data=data) self.assertRedirects(response, self.get_pages_admin_list_uri("de")) response = self.client.get(self.get_page_delete_translation_uri("es-mx", page)) self.assertEqual(response.status_code, 200) self.assertContains( response, '
Are you sure you want to delete the page content "delete-page-translation-es (es-mx)"?' ) response = self.client.post(self.get_page_delete_translation_uri("es-mx", page), data=data) self.assertRedirects(response, self.get_pages_admin_list_uri("es-mx")) self.assertTrue(PageContent.objects.filter(page=page, language="en").exists()) self.assertFalse(PageContent.objects.filter(page=page, language="de").exists()) self.assertFalse(PageContent.objects.filter(page=page, language="es-mx").exists()) self.assertFalse(PageUrl.objects.filter(page=page, language="de").exists()) self.assertFalse(PageUrl.objects.filter(page=page, language="es-mx").exists()) def test_delete_translation_without_page_url(self): # A translation may exist without a PageUrl (e.g., never published with versioning) admin_user = self.get_superuser() page = create_page("delete-page-translation", "nav_playground.html", "en", created_by=admin_user) create_page_content("de", "delete-page-translation-de", page, slug="delete-page-translation-de") PageUrl.objects.filter(page=page, language="de").delete() with self.login_user_context(admin_user): response = self.client.post(self.get_page_delete_translation_uri("de", page), data={"post": "yes"}) self.assertRedirects(response, self.get_pages_admin_list_uri("de")) self.assertTrue(PageContent.objects.filter(page=page, language="en").exists()) self.assertTrue(PageUrl.objects.filter(page=page, language="en").exists()) self.assertFalse(PageContent.objects.filter(page=page, language="de").exists()) def test_change_template(self): template = get_cms_setting("TEMPLATES")[0][0] admin_user, staff = (self.get_superuser(), self.get_staff_user_with_no_permissions()) with self.login_user_context(admin_user): response = self.client.post(self.get_admin_url(PageContent, "change_template", 1), {"template": template}) self.assertEqual(response.status_code, 404) with self.login_user_context(staff): response = self.client.post(self.get_admin_url(PageContent, "change_template", 1), {"template": template}) self.assertEqual(response.status_code, 403) page = create_page("test-page", template, "en") endpoint = self.get_page_change_template_uri("en", page) with self.login_user_context(staff): response = self.client.post(endpoint, {"template": template}) self.assertEqual(response.status_code, 403) with self.login_user_context(admin_user): response = self.client.post(endpoint, {"template": "doesntexist"}) self.assertEqual(response.status_code, 400) response = self.client.post(endpoint, {"template": template}) self.assertEqual(response.status_code, 200) def test_changelist_items(self): admin_user = self.get_superuser() first_level_page = create_page("level1", "nav_playground.html", "en") second_level_page_top = create_page( "level21", "nav_playground.html", "en", created_by=admin_user, parent=first_level_page ) first_level_page.refresh_from_db() second_level_page_bottom = create_page( "level22", "nav_playground.html", "en", created_by=admin_user, parent=first_level_page ) third_level_page = create_page( "level3", "nav_playground.html", "en", created_by=admin_user, parent=second_level_page_top ) self.assertEqual(Page.objects.all().count(), 4) with self.login_user_context(admin_user): response = self.client.get(self.get_pages_admin_list_uri("en")) cms_page_nodes = response.context_data["tree"]["items"] self.assertEqual(cms_page_nodes[0], first_level_page) self.assertEqual(cms_page_nodes[1], second_level_page_top) self.assertEqual(cms_page_nodes[2], third_level_page) self.assertEqual(cms_page_nodes[3], second_level_page_bottom) def test_changelist_get_results(self): admin_user = self.get_superuser() first_level_page = create_page("level1", "nav_playground.html", "en") second_level_page_top = create_page( "level21", "nav_playground.html", "en", created_by=admin_user, parent=first_level_page ) create_page( "level22", "nav_playground.html", "en", created_by=admin_user, parent=self.reload(first_level_page) ) create_page("level3", "nav_playground.html", "en", created_by=admin_user, parent=second_level_page_top) create_page( "level23", "nav_playground.html", "en", created_by=admin_user, parent=self.reload(first_level_page) ) self.assertEqual(Page.objects.all().count(), 5) endpoint = self.get_pages_admin_list_uri() with self.login_user_context(admin_user): response = self.client.get(endpoint) self.assertEqual(response.context_data["tree"]["items"].count(), 5) with self.login_user_context(admin_user): response = self.client.get(endpoint + "&q=level23") self.assertEqual(response.context_data["tree"]["items"].count(), 1) with self.login_user_context(admin_user): response = self.client.get(endpoint + "&q=level2") self.assertEqual(response.context_data["tree"]["items"].count(), 3) def test_empty_placeholder_with_nested_plugins(self): # It's important that this test clears a placeholder # which only has nested plugins. # This allows us to catch a strange bug that happened # under these conditions with the new related name handling. page_en = create_page("EmptyPlaceholderTestPage (EN)", "nav_playground.html", "en") ph = page_en.get_placeholders("en").get(slot="body") column_wrapper = add_plugin(ph, "MultiColumnPlugin", "en") add_plugin(ph, "ColumnPlugin", "en", parent=column_wrapper) add_plugin(ph, "ColumnPlugin", "en", parent=column_wrapper) # before cleaning the de placeholder self.assertEqual(ph.get_plugins("en").count(), 3) admin_user, staff = self._get_guys() endpoint = self.get_clear_placeholder_url(ph, language="en") with self.login_user_context(admin_user): response = self.client.post(endpoint, {"test": 0}) self.assertEqual(response.status_code, 200) # After cleaning the de placeholder, en placeholder must still have all the plugins self.assertEqual(ph.get_plugins("en").count(), 0) def test_empty_placeholder_in_correct_language(self): """ Test that Cleaning a placeholder only affect current language contents """ # create some objects page_en = create_page("EmptyPlaceholderTestPage (EN)", "nav_playground.html", "en") ph = page_en.get_placeholders("en").get(slot="body") # add the text plugin to the en version of the page add_plugin(ph, "TextPlugin", "en", body="Hello World EN 1") add_plugin(ph, "TextPlugin", "en", body="Hello World EN 2") # creating a de title of the page and adding plugins to it create_page_content("de", page_en.get_title(), page_en, slug=page_en.get_slug("en")) add_plugin(ph, "TextPlugin", "de", body="Hello World DE") add_plugin(ph, "TextPlugin", "de", body="Hello World DE 2") add_plugin(ph, "TextPlugin", "de", body="Hello World DE 3") # before cleaning the de placeholder self.assertEqual(ph.get_plugins("en").count(), 2) self.assertEqual(ph.get_plugins("de").count(), 3) admin_user, staff = self._get_guys() endpoint = self.get_clear_placeholder_url(ph, language="de") with self.login_user_context(admin_user): response = self.client.post(endpoint, {"test": 0}) self.assertEqual(response.status_code, 200) # After cleaning the de placeholder, en placeholder must still have all the plugins self.assertEqual(ph.get_plugins("en").count(), 2) self.assertEqual(ph.get_plugins("de").count(), 0) def test_template_inheritance_magic_with_three_levels_of_inheritance_inherits_from_parent(self): admin_user = self.get_superuser() grandparent_page = create_page("grandparent-page", "nav_playground.html", "en", created_by=admin_user) parent_page = create_page("parent-page", "col_two.html", "en", created_by=admin_user, parent=grandparent_page) child_page = create_page("child-page", "nav_playground.html", "en", created_by=admin_user, parent=parent_page) with self.login_user_context(admin_user): self.client.post( self.get_page_change_template_uri("en", child_page), {"template": TEMPLATE_INHERITANCE_MAGIC} ) child_page_content = PageContent.objects.get(page=child_page, language="en") self.assertEqual(child_page_content.get_template(), "col_two.html") def test_template_inheritance_magic_with_three_levels_of_inheritance_inherits_from_grandparent(self): admin_user = self.get_superuser() grandparent_page = create_page("grandparent-page", "nav_playground.html", "en", created_by=admin_user) parent_page = create_page( "parent-page", TEMPLATE_INHERITANCE_MAGIC, "en", created_by=admin_user, parent=grandparent_page ) child_page = create_page("child-page", "col_two.html", "en", created_by=admin_user, parent=parent_page) with self.login_user_context(admin_user): self.client.post( self.get_page_change_template_uri("en", child_page), {"template": TEMPLATE_INHERITANCE_MAGIC} ) child_page_content = PageContent.objects.get(page=child_page, language="en") self.assertEqual(child_page_content.get_template(), "nav_playground.html") @override_settings(CMS_TEMPLATES=[]) def test_placeholder_slot_inheritance_magic_with_two_levels_of_inheritance_without_configured_templates(self): admin_user = self.get_superuser() parent_page = create_page("grandparent-page", TEMPLATE_INHERITANCE_MAGIC, "en", created_by=admin_user) child_page = create_page( "parent-page", TEMPLATE_INHERITANCE_MAGIC, "en", created_by=admin_user, parent=parent_page ) child_slots = child_page.get_content_obj("en").get_placeholder_slots() self.assertEqual(child_slots, ("content",)) class AdminTests(AdminTestsBase): # TODO: needs tests for actual permissions, not only superuser/normaluser def setUp(self): self.page = create_page("testpage", "nav_playground.html", "en") def get_admin(self): User = get_user_model() fields = dict(email="admin@django-cms.org", is_staff=True, is_superuser=True) if User.USERNAME_FIELD != "email": fields[User.USERNAME_FIELD] = "admin" usr = User(**fields) usr.set_password(getattr(usr, User.USERNAME_FIELD)) usr.save() return usr def get_permless(self): User = get_user_model() fields = dict(email="permless@django-cms.org", is_staff=True) if User.USERNAME_FIELD != "email": fields[User.USERNAME_FIELD] = "permless" usr = User(**fields) usr.set_password(getattr(usr, User.USERNAME_FIELD)) usr.save() return usr def get_page(self): return self.page def test_admin_index(self): endpoint = admin_reverse("index") endpoint_page = admin_reverse("cms_page_changelist") endpoint_page_content = admin_reverse("cms_pagecontent_changelist") admin_user = self.get_admin() with self.login_user_context(admin_user): response = self.client.get(endpoint) self.assertEqual(response.status_code, 200) self.assertNotContains(response, endpoint_page) self.assertContains(response, endpoint_page_content) def test_change_innavigation(self): page = self.get_page() content = self.get_pagecontent_obj(page, "en") permless = self.get_permless() admin_user = self.get_admin() pagecontent_admin = self.pagecontent_admin_class with self.login_user_context(permless): request = self.get_request() response = pagecontent_admin.change_innavigation(request, content.pk) self.assertEqual(response.status_code, 405) with self.login_user_context(permless): request = self.get_request(post_data={"no": "data"}) response = pagecontent_admin.change_innavigation(request, content.pk) self.assertEqual(response.status_code, 403) with self.login_user_context(permless): request = self.get_request(post_data={"no": "data"}) self.assertEqual(response.status_code, 403) with self.login_user_context(admin_user): request = self.get_request(post_data={"no": "data"}) self.assertRaises(Http404, pagecontent_admin.change_innavigation, request, content.pk + 100) with self.login_user_context(permless): request = self.get_request(post_data={"no": "data"}) response = pagecontent_admin.change_innavigation(request, content.pk) self.assertEqual(response.status_code, 403) with self.login_user_context(admin_user): request = self.get_request(post_data={"no": "data"}) old = page.get_in_navigation() response = pagecontent_admin.change_innavigation(request, content.pk) self.assertEqual(response.status_code, 204) page = self.reload(page) self.assertEqual(old, not page.get_in_navigation()) def test_remove_plugin_requires_post(self): ph = self.page.get_placeholders("en")[0] plugin = add_plugin(ph, "TextPlugin", "en", body="test") admin_user = self.get_admin() with self.login_user_context(admin_user): endpoint = self.get_delete_plugin_uri(plugin) response = self.client.get(endpoint) self.assertEqual(response.status_code, 200) def test_too_many_plugins_global(self): conf = { "body": { "limits": { "global": 1, }, }, } admin_user = self.get_admin() url = admin_reverse("cms_placeholder_add_plugin") with self.settings(CMS_PERMISSION=False, CMS_PLACEHOLDER_CONF=conf): page = create_page("somepage", "nav_playground.html", "en") body = page.get_placeholders("en").get(slot="body") add_plugin(body, "TextPlugin", "en", body="text") with self.login_user_context(admin_user): data = { "plugin_type": "TextPlugin", "placeholder_id": body.pk, "target_language": "en", } response = self.client.post(url, data) self.assertEqual(response.status_code, HttpResponseBadRequest.status_code) def test_too_many_plugins_type(self): conf = { "body": { "limits": { "TextPlugin": 1, }, }, } admin_user = self.get_admin() url = admin_reverse("cms_placeholder_add_plugin") with self.settings(CMS_PERMISSION=False, CMS_PLACEHOLDER_CONF=conf): page = create_page("somepage", "nav_playground.html", "en") body = page.get_placeholders("en").get(slot="body") add_plugin(body, "TextPlugin", "en", body="text") with self.login_user_context(admin_user): data = { "plugin_type": "TextPlugin", "placeholder_id": body.pk, "target_language": "en", "plugin_parent": "", } response = self.client.post(url, data) self.assertEqual(response.status_code, HttpResponseBadRequest.status_code) def test_page_edit_field_endpoint(self): endpoint = ( admin_reverse("cms_page_edit_title_fields", args=(self.page.pk, "en")) + "?language=en&edit_fields=page_title" ) with self.login_user_context(self.get_superuser()): response = self.client.get(endpoint) self.assertContains( response, '', ) class NoDBAdminTests(CMSTestCase): @property def admin_class(self): return site._registry[Page] def test_lookup_allowed_site__exact(self): request = self.get_request() self.assertTrue(self.admin_class.lookup_allowed("site__exact", "1", request=request)) def test_lookup_allowed_published(self): request = self.get_request() self.assertTrue(self.admin_class.lookup_allowed("site__exact", "1", request=request)) class PluginPermissionTests(AdminTestsBase): def setUp(self): self._page = create_page("test page", "nav_playground.html", "en") self._placeholder = self._page.get_placeholders("en")[0] def _get_admin(self): User = get_user_model() fields = dict(email="admin@django-cms.org", is_staff=True, is_active=True) if User.USERNAME_FIELD != "email": fields[User.USERNAME_FIELD] = "admin" admin_user = User(**fields) admin_user.set_password("admin") admin_user.save() return admin_user def _get_page_admin(self): return admin.site._registry[Page] def _give_permission(self, user, model, permission_type, save=True): codename = f"{permission_type}_{model._meta.object_name.lower()}" user.user_permissions.add(Permission.objects.get(codename=codename)) def _give_page_permission_rights(self, user): self._give_permission(user, PagePermission, "add") self._give_permission(user, PagePermission, "change") self._give_permission(user, PagePermission, "delete") def _get_change_page_request(self, user, page): return type("Request", (object,), {"user": user, "path": self.get_page_change_uri("en", page)}) def _give_cms_permissions(self, user, save=True): for perm_type in ["add", "change", "delete"]: for model in [Page, PageContent]: self._give_permission(user, model, perm_type, False) gpp = GlobalPagePermission.objects.create( user=user, can_change=True, can_delete=True, can_publish=True, can_change_advanced_settings=False, can_change_permissions=False, can_move_page=True, ) gpp.sites = Site.objects.all() if save: user.save() def _create_plugin(self): plugin = add_plugin(self._placeholder, "TextPlugin", "en") return plugin def test_plugin_edit_wrong_url(self): """User tries to edit a plugin using a random url. 404 response returned""" plugin = self._create_plugin() _, normal_guy = self._get_guys() if get_user_model().USERNAME_FIELD == "email": self.client.login(username="test@test.com", password="test@test.com") else: self.client.login(username="test", password="test") self._give_permission(normal_guy, Text, "change") endpoint = "{}edit-plugin/{}/".format( admin_reverse("cms_placeholder_edit_plugin", args=[plugin.id]), plugin.id ) endpoint += "?cms_path=/en/" response = self.client.post(endpoint, dict()) self.assertEqual(response.status_code, HttpResponseNotFound.status_code) self.assertTrue("Page not found" in force_str(response.content)) class AdminFormsTests(AdminTestsBase): def test_clean_overwrite_url(self): """ A manual path needs to be stripped from leading and trailing slashes. """ superuser = self.get_superuser() cms_page = create_page("test page", "nav_playground.html", "en") page_data = { "title": "test page", "slug": "test-page", "overwrite_url": "/overwrite/url/", "template": cms_page.get_template("en"), } endpoint = self.get_page_change_uri("en", cms_page) with self.login_user_context(superuser): response = self.client.post(endpoint, page_data) self.assertRedirects(response, self.get_pages_admin_list_uri("en")) self.assertSequenceEqual( cms_page.urls.values_list("path", "managed"), [("overwrite/url", False)], ) def test_missmatching_site_parent_dotsite(self): superuser = self.get_superuser() new_site = Site.objects.create(id=2, domain="foo.com", name="foo.com") parent_page = api.create_page("test", get_cms_setting("TEMPLATES")[0][0], "fr", site=new_site) new_page_data = { "title": "Title", "slug": "slug", "parent_page": parent_page.pk, } with self.login_user_context(superuser): # Invalid parent endpoint = self.get_page_add_uri("en") response = self.client.post(endpoint, new_page_data) expected_error = ( '