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> -->', )
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")
def regions(self, item, inherit_from=None, regions=Regions): return regions( item, SimpleLazyObject( lambda: contents_for_item(item, self.plugins(), inherit_from)), self, )
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>'], )
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)
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)
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, []))
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, )
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, })
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
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>"])
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, )
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 }, })
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)
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