def test_render_js_init_with_can_choose_root_true(self):
        # construct an alternative page chooser panel object, with can_choose_root=True
        MyPageChooserPanel = PageChooserPanel('page', can_choose_root=True).bind_to_model(PageChooserModel)
        PageChooserForm = MyPageChooserPanel.get_form_class(PageChooserModel)

        form = PageChooserForm(instance=self.test_instance)
        page_chooser_panel = MyPageChooserPanel(instance=self.test_instance, form=form)
        result = page_chooser_panel.render_as_field()

        # the canChooseRoot flag on createPageChooser should now be true
        expected_js = 'createPageChooser("{id}", ["{model}"], {parent}, true);'.format(
            id="id_page", model="wagtailcore.page", 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_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)
Beispiel #4
0
class UniversalBlogPageRelatedLink(Orderable, models.Model):
    """
    Common model needed for "pages related links" feature,
    which is accessible when editing a UniversalBlogPage.
    """
    title = models.CharField(max_length=255, help_text="Link title")
    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey('wagtailcore.Page',
                                  null=True,
                                  blank=True,
                                  related_name='+')
    link_document = models.ForeignKey('wagtaildocs.Document',
                                      null=True,
                                      blank=True,
                                      related_name='+')
    page = ParentalKey('home.UniversalBlogPage', related_name='related_links')

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_document:
            return self.link_document.url
        else:
            return self.link_external

    panels = [
        FieldPanel('title'),
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
    ]
Beispiel #5
0
class BookTechRelationship(models.Model):
    book = ParentalKey(Book, related_name='techs')
    tech = models.ForeignKey('techs.Tech')

    panels = [
        PageChooserPanel('tech', 'techs.Tech'),
    ]
Beispiel #6
0
class SeriesArticleLink(Orderable, models.Model):
    override_image = models.ForeignKey(
        'images.AttributedImage',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
        help_text="This field is optional. If not provided, the image will be "
        "pulled from the article page automatically. This field "
        "allows you to override the automatic image.")
    override_text = RichTextField(
        blank=True,
        default="",
        help_text="This field is optional. If not provided, the text will be "
        "pulled from the article page automatically. This field "
        "allows you to override the automatic text.")
    article = models.ForeignKey("ArticlePage",
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                related_name='series_links')
    series = ParentalKey("SeriesPage", related_name='related_article_links')

    panels = [
        PageChooserPanel("article", 'articles.ArticlePage'),
        FieldPanel("override_text"),
        ImageChooserPanel("override_image"),
    ]
Beispiel #7
0
class PressReleasePage(ContentPage):
    date = models.DateField(default=datetime.date.today)
    formatted_title = models.CharField(max_length=255, null=True, blank=True, default='',
                                        help_text="Use if you need italics in the title. e.g. <em>Italicized words</em>")
    category = models.CharField(max_length=255,
                                choices=constants.press_release_page_categories.items())
    read_next = models.ForeignKey('PressReleasePage', blank=True, null=True,
                                  default=get_previous_press_release_page,
                                  on_delete=models.SET_NULL)

    content_panels = ContentPage.content_panels + [
        FieldPanel('formatted_title'),
        FieldPanel('date'),
        InlinePanel('authors', label="Authors"),
        FieldPanel('category'),
        PageChooserPanel('read_next'),
    ]

    @property
    def content_section(self):
        return ''

    @property
    def get_update_type(self):
        return constants.update_types['press-release']

    """
    Because we removed the boilerplate from all 2016 releases
    this flag is used to show it in the templates as a print-only element
    """
    @property
    def no_boilerplate(self):
        return self.date.year >= 2016
Beispiel #8
0
class EmailLinkFields(LinkFields):
    link_email = models.EmailField(blank=True, null=False)

    class Meta:
        abstract = True

    content_panels = [
        MultiFieldPanel([
            PageChooserPanel('link_page'),
            FieldPanel('link_url'),
            FieldPanel('link_email'),
            FieldPanel('link_text'),
        ], 'Link'),
    ]

    def clean(self):
        errors = {}

        fields = [
            f for f in [self.link_email, self.link_page, self.link_url]
            if f is not None if f is not ''
        ]

        if len(fields) > 1:
            error_message = 'Please choose one of link url, link page or link email.'
            errors.update({'link_email': _(error_message)}, )
            errors.update({'link_page': _(error_message)}, )
            errors.update({'link_url': _(error_message)}, )

        if errors:
            raise ValidationError(errors)

        return super().clean()
