Beispiel #1
0
    def test_stuff(self):
        # Smoke test some stuff
        article = Article.objects.create(title='Test', )
        richtext = article.testapp_richtext_set.create(
            text='<p>bla</p>',
            region='main',
            ordering=10,
        )
        article.testapp_download_set.create(
            file='bla.pdf',
            region='main',
            ordering=20,
        )

        with self.assertNumQueries(0):
            self.assertEqual(
                '%s' % richtext,
                'testapp.RichText<region=main ordering=10 pk=%s>' %
                (richtext.pk, ),
            )

        with self.assertNumQueries(2):  # Two content types.
            contents = contents_for_item(article, plugins=[RichText, Download])

            self.assertEqual(contents.main[0], richtext)
            self.assertEqual(contents.main[0].parent, article)

        self.assertEqual(len(contents.main), 2)
        self.assertEqual(len(contents.sidebar), 0)
        self.assertEqual(len(contents.bla), 0)  # No AttributeError

        response = self.client.get(article.get_absolute_url())
        self.assertContains(response, '<h1>Test</h1>')
        self.assertContains(response, '<p>bla</p>')

        # Test for Contents.__iter__
        contents = contents_for_item(article, plugins=[RichText, Download])
        self.assertFalse(contents._sorted)
        self.assertEqual(len(list(contents)), 2)
        self.assertTrue(contents._sorted)
        self.assertEqual(len(list(contents)), 2)

        # Contents.__len__ also means that a Contents instance may be falsy
        self.assertEqual(len(contents), 2)
        self.assertTrue(contents)
        self.assertFalse(contents_for_item(article, [Bla]))

        article.testapp_bla_set.create(
            region='main',
            ordering=30,
        )

        response = self.client.get(article.get_absolute_url())
        self.assertContains(
            response,
            '<!-- testapp.Bla: testapp.Bla<region=main ordering=30 pk=1> -->',
        )
Beispiel #2
0
    def test_empty(self):
        article = Article.objects.create(title="Test")

        with self.assertNumQueries(2):
            contents = contents_for_item(article, plugins=[RichText, Download])

        self.assertEqual(contents.main, [])

        with self.assertNumQueries(0):
            contents = contents_for_item(article, plugins=[])

        self.assertEqual(contents.main, [])
    def test_inheritance(self):
        page = Page.objects.create(title="root")
        child = page.children.create(title="child 1")

        with self.assertNumQueries(1):
            contents = contents_for_item(child,
                                         plugins=[PageText],
                                         inherit_from=[page])
            self.assertEqual(contents.main, [])
            self.assertEqual(contents.sidebar, [])

        page.testapp_pagetext_set.create(region="main",
                                         ordering=10,
                                         text="page main text")
        page.testapp_pagetext_set.create(region="sidebar",
                                         ordering=20,
                                         text="page sidebar text")

        with self.assertNumQueries(1):
            contents = contents_for_item(child,
                                         plugins=[PageText],
                                         inherit_from=[page])
            self.assertEqual(contents.main, [])
            self.assertEqual([c.text for c in contents.sidebar],
                             ["page sidebar text"])

            self.assertEqual(contents.sidebar[0].parent, page)

        child.testapp_pagetext_set.create(region="sidebar",
                                          ordering=10,
                                          text="child sidebar text")

        child.testapp_pagetext_set.create(region="main",
                                          ordering=20,
                                          text="child main text")

        with self.assertNumQueries(1):
            contents = contents_for_item(child,
                                         plugins=[PageText],
                                         inherit_from=[page])
            self.assertEqual([c.text for c in contents.main],
                             ["child main text"])
            self.assertEqual([c.text for c in contents.sidebar],
                             ["child sidebar text"])

            self.assertEqual(contents.sidebar[0].parent, child)

        response = self.client.get(child.get_absolute_url())
        self.assertContains(response, "child main text")
        self.assertContains(response, "child sidebar text")
Beispiel #4
0
 def regions(self, item, inherit_from=None, regions=Regions):
     return regions(
         item,
         SimpleLazyObject(
             lambda: contents_for_item(item, self.plugins(), inherit_from)),
         self,
     )
Beispiel #5
0
    def test_rendered_contents(self):
        article = Article.objects.create(
            title='Test',
        )
        article.testapp_richtext_set.create(
            text='<p>bla</p>',
            region='main',
            ordering=10,
        )
        article.testapp_richtext_set.create(
            text='<p>blah</p>',
            region='main',
            ordering=20,
        )

        renderer = PluginRenderer()
        renderer.register(RichText, lambda plugin: mark_safe(plugin.text))

        contents = contents_for_item(article, [RichText])

        self.assertEqual(
            '%s' % renderer.render(contents.main),
            '<p>bla</p><p>blah</p>',
        )
        self.assertEqual(
            list(renderer.render(contents.main)),
            ['<p>bla</p>', '<p>blah</p>'],
        )
