Added renderer to association paragraph to display remote content
authorThierry Florac <thierry.florac@onf.fr>
Mon, 03 Sep 2018 16:07:19 +0200
changeset 124 62632a9571d5
parent 123 9638eaef9d34
child 125 a6d503cd9bb1
child 127 79f37cf0ded8
Added renderer to association paragraph to display remote content
src/pyams_default_theme/component/association/__init__.py
src/pyams_default_theme/component/association/interfaces/__init__.py
src/pyams_default_theme/component/association/templates/association-remote-content.pt
src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.mo
src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po
src/pyams_default_theme/locales/pyams_default_theme.pot
--- a/src/pyams_default_theme/component/association/__init__.py	Mon Sep 03 11:22:03 2018 +0200
+++ b/src/pyams_default_theme/component/association/__init__.py	Mon Sep 03 16:07:19 2018 +0200
@@ -18,13 +18,20 @@
 # import interfaces
 from pyams_content.component.association.interfaces import IAssociationParagraph, IAssociationInfo, \
     IAssociationContainer
+from pyams_content.component.links.interfaces import IInternalLink
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
 from pyams_content.features.renderer.interfaces import IContentRenderer
+from pyams_default_theme.component.association.interfaces import IAssociationParagraphRemoteContentRendererSettings
 from pyams_skin.layer import IPyAMSLayer
 
 # import packages
+from persistent import Persistent
 from pyams_content.features.renderer.skin import BaseContentRenderer
 from pyams_template.template import template_config
-from pyams_utils.adapter import adapter_config
+from pyams_utils.adapter import adapter_config, get_annotation_adapter
+from zope.interface import implementer
+from zope.location import Location
+from zope.schema.fieldproperty import FieldProperty
 
 from pyams_default_theme import _
 
@@ -39,6 +46,7 @@
     """Associations paragraph default renderer"""
 
     label = _("Default associations renderer")
+    associations = ()
 
     i18n_context_attrs = ('title', )
 