Beispiel #9
0
class LinkFields(models.Model):
    caption = models.CharField(max_length=255, blank=True)

    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        related_name='+'
    )

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        else:
            return self.link_external

    panels = [
        FieldPanel('caption'),
        FieldPanel('link_external'),
        PageChooserPanel('link_page')
    ]

    class Meta:
        abstract = True
    def setUp(self):
        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').bind_to_model(PageChooserModel)

        # build a form class containing the fields that MyPageChooserPanel wants
        self.PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel)

        # a test instance of PageChooserModel, pointing to the 'christmas' page
        self.christmas_page = Page.objects.get(slug='christmas')
        self.events_index_page = Page.objects.get(slug='events')
        self.test_instance = model.objects.create(page=self.christmas_page)

        self.form = self.PageChooserForm(instance=self.test_instance)
        self.page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=self.form)
Beispiel #11
0
class Advert(LinkFields):
    page = models.ForeignKey(
        Page,
        related_name='adverts',
        null=True,
        blank=True
    )
    title = models.CharField(max_length=150, null=True)
    image = models.ForeignKey(
        Image, null=True, blank=True, on_delete=models.SET_NULL
    )
    button_text = models.CharField(max_length=150, null=True)
    text = RichTextField(blank=True)

    panels = [
        PageChooserPanel('page'),
        FieldPanel('title'),
        ImageChooserPanel('image'),
        FieldPanel('text'),
        FieldPanel('button_text'),
        MultiFieldPanel(LinkFields.panels, "Link"),
    ]

    def __unicode__(self):
        return self.title
Beispiel #12
0
class LinkFields(LinkFieldUrl, LinkFieldPage, LinkFieldDocument,
                 LinkFieldImage):
    link_text = models.CharField(max_length=40, blank=True)

    @property
    def link(self):
        if self.link_page:
            return self.link_page
        elif self.link_document:
            return self.link_document
        elif self.link_image:
            return self.link_image
        else:
            return self.link_external

    panels = [
        FieldPanel('link_text'),
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
        ImageChooserPanel('link_image')
    ]

    class Meta:
        abstract = True
Beispiel #13
0
class FacultyResources(models.Model):
    resource = models.ForeignKey(
        Resource,
        null=True,
        help_text="Manage resources through snippets.",
        related_name='+')
    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey('wagtailcore.Page',
                                  null=True,
                                  blank=True,
                                  related_name='+')
    link_document = models.ForeignKey('wagtaildocs.Document',
                                      null=True,
                                      blank=True,
                                      related_name='+')

    api_fields = (
        'resource',
        'link_external',
        'link_page',
        'link_document',
    )

    panels = [
        SnippetChooserPanel('resource', Resource),
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
    ]
Beispiel #14
0
 def test_target_content_type_nonexistent_type(self):
     result = PageChooserPanel(
         'barbecue',
         'snowman.lorry'
     )
     self.assertRaises(ImproperlyConfigured,
                       result.target_content_type)
Beispiel #15
0
class NewsItem(AbstractNewsItem):
    title = models.CharField(max_length=32)
    page = models.ForeignKey('wagtailcore.Page', related_name='+', null=True,
                             blank=True)

    tags = ClusterTaggableManager(through=NewsItemTag, blank=True)

    panels = [
        FieldPanel('title'),
        PageChooserPanel('page'),
        FieldPanel('tags'),
        FieldPanel('date'),
    ]

    search_fields = AbstractNewsItem.search_fields + [
        index.SearchField('title'),
    ]

    def __str__(self):
        return self.title

    def get_context(self, request, *args, **kwargs):
        context = super(NewsItem, self).get_context(request, *args, **kwargs)
        context['foo'] = 'bar'
        return context

    def get_description(self):
        return "This post was published on {0}, with a title of {1}".format(self.date, self.title)
