123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656 |
- import datetime
- import unittest
- from unittest import mock
- from django.contrib.auth.models import Group, Permission
- from django.http import HttpRequest, HttpResponse
- from django.test import TestCase
- from django.test.utils import override_settings
- from django.urls import reverse
- from django.utils import timezone
- from django.utils.translation import gettext_lazy as _
- from wagtail.admin.tests.pages.timestamps import submittable_timestamp
- from wagtail.models import GroupPagePermission, Locale, Page, PageRevision
- from wagtail.signals import page_published
- from wagtail.test.testapp.models import (
- BusinessChild,
- BusinessIndex,
- BusinessSubIndex,
- DefaultStreamPage,
- PersonPage,
- SimplePage,
- SingletonPage,
- SingletonPageViaMaxCount,
- StandardChild,
- StandardIndex,
- )
- from wagtail.test.utils import WagtailTestUtils
- class TestPageCreation(TestCase, WagtailTestUtils):
- def setUp(self):
- # Find root page
- self.root_page = Page.objects.get(id=2)
- # Login
- self.user = self.login()
- def test_add_subpage(self):
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(self.root_page.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, "Simple page")
- target_url = reverse(
- "wagtailadmin_pages:add", args=("tests", "simplepage", self.root_page.id)
- )
- self.assertContains(response, 'href="%s"' % target_url)
- self.assertContains(response, "A simple page description")
- # List of available page types should not contain pages with is_creatable = False
- self.assertNotContains(response, "MTI base page")
- # List of available page types should not contain abstract pages
- self.assertNotContains(response, "Abstract page")
- # List of available page types should not contain pages whose parent_page_types forbid it
- self.assertNotContains(response, "Business child")
- def test_add_subpage_with_subpage_types(self):
- # Add a BusinessIndex to test business rules in
- business_index = BusinessIndex(
- title="Hello world!",
- slug="hello-world",
- )
- self.root_page.add_child(instance=business_index)
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(business_index.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, "Business child")
- # List should not contain page types not in the subpage_types list
- self.assertNotContains(response, "Simple page")
- def test_add_subpage_with_one_valid_subpage_type(self):
- # Add a BusinessSubIndex to test business rules in
- business_index = BusinessIndex(
- title="Hello world!",
- slug="hello-world",
- )
- self.root_page.add_child(instance=business_index)
- business_subindex = BusinessSubIndex(
- title="Hello world!",
- slug="hello-world",
- )
- business_index.add_child(instance=business_subindex)
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(business_subindex.id,))
- )
- # Should be redirected to the 'add' page for BusinessChild, the only valid subpage type
- self.assertRedirects(
- response,
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "businesschild", business_subindex.id),
- ),
- )
- def test_add_subpage_bad_permissions(self):
- # Remove privileges from user
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- # Get add subpage page
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(self.root_page.id,))
- )
- # Check that the user received a 403 response
- self.assertEqual(response.status_code, 302)
- def test_add_subpage_nonexistantparent(self):
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(100000,))
- )
- self.assertEqual(response.status_code, 404)
- def test_add_subpage_with_next_param(self):
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(self.root_page.id,)),
- {"next": "/admin/users/"},
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, "Simple page")
- target_url = reverse(
- "wagtailadmin_pages:add", args=("tests", "simplepage", self.root_page.id)
- )
- self.assertContains(response, 'href="%s?next=/admin/users/"' % target_url)
- def test_create_simplepage(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["Content-Type"], "text/html; charset=utf-8")
- self.assertContains(
- response,
- '<a href="#tab-content" class="active" data-tab="content">Content</a>',
- )
- self.assertContains(
- response, '<a href="#tab-promote" class="" data-tab="promote">Promote</a>'
- )
- # test register_page_action_menu_item hook
- self.assertContains(
- response,
- '<button type="submit" name="action-panic" value="Panic!" class="button">Panic!</button>',
- )
- self.assertContains(response, "testapp/js/siren.js")
- # test construct_page_action_menu hook
- self.assertContains(
- response,
- '<button type="submit" name="action-relax" value="Relax." class="button">Relax.</button>',
- )
- # test that workflow actions are shown
- self.assertContains(
- response,
- '<button type="submit" name="action-submit" value="Submit for moderation" class="button">',
- )
- @override_settings(WAGTAIL_WORKFLOW_ENABLED=False)
- def test_workflow_buttons_not_shown_when_workflow_disabled(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertNotContains(response, 'value="Submit for moderation"')
- def test_create_multipart(self):
- """
- Test checks if 'enctype="multipart/form-data"' is added and only to forms that require multipart encoding.
- """
- # check for SimplePage where is no file field
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertNotContains(response, 'enctype="multipart/form-data"')
- self.assertTemplateUsed(response, "wagtailadmin/pages/create.html")
- # check for FilePage which has file field
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add", args=("tests", "filepage", self.root_page.id)
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, 'enctype="multipart/form-data"')
- def test_create_page_without_promote_tab(self):
- """
- Test that the Promote tab is not rendered for page classes that define it as empty
- """
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "standardindex", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(
- response,
- '<a href="#tab-content" class="active" data-tab="content">Content</a>',
- )
- self.assertNotContains(
- response, '<a href="#tab-promote" class="" data-tab="promote">Promote</a>'
- )
- def test_create_page_with_custom_tabs(self):
- """
- Test that custom edit handlers are rendered
- """
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "standardchild", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(
- response,
- '<a href="#tab-content" class="active" data-tab="content">Content</a>',
- )
- self.assertContains(
- response, '<a href="#tab-promote" class="" data-tab="promote">Promote</a>'
- )
- self.assertContains(
- response,
- '<a href="#tab-dinosaurs" class="" data-tab="dinosaurs">Dinosaurs</a>',
- )
- def test_create_page_with_non_model_field(self):
- """
- Test that additional fields defined on the form rather than the model are accepted and rendered
- """
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "formclassadditionalfieldpage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailadmin/pages/create.html")
- self.assertContains(response, "Enter SMS authentication code")
- def test_create_simplepage_bad_permissions(self):
- # Remove privileges from user
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- # Get page
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=(
- "tests",
- "simplepage",
- self.root_page.id,
- ),
- )
- )
- # Check that the user received a 403 response
- self.assertEqual(response.status_code, 302)
- def test_cannot_create_page_with_is_creatable_false(self):
- # tests.MTIBasePage has is_creatable=False, so attempting to add a new one
- # should fail with permission denied
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "mtibasepage", self.root_page.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- def test_cannot_create_page_when_can_create_at_returns_false(self):
- # issue #2892
- # Check that creating a second SingletonPage results in a permission
- # denied error.
- # SingletonPage overrides the can_create_at method to make it return
- # False if another SingletonPage already exists.
- # The Page model now has a max_count attribute (issue 4841),
- # but we are leaving this test in place to cover existing behaviour and
- # ensure it does not break any code doing this in the wild.
- add_url = reverse(
- "wagtailadmin_pages:add",
- args=[
- SingletonPage._meta.app_label,
- SingletonPage._meta.model_name,
- self.root_page.pk,
- ],
- )
- # A single singleton page should be creatable
- self.assertTrue(SingletonPage.can_create_at(self.root_page))
- response = self.client.get(add_url)
- self.assertEqual(response.status_code, 200)
- # Create a singleton page
- self.root_page.add_child(
- instance=SingletonPage(title="singleton", slug="singleton")
- )
- # A second singleton page should not be creatable
- self.assertFalse(SingletonPage.can_create_at(self.root_page))
- response = self.client.get(add_url)
- self.assertRedirects(response, "/admin/")
- def test_cannot_create_singleton_page_with_max_count(self):
- # Check that creating a second SingletonPageViaMaxCount results in a permission
- # denied error.
- # SingletonPageViaMaxCount uses the max_count attribute to limit the number of
- # instance it can have.
- add_url = reverse(
- "wagtailadmin_pages:add",
- args=[
- SingletonPageViaMaxCount._meta.app_label,
- SingletonPageViaMaxCount._meta.model_name,
- self.root_page.pk,
- ],
- )
- # A single singleton page should be creatable
- self.assertTrue(SingletonPageViaMaxCount.can_create_at(self.root_page))
- response = self.client.get(add_url)
- self.assertEqual(response.status_code, 200)
- # Create a singleton page
- self.root_page.add_child(
- instance=SingletonPageViaMaxCount(title="singleton", slug="singleton")
- )
- # A second singleton page should not be creatable
- self.assertFalse(SingletonPageViaMaxCount.can_create_at(self.root_page))
- response = self.client.get(add_url)
- self.assertRedirects(response, "/admin/")
- def test_cannot_create_page_with_wrong_parent_page_types(self):
- # tests.BusinessChild has limited parent_page_types, so attempting to add
- # a new one at the root level should fail with permission denied
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "businesschild", self.root_page.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- def test_cannot_create_page_with_wrong_subpage_types(self):
- # Add a BusinessIndex to test business rules in
- business_index = BusinessIndex(
- title="Hello world!",
- slug="hello-world",
- )
- self.root_page.add_child(instance=business_index)
- # BusinessIndex has limited subpage_types, so attempting to add a SimplePage
- # underneath it should fail with permission denied
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", business_index.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- def test_create_simplepage_post(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Find the page and check it
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- # Should be redirected to edit page
- self.assertRedirects(
- response, reverse("wagtailadmin_pages:edit", args=(page.id,))
- )
- self.assertEqual(page.title, post_data["title"])
- self.assertEqual(page.draft_title, post_data["title"])
- self.assertIsInstance(page, SimplePage)
- self.assertFalse(page.live)
- self.assertFalse(page.first_published_at)
- # treebeard should report no consistency problems with the tree
- self.assertFalse(
- any(Page.find_problems()), "treebeard found consistency problems"
- )
- def test_create_simplepage_scheduled(self):
- go_live_at = timezone.now() + datetime.timedelta(days=1)
- expire_at = timezone.now() + datetime.timedelta(days=2)
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "go_live_at": submittable_timestamp(go_live_at),
- "expire_at": submittable_timestamp(expire_at),
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Should be redirected to explorer page
- self.assertEqual(response.status_code, 302)
- # Find the page and check the scheduled times
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- self.assertEqual(page.go_live_at.date(), go_live_at.date())
- self.assertEqual(page.expire_at.date(), expire_at.date())
- self.assertIs(page.expired, False)
- self.assertTrue(page.status_string, "draft")
- # No revisions with approved_go_live_at
- self.assertFalse(
- PageRevision.objects.filter(page=page)
- .exclude(approved_go_live_at__isnull=True)
- .exists()
- )
- def test_create_simplepage_scheduled_go_live_before_expiry(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "go_live_at": submittable_timestamp(
- timezone.now() + datetime.timedelta(days=2)
- ),
- "expire_at": submittable_timestamp(
- timezone.now() + datetime.timedelta(days=1)
- ),
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- # Check that a form error was raised
- self.assertFormError(
- response,
- "form",
- "go_live_at",
- "Go live date/time must be before expiry date/time",
- )
- self.assertFormError(
- response,
- "form",
- "expire_at",
- "Go live date/time must be before expiry date/time",
- )
- # form should be marked as having unsaved changes for the purposes of the dirty-forms warning
- self.assertContains(response, "alwaysDirty: true")
- def test_create_simplepage_scheduled_expire_in_the_past(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "expire_at": submittable_timestamp(
- timezone.now() + datetime.timedelta(days=-1)
- ),
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- # Check that a form error was raised
- self.assertFormError(
- response, "form", "expire_at", "Expiry date/time must be in the future"
- )
- # form should be marked as having unsaved changes for the purposes of the dirty-forms warning
- self.assertContains(response, "alwaysDirty: true")
- def test_create_simplepage_post_publish(self):
- # Connect a mock signal handler to page_published signal
- mock_handler = mock.MagicMock()
- page_published.connect(mock_handler)
- # Post
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Find the page and check it
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- # Should be redirected to explorer
- self.assertRedirects(
- response, reverse("wagtailadmin_explore", args=(self.root_page.id,))
- )
- self.assertEqual(page.title, post_data["title"])
- self.assertEqual(page.draft_title, post_data["title"])
- self.assertIsInstance(page, SimplePage)
- self.assertTrue(page.live)
- self.assertTrue(page.first_published_at)
- # Check that the page_published signal was fired
- self.assertEqual(mock_handler.call_count, 1)
- mock_call = mock_handler.mock_calls[0][2]
- self.assertEqual(mock_call["sender"], page.specific_class)
- self.assertEqual(mock_call["instance"], page)
- self.assertIsInstance(mock_call["instance"], page.specific_class)
- # treebeard should report no consistency problems with the tree
- self.assertFalse(
- any(Page.find_problems()), "treebeard found consistency problems"
- )
- def test_create_simplepage_post_publish_scheduled(self):
- go_live_at = timezone.now() + datetime.timedelta(days=1)
- expire_at = timezone.now() + datetime.timedelta(days=2)
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- "go_live_at": submittable_timestamp(go_live_at),
- "expire_at": submittable_timestamp(expire_at),
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Should be redirected to explorer page
- self.assertEqual(response.status_code, 302)
- # Find the page and check it
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- self.assertEqual(page.go_live_at.date(), go_live_at.date())
- self.assertEqual(page.expire_at.date(), expire_at.date())
- self.assertIs(page.expired, False)
- # A revision with approved_go_live_at should exist now
- self.assertTrue(
- PageRevision.objects.filter(page=page)
- .exclude(approved_go_live_at__isnull=True)
- .exists()
- )
- # But Page won't be live
- self.assertFalse(page.live)
- self.assertFalse(page.first_published_at)
- self.assertTrue(page.status_string, "scheduled")
- def test_create_simplepage_post_submit(self):
- # Create a moderator user for testing email
- self.create_superuser("moderator", "moderator@email.com", "password")
- # Submit
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Find the page and check it
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- # Should be redirected to explorer
- self.assertRedirects(
- response, reverse("wagtailadmin_explore", args=(self.root_page.id,))
- )
- self.assertEqual(page.title, post_data["title"])
- self.assertIsInstance(page, SimplePage)
- self.assertFalse(page.live)
- self.assertFalse(page.first_published_at)
- # The page should now be in moderation
- self.assertEqual(
- page.current_workflow_state.status,
- page.current_workflow_state.STATUS_IN_PROGRESS,
- )
- def test_create_simplepage_post_existing_slug(self):
- # This tests the existing slug checking on page save
- # Create a page
- self.child_page = SimplePage(
- title="Hello world!", slug="hello-world", content="hello"
- )
- self.root_page.add_child(instance=self.child_page)
- # Attempt to create a new one with the same slug
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Should not be redirected (as the save should fail)
- self.assertEqual(response.status_code, 200)
- # Check that a form error was raised
- self.assertFormError(response, "form", "slug", "This slug is already in use")
- # form should be marked as having unsaved changes for the purposes of the dirty-forms warning
- self.assertContains(response, "alwaysDirty: true")
- def test_create_nonexistantparent(self):
- response = self.client.get(
- reverse("wagtailadmin_pages:add", args=("tests", "simplepage", 100000))
- )
- self.assertEqual(response.status_code, 404)
- def test_create_nonpagetype(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("wagtailimages", "image", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 404)
- def test_preview_on_create(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- }
- preview_url = reverse(
- "wagtailadmin_pages:preview_on_add",
- args=("tests", "simplepage", self.root_page.id),
- )
- response = self.client.post(preview_url, post_data)
- # Check the JSON response
- self.assertEqual(response.status_code, 200)
- self.assertJSONEqual(response.content.decode(), {"is_valid": True})
- response = self.client.get(preview_url)
- # Check the HTML response
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "tests/simple_page.html")
- self.assertContains(response, "New page!")
- # Check that the treebeard attributes were set correctly on the page object
- self.assertEqual(response.context["self"].depth, self.root_page.depth + 1)
- self.assertTrue(response.context["self"].path.startswith(self.root_page.path))
- self.assertEqual(response.context["self"].get_parent(), self.root_page)
- def test_whitespace_titles(self):
- post_data = {
- "title": " ", # Single space on purpose
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Check that a form error was raised
- self.assertFormError(response, "form", "title", "This field is required.")
- def test_whitespace_titles_with_tab(self):
- post_data = {
- "title": "\t", # Single space on purpose
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Check that a form error was raised
- self.assertFormError(response, "form", "title", "This field is required.")
- def test_whitespace_titles_with_tab_in_seo_title(self):
- post_data = {
- "title": "Hello",
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- "seo_title": "\t",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Should be successful, as seo_title is not required
- self.assertEqual(response.status_code, 302)
- # The tab should be automatically stripped from the seo_title
- page = Page.objects.order_by("-id").first()
- self.assertEqual(page.seo_title, "")
- def test_whitespace_is_stripped_from_titles(self):
- post_data = {
- "title": " Hello ",
- "content": "Some content",
- "slug": "hello-world",
- "action-submit": "Submit",
- "seo_title": " hello SEO ",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Should be successful, as both title and seo_title are non-empty after stripping
- self.assertEqual(response.status_code, 302)
- # Whitespace should be automatically stripped from title and seo_title
- page = Page.objects.order_by("-id").first()
- self.assertEqual(page.title, "Hello")
- self.assertEqual(page.draft_title, "Hello")
- self.assertEqual(page.seo_title, "hello SEO")
- def test_long_slug(self):
- post_data = {
- "title": "Hello world",
- "content": "Some content",
- "slug": "hello-world-hello-world-hello-world-hello-world-hello-world-hello-world-"
- "hello-world-hello-world-hello-world-hello-world-hello-world-hello-world-"
- "hello-world-hello-world-hello-world-hello-world-hello-world-hello-world-"
- "hello-world-hello-world-hello-world-hello-world-hello-world-hello-world",
- "action-submit": "Submit",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- # Check that a form error was raised
- self.assertEqual(response.status_code, 200)
- self.assertFormError(
- response,
- "form",
- "slug",
- "Ensure this value has at most 255 characters (it has 287).",
- )
- def test_before_create_page_hook(self):
- def hook_func(request, parent_page, page_class):
- self.assertIsInstance(request, HttpRequest)
- self.assertEqual(parent_page.id, self.root_page.id)
- self.assertEqual(page_class, SimplePage)
- return HttpResponse("Overridden!")
- with self.register_hook("before_create_page", hook_func):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- def test_before_create_page_hook_post(self):
- def hook_func(request, parent_page, page_class):
- self.assertIsInstance(request, HttpRequest)
- self.assertEqual(parent_page.id, self.root_page.id)
- self.assertEqual(page_class, SimplePage)
- return HttpResponse("Overridden!")
- with self.register_hook("before_create_page", hook_func):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- # page should not be created
- self.assertFalse(Page.objects.filter(title="New page!").exists())
- def test_after_create_page_hook(self):
- def hook_func(request, page):
- self.assertIsInstance(request, HttpRequest)
- self.assertIsInstance(page, SimplePage)
- # Both are None as this is only a draft
- self.assertIsNone(page.first_published_at)
- self.assertIsNone(page.last_published_at)
- return HttpResponse("Overridden!")
- with self.register_hook("after_create_page", hook_func):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- # page should be created
- self.assertTrue(Page.objects.filter(title="New page!").exists())
- def test_after_create_page_hook_with_page_publish(self):
- def hook_func(request, page):
- self.assertIsInstance(request, HttpRequest)
- self.assertIsInstance(page, SimplePage)
- self.assertIsNotNone(page.first_published_at)
- self.assertIsNotNone(page.last_published_at)
- return HttpResponse("Overridden!")
- with self.register_hook("after_create_page", hook_func):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- # page should be created
- self.assertTrue(Page.objects.filter(title="New page!").exists())
- def test_after_publish_page(self):
- def hook_func(request, page):
- self.assertIsInstance(request, HttpRequest)
- self.assertEqual(page.title, "New page!")
- self.assertIsNotNone(page.first_published_at)
- self.assertIsNotNone(page.last_published_at)
- return HttpResponse("Overridden!")
- with self.register_hook("after_publish_page", hook_func):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- self.root_page.refresh_from_db()
- self.assertEqual(self.root_page.get_children()[0].status_string, _("live"))
- def test_before_publish_page(self):
- def hook_func(request, page):
- self.assertIsInstance(request, HttpRequest)
- self.assertEqual(page.title, "New page!")
- self.assertIsNone(page.first_published_at)
- self.assertIsNone(page.last_published_at)
- return HttpResponse("Overridden!")
- with self.register_hook("before_publish_page", hook_func):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "action-publish": "Publish",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.content, b"Overridden!")
- self.root_page.refresh_from_db()
- self.assertEqual(
- self.root_page.get_children()[0].status_string, _("live + draft")
- )
- def test_display_moderation_button_by_default(self):
- """
- Tests that by default the "Submit for Moderation" button is shown in the action menu.
- """
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertContains(
- response,
- '<button type="submit" name="action-submit" value="Submit for moderation" class="button">'
- '<svg class="icon icon-resubmit icon" aria-hidden="true"><use href="#icon-resubmit"></use></svg>'
- "Submit for moderation</button>",
- )
- @override_settings(WAGTAIL_MODERATION_ENABLED=False)
- def test_hide_moderation_button(self):
- """
- Tests that if WAGTAIL_MODERATION_ENABLED is set to False, the "Submit for Moderation" button is not shown.
- """
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "simplepage", self.root_page.id),
- )
- )
- self.assertNotContains(
- response,
- '<button type="submit" name="action-submit" value="Submit for moderation" class="button">Submit for moderation</button>',
- )
- def test_create_sets_locale_to_parent_locale(self):
- # We need to make sure the page's locale it set to the parent in the create view so that any customisations
- # for that language will take effect.
- fr_locale = Locale.objects.create(language_code="fr")
- fr_homepage = self.root_page.add_child(
- instance=Page(
- title="Home",
- slug="home-fr",
- locale=fr_locale,
- )
- )
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add", args=("tests", "simplepage", fr_homepage.id)
- )
- )
- self.assertEqual(response.context["page"].locale, fr_locale)
- class TestPermissionedFieldPanels(TestCase, WagtailTestUtils):
- fixtures = ["test.json"]
- def setUp(self):
- # Find root page
- self.root_page = Page.objects.get(id=2)
- GroupPagePermission.objects.create(
- group=Group.objects.get(name="Site-wide editors"),
- page=self.root_page,
- permission_type="add",
- )
- def test_create_page_with_permissioned_field_panel(self):
- """
- Test that permission rules on field panels are honoured
- """
- # non-superusers should not see secret_data
- self.login(username="siteeditor", password="password")
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "secretpage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, '"boring_data"')
- self.assertNotContains(response, '"secret_data"')
- # superusers should see secret_data
- self.login(username="superuser", password="password")
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "secretpage", self.root_page.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, '"boring_data"')
- self.assertContains(response, '"secret_data"')
- class TestSubpageBusinessRules(TestCase, WagtailTestUtils):
- def setUp(self):
- # Find root page
- self.root_page = Page.objects.get(id=2)
- # Add standard page (allows subpages of any type)
- self.standard_index = StandardIndex()
- self.standard_index.title = "Standard Index"
- self.standard_index.slug = "standard-index"
- self.root_page.add_child(instance=self.standard_index)
- # Add business page (allows BusinessChild and BusinessSubIndex as subpages)
- self.business_index = BusinessIndex()
- self.business_index.title = "Business Index"
- self.business_index.slug = "business-index"
- self.root_page.add_child(instance=self.business_index)
- # Add business child (allows no subpages)
- self.business_child = BusinessChild()
- self.business_child.title = "Business Child"
- self.business_child.slug = "business-child"
- self.business_index.add_child(instance=self.business_child)
- # Add business subindex (allows only BusinessChild as subpages)
- self.business_subindex = BusinessSubIndex()
- self.business_subindex.title = "Business Subindex"
- self.business_subindex.slug = "business-subindex"
- self.business_index.add_child(instance=self.business_subindex)
- # Login
- self.login()
- def test_standard_subpage(self):
- add_subpage_url = reverse(
- "wagtailadmin_pages:add_subpage", args=(self.standard_index.id,)
- )
- # explorer should contain a link to 'add child page'
- response = self.client.get(
- reverse("wagtailadmin_explore", args=(self.standard_index.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, add_subpage_url)
- # add_subpage should give us choices of StandardChild, and BusinessIndex.
- # BusinessSubIndex and BusinessChild are not allowed
- response = self.client.get(add_subpage_url)
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, StandardChild.get_verbose_name())
- self.assertContains(response, BusinessIndex.get_verbose_name())
- self.assertNotContains(response, BusinessSubIndex.get_verbose_name())
- self.assertNotContains(response, BusinessChild.get_verbose_name())
- def test_business_subpage(self):
- add_subpage_url = reverse(
- "wagtailadmin_pages:add_subpage", args=(self.business_index.id,)
- )
- # explorer should contain a link to 'add child page'
- response = self.client.get(
- reverse("wagtailadmin_explore", args=(self.business_index.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, add_subpage_url)
- # add_subpage should give us a cut-down set of page types to choose
- response = self.client.get(add_subpage_url)
- self.assertEqual(response.status_code, 200)
- self.assertNotContains(response, StandardIndex.get_verbose_name())
- self.assertNotContains(response, StandardChild.get_verbose_name())
- self.assertContains(response, BusinessSubIndex.get_verbose_name())
- self.assertContains(response, BusinessChild.get_verbose_name())
- def test_business_child_subpage(self):
- add_subpage_url = reverse(
- "wagtailadmin_pages:add_subpage", args=(self.business_child.id,)
- )
- # explorer should not contain a link to 'add child page', as this page doesn't accept subpages
- response = self.client.get(
- reverse("wagtailadmin_explore", args=(self.business_child.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertNotContains(response, add_subpage_url)
- # this also means that fetching add_subpage is blocked at the permission-check level
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(self.business_child.id,))
- )
- self.assertEqual(response.status_code, 302)
- def test_cannot_add_invalid_subpage_type(self):
- # cannot add StandardChild as a child of BusinessIndex, as StandardChild is not present in subpage_types
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "standardchild", self.business_index.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- # likewise for BusinessChild which has an empty subpage_types list
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "standardchild", self.business_child.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- # cannot add BusinessChild to StandardIndex, as BusinessChild restricts is parent page types
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "businesschild", self.standard_index.id),
- )
- )
- self.assertRedirects(response, "/admin/")
- # but we can add a BusinessChild to BusinessIndex
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "businesschild", self.business_index.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- def test_not_prompted_for_page_type_when_only_one_choice(self):
- response = self.client.get(
- reverse("wagtailadmin_pages:add_subpage", args=(self.business_subindex.id,))
- )
- # BusinessChild is the only valid subpage type of BusinessSubIndex, so redirect straight there
- self.assertRedirects(
- response,
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "businesschild", self.business_subindex.id),
- ),
- )
- class TestInlinePanelMedia(TestCase, WagtailTestUtils):
- """
- Test that form media required by InlinePanels is correctly pulled in to the edit page
- """
- def test_inline_panel_media(self):
- homepage = Page.objects.get(id=2)
- self.login()
- # simplepage does not need draftail...
- response = self.client.get(
- reverse("wagtailadmin_pages:add", args=("tests", "simplepage", homepage.id))
- )
- self.assertEqual(response.status_code, 200)
- self.assertNotContains(response, "wagtailadmin/js/draftail.js")
- # but sectionedrichtextpage does
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "sectionedrichtextpage", homepage.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, "wagtailadmin/js/draftail.js")
- class TestInlineStreamField(TestCase, WagtailTestUtils):
- """
- Test that streamfields inside an inline child work
- """
- def test_inline_streamfield(self):
- homepage = Page.objects.get(id=2)
- self.login()
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "inlinestreampage", homepage.id),
- )
- )
- self.assertEqual(response.status_code, 200)
- # response should include HTML declarations for streamfield child blocks
- self.assertContains(response, '<div id="sections-__prefix__-body" data-block="')
- class TestIssue2994(TestCase, WagtailTestUtils):
- """
- In contrast to most "standard" form fields, StreamField form widgets generally won't
- provide a postdata field with a name exactly matching the field name. To prevent Django
- from wrongly interpreting this as the field being omitted from the form,
- we need to provide a custom value_omitted_from_data method.
- """
- def setUp(self):
- self.root_page = Page.objects.get(id=2)
- self.user = self.login()
- def test_page_edit_post_publish_url(self):
- # Post
- post_data = {
- "title": "Issue 2994 test",
- "slug": "issue-2994-test",
- "body-count": "1",
- "body-0-deleted": "",
- "body-0-order": "0",
- "body-0-type": "text",
- "body-0-value": "hello world",
- "action-publish": "Publish",
- }
- self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "defaultstreampage", self.root_page.id),
- ),
- post_data,
- )
- new_page = DefaultStreamPage.objects.get(slug="issue-2994-test")
- self.assertEqual(1, len(new_page.body))
- self.assertEqual("hello world", new_page.body[0].value)
- class TestInlinePanelWithTags(TestCase, WagtailTestUtils):
- # https://github.com/wagtail/wagtail/issues/5414#issuecomment-567080707
- def setUp(self):
- self.root_page = Page.objects.get(id=2)
- self.user = self.login()
- def test_create(self):
- post_data = {
- "title": "Mr Benn",
- "slug": "mr-benn",
- "first_name": "William",
- "last_name": "Benn",
- "addresses-TOTAL_FORMS": 1,
- "addresses-INITIAL_FORMS": 0,
- "addresses-MIN_NUM_FORMS": 0,
- "addresses-MAX_NUM_FORMS": 1000,
- "addresses-0-address": "52 Festive Road, London",
- "addresses-0-tags": "shopkeeper, bowler-hat",
- "action-publish": "Publish",
- "comments-TOTAL_FORMS": 0,
- "comments-INITIAL_FORMS": 0,
- "comments-MIN_NUM_FORMS": 0,
- "comments-MAX_NUM_FORMS": 1000,
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("tests", "personpage", self.root_page.id),
- ),
- post_data,
- )
- self.assertRedirects(
- response, reverse("wagtailadmin_explore", args=(self.root_page.id,))
- )
- new_page = PersonPage.objects.get(slug="mr-benn")
- self.assertEqual(new_page.addresses.first().tags.count(), 2)
- class TestInlinePanelNonFieldErrors(TestCase, WagtailTestUtils):
- """
- Test that non field errors will render for InlinePanels
- https://github.com/wagtail/wagtail/issues/3890
- """
- fixtures = ["demosite.json"]
- def setUp(self):
- self.root_page = Page.objects.get(id=2)
- self.user = self.login()
- def test_create(self):
- post_data = {
- "title": "Issue 3890 test",
- "slug": "issue-3890-test",
- "related_links-TOTAL_FORMS": 1,
- "related_links-INITIAL_FORMS": 0,
- "related_links-MIN_NUM_FORMS": 0,
- "related_links-MAX_NUM_FORMS": 1000,
- "related_links-0-id": 0,
- "related_links-0-ORDER": 1,
- # Leaving all fields empty should raise a validation error
- "related_links-0-link_page": "",
- "related_links-0-link_document": "",
- "related_links-0-link_external": "",
- "carousel_items-INITIAL_FORMS": 0,
- "carousel_items-MAX_NUM_FORMS": 1000,
- "carousel_items-TOTAL_FORMS": 0,
- "action-publish": "Publish",
- "comments-TOTAL_FORMS": 0,
- "comments-INITIAL_FORMS": 0,
- "comments-MIN_NUM_FORMS": 0,
- "comments-MAX_NUM_FORMS": 1000,
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=("demosite", "homepage", self.root_page.id),
- ),
- post_data,
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(
- response, "The page could not be created due to validation errors"
- )
- self.assertContains(
- response,
- "You must provide a related page, related document or an external URL",
- count=1,
- )
- @override_settings(WAGTAIL_I18N_ENABLED=True)
- class TestLocaleSelector(TestCase, WagtailTestUtils):
- fixtures = ["test.json"]
- def setUp(self):
- self.events_page = Page.objects.get(url_path="/home/events/")
- self.fr_locale = Locale.objects.create(language_code="fr")
- self.translated_events_page = self.events_page.copy_for_translation(
- self.fr_locale, copy_parents=True
- )
- self.user = self.login()
- @unittest.expectedFailure # TODO: Page editor header rewrite
- def test_locale_selector(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.events_page.id],
- )
- )
- self.assertContains(response, '<li class="header-meta--locale">')
- add_translation_url = reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.translated_events_page.id],
- )
- self.assertContains(
- response,
- f'<a href="{add_translation_url}" aria-label="French" class="u-link is-live">',
- )
- @override_settings(WAGTAIL_I18N_ENABLED=False)
- def test_locale_selector_not_present_when_i18n_disabled(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.events_page.id],
- )
- )
- self.assertNotContains(response, '<li class="header-meta--locale">')
- add_translation_url = reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.translated_events_page.id],
- )
- self.assertNotContains(
- response,
- f'<a href="{add_translation_url}" aria-label="French" class="u-link is-live">',
- )
- @unittest.expectedFailure # TODO: Page editor header rewrite
- def test_locale_selector_not_present_without_permission_to_add(self):
- # Remove user's permissions to add in the French tree
- group = Group.objects.get(name="Moderators")
- GroupPagePermission.objects.create(
- group=group,
- page=self.events_page,
- permission_type="add",
- )
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.groups.add(group)
- self.user.save()
- # Locale indicator should exist, but the "French" option should be hidden
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.events_page.id],
- )
- )
- self.assertContains(response, '<li class="header-meta--locale">')
- add_translation_url = reverse(
- "wagtailadmin_pages:add",
- args=["tests", "eventpage", self.translated_events_page.id],
- )
- self.assertNotContains(
- response,
- f'<a href="{add_translation_url}" aria-label="French" class="u-link is-live">',
- )
- @override_settings(WAGTAIL_I18N_ENABLED=True)
- class TestLocaleSelectorOnRootPage(TestCase, WagtailTestUtils):
- fixtures = ["test.json"]
- def setUp(self):
- self.root_page = Page.objects.get(id=1)
- self.fr_locale = Locale.objects.create(language_code="fr")
- self.user = self.login()
- @unittest.expectedFailure # TODO: Page editor header rewrite
- def test_locale_selector(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["demosite", "homepage", self.root_page.id],
- )
- )
- self.assertContains(response, '<li class="header-meta--locale">')
- add_translation_url = (
- reverse(
- "wagtailadmin_pages:add",
- args=["demosite", "homepage", self.root_page.id],
- )
- + "?locale=fr"
- )
- self.assertContains(
- response,
- f'<a href="{add_translation_url}" aria-label="French" class="u-link is-live">',
- )
- @override_settings(WAGTAIL_I18N_ENABLED=False)
- def test_locale_selector_not_present_when_i18n_disabled(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["demosite", "homepage", self.root_page.id],
- )
- )
- self.assertNotContains(response, '<li class="header-meta--locale">')
- add_translation_url = (
- reverse(
- "wagtailadmin_pages:add",
- args=["demosite", "homepage", self.root_page.id],
- )
- + "?locale=fr"
- )
- self.assertNotContains(
- response,
- f'<a href="{add_translation_url}" aria-label="French" class="u-link is-live">',
- )
- class TestPageSubscriptionSettings(TestCase, WagtailTestUtils):
- def setUp(self):
- # Find root page
- self.root_page = Page.objects.get(id=2)
- # Login
- self.user = self.login()
- def test_commment_notifications_switched_on_by_default(self):
- response = self.client.get(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "simplepage", self.root_page.id],
- )
- )
- self.assertEqual(response.status_code, 200)
- self.assertContains(
- response,
- '<input type="checkbox" name="comment_notifications" id="id_comment_notifications" checked>',
- )
- def test_post_with_comment_notifications_switched_on(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- "comment_notifications": "on",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "simplepage", self.root_page.id],
- ),
- post_data,
- )
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- self.assertRedirects(
- response, reverse("wagtailadmin_pages:edit", args=[page.id])
- )
- # Check the subscription
- subscription = page.subscribers.get()
- self.assertEqual(subscription.user, self.user)
- self.assertTrue(subscription.comment_notifications)
- def test_post_with_comment_notifications_switched_off(self):
- post_data = {
- "title": "New page!",
- "content": "Some content",
- "slug": "hello-world",
- }
- response = self.client.post(
- reverse(
- "wagtailadmin_pages:add",
- args=["tests", "simplepage", self.root_page.id],
- ),
- post_data,
- )
- page = Page.objects.get(
- path__startswith=self.root_page.path, slug="hello-world"
- ).specific
- self.assertRedirects(
- response, reverse("wagtailadmin_pages:edit", args=[page.id])
- )
- # Check the subscription
- subscription = page.subscribers.get()
- self.assertEqual(subscription.user, self.user)
- self.assertFalse(subscription.comment_notifications)
|