diff --git a/wagtail/tests/migrations/0009_eventpagechoosermodel.py b/wagtail/tests/migrations/0009_eventpagechoosermodel.py new file mode 100644 index 000000000..1d51460cd --- /dev/null +++ b/wagtail/tests/migrations/0009_eventpagechoosermodel.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tests', '0008_registerdecorator'), + ] + + operations = [ + migrations.CreateModel( + name='EventPageChooserModel', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('page', models.ForeignKey(help_text=b'more help text', to='tests.EventPage')), + ], + options={ + }, + bases=(models.Model,), + ), + ] diff --git a/wagtail/tests/models.py b/wagtail/tests/models.py index c419de7c7..2169ef209 100644 --- a/wagtail/tests/models.py +++ b/wagtail/tests/models.py @@ -504,6 +504,8 @@ TaggedPage.content_panels = [ class PageChooserModel(models.Model): page = models.ForeignKey('wagtailcore.Page', help_text='help text') +class EventPageChooserModel(models.Model): + page = models.ForeignKey('tests.EventPage', help_text='more help text') class SnippetChooserModel(models.Model): advert = models.ForeignKey(Advert, help_text='help text') diff --git a/wagtail/wagtailadmin/edit_handlers.py b/wagtail/wagtailadmin/edit_handlers.py index 19b5d6a27..23c129ed2 100644 --- a/wagtail/wagtailadmin/edit_handlers.py +++ b/wagtail/wagtailadmin/edit_handlers.py @@ -529,8 +529,8 @@ class BasePageChooserPanel(BaseChooserPanel): cls._target_content_type = ContentType.objects.get_for_model(model) else: - # TODO: infer the content type by introspection on the foreign key - cls._target_content_type = ContentType.objects.get_by_natural_key('wagtailcore', 'page') + target_model = cls.model._meta.get_field(cls.field_name).rel.to + cls._target_content_type = ContentType.objects.get_for_model(target_model) return cls._target_content_type diff --git a/wagtail/wagtailadmin/tests/test_edit_handlers.py b/wagtail/wagtailadmin/tests/test_edit_handlers.py index 57fde93a0..281c6f92c 100644 --- a/wagtail/wagtailadmin/tests/test_edit_handlers.py +++ b/wagtail/wagtailadmin/tests/test_edit_handlers.py @@ -19,7 +19,7 @@ from wagtail.wagtailadmin.edit_handlers import ( from wagtail.wagtailadmin.widgets import AdminPageChooser, AdminDateInput from wagtail.wagtailimages.edit_handlers import ImageChooserPanel from wagtail.wagtailcore.models import Page, Site -from wagtail.tests.models import PageChooserModel, EventPage, EventPageSpeaker +from wagtail.tests.models import PageChooserModel, EventPageChooserModel, EventPage, EventPageSpeaker from wagtail.tests.utils import WagtailTestUtils from wagtail.utils.deprecation import RemovedInWagtail11Warning @@ -329,7 +329,7 @@ class TestPageChooserPanel(TestCase): model = PageChooserModel # a model with a foreign key to Page which we want to render as a page chooser # a PageChooserPanel class that works on PageChooserModel's 'page' field - self.MyPageChooserPanel = PageChooserPanel('page', 'tests.EventPage').bind_to_model(PageChooserModel) + self.MyPageChooserPanel = PageChooserPanel('page').bind_to_model(PageChooserModel) # build a form class containing the fields that MyPageChooserPanel wants self.PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel) @@ -340,7 +340,6 @@ class TestPageChooserPanel(TestCase): self.test_instance = model.objects.create(page=self.christmas_page) self.form = self.PageChooserForm(instance=self.test_instance) - # self.form.errors['page'] = self.form.error_class(['errors']) # FIXME: wat self.page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=self.form) @@ -350,7 +349,7 @@ class TestPageChooserPanel(TestCase): def test_render_js_init(self): result = self.page_chooser_panel.render_as_field() expected_js = 'createPageChooser("{id}", "{model}", {parent});'.format( - id="id_page", model="tests.eventpage", parent=self.events_index_page.id) + id="id_page", model="wagtailcore.page", parent=self.events_index_page.id) self.assertIn(expected_js, result) @@ -370,6 +369,34 @@ class TestPageChooserPanel(TestCase): form=form) self.assertIn('This field is required.', page_chooser_panel.render_as_field()) + def test_override_page_type(self): + # Model has a foreign key to Page, but we specify EventPage in the PageChooserPanel + # to restrict the chooser to that page type + MyPageChooserPanel = PageChooserPanel('page', 'tests.EventPage').bind_to_model(EventPageChooserModel) + PageChooserForm = MyPageChooserPanel.get_form_class(EventPageChooserModel) + form = PageChooserForm(instance=self.test_instance) + page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=form) + + result = page_chooser_panel.render_as_field() + expected_js = 'createPageChooser("{id}", "{model}", {parent});'.format( + id="id_page", model="tests.eventpage", parent=self.events_index_page.id) + + self.assertIn(expected_js, result) + + def test_autodetect_page_type(self): + # Model has a foreign key to EventPage, which we want to autodetect + # instead of specifying the page type in PageChooserPanel + MyPageChooserPanel = PageChooserPanel('page').bind_to_model(EventPageChooserModel) + PageChooserForm = MyPageChooserPanel.get_form_class(EventPageChooserModel) + form = PageChooserForm(instance=self.test_instance) + page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=form) + + result = page_chooser_panel.render_as_field() + expected_js = 'createPageChooser("{id}", "{model}", {parent});'.format( + id="id_page", model="tests.eventpage", parent=self.events_index_page.id) + + self.assertIn(expected_js, result) + def test_target_content_type(self): result = PageChooserPanel( 'barbecue',