@@ -46,4 +54,52 @@
         super(AssociationParagraphDefaultRenderer, self).update()
         self.associations = [{'url': item.get_url(self.request),
                               'title': IAssociationInfo(item).user_title}
-                             for item in IAssociationContainer(self.context).values() if item.visible]
+                             for item in IAssociationContainer(self.context).get_visible_items(self.request)]
+
+
+#
+# Associations paragraph remote content renderer
+#
+
+ASSOCIATION_PARAGRAPH_REMOTE_CONTENT_RENDERER_SETTINGS_KEY = 'pyams_content.association.renderer:remote-content'
+
+
+@implementer(IAssociationParagraphRemoteContentRendererSettings)
+class AssociationParagraphRemoteContentRendererSettings(Persistent, Location):
+    """Associations paragraph remote content renderer settings"""
+
+    display_title = FieldProperty(IAssociationParagraphRemoteContentRendererSettings['display_title'])
+    display_header = FieldProperty(IAssociationParagraphRemoteContentRendererSettings['display_header'])
+    anchors_only = FieldProperty(IAssociationParagraphRemoteContentRendererSettings['anchors_only'])
+    factories = FieldProperty(IAssociationParagraphRemoteContentRendererSettings['factories'])
+
+
+@adapter_config(context=IAssociationParagraph, provides=IAssociationParagraphRemoteContentRendererSettings)
+def association_paragraph_remote_content_renderer_settings_factory(context):
+    """Associations paragraph remote content renderer settings factory"""
+    return get_annotation_adapter(context, ASSOCIATION_PARAGRAPH_REMOTE_CONTENT_RENDERER_SETTINGS_KEY,
+                                  AssociationParagraphRemoteContentRendererSettings)
+
+
+@adapter_config(name='remote-content', context=(IAssociationParagraph, IPyAMSLayer), provides=IContentRenderer)
+@template_config(template='templates/association-remote-content.pt', layer=IPyAMSLayer)
+class AssociationParagraphRemoteContentRenderer(BaseContentRenderer):
+    """Associations container remote content renderer"""
+
+    label = _("Include remote content")
+
+    i18n_context_attrs = ('title', )
+    links = ()
+
+    settings_interface = IAssociationParagraphRemoteContentRendererSettings
+
+    def update(self):
+        super(AssociationParagraphRemoteContentRenderer, self).update()
+        self.links = [item for item in IAssociationContainer(self.context).get_visible_items(self.request)
+                      if IInternalLink.providedBy(item) and IParagraphContainerTarget.providedBy(item.target)]
+
+    def get_paragraphs(self, target):
+        container = IParagraphContainer(target, None)
+        if container is not None:
+            settings = self.settings
+            yield from container.get_visible_paragraphs(settings.anchors_only, settings.factories)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/association/interfaces/__init__.py	Mon Sep 03 16:07:19 2018 +0200
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.paragraph.interfaces import PARAGRAPH_FACTORIES_VOCABULARY
+
+# import packages
+from zope.interface import Interface
+from zope.schema import Bool, Set, Choice
+
+from pyams_default_theme import _
+
+
+class IAssociationParagraphRemoteContentRendererSettings(Interface):
+    """Associations paragraph remote content renderer settings interface"""
+
+    display_title = Bool(title=_("Display title?"),
+                         description=_("Choose 'yes' to display remote content's title"),
+                         required=True,
+                         default=False)
+
+    display_header = Bool(title=_("Display header?"),
+                          description=_("Choose 'yes' to display remote content's header"),
+                          required=True,
+                          default=False)
+
+    anchors_only = Bool(title=_("Anchors only?"),
+                        description=_("If 'yes', only paragraphs set as 'anchors' will be selected"),
+                        required=True,
+                        default=True)
+
+    factories = Set(title=_("Paragraph types"),
+                    description=_("Select list of paragraph types you want to include; an empty "
+                                  "selection means that all paragraphs will be selected"),
+                    required=False,
+                    value_type=Choice(vocabulary=PARAGRAPH_FACTORIES_VOCABULARY))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/association/templates/association-remote-content.pt	Mon Sep 03 16:07:19 2018 +0200
@@ -0,0 +1,17 @@
+<tal:var i18n:domain="pyams_default_theme"
+		define="settings view.settings">
+	<tal:loop repeat="link view.links">
+		<tal:var define="target link.target"
+				 condition="target is not None">
+			<h2 tal:condition="settings.display_title">${i18n:target.title}</h2>
+			<div class="chapo"
+				 tal:define="header i18n:target.header"
+				 tal:condition="settings.display_header">${structure:tales:html(header)}</div>
+			<tal:loop repeat="paragraph view.get_paragraphs(target)">
+				<tal:var define="renderer paragraph.get_renderer(request);
+								 ignore renderer.update() if renderer is not None else None;"
+						 condition="renderer is not None">${structure:renderer.render()}</tal:var>
+			</tal:loop>
+		</tal:var>
+	</tal:loop>
+</tal:var>
Binary file src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.mo has changed
--- a/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po	Mon Sep 03 11:22:03 2018 +0200
+++ b/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po	Mon Sep 03 16:07:19 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-19 17:00+0200\n"
+"POT-Creation-Date: 2018-09-03 15:38+0200\n"
 "PO-Revision-Date: 2017-06-07 12:41+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -24,6 +24,10 @@
 msgid "Default gallery renderer"
 msgstr "Par défaut"
 
+#: src/pyams_default_theme/component/keynumber/__init__.py:53
+msgid "Default key numbers renderer"
+msgstr "Par défaut"
+
 #: src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
 msgid "Horizontal list with carousel"
 msgstr "Liste horizontale (par défaut)"
@@ -32,23 +36,27 @@
 msgid "Vertical list"
 msgstr "Liste verticale"
 