Beispiel #16
0
class HeroVideoFieldsLogo(HeroVideoFields):
    hero_logo = models.ForeignKey(
        'images.CustomImage',
        null=True,
        blank=True,
        related_name='+',
        help_text="Shows the brand logo on the hero instead of a text heading.",
        on_delete=models.SET_NULL,
        verbose_name="Brand Logo")

    content_panels = [
        MultiFieldPanel([
            MediaChooserPanel('hero_video'),
            ImageChooserPanel('hero_fallback_image'),
            ImageChooserPanel('hero_logo'),
            FieldPanel('hero_strapline'),
            FieldPanel('hero_strapline_hex'),
            MultiFieldPanel([
                PageChooserPanel('link_page'),
                FieldPanel('link_youtube'),
                FieldPanel('link_text'),
            ], 'Hero Clickthrough Link')
        ], 'Hero Video'),
    ]

    class Meta:
        abstract = True
Beispiel #17
0
class HomePage(Page):
    parent_page_types = ['wagtailcore.Page']

    body = models.TextField(blank=True, help_text=md_format_help)
    num_recent_recipes = models.PositiveIntegerField(default=6)
    featured_recipe = models.ForeignKey(RecipePage,
                                        null=True,
                                        blank=True,
                                        on_delete=models.SET_NULL)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
        InlinePanel('header_icons', label='Header Icons'),
        PageChooserPanel('featured_recipe'),
    ]

    class Meta:
        verbose_name = "Homepage"

    def get_context(self, request, *args, **kwargs):
        """
        Add recipes to the context for recipe category listings
        """
        context = super(HomePage, self).get_context(request, *args, **kwargs)
        recent_recipes = RecipePage.objects.live().order_by(
            '-post_date')[:self.num_recent_recipes]

        context['recent_recipes'] = recent_recipes
        return context
Beispiel #18
0
class LessonTechRelationship(models.Model):
    lesson = ParentalKey(Lesson, related_name='techs')
    tech = models.ForeignKey('techs.Tech')

    panels = [
        PageChooserPanel('tech', 'techs.Tech'),
    ]
Beispiel #19
0
 def test_target_content_type_malformed_type(self):
     result = PageChooserPanel(
         'barbecue',
         'snowman'
     ).bind_to_model(PageChooserModel)
     self.assertRaises(ImproperlyConfigured,
                       result.target_content_type)
Beispiel #20
0
class LessonBookRelationship(models.Model):
    lesson = ParentalKey(Lesson, related_name='books')
    book = models.ForeignKey(Book)

    panels = [
        PageChooserPanel('book', 'books.Book'),
    ]
Beispiel #21
0
class LinkFields(models.Model):
    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey('wagtailcore.Page',
                                  null=True,
                                  blank=True,
                                  related_name='+')
    link_document = models.ForeignKey('wagtaildocs.Document',
                                      null=True,
                                      blank=True,
                                      related_name='+')

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_document:
            return self.link_document.url
        else:
            return self.link_external

    panels = [
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
    ]

    class Meta:
        abstract = True
Beispiel #22
0
class AbstractLinkField(models.Model):
    """Abstract class for link fields."""
    link_document = models.ForeignKey('wagtaildocs.Document',
                                      blank=True,
                                      null=True,
                                      related_name='+')
    link_external = models.URLField('External link', blank=True, null=True)
    link_page = models.ForeignKey('wagtailcore.Page',
                                  blank=True,
                                  null=True,
                                  related_name='+')

    panels = [
        DocumentChooserPanel('link_document'),
        FieldPanel('link_external'),
        PageChooserPanel('link_page')
    ]

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_document:
            return self.link_document.url
        else:
            return self.link_external

    class Meta:
        abstract = True
Beispiel #23
0
class ProjectTechRelationship(models.Model):
    project = ParentalKey(Project, related_name='techs')
    tech = models.ForeignKey('techs.Tech')

    panels = [
        PageChooserPanel('tech', 'techs.Tech'),
    ]
Beispiel #24
0
 def test_target_models_nonexistent_type(self):
     result = PageChooserPanel(
         'barbecue',
         'snowman.lorry'
     ).bind_to_model(PageChooserModel)
     self.assertRaises(ImproperlyConfigured,
                       result.target_models)