Beispiel #6
0
 def get_context_data(self, **kwargs):
     return super(ArticleView,
                  self).get_context_data(content=contents_for_item(
                      self.object,
                      [RichText, Download, Bla],
                  ).render_regions(renderer),
                                         **kwargs)
    def get_context_data(self, **kwargs):
        contents = contents_for_item(self.object, [RichText, Download])

        return super(ArticleView, self).get_context_data(content={
            region.key: mark_safe("".join(render_items(contents[region.key])))
            for region in self.object.regions
        },
                                                         **kwargs)
Beispiel #8
0
 def get_context_data(self, **kwargs):
     return super().get_context_data(
         content=contents_for_item(
             self.object,
             [RichText, Download, Image]).render_regions(renderer),
         related=Article.objects.exclude(id=self.object.id).exclude(
             in_menu=True).order_by("created")[:5],
         **kwargs,
     )
 def get_context_data(self, **kwargs):
     contents = contents_for_item(self.object, [PageText],
                                  inherit_from=filter(
                                      None, [self.object.parent]))
     return super(PageView, self).get_context_data(content={
         region.key: mark_safe("".join(render_items(contents[region.key])))
         for region in self.object.regions
     },
                                                   **kwargs)
Beispiel #10
0
    def test_unknown_regions(self):
        article = Article.objects.create(title="Test")
        for idx, region in enumerate(("", "notexists", "main")):
            RichText.objects.create(parent=article,
                                    ordering=idx,
                                    region=region,
                                    text="Test")

        contents = contents_for_item(article, plugins=[RichText])
        self.assertEqual(len(contents._unknown_region_contents), 2)
    def test_stuff(self):
        # Smoke test some stuff
        article = Article.objects.create(title="Test")
        richtext = article.testapp_richtext_set.create(text="<p>bla</p>",
                                                       region="main",
                                                       ordering=10)
        article.testapp_download_set.create(file="bla.pdf",
                                            region="main",
                                            ordering=20)

        with self.assertNumQueries(0):
            self.assertEqual(
                "%s" % richtext,
                "testapp.RichText<region=main ordering=10 pk=%s>" %
                (richtext.pk, ),
            )

        with self.assertNumQueries(2):  # Two content types.
            contents = contents_for_item(article, plugins=[RichText, Download])

            self.assertEqual(contents.main[0], richtext)
            self.assertEqual(contents.main[0].parent, article)

        self.assertEqual(len(contents.main), 2)
        self.assertEqual(len(contents.sidebar), 0)
        self.assertEqual(len(contents.bla), 0)  # No AttributeError

        response = self.client.get(article.get_absolute_url())
        self.assertContains(response, "<h1>Test</h1>")
        self.assertContains(response, "<p>bla</p>")

        # Test for Contents.__iter__
        contents = contents_for_item(article, plugins=[RichText, Download])
        self.assertFalse(contents._sorted)
        self.assertEqual(len(list(contents)), 2)
        self.assertTrue(contents._sorted)
        self.assertEqual(len(list(contents)), 2)

        # Contents.__len__ also means that a Contents instance may be falsy
        self.assertEqual(len(contents), 2)
        self.assertTrue(contents)
        self.assertFalse(contents_for_item(article, []))
Beispiel #12
0
 def regions(self, item, inherit_from=None, regions=Regions):
     """regions(self, item, *, inherit_from=None, regions=Regions)
     Return a ``Regions`` instance which lazily wraps the
     ``contents_for_item`` call. This is especially useful in conjunction
     with the ``render_region`` template tag. The ``inherit_from`` argument
     is directly forwarded to ``contents_for_item`` to allow regions with
     inherited content.
     """
     return regions(
         item=item,
         contents=SimpleLazyObject(
             lambda: contents_for_item(item, self.plugins(), inherit_from)),
         renderer=self,
     )
Beispiel #13
0
def page_detail(request, path=None):
    page = get_object_or_404(
        Page.objects.active(),
        path='/{}/'.format(path) if path else '/',
    )
    page.activate_language(request)

    if page.redirect_to_url or page.redirect_to_page:
        return redirect(page.redirect_to_url or page.redirect_to_page)
    return render(request, page.template.template_name, {
        'page': page,
        'contents': contents_for_item(
            page, renderer.plugins(), page.ancestors().reverse()),
        'renderer': renderer,
    })