-#: src/pyams_default_theme/component/illustration/__init__.py:72
-msgid "Centered illustration"
-msgstr "Illustration centrée (par défaut)"
+#: src/pyams_default_theme/component/illustration/__init__.py:76
+msgid "Centered illustration before text"
+msgstr "Illustration centrée avant le texte"
 
-#: src/pyams_default_theme/component/illustration/__init__.py:81
+#: src/pyams_default_theme/component/illustration/__init__.py:87
 msgid "Small illustration on the left"
 msgstr "Illustration sur la gauche"
 
-#: src/pyams_default_theme/component/illustration/__init__.py:92
+#: src/pyams_default_theme/component/illustration/__init__.py:99
 msgid "Small illustration on the right"
 msgstr "Illustration sur la droite"
 
-#: src/pyams_default_theme/component/illustration/interfaces/__init__.py:30
+#: src/pyams_default_theme/component/illustration/__init__.py:111
+msgid "Centered illustration after text"
+msgstr "Illustration centrée après le texte"
+
+#: src/pyams_default_theme/component/illustration/interfaces/__init__.py:41
 msgid "Zoom on click?"
 msgstr "Zoom sur clic ?"
 
-#: src/pyams_default_theme/component/illustration/interfaces/__init__.py:31
+#: src/pyams_default_theme/component/illustration/interfaces/__init__.py:42
 msgid "If 'yes', a click on illustration thumbnail is required to zoom"
 msgstr ""
 "Si 'oui', un clic sur la vignette de l'illustration est nécessaire pour "
@@ -79,10 +87,6 @@
 msgid "Default audio renderer"
 msgstr "Par défaut"
 
-#: src/pyams_default_theme/component/paragraph/keynumber.py:50
-msgid "Default key numbers renderer"
-msgstr "Par défaut"
-
 #: src/pyams_default_theme/component/paragraph/frame.py:123
 msgid "Default frame renderer"
 msgstr "Encadré en pleine largeur (par défaut)"
@@ -113,10 +117,6 @@
 msgid "Default contact renderer"
 msgstr "Encadré en pleine largeur (par défaut)"
 
-#: src/pyams_default_theme/component/paragraph/header.py:40
-msgid "Default header renderer"
-msgstr "Par défaut"
-
 #: src/pyams_default_theme/component/paragraph/zmi/map.py:62
 msgid "Don't use default map configuration"
 msgstr "Ne pas utiliser la configuration de carte par défaut"
@@ -218,10 +218,50 @@
 msgid "Map position"
 msgstr "Position de la carte"
 
-#: src/pyams_default_theme/component/association/__init__.py:41
+#: src/pyams_default_theme/component/association/__init__.py:48
 msgid "Default associations renderer"
 msgstr "Par défaut"
 
+#: src/pyams_default_theme/component/association/__init__.py:89
+msgid "Include remote content"
+msgstr "Include les blocs de contenu distants"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:31
+msgid "Display title?"
+msgstr "Afficher le titre ?"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:32
+msgid "Choose 'yes' to display remote content's title"
+msgstr "Choisissez 'oui' pour afficher le titre des contenus liés"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:36
+msgid "Display header?"
+msgstr "Afficher le chapô ?"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:37
+msgid "Choose 'yes' to display remote content's header"
+msgstr "Choisissez 'oui' pour afficher le chapô des contenus liés"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:41
+msgid "Anchors only?"
+msgstr "Ancres seulement ?"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:42
+msgid "If 'yes', only paragraphs set as 'anchors' will be selected"
+msgstr "Si 'oui', seuls les blocs de contenu désignés comme ancres seront sélectionnés"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:46
+msgid "Paragraph types"
+msgstr "Types de blocs"
+
+#: src/pyams_default_theme/component/association/interfaces/__init__.py:47
+msgid ""
+"Select list of paragraph types you want to include; an empty selection means "
+"that all paragraphs will be selected"
+msgstr ""
+"Sélectionnez le type des blocs de contenu que vous souhaitez intégrer ; si vous laissez "
+"la sélection vide, tous les types de blocs seront pris en compte"
+
 #: src/pyams_default_theme/shared/view/templates/render.pt:2
 msgid "View result items"
 msgstr "Aperçu du contenu de la vue"