Beispiel #25
0
class RecipeInRecipe(models.Model):
    link_external = models.URLField("External link", blank=True)
    heading = models.CharField(
        max_length=255,
        help_text="Heading text for subrecipe (optional)",
        blank=True,
        null=True)
    recipe_in_recipe_page = models.ForeignKey(
        'Recipe',
        null=True,
        blank=True,
        related_name='+',
        on_delete=models.SET_NULL,
    )
    panels = [
        PageChooserPanel('recipe_in_recipe_page'),
    ]

    class Meta:
        abstract = True

    def get_context(self, request):
        context = super(RecipeInRecipe, self).get_context(request)
        context['RecipeInRecipe'] = RecipeInRecipe.objects.all()
        return context
Beispiel #26
0
class DigestPage(ContentPage):
    date = models.DateField(default=datetime.date.today)
    read_next = models.ForeignKey('DigestPage', blank=True, null=True,
                                  default=get_previous_digest_page,
                                  on_delete=models.SET_NULL)

    content_panels = ContentPage.content_panels + [
        FieldPanel('date'),
        InlinePanel('authors', label="Authors"),
        PageChooserPanel('read_next'),
    ]

    template = 'home/updates/digest_page.html'

    search_fields =  ContentPage.search_fields + [
        index.FilterField('date')
    ]

    @property
    def content_section(self):
        return ''

    @property
    def get_update_type(self):
        return constants.update_types['weekly-digest']

    @property
    def get_author_office(self):
        return 'Press Office'
Beispiel #27
0
class LinkFields(models.Model):
    link_external = models.URLField('External link', blank=True)
    link_page = models.ForeignKey('wagtailcore.Page',
                                  null=True,
                                  blank=True,
                                  on_delete=models.SET_NULL,
                                  related_name='+')
    link_document = models.ForeignKey('wagtaildocs.Document',
                                      null=True,
                                      blank=True,
                                      on_delete=models.SET_NULL,
                                      related_name='+')

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_external:
            return self.link_external
        else:
            return '/'

    panels = [
        PageChooserPanel('link_page'),
        FieldPanel('link_external'),
    ]

    # DocumentChooserPanel('link_document'),
    class Meta:
        abstract = True
Beispiel #28
0
class EventIndexPageFeaturedPage(RelatedPage):
    source_page = ParentalKey('events.EventIndexPage',
                              related_name='featured_pages')

    panels = [
        PageChooserPanel('page', page_type='events.EventPage'),
    ]
Beispiel #29
0
class MultilingualMenuItem(models.Model):
    link_text_de = models.CharField(
        verbose_name=_('link text (de)'),
        max_length=255,
        blank=True,
    )
    link_text_fr = models.CharField(
        verbose_name=_('link text (fr)'),
        max_length=255,
        blank=True,
    )
    translated_link_text = TranslatedField('link_text', 'link_text_de',
                                           'link_text_fr')

    class Meta:
        abstract = True
        ordering = ('sort_order', )

    def menu_text(self):
        return self.translated_link_text or getattr(
            self.link_page, 'translated_title', None) or self.link_page.title

    panels = (
        PageChooserPanel('link_page'),
        FieldPanel('link_url'),
        FieldPanel('url_append'),
        FieldPanel('link_text'),
        FieldPanel('link_text_de'),
        FieldPanel('link_text_fr'),
        FieldPanel('handle'),
        FieldPanel('allow_subnav'),
    )
Beispiel #30
0
class LinkFields(models.Model):
    link_external = models.CharField(
        "External link",
        max_length=500,
        blank=True,
        help_text="Please provide an external URL, or select a page below.")
    link_page = models.ForeignKey(Page,
                                  verbose_name="Internal link",
                                  null=True,
                                  blank=True,
                                  on_delete=models.SET_NULL,
                                  related_name='+')

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        else:
            return self.link_external

    panels = [
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
    ]

    class Meta:
        abstract = True
Beispiel #31
0
class NewsletterArticleLink(Orderable, models.Model):

    article = models.ForeignKey("wagtailcore.Page",
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                related_name='+',
                                help_text="Link to an internal article")
    override_text = RichTextField(blank=True,
                                  default="",
                                  help_text="Text to describe article.")
    override_image = models.ForeignKey(
        'images.AttributedImage',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
        help_text=
        "Circular Image to accompany article if article image not selected")
    newsletter = ParentalKey("NewsletterPage", related_name='article_links')

    def __str__(self):
        return "{}".format(self.article.title)

    panels = [
        PageChooserPanel("article",
                         ['articles.ArticlePage', 'articles.SeriesPage']),
        FieldPanel("override_text"),
        ImageChooserPanel("override_image"),
    ]
