123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848 |
- import collections
- import datetime
- import json
- from django.contrib.auth import get_user_model
- from django.contrib.auth.models import Group, Permission
- from django.urls import reverse
- from django.utils import timezone
- from wagtail import hooks
- from wagtail.api.v2.tests.test_pages import TestPageDetail, TestPageListing
- from wagtail.models import GroupPagePermission, Locale, Page, PageLogEntry
- from wagtail.test.demosite import models
- from wagtail.test.testapp.models import EventIndex, EventPage, SimplePage, StreamPage
- from wagtail.users.models import UserProfile
- from .utils import AdminAPITestCase
- def get_total_page_count():
-
- return Page.objects.count() - 1
- class TestAdminPageListing(AdminAPITestCase, TestPageListing):
- fixtures = ["demosite.json"]
- def get_response(self, **params):
- return self.client.get(reverse("wagtailadmin_api:pages:listing"), params)
- def get_page_id_list(self, content):
- return [page["id"] for page in content["items"]]
-
- def test_basic(self):
- response = self.get_response()
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["Content-type"], "application/json")
-
- content = json.loads(response.content.decode("UTF-8"))
-
- self.assertIn("meta", content)
- self.assertIsInstance(content["meta"], dict)
-
- self.assertIn("total_count", content["meta"])
- self.assertIsInstance(content["meta"]["total_count"], int)
- self.assertEqual(content["meta"]["total_count"], get_total_page_count())
-
- self.assertIn("items", content)
- self.assertIsInstance(content["items"], list)
-
- for page in content["items"]:
- self.assertIn("meta", page)
- self.assertIsInstance(page["meta"], dict)
- self.assertEqual(
- set(page["meta"].keys()),
- {
- "type",
- "detail_url",
- "html_url",
- "status",
- "children",
- "slug",
- "first_published_at",
- "latest_revision_created_at",
- },
- )
-
- self.assertIsInstance(content["__types"], dict)
- self.assertEqual(
- set(content["__types"].keys()),
- {
- "demosite.EventPage",
- "demosite.StandardIndexPage",
- "demosite.PersonPage",
- "demosite.HomePage",
- "demosite.StandardPage",
- "demosite.EventIndexPage",
- "demosite.ContactPage",
- "demosite.BlogEntryPage",
- "demosite.BlogIndexPage",
- },
- )
- self.assertEqual(
- set(content["__types"]["demosite.EventPage"].keys()),
- {"verbose_name", "verbose_name_plural"},
- )
- self.assertEqual(
- content["__types"]["demosite.EventPage"]["verbose_name"], "event page"
- )
- self.assertEqual(
- content["__types"]["demosite.EventPage"]["verbose_name_plural"],
- "event pages",
- )
-
- test_unpublished_pages_dont_appear_in_list = None
- test_private_pages_dont_appear_in_list = None
- def test_unpublished_pages_appear_in_list(self):
- total_count = get_total_page_count()
- page = models.BlogEntryPage.objects.get(id=16)
- page.unpublish()
- response = self.get_response()
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(content["meta"]["total_count"], total_count)
- def test_private_pages_appear_in_list(self):
- total_count = get_total_page_count()
- page = models.BlogIndexPage.objects.get(id=5)
- page.view_restrictions.create(password="test")
- new_total_count = get_total_page_count()
- self.assertEqual(total_count, total_count)
- response = self.get_response()
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(content["meta"]["total_count"], new_total_count)
- def test_get_in_non_content_language(self):
-
- user = get_user_model().objects.get(email="test@email.com")
- UserProfile.objects.update_or_create(
- user=user, defaults={"preferred_language": "se"}
- )
- response = self.get_response()
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["Content-type"], "application/json")
-
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("meta", content)
-
-
- test_parent_field_gives_error = None
- def test_fields(self):
- response = self.get_response(
- type="demosite.BlogEntryPage", fields="title,date,feed_image"
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()),
- {"id", "meta", "title", "admin_display_title", "date", "feed_image"},
- )
- def test_fields_default(self):
- response = self.get_response(type="demosite.BlogEntryPage")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()), {"id", "meta", "title", "admin_display_title"}
- )
- self.assertEqual(
- set(page["meta"].keys()),
- {
- "type",
- "detail_url",
- "html_url",
- "children",
- "status",
- "slug",
- "first_published_at",
- "latest_revision_created_at",
- },
- )
- def test_remove_meta_fields(self):
- response = self.get_response(fields="-html_url")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()), {"id", "meta", "title", "admin_display_title"}
- )
- self.assertEqual(
- set(page["meta"].keys()),
- {
- "type",
- "detail_url",
- "slug",
- "first_published_at",
- "latest_revision_created_at",
- "status",
- "children",
- },
- )
- def test_remove_all_meta_fields(self):
- response = self.get_response(
- fields="-type,-detail_url,-slug,-first_published_at,-html_url,-latest_revision_created_at,-status,-children"
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(set(page.keys()), {"id", "title", "admin_display_title"})
- def test_remove_fields(self):
- response = self.get_response(fields="-title,-admin_display_title")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(set(page.keys()), {"id", "meta"})
- def test_remove_id_field(self):
- response = self.get_response(fields="-id")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(set(page.keys()), {"meta", "title", "admin_display_title"})
- def test_all_fields(self):
- response = self.get_response(type="demosite.BlogEntryPage", fields="*")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()),
- {
- "id",
- "meta",
- "title",
- "admin_display_title",
- "date",
- "related_links",
- "tags",
- "carousel_items",
- "body",
- "feed_image",
- "feed_image_thumbnail",
- },
- )
- self.assertEqual(
- set(page["meta"].keys()),
- {
- "type",
- "detail_url",
- "show_in_menus",
- "first_published_at",
- "seo_title",
- "slug",
- "parent",
- "html_url",
- "search_description",
- "locale",
- "alias_of",
- "children",
- "descendants",
- "ancestors",
- "translations",
- "status",
- "latest_revision_created_at",
- },
- )
- def test_all_fields_then_remove_something(self):
- response = self.get_response(
- type="demosite.BlogEntryPage",
- fields="*,-title,-admin_display_title,-date,-seo_title,-status",
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()),
- {
- "id",
- "meta",
- "related_links",
- "tags",
- "carousel_items",
- "body",
- "feed_image",
- "feed_image_thumbnail",
- },
- )
- self.assertEqual(
- set(page["meta"].keys()),
- {
- "type",
- "detail_url",
- "show_in_menus",
- "first_published_at",
- "slug",
- "parent",
- "html_url",
- "search_description",
- "locale",
- "alias_of",
- "children",
- "descendants",
- "ancestors",
- "translations",
- "latest_revision_created_at",
- },
- )
- def test_all_nested_fields(self):
- response = self.get_response(
- type="demosite.BlogEntryPage", fields="feed_image(*)"
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page["feed_image"].keys()),
- {"id", "meta", "title", "width", "height", "thumbnail"},
- )
- def test_fields_foreign_key(self):
-
- response = self.get_response(
- type="demosite.BlogEntryPage", fields="title,date,feed_image"
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- feed_image = page["feed_image"]
- if feed_image is not None:
- self.assertIsInstance(feed_image, dict)
- self.assertEqual(set(feed_image.keys()), {"id", "meta", "title"})
- self.assertIsInstance(feed_image["id"], int)
- self.assertIsInstance(feed_image["meta"], dict)
- self.assertEqual(
- set(feed_image["meta"].keys()),
- {"type", "detail_url", "download_url"},
- )
- self.assertEqual(feed_image["meta"]["type"], "wagtailimages.Image")
- self.assertEqual(
- feed_image["meta"]["detail_url"],
- "http://localhost/admin/api/main/images/%d/" % feed_image["id"],
- )
- def test_fields_parent(self):
- response = self.get_response(type="demosite.BlogEntryPage", fields="parent")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- parent = page["meta"]["parent"]
-
- self.assertDictEqual(
- parent,
- {
- "id": 5,
- "meta": {
- "type": "demosite.BlogIndexPage",
- "detail_url": "http://localhost/admin/api/main/pages/5/",
- "html_url": "http://localhost/blog-index/",
- },
- "title": "Blog index",
- },
- )
- def test_fields_descendants(self):
- response = self.get_response(fields="descendants")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- descendants = page["meta"]["descendants"]
- self.assertEqual(set(descendants.keys()), {"count", "listing_url"})
- self.assertIsInstance(descendants["count"], int)
- self.assertEqual(
- descendants["listing_url"],
- "http://localhost/admin/api/main/pages/?descendant_of=%d" % page["id"],
- )
- def test_fields_child_relation(self):
- response = self.get_response(
- type="demosite.BlogEntryPage", fields="title,related_links"
- )
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()),
- {"id", "meta", "title", "admin_display_title", "related_links"},
- )
- self.assertIsInstance(page["related_links"], list)
- def test_fields_ordering(self):
- response = self.get_response(
- type="demosite.BlogEntryPage", fields="date,title,feed_image,related_links"
- )
-
- content = json.loads(response.content.decode("UTF-8"))
-
- content = json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode(
- response.content.decode("UTF-8")
- )
- field_order = [
- "id",
- "meta",
- "title",
- "admin_display_title",
- "date",
- "feed_image",
- "related_links",
- ]
- self.assertEqual(list(content["items"][0].keys()), field_order)
- def test_fields_tags(self):
- response = self.get_response(type="demosite.BlogEntryPage", fields="tags")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(
- set(page.keys()), {"id", "meta", "tags", "title", "admin_display_title"}
- )
- self.assertIsInstance(page["tags"], list)
- def test_fields_translations(self):
-
- french = Locale.objects.create(language_code="fr")
- homepage = Page.objects.get(depth=2)
- french_homepage = homepage.copy_for_translation(french)
- response = self.get_response(fields="translations")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- translations = page["meta"]["translations"]
- if page["id"] == homepage.id:
- self.assertEqual(len(translations), 1)
- self.assertEqual(translations[0]["id"], french_homepage.id)
- self.assertEqual(translations[0]["meta"]["locale"], "fr")
- elif page["id"] == french_homepage.id:
- self.assertEqual(len(translations), 1)
- self.assertEqual(translations[0]["id"], homepage.id)
- self.assertEqual(translations[0]["meta"]["locale"], "en")
- else:
- self.assertEqual(translations, [])
-
-
- test_child_of_page_thats_not_in_same_site_gives_error = None
- def test_child_of_root(self):
-
-
-
- response = self.get_response(child_of="root")
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(page_id_list, [2])
- def test_child_of_page_1(self):
-
- response = self.get_response(child_of=1)
- json.loads(response.content.decode("UTF-8"))
- self.assertEqual(response.status_code, 200)
-
-
- test_descendant_of_page_thats_not_in_same_site_gives_error = None
- def test_descendant_of_root(self):
- response = self.get_response(descendant_of="root")
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(
- page_id_list,
- [2, 4, 8, 9, 5, 16, 18, 19, 6, 10, 15, 17, 21, 22, 23, 20, 13, 14, 12],
- )
- def test_descendant_of_root_doesnt_give_error(self):
-
- response = self.get_response(descendant_of=1)
- json.loads(response.content.decode("UTF-8"))
- self.assertEqual(response.status_code, 200)
-
- def make_simple_page(self, parent, title):
- return parent.add_child(instance=SimplePage(title=title, content="Simple page"))
- def test_for_explorer_filter(self):
- movies = self.make_simple_page(Page.objects.get(pk=1), "Movies")
- visible_movies = [
- self.make_simple_page(movies, "The Way of the Dragon"),
- self.make_simple_page(movies, "Enter the Dragon"),
- self.make_simple_page(movies, "Dragons Forever"),
- ]
- hidden_movies = [
- self.make_simple_page(movies, "The Hidden Fortress"),
- self.make_simple_page(movies, "Crouching Tiger, Hidden Dragon"),
- self.make_simple_page(
- movies, "Crouching Tiger, Hidden Dragon: Sword of Destiny"
- ),
- ]
- response = self.get_response(child_of=movies.pk, for_explorer=1)
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(page_id_list, [page.pk for page in visible_movies])
- response = self.get_response(child_of=movies.pk)
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(
- page_id_list, [page.pk for page in visible_movies + hidden_movies]
- )
- def test_for_explorer_no_child_of(self):
- response = self.get_response(for_explorer=1)
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(
- content,
- {
- "message": "filtering by for_explorer without child_of is not supported",
- },
- )
- def test_for_explorer_construct_explorer_page_queryset_ordering(self):
- def set_custom_ordering(parent_page, pages, request):
- return pages.order_by("-title")
- with hooks.register_temporarily(
- "construct_explorer_page_queryset", set_custom_ordering
- ):
- response = self.get_response(for_explorer=True, child_of=2)
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(page_id_list, [6, 20, 4, 12, 5])
-
- def test_has_children_filter(self):
- response = self.get_response(has_children="true")
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(page_id_list, [2, 4, 5, 6, 21, 20])
- def test_has_children_filter_off(self):
- response = self.get_response(has_children="false")
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(
- page_id_list, [8, 9, 16, 18, 19, 10, 15, 17, 22, 23, 13, 14, 12]
- )
- def test_has_children_filter_int(self):
- response = self.get_response(has_children=1)
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(page_id_list, [2, 4, 5, 6, 21, 20])
- def test_has_children_filter_int_off(self):
- response = self.get_response(has_children=0)
- content = json.loads(response.content.decode("UTF-8"))
- page_id_list = self.get_page_id_list(content)
- self.assertEqual(
- page_id_list, [8, 9, 16, 18, 19, 10, 15, 17, 22, 23, 13, 14, 12]
- )
- def test_has_children_filter_invalid_integer(self):
- response = self.get_response(has_children=3)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(response.status_code, 400)
- self.assertEqual(content, {"message": "has_children must be 'true' or 'false'"})
- def test_has_children_filter_invalid_value(self):
- response = self.get_response(has_children="yes")
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(response.status_code, 400)
- self.assertEqual(content, {"message": "has_children must be 'true' or 'false'"})
-
- def test_type_filter_items_are_all_blog_entries(self):
- response = self.get_response(type="demosite.BlogEntryPage")
- content = json.loads(response.content.decode("UTF-8"))
- for page in content["items"]:
- self.assertEqual(page["meta"]["type"], "demosite.BlogEntryPage")
-
- self.assertEqual(
- set(page.keys()), {"id", "meta", "title", "admin_display_title"}
- )
- def test_type_filter_multiple(self):
- response = self.get_response(type="demosite.BlogEntryPage,demosite.EventPage")
- content = json.loads(response.content.decode("UTF-8"))
- blog_page_seen = False
- event_page_seen = False
- for page in content["items"]:
- self.assertIn(
- page["meta"]["type"], ["demosite.BlogEntryPage", "demosite.EventPage"]
- )
- if page["meta"]["type"] == "demosite.BlogEntryPage":
- blog_page_seen = True
- elif page["meta"]["type"] == "demosite.EventPage":
- event_page_seen = True
-
- self.assertEqual(
- set(page.keys()), {"id", "meta", "title", "admin_display_title"}
- )
- self.assertTrue(blog_page_seen, "No blog pages were found in the items")
- self.assertTrue(event_page_seen, "No event pages were found in the items")
- class TestAdminPageDetail(AdminAPITestCase, TestPageDetail):
- fixtures = ["demosite.json"]
- def get_response(self, page_id, **params):
- return self.client.get(
- reverse("wagtailadmin_api:pages:detail", args=(page_id,)), params
- )
- def test_basic(self):
- response = self.get_response(16)
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["Content-type"], "application/json")
-
- content = json.loads(response.content.decode("UTF-8"))
-
- self.assertIn("id", content)
- self.assertEqual(content["id"], 16)
-
- self.assertIn("meta", content)
- self.assertIsInstance(content["meta"], dict)
-
- self.assertIn("type", content["meta"])
- self.assertEqual(content["meta"]["type"], "demosite.BlogEntryPage")
-
- self.assertIn("detail_url", content["meta"])
- self.assertEqual(
- content["meta"]["detail_url"], "http://localhost/admin/api/main/pages/16/"
- )
-
- self.assertIn("html_url", content["meta"])
- self.assertEqual(
- content["meta"]["html_url"], "http://localhost/blog-index/blog-post/"
- )
-
- self.assertIn("status", content["meta"])
- self.assertEqual(
- content["meta"]["status"],
- {"status": "live", "live": True, "has_unpublished_changes": False},
- )
-
- self.assertIn("children", content["meta"])
- self.assertEqual(
- content["meta"]["children"],
- {
- "count": 0,
- "listing_url": "http://localhost/admin/api/main/pages/?child_of=16",
- },
- )
-
- self.assertIn("parent", content["meta"])
- self.assertIsInstance(content["meta"]["parent"], dict)
- self.assertEqual(set(content["meta"]["parent"].keys()), {"id", "meta", "title"})
- self.assertEqual(content["meta"]["parent"]["id"], 5)
- self.assertIsInstance(content["meta"]["parent"]["meta"], dict)
- self.assertEqual(
- set(content["meta"]["parent"]["meta"].keys()),
- {"type", "detail_url", "html_url"},
- )
- self.assertEqual(
- content["meta"]["parent"]["meta"]["type"], "demosite.BlogIndexPage"
- )
- self.assertEqual(
- content["meta"]["parent"]["meta"]["detail_url"],
- "http://localhost/admin/api/main/pages/5/",
- )
- self.assertEqual(
- content["meta"]["parent"]["meta"]["html_url"],
- "http://localhost/blog-index/",
- )
-
-
- self.assertIn("alias_of", content["meta"])
- self.assertIsNone(content["meta"]["alias_of"])
-
- self.assertIn("date", content)
- self.assertIn("body", content)
- self.assertIn("tags", content)
- self.assertIn("feed_image", content)
- self.assertIn("related_links", content)
- self.assertIn("carousel_items", content)
-
- self.assertEqual(content["date"], "2013-12-02")
-
- self.assertEqual(content["tags"], ["bird", "wagtail"])
-
- self.assertIsInstance(content["feed_image"], dict)
- self.assertEqual(set(content["feed_image"].keys()), {"id", "meta", "title"})
- self.assertEqual(content["feed_image"]["id"], 7)
- self.assertIsInstance(content["feed_image"]["meta"], dict)
- self.assertEqual(
- set(content["feed_image"]["meta"].keys()),
- {"type", "detail_url", "download_url"},
- )
- self.assertEqual(content["feed_image"]["meta"]["type"], "wagtailimages.Image")
- self.assertEqual(
- content["feed_image"]["meta"]["detail_url"],
- "http://localhost/admin/api/main/images/7/",
- )
-
- self.assertEqual(content["related_links"], [])
- for carousel_item in content["carousel_items"]:
- self.assertEqual(
- set(carousel_item.keys()),
- {"id", "meta", "embed_url", "link", "caption", "image"},
- )
- self.assertEqual(set(carousel_item["meta"].keys()), {"type"})
-
- self.assertIsInstance(content["__types"], dict)
- self.assertEqual(
- set(content["__types"].keys()),
- {
- "wagtailcore.Page",
- "demosite.HomePage",
- "demosite.BlogIndexPage",
- "demosite.BlogEntryPageCarouselItem",
- "demosite.BlogEntryPage",
- "wagtailimages.Image",
- },
- )
- self.assertEqual(
- set(content["__types"]["demosite.BlogIndexPage"].keys()),
- {"verbose_name", "verbose_name_plural"},
- )
- self.assertEqual(
- content["__types"]["demosite.BlogIndexPage"]["verbose_name"],
- "blog index page",
- )
- self.assertEqual(
- content["__types"]["demosite.BlogIndexPage"]["verbose_name_plural"],
- "blog index pages",
- )
-
- def test_meta_parent_id_doesnt_show_root_page(self):
-
- response = self.get_response(2)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIsNotNone(content["meta"]["parent"])
- def test_field_ordering(self):
-
- response = self.get_response(16)
-
- content = json.loads(response.content.decode("UTF-8"))
-
- content = json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode(
- response.content.decode("UTF-8")
- )
- field_order = [
- "id",
- "meta",
- "title",
- "admin_display_title",
- "body",
- "tags",
- "date",
- "feed_image",
- "feed_image_thumbnail",
- "carousel_items",
- "related_links",
- "__types",
- ]
- self.assertEqual(list(content.keys()), field_order)
- def test_meta_status_draft(self):
-
- Page.objects.get(id=16).unpublish()
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("status", content["meta"])
- self.assertEqual(
- content["meta"]["status"],
- {"status": "draft", "live": False, "has_unpublished_changes": True},
- )
- def test_meta_status_live_draft(self):
-
- Page.objects.get(id=16).save_revision()
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("status", content["meta"])
- self.assertEqual(
- content["meta"]["status"],
- {"status": "live + draft", "live": True, "has_unpublished_changes": True},
- )
- def test_meta_status_scheduled(self):
-
- Page.objects.get(id=16).unpublish()
- tomorrow = timezone.now() + datetime.timedelta(days=1)
- Page.objects.get(id=16).save_revision(approved_go_live_at=tomorrow)
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("status", content["meta"])
- self.assertEqual(
- content["meta"]["status"],
- {"status": "scheduled", "live": False, "has_unpublished_changes": True},
- )
- def test_meta_status_expired(self):
-
- Page.objects.get(id=16).unpublish()
- Page.objects.filter(id=16).update(expired=True)
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("status", content["meta"])
- self.assertEqual(
- content["meta"]["status"],
- {"status": "expired", "live": False, "has_unpublished_changes": True},
- )
- def test_meta_children_for_parent(self):
-
- response = self.get_response(2)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("children", content["meta"])
- self.assertEqual(
- content["meta"]["children"],
- {
- "count": 5,
- "listing_url": "http://localhost/admin/api/main/pages/?child_of=2",
- },
- )
- def test_meta_descendants(self):
-
- response = self.get_response(2)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("descendants", content["meta"])
- self.assertEqual(
- content["meta"]["descendants"],
- {
- "count": 18,
- "listing_url": "http://localhost/admin/api/main/pages/?descendant_of=2",
- },
- )
- def test_meta_ancestors(self):
-
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- self.assertIn("ancestors", content["meta"])
- self.assertIsInstance(content["meta"]["ancestors"], list)
- self.assertEqual(len(content["meta"]["ancestors"]), 3)
- self.assertEqual(
- content["meta"]["ancestors"][0].keys(),
- {"id", "meta", "title", "admin_display_title"},
- )
- self.assertEqual(content["meta"]["ancestors"][0]["title"], "Root")
- self.assertEqual(content["meta"]["ancestors"][1]["title"], "Home page")
- self.assertEqual(content["meta"]["ancestors"][2]["title"], "Blog index")
- def test_alias_page(self):
- original = Page.objects.get(id=16).specific
- alias = original.create_alias(update_slug="new-slug")
- response = self.get_response(alias.id)
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["Content-type"], "application/json")
-
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(content["meta"]["type"], "demosite.BlogEntryPage")
- self.assertEqual(
- content["meta"]["html_url"], "http://localhost/blog-index/new-slug/"
- )
-
- self.assertIn("alias_of", content["meta"])
- self.assertIsInstance(content["meta"]["alias_of"], dict)
- self.assertEqual(
- set(content["meta"]["alias_of"].keys()), {"id", "meta", "title"}
- )
- self.assertEqual(content["meta"]["alias_of"]["id"], 16)
- self.assertIsInstance(content["meta"]["alias_of"]["meta"], dict)
- self.assertEqual(
- set(content["meta"]["alias_of"]["meta"].keys()),
- {"type", "detail_url", "html_url"},
- )
- self.assertEqual(
- content["meta"]["alias_of"]["meta"]["type"], "demosite.BlogEntryPage"
- )
- self.assertEqual(
- content["meta"]["alias_of"]["meta"]["detail_url"],
- "http://localhost/admin/api/main/pages/16/",
- )
- self.assertEqual(
- content["meta"]["alias_of"]["meta"]["html_url"],
- "http://localhost/blog-index/blog-post/",
- )
-
- def test_remove_all_meta_fields(self):
- response = self.get_response(
- 16,
- fields="-type,-detail_url,-slug,-first_published_at,-html_url,-descendants,-latest_revision_created_at,-alias_of,-children,-ancestors,-show_in_menus,-seo_title,-parent,-status,-search_description",
- )
- content = json.loads(response.content.decode("UTF-8"))
- self.assertNotIn("meta", set(content.keys()))
- self.assertIn("id", set(content.keys()))
- def test_remove_all_fields(self):
- response = self.get_response(16, fields="_,id,type")
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(set(content.keys()), {"id", "meta", "__types"})
- self.assertEqual(set(content["meta"].keys()), {"type"})
- def test_all_nested_fields(self):
- response = self.get_response(16, fields="feed_image(*)")
- content = json.loads(response.content.decode("UTF-8"))
- self.assertEqual(
- set(content["feed_image"].keys()),
- {"id", "meta", "title", "width", "height", "thumbnail"},
- )
- def test_fields_foreign_key(self):
- response = self.get_response(16)
- content = json.loads(response.content.decode("UTF-8"))
- feed_image = content["feed_image"]
- self.assertIsInstance(feed_image, dict)
- self.assertEqual(set(feed_image.keys()), {"id", "meta", "title"})
- self.assertIsInstance(feed_image["id"], int)
- self.assertIsInstance(feed_image["meta"], dict)
- self.assertEqual(
- set(feed_image["meta"].keys()), {"type", "detail_url", "download_url"}
- )
- self.assertEqual(feed_image["meta"]["type"], "wagtailimages.Image")
- self.assertEqual(
- feed_image["meta"]["detail_url"],
- "http://localhost/admin/api/main/images/%d/" % feed_image["id"],
- )
- class TestAdminPageDetailWithStreamField(AdminAPITestCase):
- fixtures = ["test.json"]
- def setUp(self):
- super().setUp()
- self.homepage = Page.objects.get(url_path="/home/")
- def make_stream_page(self, body):
- stream_page = StreamPage(title="stream page", slug="stream-page", body=body)
- return self.homepage.add_child(instance=stream_page)
- def test_can_fetch_streamfield_content(self):
- stream_page = self.make_stream_page('[{"type": "text", "value": "foo"}]')
- response_url = reverse("wagtailadmin_api:pages:detail", args=(stream_page.id,))
- response = self.client.get(response_url)
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response["content-type"], "application/json")
- content = json.loads(response.content.decode("utf-8"))
- self.assertIn("id", content)
- self.assertEqual(content["id"], stream_page.id)
- self.assertIn("body", content)
- self.assertEqual(len(content["body"]), 1)
- self.assertEqual(content["body"][0]["type"], "text")
- self.assertEqual(content["body"][0]["value"], "foo")
- self.assertTrue(content["body"][0]["id"])
- def test_image_block(self):
- stream_page = self.make_stream_page('[{"type": "image", "value": 1}]')
- response_url = reverse("wagtailadmin_api:pages:detail", args=(stream_page.id,))
- response = self.client.get(response_url)
- content = json.loads(response.content.decode("utf-8"))
-
- self.assertEqual(content["body"][0]["type"], "image")
- self.assertEqual(content["body"][0]["value"], 1)
- class TestCustomAdminDisplayTitle(AdminAPITestCase):
- fixtures = ["test.json"]
- def setUp(self):
- super().setUp()
- self.event_page = Page.objects.get(url_path="/home/events/saint-patrick/")
- def test_custom_admin_display_title_shown_on_detail_page(self):
- api_url = reverse("wagtailadmin_api:pages:detail", args=(self.event_page.id,))
- response = self.client.get(api_url)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content["title"], "Saint Patrick")
- self.assertEqual(content["admin_display_title"], "Saint Patrick (single event)")
- def test_custom_admin_display_title_shown_on_listing(self):
- api_url = reverse("wagtailadmin_api:pages:listing")
- response = self.client.get(api_url)
- content = json.loads(response.content.decode("utf-8"))
- matching_items = [
- item for item in content["items"] if item["id"] == self.event_page.id
- ]
- self.assertEqual(1, len(matching_items))
- self.assertEqual(matching_items[0]["title"], "Saint Patrick")
- self.assertEqual(
- matching_items[0]["admin_display_title"], "Saint Patrick (single event)"
- )
- class TestCopyPageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id, data):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "copy"]), data
- )
- def test_copy_page(self):
- response = self.get_response(3, {})
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.title, "Events")
- self.assertEqual(new_page.slug, "events-1")
- self.assertTrue(new_page.live)
- self.assertFalse(new_page.get_children().exists())
- def test_copy_page_change_title(self):
- response = self.get_response(3, {"title": "New title"})
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.title, "New title")
- self.assertEqual(new_page.slug, "events-1")
- def test_copy_page_change_slug(self):
- response = self.get_response(3, {"slug": "new-slug"})
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.slug, "new-slug")
- def test_copy_page_destination(self):
- response = self.get_response(3, {"destination_page_id": 3})
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.title, "Events")
- self.assertTrue(new_page.live)
- self.assertFalse(new_page.get_children().exists())
- def test_copy_page_recursive(self):
- response = self.get_response(
- 3,
- {
- "recursive": True,
- },
- )
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.title, "Events")
- self.assertTrue(new_page.get_children().exists())
- def test_copy_page_in_draft(self):
- response = self.get_response(
- 3,
- {
- "keep_live": False,
- },
- )
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_page = Page.objects.get(id=content["id"])
- self.assertEqual(new_page.title, "Events")
- self.assertFalse(new_page.live)
-
- def test_without_publish_permissions_at_destination_with_keep_live_false(self):
- 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.objects.get(name="Editors"))
- self.user.save()
- response = self.get_response(
- 3,
- {
- "destination_page_id": 1,
- "keep_live": False,
- },
- )
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_recursively_copy_into_self(self):
- response = self.get_response(
- 3,
- {
- "destination_page_id": 3,
- "recursive": True,
- },
- )
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content,
- {"message": "You cannot copy a tree branch recursively into itself"},
- )
- def test_without_create_permissions_at_destination(self):
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- response = self.get_response(
- 3,
- {
- "destination_page_id": 2,
- },
- )
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_without_publish_permissions_at_destination_with_keep_live(self):
- 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.objects.get(name="Editors"))
- self.user.save()
- GroupPagePermission.objects.create(
- group=Group.objects.get(name="Editors"), page_id=2, permission_type="add"
- )
- response = self.get_response(
- 3,
- {
- "destination_page_id": 2,
- },
- )
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_respects_page_creation_rules(self):
-
- response = self.get_response(2, {})
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_copy_page_slug_in_use(self):
- response = self.get_response(
- 3,
- {
- "slug": "events",
- },
- )
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"slug": ["This slug is already in use"]})
- class TestConvertAliasPageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def setUp(self):
- super().setUp()
-
- self.root_page = Page.objects.get(id=2)
-
- self.child_page = SimplePage(
- title="Hello world!", slug="hello-world", content="hello"
- )
- self.root_page.add_child(instance=self.child_page)
-
- self.alias_page = self.child_page.create_alias(update_slug="alias-page")
- def get_response(self, page_id):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "convert_alias"])
- )
- def test_convert_alias(self):
- response = self.get_response(self.alias_page.id)
- self.assertEqual(response.status_code, 200)
-
- self.alias_page.refresh_from_db()
- self.assertIsNone(self.alias_page.alias_of)
-
- revision = self.alias_page.revisions.get()
- self.assertEqual(revision.user, self.user)
- self.assertEqual(self.alias_page.live_revision, revision)
-
- log = PageLogEntry.objects.get(action="wagtail.convert_alias")
- self.assertFalse(log.content_changed)
- self.assertEqual(
- log.data,
- {
- "page": {
- "id": self.alias_page.id,
- "title": self.alias_page.get_admin_display_title(),
- }
- },
- )
- self.assertEqual(log.page, self.alias_page.page_ptr)
- self.assertEqual(log.revision, revision)
- self.assertEqual(log.user, self.user)
- def test_convert_alias_not_alias(self):
- response = self.get_response(self.child_page.id)
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"message": "Page must be an alias to be converted."})
- def test_convert_alias_bad_permission(self):
-
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- response = self.get_response(self.alias_page.id)
- self.assertEqual(response.status_code, 403)
- class TestDeletePageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "delete"])
- )
- def test_delete_page(self):
- response = self.get_response(4)
-
- self.assertEqual(response.status_code, 204)
- self.assertFalse(Page.objects.filter(id=4).exists())
- def test_delete_page_bad_permissions(self):
-
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
-
- response = self.get_response(4)
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
-
- self.assertTrue(Page.objects.filter(id=4).exists())
- class TestPublishPageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "publish"])
- )
- def test_publish_page(self):
- unpublished_page = Page.objects.get(slug="tentative-unpublished-event")
- self.assertIsNone(unpublished_page.first_published_at)
- self.assertEqual(
- unpublished_page.first_published_at, unpublished_page.last_published_at
- )
- self.assertIs(unpublished_page.live, False)
- response = self.get_response(unpublished_page.id)
- self.assertEqual(response.status_code, 200)
- unpublished_page.refresh_from_db()
- self.assertIsNotNone(unpublished_page.first_published_at)
- self.assertEqual(
- unpublished_page.first_published_at, unpublished_page.last_published_at
- )
- self.assertIs(unpublished_page.live, True)
- def test_publish_insufficient_permissions(self):
- 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.objects.get(name="Editors"))
- self.user.save()
- response = self.get_response(4)
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_publish_alias_page(self):
- home = Page.objects.get(slug="home")
- alias_page = home.create_alias(update_slug="new-home-page")
- response = self.get_response(alias_page.id)
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content,
- {
- "message": (
- "save_revision() was called on an alias page. "
- "Revisions are not required for alias pages as they are an exact copy of another page."
- )
- },
- )
- class TestUnpublishPageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id, data):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "unpublish"]), data
- )
- def test_unpublish_page(self):
- self.assertTrue(Page.objects.get(id=3).live)
- response = self.get_response(3, {})
- self.assertEqual(response.status_code, 200)
-
- self.assertFalse(Page.objects.get(id=3).live)
- def test_unpublish_page_include_descendants(self):
- page = Page.objects.get(slug="home")
-
- self.assertTrue(page.get_descendants().live().filter(locked=False).exists())
- response = self.get_response(page.id, {"recursive": True})
- self.assertEqual(response.status_code, 200)
-
- page.refresh_from_db()
- self.assertFalse(page.live)
-
- descendant_pages = page.get_descendants().filter(locked=False)
- self.assertTrue(descendant_pages.exists())
- for descendant_page in descendant_pages:
- self.assertFalse(descendant_page.live)
- def test_unpublish_page_without_including_descendants(self):
- page = Page.objects.get(slug="secret-plans")
-
- self.assertTrue(page.get_descendants().live().filter(locked=False).exists())
- response = self.get_response(page.id, {"recursive": False})
- self.assertEqual(response.status_code, 200)
-
- page.refresh_from_db()
- self.assertFalse(page.live)
-
- self.assertTrue(page.get_descendants().live().filter(locked=False).exists())
- def test_unpublish_invalid_page_id(self):
- response = self.get_response(12345, {})
- self.assertEqual(response.status_code, 404)
- def test_unpublish_page_insufficient_permission(self):
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- response = self.get_response(3, {})
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- class TestMovePageAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id, data):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "move"]), data
- )
- def test_move_page(self):
- response = self.get_response(4, {"destination_page_id": 3})
- self.assertEqual(response.status_code, 200)
- def test_move_page_bad_permissions(self):
-
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
-
- response = self.get_response(4, {"destination_page_id": 3})
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_move_page_without_destination_page_id(self):
- response = self.get_response(4, {})
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"destination_page_id": ["This field is required."]})
- class TestCopyForTranslationAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def get_response(self, page_id, data):
- return self.client.post(
- reverse(
- "wagtailadmin_api:pages:action", args=[page_id, "copy_for_translation"]
- ),
- data,
- )
- def setUp(self):
- super().setUp()
- self.en_homepage = Page.objects.get(url_path="/home/").specific
- self.en_eventindex = EventIndex.objects.get(url_path="/home/events/")
- self.en_eventpage = EventPage.objects.get(url_path="/home/events/christmas/")
- self.root_page = self.en_homepage.get_parent()
- self.fr_locale = Locale.objects.create(language_code="fr")
- def test_copy_homepage_for_translation(self):
- response = self.get_response(self.en_homepage.id, {"locale": "fr"})
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- fr_homepage = Page.objects.get(id=content["id"])
- self.assertNotEqual(self.en_homepage.id, fr_homepage.id)
- self.assertEqual(fr_homepage.locale, self.fr_locale)
- self.assertEqual(fr_homepage.translation_key, self.en_homepage.translation_key)
-
- self.assertEqual(fr_homepage.slug, "home-fr")
-
- self.assertFalse(fr_homepage.live)
- self.assertTrue(fr_homepage.has_unpublished_changes)
- def test_copy_childpage_without_parent(self):
- response = self.get_response(self.en_eventindex.id, {"locale": "fr"})
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"message": "Parent page is not translated."})
- def test_copy_childpage_with_copy_parents(self):
- response = self.get_response(
- self.en_eventindex.id, {"locale": "fr", "copy_parents": True}
- )
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- fr_eventindex = Page.objects.get(id=content["id"])
- self.assertNotEqual(self.en_eventindex.id, fr_eventindex.id)
- self.assertEqual(fr_eventindex.locale, self.fr_locale)
- self.assertEqual(
- fr_eventindex.translation_key, self.en_eventindex.translation_key
- )
- self.assertEqual(self.en_eventindex.slug, fr_eventindex.slug)
-
- fr_homepage = fr_eventindex.get_parent()
- self.assertNotEqual(self.en_homepage.id, fr_homepage.id)
- self.assertEqual(fr_homepage.locale, self.fr_locale)
- self.assertEqual(fr_homepage.translation_key, self.en_homepage.translation_key)
- self.assertEqual(fr_homepage.slug, "home-fr")
- def test_copy_for_translation_no_locale(self):
- response = self.get_response(self.en_homepage.id, {})
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"locale": ["This field is required."]})
- def test_copy_for_translation_unknown_locale(self):
- response = self.get_response(self.en_homepage.id, {"locale": "de"})
- self.assertEqual(response.status_code, 404)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"message": "No Locale matches the given query."})
- class TestCreatePageAliasAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def setUp(self):
- super().setUp()
- self.events_index = EventIndex.objects.get(url_path="/home/events/")
- self.about_us = SimplePage.objects.get(url_path="/home/about-us/")
- def get_response(self, page_id, data):
- return self.client.post(
- reverse("wagtailadmin_api:pages:action", args=[page_id, "create_alias"]),
- data,
- )
- def test_create_alias(self):
-
-
-
- self.about_us.draft_title = "Draft title"
- self.about_us.save(update_fields=["draft_title"])
- response = self.get_response(
- self.about_us.id, data={"update_slug": "new-about-us"}
- )
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_about_us = Page.objects.get(id=content["id"])
-
- self.assertIsInstance(new_about_us.specific, SimplePage)
- self.assertEqual(new_about_us.slug, "new-about-us")
-
- self.assertEqual(new_about_us.draft_title, "About us")
-
- self.assertNotEqual(self.about_us.id, new_about_us.id)
-
- self.assertEqual(new_about_us.url_path, "/home/new-about-us/")
-
- self.assertEqual(new_about_us.alias_of.specific, self.about_us)
- def test_create_alias_recursive(self):
- response = self.get_response(
- self.events_index.id,
- data={"recursive": True, "update_slug": "new-events-index"},
- )
- self.assertEqual(response.status_code, 201)
- content = json.loads(response.content.decode("utf-8"))
- new_events_index = Page.objects.get(id=content["id"])
-
- old_christmas_event = (
- self.events_index.get_children().filter(slug="christmas").first()
- )
- new_christmas_event = (
- new_events_index.get_children().filter(slug="christmas").first()
- )
-
- self.assertIsNotNone(new_christmas_event, "Child pages weren't copied")
- self.assertIsNotNone(
- old_christmas_event, "Child pages were removed from original page"
- )
-
- self.assertEqual(
- new_christmas_event.url_path, "/home/new-events-index/christmas/"
- )
-
- self.assertEqual(new_christmas_event.alias_of, old_christmas_event)
- def test_create_alias_doesnt_copy_recursively_to_the_same_tree(self):
- response = self.get_response(
- self.events_index.id,
- data={"recursive": True, "destination_page_id": self.events_index.id},
- )
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content,
- {"message": "You cannot copy a tree branch recursively into itself"},
- )
- def test_create_alias_without_publish_permissions(self):
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- response = self.get_response(
- self.events_index.id,
- data={"recursive": True, "update_slug": "new-events-index"},
- )
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- class TestRevertToPageRevisionAction(AdminAPITestCase):
- fixtures = ["test.json"]
- def setUp(self):
- super().setUp()
- self.events_page = Page.objects.get(id=3)
-
- self.first_revision = self.events_page.save_revision()
-
- self.events_page.title = "Evenements"
- self.events_page.save_revision().publish()
- def get_response(self, page_id, data):
- return self.client.post(
- reverse(
- "wagtailadmin_api:pages:action",
- args=[page_id, "revert_to_page_revision"],
- ),
- data,
- )
- def test_revert_to_page_revision(self):
- self.assertEqual(self.events_page.title, "Evenements")
- response = self.get_response(
- self.events_page.id, {"revision_id": self.first_revision.id}
- )
- self.assertEqual(response.status_code, 200)
- self.events_page.get_latest_revision().publish()
- self.events_page.refresh_from_db()
- self.assertEqual(self.events_page.title, "Events")
- def test_revert_to_page_revision_bad_permissions(self):
-
- self.user.is_superuser = False
- self.user.user_permissions.add(
- Permission.objects.get(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- )
- self.user.save()
- response = self.get_response(
- self.events_page.id, {"revision_id": self.first_revision.id}
- )
- self.assertEqual(response.status_code, 403)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"detail": "You do not have permission to perform this action."}
- )
- def test_revert_to_page_revision_without_revision_id(self):
- response = self.get_response(self.events_page.id, {})
- self.assertEqual(response.status_code, 400)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(content, {"revision_id": ["This field is required."]})
- def test_revert_to_page_revision_bad_revision_id(self):
- self.assertEqual(self.events_page.title, "Evenements")
- response = self.get_response(self.events_page.id, {"revision_id": 999})
- self.assertEqual(response.status_code, 404)
- content = json.loads(response.content.decode("utf-8"))
- self.assertEqual(
- content, {"message": "No PageRevision matches the given query."}
- )
- TestPageDetail = None
- TestPageListing = None
|