Merge pull request #1009 from gasman/feature/pagechooser-autodetect-page-type

Make PageChooserPanel autodetect page type from the foreign key - fixes #509
pull/893/merge
Karl Hobley 2015-02-20 10:49:39 +00:00
commit 1374b3dc17
4 zmienionych plików z 59 dodań i 6 usunięć

Wyświetl plik

@ -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='more help text', to='tests.EventPage')),
],
options={
},
bases=(models.Model,),
),
]

Wyświetl plik

@ -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')

Wyświetl plik

@ -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

Wyświetl plik

@ -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('<span>This field is required.</span>', 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',