Beispiel #14
0
 def get_plugins(self):
     renderers = get_available_renderers()
     page = get_object_or_404(Page, pk=self.id)
     contents = contents_for_item(page, PagePlugins)
     data = []
     for region in self.regions:
         new_data = {
             region.key: [
                 dict(renderers[plugin.__class__](plugin),
                      type=plugin.__class__.__name__,
                      lang=page.language_code,
                      parent=page.slug)
             ]
             for plugin in eval(region.content)
         }
         data.append(new_data)
     return data
Beispiel #15
0
    def test_rendered_contents(self):
        article = Article.objects.create(title="Test")
        article.testapp_richtext_set.create(text="<p>bla</p>",
                                            region="main",
                                            ordering=10)
        article.testapp_richtext_set.create(text="<p>blah</p>",
                                            region="main",
                                            ordering=20)

        renderer = PluginRenderer()
        renderer.register(RichText, lambda plugin: mark_safe(plugin.text))

        contents = contents_for_item(article, [RichText])

        self.assertEqual("%s" % renderer.render(contents.main),
                         "<p>bla</p><p>blah</p>")
        self.assertEqual(list(renderer.render(contents.main)),
                         ["<p>bla</p>", "<p>blah</p>"])
Beispiel #16
0
    def regions(self, item, inherit_from=None, regions=None):
        """regions(self, item, *, inherit_from=None, regions=None)
        Return a ``Regions`` instance which lazily wraps the
        ``contents_for_item`` call. This is especially useful in conjunction
        with the ``render_region`` template tag. The ``inherit_from`` argument
        is directly forwarded to ``contents_for_item`` to allow regions with
        inherited content.

        The ``Regions`` type may be overridden by passing a ``regions_class``
        keyword argument when instantiating the ``TemplatePluginRenderer`` or
        by setting the ``regions`` argument of this method.
        """
        regions = self._regions_class if regions is None else regions
        return regions(
            item=item,
            contents=SimpleLazyObject(
                lambda: contents_for_item(item, self.plugins(), inherit_from)),
            renderer=self,
        )
Beispiel #17
0
    def get(self, request, event_id, slug):  # noqa: D102
        # check if url is valid
        event = get_object_or_404(Event, pk=event_id)

        if (event.hidden_event and
                not self.request.user.has_perms("website.view_hidden_event")):
            self.handle_no_permission()

        if event.slug != slug:
            return redirect('website:event_page',
                            event_id=event.pk,
                            slug=event.slug)

        # Not start date yet
        if (date.today() < event.start_date and
                not self.request.user.has_perm("website.view_unreleased_event")
            ):
            raise Http404(self.get_unreleased_message().format(
                f"from {ordinal(event.start_date.day)} ",
                calendar.month_name[event.start_date.month]))

        # Unreleased
        if (not event.released and
                not self.request.user.has_perm("website.view_unreleased_event")
            ):
            raise Http404(self.get_unreleased_message().format("", "soon"))

        contents = contents_for_item(event,
                                     [RichText, Download, NoEmbed, LightBox])
        return render(
            request, self.template_name, {
                "event": event,
                "content": {
                    region.key: mark_safe("".join(
                        self._render_elements(contents[region.key])))
                    for region in event.regions
                },
            })
Beispiel #18
0
    def from_item(cls,
                  item,
                  *,
                  renderer,
                  inherit_from=None,
                  timeout=None,
                  **kwargs):
        """
        Create and return a regions instance for an item (for example a page,
        an article or anything else managed by django-content-editor).

        The item's plugins are determined by what is registered with the
        renderer. The plugin instances themselves are loaded lazily, and
        loading every time can be avoided completely by specifying a
        ``timeout``.
        """
        if timeout is not None and "cache_key" not in kwargs:
            key = "%s-%s" % (item._meta.label_lower, item.pk)
            kwargs["cache_key"] = lambda region: "%s-%s" % (key, region)
        return cls.from_contents(SimpleLazyObject(lambda: contents_for_item(
            item, renderer.plugins(), inherit_from=inherit_from)),
                                 renderer=renderer,
                                 timeout=timeout,
                                 **kwargs)
Beispiel #19
0
 def render_body(self):
     contents = contents_for_item(self.email_message,
                                  plugins=renderer.plugins())
     body = renderer.regions(self.email_message).render(
         'body')  #TODO: split test content here
     return body