Beispiel #32
0
class PreviewArticle(Orderable):
    page = ParentalKey('HomePage', related_name='preview_articles')
    article = models.ForeignKey(ArticlePage)

    panels = [
        PageChooserPanel('article'),
    ]
Beispiel #33
0
class RecordPage(ContentPage):
    date = models.DateField(default=datetime.date.today)
    category = models.CharField(max_length=255,
                                choices=constants.record_page_categories.items())
    read_next = models.ForeignKey('RecordPage', blank=True, null=True,
                                  default=get_previous_record_page,
                                  on_delete=models.SET_NULL)
    related_section_title = models.CharField(max_length=255, blank=True,
                                             default="Explore campaign finance data")
    related_section_url = models.CharField(max_length=255, blank=True,
                                           default="/data/")

    content_panels = ContentPage.content_panels + [
        FieldPanel('date'),
        FieldPanel('category'),
        InlinePanel('authors', label="Authors"),
        PageChooserPanel('read_next'),
        FieldPanel('related_section_title'),
        FieldPanel('related_section_url'),
    ]

    @property
    def content_section(self):
        return ''

    @property
    def get_update_type(self):
        return constants.update_types['fec-record']
Beispiel #34
0
class TestPageChooserPanel(TestCase):

    def setUp(self):
        model = PageChooserModel
        self.chosen_page = Page.objects.get(pk=2)
        test_instance = model.objects.create(page=self.chosen_page)
        self.dotted_model = model._meta.app_label + '.' + model._meta.model_name

        self.page_chooser_panel_class = PageChooserPanel('page', model)

        form_class = get_form_for_model(model, widgets=self.page_chooser_panel_class.widget_overrides())
        form = form_class(instance=test_instance)
        form.errors['page'] = form.error_class(['errors'])

        self.page_chooser_panel = self.page_chooser_panel_class(instance=test_instance,
                                                                form=form)

    def test_render_js_init(self):
        result = self.page_chooser_panel.render_as_field()
        self.assertIn(
            'createPageChooser("{id}", "{model}", {parent});'.format(
                id="id_page", model=self.dotted_model, parent=self.chosen_page.get_parent().id),
            result)

    def test_get_chosen_item(self):
        result = self.page_chooser_panel.get_chosen_item()
        self.assertEqual(result, self.chosen_page)

    def test_render_as_field(self):
        result = self.page_chooser_panel.render_as_field()
        self.assertIn('<p class="help">help text</p>', result)
        self.assertIn('<span>errors</span>', result)

    def test_widget_overrides(self):
        result = self.page_chooser_panel.widget_overrides()
        self.assertIsInstance(result['page'], AdminPageChooser)

    def test_target_content_type(self):
        result = PageChooserPanel(
            'barbecue',
            'wagtailcore.site'
        ).target_content_type()
        self.assertEqual(result.name, 'site')

    def test_target_content_type_malformed_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman'
        )
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)

    def test_target_content_type_nonexistent_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman.lorry'
        )
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)
Beispiel #35
0
    def setUp(self):
        model = PageChooserModel
        self.chosen_page = Page.objects.get(pk=2)
        test_instance = model.objects.create(page=self.chosen_page)
        self.dotted_model = model._meta.app_label + '.' + model._meta.model_name

        self.page_chooser_panel_class = PageChooserPanel('page', model)

        form_class = get_form_for_model(model, widgets=self.page_chooser_panel_class.widget_overrides())
        form = form_class(instance=test_instance)
        form.errors['page'] = form.error_class(['errors'])

        self.page_chooser_panel = self.page_chooser_panel_class(instance=test_instance,
                                                                form=form)
    def setUp(self):
        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').bind_to_model(PageChooserModel)

        # build a form class containing the fields that MyPageChooserPanel wants
        self.PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel)

        # a test instance of PageChooserModel, pointing to the 'christmas' page
        self.christmas_page = Page.objects.get(slug='christmas')
        self.events_index_page = Page.objects.get(slug='events')
        self.test_instance = model.objects.create(page=self.christmas_page)

        self.form = self.PageChooserForm(instance=self.test_instance)
        self.page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=self.form)
