From f66892289312981a3bbf38b7d556ea8dda83aced Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 16 Oct 2015 16:35:49 +0100 Subject: [PATCH] Add a can_choose_root flag to PageChooserBlock --- docs/topics/streamfield.rst | 8 +++++++- wagtail/wagtailcore/blocks/field_block.py | 6 +++++- wagtail/wagtailcore/tests/test_blocks.py | 6 ++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/topics/streamfield.rst b/docs/topics/streamfield.rst index b6eeaa1aa3..d254b78761 100644 --- a/docs/topics/streamfield.rst +++ b/docs/topics/streamfield.rst @@ -188,7 +188,13 @@ PageChooserBlock ``wagtail.wagtailcore.blocks.PageChooserBlock`` -A control for selecting a page object, using Wagtail's page browser. The keyword argument ``required`` is accepted. +A control for selecting a page object, using Wagtail's page browser. The following keyword arguments are accepted: + +``required`` (default: True) + If true, the field cannot be left blank. + +``can_choose_root`` (default: False) + If true, the editor can choose the tree root as a page. Normally this would be undesirable, since the tree root is never a usable page, but in some specialised cases it may be appropriate; for example, a block providing a feed of related articles could use a PageChooserBlock to select which subsection articles will be taken from, with the root corresponding to 'everywhere'. DocumentChooserBlock ~~~~~~~~~~~~~~~~~~~~ diff --git a/wagtail/wagtailcore/blocks/field_block.py b/wagtail/wagtailcore/blocks/field_block.py index 8e4519ecdc..5b2b18eb96 100644 --- a/wagtail/wagtailcore/blocks/field_block.py +++ b/wagtail/wagtailcore/blocks/field_block.py @@ -366,6 +366,10 @@ class ChooserBlock(FieldBlock): class PageChooserBlock(ChooserBlock): + def __init__(self, can_choose_root=False, **kwargs): + self.can_choose_root = can_choose_root + super(PageChooserBlock, self).__init__(**kwargs) + @cached_property def target_model(self): from wagtail.wagtailcore.models import Page # TODO: allow limiting to specific page types @@ -374,7 +378,7 @@ class PageChooserBlock(ChooserBlock): @cached_property def widget(self): from wagtail.wagtailadmin.widgets import AdminPageChooser - return AdminPageChooser + return AdminPageChooser(can_choose_root=self.can_choose_root) def render_basic(self, value): if value: diff --git a/wagtail/wagtailcore/tests/test_blocks.py b/wagtail/wagtailcore/tests/test_blocks.py index f7b54441b1..bc51660930 100644 --- a/wagtail/wagtailcore/tests/test_blocks.py +++ b/wagtail/wagtailcore/tests/test_blocks.py @@ -1302,6 +1302,7 @@ class TestPageChooserBlock(TestCase): empty_form_html = block.render_form(None, 'page') self.assertIn('', empty_form_html) + self.assertIn('createPageChooser("page", ["wagtailcore.page"], null, false);', empty_form_html) christmas_page = Page.objects.get(slug='christmas') christmas_form_html = block.render_form(christmas_page, 'page') @@ -1309,6 +1310,11 @@ class TestPageChooserBlock(TestCase): self.assertIn(expected_html, christmas_form_html) self.assertIn("pick a page, any page", christmas_form_html) + def test_form_render_with_can_choose_root(self): + block = blocks.PageChooserBlock(help_text="pick a page, any page", can_choose_root=True) + empty_form_html = block.render_form(None, 'page') + self.assertIn('createPageChooser("page", ["wagtailcore.page"], null, true);', empty_form_html) + def test_form_response(self): block = blocks.PageChooserBlock() christmas_page = Page.objects.get(slug='christmas')