@@ -324,6 +364,9 @@
 msgid "PyAMS simple header with banner and tabs"
 msgstr "PyAMS: en-tête simple avec bandeau et onglets de navigation"
 
+#~ msgid "Default header renderer"
+#~ msgstr "Par défaut"
+
 #~ msgid "Search..."
 #~ msgstr "Chercher..."
 
--- a/src/pyams_default_theme/locales/pyams_default_theme.pot	Mon Sep 03 11:22:03 2018 +0200
+++ b/src/pyams_default_theme/locales/pyams_default_theme.pot	Mon Sep 03 16:07:19 2018 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-19 17:00+0200\n"
+"POT-Creation-Date: 2018-09-03 15:38+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,6 +24,10 @@
 msgid "Default gallery renderer"
 msgstr ""
 
+#: ./src/pyams_default_theme/component/keynumber/__init__.py:53
+msgid "Default key numbers renderer"
+msgstr ""
+
 #: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
 msgid "Horizontal list with carousel"
 msgstr ""
@@ -32,23 +36,27 @@
 msgid "Vertical list"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/illustration/__init__.py:72
-msgid "Centered illustration"
+#: ./src/pyams_default_theme/component/illustration/__init__.py:76
+msgid "Centered illustration before text"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/illustration/__init__.py:81
+#: ./src/pyams_default_theme/component/illustration/__init__.py:87
 msgid "Small illustration on the left"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/illustration/__init__.py:92
+#: ./src/pyams_default_theme/component/illustration/__init__.py:99
 msgid "Small illustration on the right"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/illustration/interfaces/__init__.py:30
+#: ./src/pyams_default_theme/component/illustration/__init__.py:111
+msgid "Centered illustration after text"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/illustration/interfaces/__init__.py:41
 msgid "Zoom on click?"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/illustration/interfaces/__init__.py:31
+#: ./src/pyams_default_theme/component/illustration/interfaces/__init__.py:42
 msgid "If 'yes', a click on illustration thumbnail is required to zoom"
 msgstr ""
 
@@ -77,10 +85,6 @@
 msgid "Default audio renderer"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/paragraph/keynumber.py:50
-msgid "Default key numbers renderer"
-msgstr ""
-
 #: ./src/pyams_default_theme/component/paragraph/frame.py:123
 msgid "Default frame renderer"
 msgstr ""
@@ -111,10 +115,6 @@
 msgid "Default contact renderer"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/paragraph/header.py:40
-msgid "Default header renderer"
-msgstr ""
-
 #: ./src/pyams_default_theme/component/paragraph/zmi/map.py:62
 msgid "Don't use default map configuration"
 msgstr ""
@@ -203,10 +203,48 @@
 msgid "Map position"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/association/__init__.py:41
+#: ./src/pyams_default_theme/component/association/__init__.py:48
 msgid "Default associations renderer"
 msgstr ""
 
+#: ./src/pyams_default_theme/component/association/__init__.py:89
+msgid "Include remote content"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:31
+msgid "Display title?"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:32
+msgid "Choose 'yes' to display remote content's title"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:36
+msgid "Display header?"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:37
+msgid "Choose 'yes' to display remote content's header"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:41
+msgid "Anchors only?"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:42
+msgid "If 'yes', only paragraphs set as 'anchors' will be selected"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:46
+msgid "Paragraph types"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/association/interfaces/__init__.py:47
+msgid ""
+"Select list of paragraph types you want to include; an empty selection means "
+"that all paragraphs will be selected"
+msgstr ""
+
 #: ./src/pyams_default_theme/shared/view/templates/render.pt:2
 msgid "View result items"
 msgstr ""