Beispiel #37
0
 def setUp(self):
     fake_field = self.FakeField()
     fake_instance = self.FakeInstance()
     self.page_chooser_panel = PageChooserPanel('barbecue')(
         instance=fake_instance,
         form={'barbecue': fake_field})
Beispiel #38
0
class TestPageChooserPanel(TestCase):
    class FakeField(object):
        label = 'label'
        help_text = 'help text'
        errors = ['errors']
        id_for_label = 'id for label'

    class FakeInstance(object):
        class FakePage(object):
            class FakeParent(object):
                id = 1

            name = 'fake page'

            def get_parent(self):
                return self.FakeParent()

        def __init__(self):
            fake_page = self.FakePage()
            self.barbecue = fake_page

    def setUp(self):
        fake_field = self.FakeField()
        fake_instance = self.FakeInstance()
        self.page_chooser_panel = PageChooserPanel('barbecue')(
            instance=fake_instance,
            form={'barbecue': fake_field})

    def test_render_js(self):
        result = self.page_chooser_panel.render_js()
        self.assertEqual(result,
                         "createPageChooser(fixPrefix('id for label'), 'wagtailcore.page', 1);")

    def test_get_chosen_item(self):
        result = self.page_chooser_panel.get_chosen_item()
        self.assertEqual(result.name, 'fake page')

    def test_render_as_field(self):
        result = self.page_chooser_panel.render_as_field()
        self.assertIn('<p class="help">help text</p>', result)
        self.assertIn('<span>errors</span>', result)

    def test_widget_overrides(self):
        result = self.page_chooser_panel.widget_overrides()
        self.assertEqual(result, {'barbecue': HiddenInput})

    def test_target_content_type(self):
        result = PageChooserPanel(
            'barbecue',
            'wagtailcore.site'
        ).target_content_type()
        self.assertEqual(result.name, 'site')

    def test_target_content_type_malformed_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman'
        )
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)

    def test_target_content_type_nonexistent_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman.lorry'
        )
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)
class TestPageChooserPanel(TestCase):
    fixtures = ['test.json']

    def setUp(self):
        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').bind_to_model(PageChooserModel)

        # build a form class containing the fields that MyPageChooserPanel wants
        self.PageChooserForm = self.MyPageChooserPanel.get_form_class(PageChooserModel)

        # a test instance of PageChooserModel, pointing to the 'christmas' page
        self.christmas_page = Page.objects.get(slug='christmas')
        self.events_index_page = Page.objects.get(slug='events')
        self.test_instance = model.objects.create(page=self.christmas_page)

        self.form = self.PageChooserForm(instance=self.test_instance)
        self.page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, form=self.form)

    def test_page_chooser_uses_correct_widget(self):
        self.assertEqual(type(self.form.fields['page'].widget), AdminPageChooser)

    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="wagtailcore.page", parent=self.events_index_page.id)

        self.assertIn(expected_js, result)

    def test_get_chosen_item(self):
        result = self.page_chooser_panel.get_chosen_item()
        self.assertEqual(result, self.christmas_page)

    def test_render_as_field(self):
        result = self.page_chooser_panel.render_as_field()
        self.assertIn('<p class="help">help text</p>', result)
        self.assertIn('<span class="title">Christmas</span>', result)
        self.assertIn(
            '<a href="/admin/pages/%d/edit/" class="edit-link button button-small button-secondary" target="_blank">Edit this page</a>' % self.christmas_page.id,
            result)

    def test_render_error(self):
        form = self.PageChooserForm({'page': ''}, instance=self.test_instance)
        self.assertFalse(form.is_valid())

        page_chooser_panel = self.MyPageChooserPanel(instance=self.test_instance, 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',
            'wagtailcore.site'
        ).bind_to_model(PageChooserModel).target_content_type()
        self.assertEqual(result.name, 'site')

    def test_target_content_type_malformed_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman'
        ).bind_to_model(PageChooserModel)
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)

    def test_target_content_type_nonexistent_type(self):
        result = PageChooserPanel(
            'barbecue',
            'snowman.lorry'
        ).bind_to_model(PageChooserModel)
        self.assertRaises(ImproperlyConfigured,
                          result.target_content_type)