merge default doc-dc
authorDamien Correia
Mon, 11 Jun 2018 16:14:41 +0200
branchdoc-dc
changeset 661 cffd13804aa8
parent 660 b977c7da3074 (current diff)
parent 620 7de4aaf90bff (diff)
child 662 93f8b735357a
merge default
--- a/.hgtags	Mon Jun 11 10:00:17 2018 +0200
+++ b/.hgtags	Mon Jun 11 16:14:41 2018 +0200
@@ -15,3 +15,4 @@
 d73905f6a2eb2949b3979671bf261965473bb7b9 0.1.11
 5d94baef6923642af27a9f30f377d45f67f04bbf 0.1.12
 cf2d19055dd754ce3ed30be24f83dae351b3ae5c 0.1.13
+95026785904d443509d93895ddf761b7967d9d46 0.1.14
--- a/src/pyams_content.egg-info/PKG-INFO	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content.egg-info/PKG-INFO	Mon Jun 11 16:14:41 2018 +0200
@@ -75,6 +75,10 @@
         
         0.1.14
         ------
+         - added header and footer management features
+         - added renderer for each kind of paragraphs
+         - added preview for a each paragraph one by one
+         - added optional checks before publishing content
          - updated groups management in forms
         
         0.1.13
--- a/src/pyams_content.egg-info/SOURCES.txt	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content.egg-info/SOURCES.txt	Mon Jun 11 16:14:41 2018 +0200
@@ -50,6 +50,7 @@
 src/pyams_content/component/links/zmi/reverse.py
 src/pyams_content/component/media/__init__.py
 src/pyams_content/component/paragraph/__init__.py
+src/pyams_content/component/paragraph/audio.py
 src/pyams_content/component/paragraph/contact.py
 src/pyams_content/component/paragraph/container.py
 src/pyams_content/component/paragraph/frame.py
@@ -62,6 +63,7 @@
 src/pyams_content/component/paragraph/verbatim.py
 src/pyams_content/component/paragraph/video.py
 src/pyams_content/component/paragraph/interfaces/__init__.py
+src/pyams_content/component/paragraph/interfaces/audio.py
 src/pyams_content/component/paragraph/interfaces/contact.py
 src/pyams_content/component/paragraph/interfaces/frame.py
 src/pyams_content/component/paragraph/interfaces/header.py
@@ -73,6 +75,7 @@
 src/pyams_content/component/paragraph/interfaces/verbatim.py
 src/pyams_content/component/paragraph/interfaces/video.py
 src/pyams_content/component/paragraph/zmi/__init__.py
+src/pyams_content/component/paragraph/zmi/audio.py
 src/pyams_content/component/paragraph/zmi/contact.py
 src/pyams_content/component/paragraph/zmi/container.py
 src/pyams_content/component/paragraph/zmi/frame.py
@@ -87,10 +90,8 @@
 src/pyams_content/component/paragraph/zmi/verbatim.py
 src/pyams_content/component/paragraph/zmi/video.py
 src/pyams_content/component/paragraph/zmi/templates/associations.pt
-src/pyams_content/component/paragraph/zmi/templates/html-render.pt
 src/pyams_content/component/paragraph/zmi/templates/paragraph-title-icon.pt
 src/pyams_content/component/paragraph/zmi/templates/paragraph-title-toolbar.pt
-src/pyams_content/component/paragraph/zmi/templates/raw-render.pt
 src/pyams_content/component/theme/__init__.py
 src/pyams_content/component/theme/portlet.py
 src/pyams_content/component/theme/interfaces/__init__.py
@@ -113,7 +114,6 @@
 src/pyams_content/component/video/provider/zmi/templates/youtube-render.pt
 src/pyams_content/component/video/zmi/__init__.py
 src/pyams_content/component/video/zmi/paragraph.py
-src/pyams_content/component/video/zmi/templates/video-render.pt
 src/pyams_content/component/video/zmi/templates/video-settings.pt
 src/pyams_content/doctests/README.txt
 src/pyams_content/features/__init__.py
@@ -129,6 +129,7 @@
 src/pyams_content/features/footer/interfaces/__init__.py
 src/pyams_content/features/footer/skin/__init__.py
 src/pyams_content/features/footer/zmi/__init__.py
+src/pyams_content/features/footer/zmi/__init__.py.orig
 src/pyams_content/features/footer/zmi/templates/renderer-settings.pt
 src/pyams_content/features/header/__init__.py
 src/pyams_content/features/header/interfaces/__init__.py
@@ -159,6 +160,12 @@
 src/pyams_content/locales/pyams_content.pot
 src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo
 src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po
+src/pyams_content/portlet/__init__.py
+src/pyams_content/portlet/content/__init__.py
+src/pyams_content/portlet/content/interfaces.py
+src/pyams_content/portlet/content/skin/__init__.py
+src/pyams_content/portlet/content/zmi/__init__.py
+src/pyams_content/portlet/content/zmi/preview.pt
 src/pyams_content/profile/__init__.py
 src/pyams_content/profile/admin.py
 src/pyams_content/profile/interfaces/__init__.py
@@ -171,6 +178,7 @@
 src/pyams_content/reference/pictograms/zmi/__init__.py
 src/pyams_content/reference/pictograms/zmi/manager.py
 src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt
+src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt
 src/pyams_content/reference/zmi/__init__.py
 src/pyams_content/reference/zmi/table.py
 src/pyams_content/root/__init__.py
@@ -190,6 +198,7 @@
 src/pyams_content/shared/blog/zmi/manager.py
 src/pyams_content/shared/common/__init__.py
 src/pyams_content/shared/common/manager.py
+src/pyams_content/shared/common/portal.py
 src/pyams_content/shared/common/security.py
 src/pyams_content/shared/common/types.py
 src/pyams_content/shared/common/interfaces/__init__.py
@@ -209,8 +218,10 @@
 src/pyams_content/shared/common/zmi/types.py
 src/pyams_content/shared/common/zmi/workflow.py
 src/pyams_content/shared/common/zmi/templates/advanced-search.pt
+src/pyams_content/shared/common/zmi/templates/check-input.pt
 src/pyams_content/shared/common/zmi/templates/dashboard.pt
 src/pyams_content/shared/common/zmi/templates/header.pt
+src/pyams_content/shared/common/zmi/templates/preview-input.pt
 src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt
 src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt
 src/pyams_content/shared/common/zmi/templates/wf-cancel-archiving-message.pt
@@ -302,7 +313,6 @@
 src/pyams_content/skin/resources/js/jquery-imagemapster-1.2.10.min.js
 src/pyams_content/skin/resources/js/pyams_content.js
 src/pyams_content/skin/resources/js/pyams_content.min.js
-src/pyams_content/skin/resources/js/pyams_content.min.min.js
 src/pyams_content/skin/resources/js/tinymce/onflinks/plugin.js
 src/pyams_content/skin/resources/js/tinymce/onflinks/plugin.min.js
 src/pyams_content/skin/resources/js/tinymce/onflinks/langs/fr.js
--- a/src/pyams_content.egg-info/requires.txt	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content.egg-info/requires.txt	Mon Jun 11 16:14:41 2018 +0200
@@ -14,7 +14,7 @@
 pyams_skin
 pyams_template
 pyams_thesaurus
-pyams_utils
+pyams_utils>=0.1.15
 pyams_viewlet
 pyams_workflow
 pyams_zmi
--- a/src/pyams_content/component/paragraph/zmi/milestone.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/milestone.py	Mon Jun 11 16:14:41 2018 +0200
@@ -304,7 +304,7 @@
 
 @pagelet_config(name='add-milestone.html', context=IMilestoneContainerTarget, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
-@ajax_config(name='add-milestone.json', context=IParagraphContainerTarget, layer=IPyAMSLayer,
+@ajax_config(name='add-milestone.json', context=IMilestoneContainerTarget, layer=IPyAMSLayer,
              base=AJAXAddForm)
 class MilestoneAddForm(AdminDialogAddForm):
     """Milestone add form"""
--- a/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 11 16:14:41 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_content.reference.pictograms.zmi import get_pictogram_header
 
 __docformat__ = 'restructuredtext'
 
@@ -387,12 +388,11 @@
                 widget = self.widgets['pictogram_name']
                 widget.required = True
                 if pictogram is None:
-                    widget.after_widget_notice = '<span id="{0}" class="text-info">{1}</span>'.format(label_id, '--')
+                    widget.after_widget_notice = '<span id="{0}" class="text-info">--</span>'.format(label_id)
                 else:
                     widget.after_widget_notice = '<span id="{0}" class="text-info">{1}</span>'.format(
                         label_id,
-                        self.request.localizer.translate(_("Default header: {0}")).format(
-                            II18n(pictogram).query_attribute('header', request=self.request) or '--'))
+                        get_pictogram_header(pictogram, self.request))
                 widget.object_data = {
                     'ams-change-handler': 'MyAMS.helpers.select2ChangeHelper',
                     'ams-stop-propagation': 'true',
--- a/src/pyams_content/component/paragraph/zmi/preview.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/preview.py	Mon Jun 11 16:14:41 2018 +0200
@@ -37,7 +37,8 @@
         super(ParagraphsContainerRenderer, self).__init__(context, request)
         paragraphs = [para for para in IParagraphContainer(self.context).values()
                       if para.visible]
-        self.renderers = [self.request.registry.queryMultiAdapter((paragraph, self.request), IParagraphRenderer)
+        registry = self.request.registry
+        self.renderers = [registry.queryMultiAdapter((paragraph, self.request), IParagraphRenderer)
                           for paragraph in paragraphs]
 
     def update(self):
--- a/src/pyams_content/component/theme/zmi/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/component/theme/zmi/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -88,7 +88,7 @@
 
     def get_subterms(self, term):
         for subterm in term.specifics:
-            if self.extract_name in subterm.extracts:
+            if (not self.extract_name) or (self.extract_name in subterm.extracts):
                 yield subterm
                 for another in self.get_subterms(subterm):
                     yield another
--- a/src/pyams_content/features/review/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/features/review/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -22,7 +22,6 @@
 from pyams_content.interfaces import READER_ROLE
 from pyams_content.features.review.interfaces import IReviewManager, IReviewComment, IReviewComments, \
     REVIEW_COMMENTS_ANNOTATION_KEY, CommentAddedEvent, ICommentAddedEvent, IReviewTarget
-from pyams_content.shared.common.interfaces import IWfSharedContentRoles
 from pyams_i18n.interfaces import II18n
 from pyams_mail.interfaces import IPrincipalMailInfo
 from pyams_security.interfaces import ISecurityManager, IProtectedObject
@@ -124,6 +123,8 @@
 
     def ask_review(self, reviewers, comment, notify_all=True):
         """Ask for content review"""
+        from pyams_content.shared.common.interfaces import IWfSharedContentRoles
+
         roles = IWfSharedContentRoles(self.context, None)
         if roles is None:
             return
--- a/src/pyams_content/generations/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/generations/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -19,6 +19,7 @@
 
 # import interfaces
 from pyams_catalog.interfaces import MINUTE_RESOLUTION, DATE_RESOLUTION
+from pyams_content.component.theme import IThemesInfo
 from pyams_content.interfaces import IBaseContent
 from pyams_content.root.interfaces import ISiteRootToolsConfiguration
 from pyams_content.shared.common.interfaces import IWfSharedContent
@@ -42,6 +43,7 @@
 from pyams_content.shared.common.manager import SharedToolContainer
 from pyams_i18n.index import I18nTextIndexWithInterface
 from pyams_security.index import PrincipalsRoleIndex
+from pyams_thesaurus.index import ThesaurusTermsListFieldIndex
 from pyams_utils.registry import utility_config, get_global_registry
 from pyams_utils.site import check_required_utilities
 from pyramid.path import DottedNameResolver
@@ -55,7 +57,9 @@
 RENAMED_CLASSES = {
     'pyams_content.shared.common.review ReviewComment': 'pyams_content.features.review ReviewComment',
     'pyams_content.shared.common.review ReviewCommentsContainer':
-        'pyams_content.features.review ReviewCommentsContainer'
+        'pyams_content.features.review ReviewCommentsContainer',
+    'pyams_portal.portlets.content ContentPortletSettings':
+        'pyams_content.portlet.content SharedContentPortletSettings'
 }
 
 
@@ -109,7 +113,19 @@
                                                      'resolution': MINUTE_RESOLUTION}),
     ('first_publication_date', DatetimeIndexWithInterface, {'interface': IWorkflowPublicationInfo,
                                                             'discriminator': 'first_publication_date',
-                                                            'resolution': MINUTE_RESOLUTION})
+                                                            'resolution': MINUTE_RESOLUTION}),
+    ('themes', ThesaurusTermsListFieldIndex, {'interface': IThemesInfo,
+                                              'discriminator': 'themes',
+                                              'include_parents': False,
+                                              'include_synonyms': False}),
+    ('themes_tree', ThesaurusTermsListFieldIndex, {'interface': IThemesInfo,
+                                                   'discriminator': 'themes',
+                                                   'include_parents': True,
+                                                   'include_synonyms': False}),
+    ('themes_all', ThesaurusTermsListFieldIndex, {'interface': IThemesInfo,
+                                                  'discriminator': 'themes',
+                                                  'include_parents': True,
+                                                  'include_synonyms': True})
 ]
 
 
Binary file src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo has changed
--- a/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Mon Jun 11 16:14:41 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-06-08 17:54+0200\n"
+"POT-Creation-Date: 2018-06-11 14:34+0200\n"
 "PO-Revision-Date: 2015-09-10 10:42+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -221,7 +221,7 @@
 #: src/pyams_content/component/paragraph/interfaces/audio.py:44
 #: src/pyams_content/component/links/interfaces/__init__.py:37
 #: src/pyams_content/component/video/interfaces/__init__.py:48
-#: src/pyams_content/shared/common/interfaces/__init__.py:145
+#: src/pyams_content/shared/common/interfaces/__init__.py:144
 #: src/pyams_content/shared/form/interfaces/__init__.py:65
 msgid "Description"
 msgstr "Description"
@@ -285,7 +285,7 @@
 #: src/pyams_content/shared/site/zmi/folder.py:68
 #: src/pyams_content/root/zmi/templates/advanced-search.pt:188
 #: src/pyams_content/interfaces/__init__.py:99
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:152
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:153
 msgid "Title"
 msgstr "Titre"
 
@@ -633,18 +633,18 @@
 msgstr "Aperçu"
 
 #: src/pyams_content/component/paragraph/zmi/__init__.py:212
-#: src/pyams_content/shared/common/zmi/workflow.py:125
-#: src/pyams_content/shared/common/zmi/workflow.py:212
-#: src/pyams_content/shared/common/zmi/workflow.py:252
-#: src/pyams_content/shared/common/zmi/workflow.py:306
-#: src/pyams_content/shared/common/zmi/workflow.py:395
-#: src/pyams_content/shared/common/zmi/workflow.py:451
-#: src/pyams_content/shared/common/zmi/workflow.py:491
-#: src/pyams_content/shared/common/zmi/workflow.py:532
-#: src/pyams_content/shared/common/zmi/workflow.py:575
-#: src/pyams_content/shared/common/zmi/workflow.py:615
-#: src/pyams_content/shared/common/zmi/workflow.py:656
-#: src/pyams_content/shared/common/zmi/workflow.py:707
+#: src/pyams_content/shared/common/zmi/workflow.py:122
+#: src/pyams_content/shared/common/zmi/workflow.py:209
+#: src/pyams_content/shared/common/zmi/workflow.py:249
+#: src/pyams_content/shared/common/zmi/workflow.py:303
+#: src/pyams_content/shared/common/zmi/workflow.py:392
+#: src/pyams_content/shared/common/zmi/workflow.py:448
+#: src/pyams_content/shared/common/zmi/workflow.py:488
+#: src/pyams_content/shared/common/zmi/workflow.py:529
+#: src/pyams_content/shared/common/zmi/workflow.py:572
+#: src/pyams_content/shared/common/zmi/workflow.py:612
+#: src/pyams_content/shared/common/zmi/workflow.py:653
+#: src/pyams_content/shared/common/zmi/workflow.py:704
 #: src/pyams_content/shared/common/zmi/__init__.py:275
 #: src/pyams_content/shared/common/zmi/owner.py:73
 #: src/pyams_content/features/review/zmi/__init__.py:90
@@ -712,70 +712,64 @@
 "Vérifiez le paramétrage des types de blocs de contenu autorisés pour pouvoir "
 "ajouter de nouveaux blocs."
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:83
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:84
 msgid "Pictograms..."
 msgstr "Pictogrammes"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:96
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:97
 msgid "Add new pictogram paragraph"
 msgstr "Ajout de pictogrammes"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:123
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:124
 msgid "Edit pictogram paragraph properties"
 msgstr "Propriétés des pictogrammes"
 
 #. Default: Header
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:253
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:254
 msgid "pictogram-item-header"
 msgstr "En-tête"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:268
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:269
 #: src/pyams_content/component/paragraph/zmi/keynumber.py:260
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:58
 #: src/pyams_content/component/paragraph/interfaces/keynumber.py:58
 msgid "Associated text"
 msgstr "Texte associé"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:290
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:291
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:80
 msgid "Pictograms"
 msgstr "Pictogrammes"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:305
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:61
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:306
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:62
 msgid "Add pictogram"
 msgstr "Ajouter un pictogramme"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:318
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:73
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:319
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:74
 msgid "Add new pictogram"
 msgstr "Ajout d'un pictogramme"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:374
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:97
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:375
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:98
 msgid "Edit pictogram properties"
 msgstr "Propriétés du pictogramme"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:354
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:355
 msgid "Pictogram was correctly added"
 msgstr "Le pictogramme a été ajouté."
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:364
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:365
 #: src/pyams_content/component/paragraph/zmi/pictogram.py:422
 msgid "You must select a pictogram!"
 msgstr "Vous devez sélectionner un pictogramme !"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:333
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:173
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:334
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:174
 msgid "Default header: --"
 msgstr "En-tête par défaut : --"
 
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:394
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:177
-#, python-format
-msgid "Default header: {0}"
-msgstr "En-tête par défaut : {0}"
-
 #: src/pyams_content/component/paragraph/zmi/audio.py:54
 msgid "Audio paragraph..."
 msgstr "Bande son"
@@ -1878,54 +1872,54 @@
 msgid "Click to see subtypes"
 msgstr "Montrer ou caher les sous-types"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:847
+#: src/pyams_content/shared/common/zmi/workflow.py:844
 msgid "Prior checks"
 msgstr "Contrôles préalables : avez-vous ?"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:126
+#: src/pyams_content/shared/common/zmi/workflow.py:123
 msgid "Request publication"
 msgstr "Demander la publication"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:213
+#: src/pyams_content/shared/common/zmi/workflow.py:210
 #: src/pyams_content/workflow/__init__.py:315
 msgid "Cancel publication request"
 msgstr "Annuler la demande de publication"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:253
+#: src/pyams_content/shared/common/zmi/workflow.py:250
 msgid "Refuse publication request"
 msgstr "Refuser la demande de publication"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:307
+#: src/pyams_content/shared/common/zmi/workflow.py:304
 #: src/pyams_content/workflow/basic.py:196
 msgid "Publish"
 msgstr "Publier"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:396
+#: src/pyams_content/shared/common/zmi/workflow.py:393
 msgid "Request retire"
 msgstr "Demander le retrait"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:452
+#: src/pyams_content/shared/common/zmi/workflow.py:449
 msgid "Cancel retire request"
 msgstr "Annuler la demande de retrait"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:492
+#: src/pyams_content/shared/common/zmi/workflow.py:489
 msgid "Retire"
 msgstr "Retirer"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:533
+#: src/pyams_content/shared/common/zmi/workflow.py:530
 #: src/pyams_content/workflow/__init__.py:436
 msgid "Request archive"
 msgstr "Demander l'archivage"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:576
+#: src/pyams_content/shared/common/zmi/workflow.py:573
 msgid "Cancel archive request"
 msgstr "Annuler la demande d'archivage"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:616
+#: src/pyams_content/shared/common/zmi/workflow.py:613
 msgid "Archive"
 msgstr "Archiver"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:657
+#: src/pyams_content/shared/common/zmi/workflow.py:654
 #: src/pyams_content/workflow/__init__.py:501
 #: src/pyams_content/workflow/__init__.py:513
 #: src/pyams_content/workflow/__init__.py:525
@@ -1936,39 +1930,39 @@
 msgid "Create new version"
 msgstr "Créer une nouvelle version"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:708
+#: src/pyams_content/shared/common/zmi/workflow.py:705
 #: src/pyams_content/workflow/__init__.py:561
 #: src/pyams_content/workflow/basic.py:248
 msgid "Delete version"
 msgstr "Supprimer cette version"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:793
+#: src/pyams_content/shared/common/zmi/workflow.py:790
 msgid "Previewed content?"
 msgstr "Prévisualisé ce contenu ?"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:797
+#: src/pyams_content/shared/common/zmi/workflow.py:794
 msgid "Verified content?"
 msgstr "Audité ce contenu ?"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:183
-#: src/pyams_content/shared/common/zmi/workflow.py:365
+#: src/pyams_content/shared/common/zmi/workflow.py:180
+#: src/pyams_content/shared/common/zmi/workflow.py:362
 msgid "Publication start date is required"
 msgstr "La date de début de publication est obligatoire"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:276
-#: src/pyams_content/shared/common/zmi/workflow.py:422
+#: src/pyams_content/shared/common/zmi/workflow.py:273
+#: src/pyams_content/shared/common/zmi/workflow.py:419
 msgid "A comment is required"
 msgstr "Le commentaire est obligatoire"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:732
+#: src/pyams_content/shared/common/zmi/workflow.py:729
 msgid "Delete content"
 msgstr "Supprimer définitivement ce contenu"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:741
+#: src/pyams_content/shared/common/zmi/workflow.py:738
 msgid "Delete definitively"
 msgstr "Supprimer définitivement"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:863
+#: src/pyams_content/shared/common/zmi/workflow.py:860
 msgid ""
 "You must confirm that you previewed and checked this content before "
 "requesting publication!!"
@@ -1976,12 +1970,12 @@
 "Vous devez avoir prévisualisé et audité ce contenu avant de pouvoir le "
 "publier !!"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:90
+#: src/pyams_content/shared/common/zmi/workflow.py:87
 #, python-format
 msgid "{state} | by {principal}"
 msgstr "{state} | par {principal}"
 
-#: src/pyams_content/shared/common/zmi/workflow.py:86
+#: src/pyams_content/shared/common/zmi/workflow.py:83
 #: src/pyams_content/workflow/__init__.py:648
 #: src/pyams_content/workflow/__init__.py:619
 #: src/pyams_content/workflow/basic.py:315
@@ -2441,8 +2435,8 @@
 
 #: src/pyams_content/shared/common/zmi/security.py:118
 #: src/pyams_content/shared/common/zmi/security.py:270
-#: src/pyams_content/shared/common/interfaces/__init__.py:252
-#: src/pyams_content/shared/common/interfaces/__init__.py:277
+#: src/pyams_content/shared/common/interfaces/__init__.py:251
+#: src/pyams_content/shared/common/interfaces/__init__.py:276
 msgid "Publication checks"
 msgstr "Activer le tunnel de publication"
 
@@ -2870,22 +2864,22 @@
 msgid "List of fields associated with this data type"
 msgstr "Liste des champs de saisie associés à ce type"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:46
+#: src/pyams_content/shared/common/interfaces/__init__.py:45
 #: src/pyams_content/root/interfaces/__init__.py:40
 msgid "Webmasters"
 msgstr "Webmestres"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:47
+#: src/pyams_content/shared/common/interfaces/__init__.py:46
 msgid "Webmasters can handle all contents, including published ones"
 msgstr ""
 "Les webmestres peuvent modifier et gérer tous les contenus, y compris ceux "
 "qui sont publiés et hormis ceux qui sont archivés"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:51
+#: src/pyams_content/shared/common/interfaces/__init__.py:50
 msgid "Pilots"
 msgstr "Pilotes"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:52
+#: src/pyams_content/shared/common/interfaces/__init__.py:51
 msgid ""
 "Pilots can handle tool configuration, manage access rules, grant users roles "
 "and manage managers restrictions"
@@ -2894,13 +2888,13 @@
 "et les contributeurs, et limitent si nécessaire l'intervention des "
 "responsables à certains contenus"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:57
-#: src/pyams_content/shared/common/interfaces/__init__.py:174
+#: src/pyams_content/shared/common/interfaces/__init__.py:56
+#: src/pyams_content/shared/common/interfaces/__init__.py:173
 msgid "Managers"
 msgstr "Responsables"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:58
-#: src/pyams_content/shared/common/interfaces/__init__.py:175
+#: src/pyams_content/shared/common/interfaces/__init__.py:57
+#: src/pyams_content/shared/common/interfaces/__init__.py:174
 msgid ""
 "Managers can handle main operations in tool's workflow, like publish or "
 "retire contents"
@@ -2909,28 +2903,28 @@
 "(comme la publication ou le retrait des contenus), dans la limite des "
 "restrictions qui leur sont imposées"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:63
-#: src/pyams_content/shared/common/interfaces/__init__.py:180
+#: src/pyams_content/shared/common/interfaces/__init__.py:62
+#: src/pyams_content/shared/common/interfaces/__init__.py:179
 msgid "Contributors"
 msgstr "Contributeurs"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:64
+#: src/pyams_content/shared/common/interfaces/__init__.py:63
 msgid "Contributors are users which are allowed to create new contents"
 msgstr "Les contributeurs sont autorisés à créer de nouveaux contenus"
 
+#: src/pyams_content/shared/common/interfaces/__init__.py:89
+msgid "Workflow name"
+msgstr "Nom du workflow"
+
 #: src/pyams_content/shared/common/interfaces/__init__.py:90
-msgid "Workflow name"
-msgstr "Nom du workflow"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:91
 msgid "Name of workflow utility used to manage tool contents"
 msgstr "Nom du workflow qui gère le cycle de vie des contenus de cet outil"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:115
+#: src/pyams_content/shared/common/interfaces/__init__.py:114
 msgid "Content URL"
 msgstr "URL du contenu"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:116
+#: src/pyams_content/shared/common/interfaces/__init__.py:115
 msgid ""
 "URL used to access this content; this is important for SEO and should "
 "include most important words describing content; spaces and underscores will "
@@ -2944,11 +2938,11 @@
 "d'union, les lettres accentuées par leur équivalent sans accent, et les mots "
 "de moins de trois lettres sont supprimés."
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:121
+#: src/pyams_content/shared/common/interfaces/__init__.py:120
 msgid "Version creator"
 msgstr "À l'origine de cette version"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:122
+#: src/pyams_content/shared/common/interfaces/__init__.py:121
 msgid ""
 "Name of content's version creator. The creator of the first version is also "
 "it's owner."
@@ -2956,39 +2950,39 @@
 "Nom du créateur de cette version. Le créateur de la première version d'un "
 "contenu est aussi son propriétaire."
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:126
+#: src/pyams_content/shared/common/interfaces/__init__.py:125
 msgid "First owner"
 msgstr "Premier propriétaire"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:127
+#: src/pyams_content/shared/common/interfaces/__init__.py:126
 msgid "Name of content's first version owner"
 msgstr "Nom de l'utilisateur ayant créé la première version"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:131
+#: src/pyams_content/shared/common/interfaces/__init__.py:130
 msgid "Version creation"
 msgstr "Date de création"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:134
+#: src/pyams_content/shared/common/interfaces/__init__.py:133
 msgid "Version modifiers"
 msgstr "Intervenants"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:135
+#: src/pyams_content/shared/common/interfaces/__init__.py:134
 msgid "List of principals who modified this content"
 msgstr "Liste des utilisateurs qui sont intervenus sur cette version"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:138
+#: src/pyams_content/shared/common/interfaces/__init__.py:137
 msgid "Last modifier"
 msgstr "Dernier intervenant"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:139
+#: src/pyams_content/shared/common/interfaces/__init__.py:138
 msgid "Last principal who modified this content"
 msgstr "Dernier utilisateur étant intervenu sur ce contenu"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:142
+#: src/pyams_content/shared/common/interfaces/__init__.py:141
 msgid "Last update"
 msgstr "Dernière modification"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:146
+#: src/pyams_content/shared/common/interfaces/__init__.py:145
 msgid ""
 "The content's description is 'hidden' into HTML's page headers; but it can "
 "be seen, for example, in some search engines results as content's description"
@@ -2997,21 +2991,21 @@
 "mais on peut la retrouver, par exemple, dans les listes de résultats des "
 "moteurs de recherche"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:151
+#: src/pyams_content/shared/common/interfaces/__init__.py:150
 msgid "Keywords"
 msgstr "Mots-clés"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:152
+#: src/pyams_content/shared/common/interfaces/__init__.py:151
 msgid "They will be included into HTML pages metadata"
 msgstr "Ces mots-clés seront intégrés dans les métadonnées des pages HTML"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:155
+#: src/pyams_content/shared/common/interfaces/__init__.py:154
 #: src/pyams_content/shared/site/zmi/folder.py:76
 #: src/pyams_content/shared/site/interfaces/__init__.py:66
 msgid "Notepad"
 msgstr "Bloc-notes"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:156
+#: src/pyams_content/shared/common/interfaces/__init__.py:155
 #: src/pyams_content/shared/site/zmi/folder.py:77
 #: src/pyams_content/shared/site/interfaces/__init__.py:67
 msgid "Internal information to be known about this content"
@@ -3019,11 +3013,11 @@
 "Pour prendre note d'informations internes utiles ou importantes à propos de "
 "ce contenu ; ces notes ne seront pas publiées sur internet."
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:167
+#: src/pyams_content/shared/common/interfaces/__init__.py:166
 msgid "Content owner"
 msgstr "Propriétaire"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:168
+#: src/pyams_content/shared/common/interfaces/__init__.py:167
 msgid ""
 "The owner is the creator of content's first version, except if it was "
 "transferred afterwards to another owner"
@@ -3032,7 +3026,7 @@
 "lorsque cette propriété a été transférée à un autre utilisateur après coup. "
 "Les contenus archivés ne sont plus transférables."
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:181
+#: src/pyams_content/shared/common/interfaces/__init__.py:180
 msgid ""
 "Contributors are users which are allowed to update this content in addition "
 "to it's owner"
@@ -3040,11 +3034,11 @@
 "Les contributeurs sont autorisés, en plus du propriétaire, à modifier ce "
 "contenu"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:186
+#: src/pyams_content/shared/common/interfaces/__init__.py:185
 msgid "Readers"
 msgstr "Relecteurs"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:187
+#: src/pyams_content/shared/common/interfaces/__init__.py:186
 msgid ""
 "Readers are users which are asked to verify and comment contents before they "
 "are published"
@@ -3052,22 +3046,22 @@
 "Les relecteurs sont des utilisateurs qui sont sollicités pour vérifier et "
 "commenter un contenu avant sa publication"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:192
+#: src/pyams_content/shared/common/interfaces/__init__.py:191
 msgid "Guests"
 msgstr "Invités"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:193
+#: src/pyams_content/shared/common/interfaces/__init__.py:192
 msgid ""
 "Guests are users which are allowed to view contents with restricted access"
 msgstr ""
 "Les invités sont autorisés à consulter des contenus dont l'accès a été "
 "restreint"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:213
+#: src/pyams_content/shared/common/interfaces/__init__.py:212
 msgid "Principal ID"
 msgstr "ID utilisateur"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:253
+#: src/pyams_content/shared/common/interfaces/__init__.py:252
 msgid ""
 "If 'yes', this contributor will have to confirm that contents have been "
 "previewed and checked before asking for publication"
@@ -3075,7 +3069,7 @@
 "Si 'oui', ce contributeur devra confirmer qu'il a bien prévisualisé et "
 "audité chaque contenu avant de pouvoir effectuer une demande de publication"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:278
+#: src/pyams_content/shared/common/interfaces/__init__.py:277
 msgid ""
 "If 'yes', this manager will have to confirm that contents have been "
 "previewed and checked before publishing a content"
@@ -3083,11 +3077,11 @@
 "Si 'oui', ce responsable devra confirmer qu'il a bien prévisualisé et audité "
 "chaque contenu avant de pouvoir effectuer une publication"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:283
+#: src/pyams_content/shared/common/interfaces/__init__.py:282
 msgid "Restricted contents"
 msgstr "Accès restreints"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:284
+#: src/pyams_content/shared/common/interfaces/__init__.py:283
 msgid ""
 "If 'yes', this manager will get restricted access to manage contents based "
 "on selected settings"
@@ -3095,11 +3089,11 @@
 "Si 'oui', ce responsable n'aura qu'un accès restreint à certains contenus en "
 "fonction de paramètres spécifiques"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:289
+#: src/pyams_content/shared/common/interfaces/__init__.py:288
 msgid "Selected owners"
 msgstr "Propriétaires"
 
-#: src/pyams_content/shared/common/interfaces/__init__.py:290
+#: src/pyams_content/shared/common/interfaces/__init__.py:289
 msgid "Manager will have access to contents owned by these principals"
 msgstr ""
 "Le responsable n'aura accès qu'aux contenus dont ces utilisateurs sont "
@@ -3517,17 +3511,28 @@
 "Indique comment les références internes indiquées seront intégrées à la "
 "liste des résultats"
 
-#: src/pyams_content/shared/view/interfaces/__init__.py:171
+#: src/pyams_content/shared/view/interfaces/__init__.py:164
+msgid "Exclude context?"
+msgstr ""
+"Exclure le contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:165
+msgid "If 'yes', context will be excluded from results list"
+msgstr ""
+"Si 'oui', le contexte d'application de la vue sera automatiquement exclus de "
+"la liste des résultats"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:176
 msgid "Select context themes?"
 msgstr "Thèmes du contexte ?"
 
-#: src/pyams_content/shared/view/interfaces/__init__.py:172
+#: src/pyams_content/shared/view/interfaces/__init__.py:177
 msgid "If 'yes', themes will be extracted from context"
 msgstr ""
 "Si 'oui', les thèmes associés au contexte d'application de la vue seront "
 "automatiquement sélectionnés"
 
-#: src/pyams_content/shared/view/interfaces/__init__.py:176
+#: src/pyams_content/shared/view/interfaces/__init__.py:181
 msgid "Other terms"
 msgstr "Autres thèmes"
 
@@ -4389,6 +4394,18 @@
 msgid "Create new content"
 msgstr "Créer un nouveau contenu"
 
+#: src/pyams_content/portlet/content/__init__.py:42
+msgid "Context content"
+msgstr "Contenu partagé"
+
+#: src/pyams_content/portlet/content/zmi/preview.pt:3
+msgid "This is where the content will be displayed!!"
+msgstr "C'est ici que seront affichés les éléments du contenu."
+
+#: src/pyams_content/portlet/content/skin/__init__.py:36
+msgid "Default content renderer"
+msgstr "Par défaut"
+
 #: src/pyams_content/interfaces/__init__.py:95
 msgid "Unique key"
 msgstr "Clé unique"
@@ -4457,6 +4474,10 @@
 msgid "Display pictogram properties"
 msgstr "Propriétés du pictogramme"
 
+#: src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
+msgid "Default header: ${header}"
+msgstr "En-tête par défaut : ${header}"
+
 #: src/pyams_content/reference/pictograms/interfaces/__init__.py:45
 msgid "Pictogram content"
 msgstr "Utilisez le bouton \"Parcourir\" pour modifier le contenu de l'image"
@@ -4665,17 +4686,17 @@
 msgid "Presentation template used for this footer"
 msgstr "Mode de rendu utilisé par ce pied de page"
 
-#: src/pyams_content/features/review/__init__.py:180
+#: src/pyams_content/features/review/__init__.py:181
 #, python-format
 msgid "Request comment: {comment}"
 msgstr "Commentaire joint : {comment}"
 
-#: src/pyams_content/features/review/__init__.py:210
+#: src/pyams_content/features/review/__init__.py:211
 #, python-format
 msgid "A new comment was added on content « {0} »"
 msgstr "Un nouveau commentaire a été ajouté pour le contenu « {0} »"
 
-#: src/pyams_content/features/review/__init__.py:167
+#: src/pyams_content/features/review/__init__.py:168
 #, python-format
 msgid "[{service_name}] A content review is requested"
 msgstr "[{service_name}] Demande de relecture"
@@ -4984,9 +5005,6 @@
 #~ "Ce formulaire vous permet d'effectuer la sélection des pictogrammes qui "
 #~ "seront disponibles pour être intégrés dans les contenus partagés."
 
-#~ msgid "Default gallery renderer"
-#~ msgstr "Galerie par défaut"
-
 #~ msgid "Add medias gallery..."
 #~ msgstr "Galerie de médias"
 
--- a/src/pyams_content/locales/pyams_content.pot	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/locales/pyams_content.pot	Mon Jun 11 16:14:41 2018 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-06-08 17:54+0200\n"
+"POT-Creation-Date: 2018-06-11 14:34+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"
@@ -213,7 +213,7 @@
 #: ./src/pyams_content/component/paragraph/interfaces/audio.py:44
 #: ./src/pyams_content/component/links/interfaces/__init__.py:37
 #: ./src/pyams_content/component/video/interfaces/__init__.py:48
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:145
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:144
 #: ./src/pyams_content/shared/form/interfaces/__init__.py:65
 msgid "Description"
 msgstr ""
@@ -275,7 +275,7 @@
 #: ./src/pyams_content/shared/site/zmi/folder.py:68
 #: ./src/pyams_content/root/zmi/templates/advanced-search.pt:188
 #: ./src/pyams_content/interfaces/__init__.py:99
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:152
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:153
 msgid "Title"
 msgstr ""
 
@@ -596,18 +596,18 @@
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/zmi/__init__.py:212
-#: ./src/pyams_content/shared/common/zmi/workflow.py:125
-#: ./src/pyams_content/shared/common/zmi/workflow.py:212
-#: ./src/pyams_content/shared/common/zmi/workflow.py:252
-#: ./src/pyams_content/shared/common/zmi/workflow.py:306
-#: ./src/pyams_content/shared/common/zmi/workflow.py:395
-#: ./src/pyams_content/shared/common/zmi/workflow.py:451
-#: ./src/pyams_content/shared/common/zmi/workflow.py:491
-#: ./src/pyams_content/shared/common/zmi/workflow.py:532
-#: ./src/pyams_content/shared/common/zmi/workflow.py:575
-#: ./src/pyams_content/shared/common/zmi/workflow.py:615
-#: ./src/pyams_content/shared/common/zmi/workflow.py:656
-#: ./src/pyams_content/shared/common/zmi/workflow.py:707
+#: ./src/pyams_content/shared/common/zmi/workflow.py:122
+#: ./src/pyams_content/shared/common/zmi/workflow.py:209
+#: ./src/pyams_content/shared/common/zmi/workflow.py:249
+#: ./src/pyams_content/shared/common/zmi/workflow.py:303
+#: ./src/pyams_content/shared/common/zmi/workflow.py:392
+#: ./src/pyams_content/shared/common/zmi/workflow.py:448
+#: ./src/pyams_content/shared/common/zmi/workflow.py:488
+#: ./src/pyams_content/shared/common/zmi/workflow.py:529
+#: ./src/pyams_content/shared/common/zmi/workflow.py:572
+#: ./src/pyams_content/shared/common/zmi/workflow.py:612
+#: ./src/pyams_content/shared/common/zmi/workflow.py:653
+#: ./src/pyams_content/shared/common/zmi/workflow.py:704
 #: ./src/pyams_content/shared/common/zmi/__init__.py:275
 #: ./src/pyams_content/shared/common/zmi/owner.py:73
 #: ./src/pyams_content/features/review/zmi/__init__.py:90
@@ -673,70 +673,64 @@
 msgid "Check allowed paragraph types to be able to create new paragraphs."
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:83
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:84
 msgid "Pictograms..."
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:96
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:97
 msgid "Add new pictogram paragraph"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:123
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:124
 msgid "Edit pictogram paragraph properties"
 msgstr ""
 
 #. Default: Header
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:253
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:254
 msgid "pictogram-item-header"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:268
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:269
 #: ./src/pyams_content/component/paragraph/zmi/keynumber.py:260
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:58
 #: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:58
 msgid "Associated text"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:290
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:291
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:80
 msgid "Pictograms"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:305
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:61
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:306
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:62
 msgid "Add pictogram"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:318
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:73
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:319
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:74
 msgid "Add new pictogram"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:374
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:97
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:375
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:98
 msgid "Edit pictogram properties"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:354
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:355
 msgid "Pictogram was correctly added"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:364
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:365
 #: ./src/pyams_content/component/paragraph/zmi/pictogram.py:422
 msgid "You must select a pictogram!"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:333
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:173
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:334
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:174
 msgid "Default header: --"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:394
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:177
-#, python-format
-msgid "Default header: {0}"
-msgstr ""
-
 #: ./src/pyams_content/component/paragraph/zmi/audio.py:54
 msgid "Audio paragraph..."
 msgstr ""
@@ -1796,54 +1790,54 @@
 msgid "Click to see subtypes"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:847
+#: ./src/pyams_content/shared/common/zmi/workflow.py:844
 msgid "Prior checks"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:126
+#: ./src/pyams_content/shared/common/zmi/workflow.py:123
 msgid "Request publication"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:213
+#: ./src/pyams_content/shared/common/zmi/workflow.py:210
 #: ./src/pyams_content/workflow/__init__.py:315
 msgid "Cancel publication request"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:253
+#: ./src/pyams_content/shared/common/zmi/workflow.py:250
 msgid "Refuse publication request"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:307
+#: ./src/pyams_content/shared/common/zmi/workflow.py:304
 #: ./src/pyams_content/workflow/basic.py:196
 msgid "Publish"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:396
+#: ./src/pyams_content/shared/common/zmi/workflow.py:393
 msgid "Request retire"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:452
+#: ./src/pyams_content/shared/common/zmi/workflow.py:449
 msgid "Cancel retire request"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:492
+#: ./src/pyams_content/shared/common/zmi/workflow.py:489
 msgid "Retire"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:533
+#: ./src/pyams_content/shared/common/zmi/workflow.py:530
 #: ./src/pyams_content/workflow/__init__.py:436
 msgid "Request archive"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:576
+#: ./src/pyams_content/shared/common/zmi/workflow.py:573
 msgid "Cancel archive request"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:616
+#: ./src/pyams_content/shared/common/zmi/workflow.py:613
 msgid "Archive"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:657
+#: ./src/pyams_content/shared/common/zmi/workflow.py:654
 #: ./src/pyams_content/workflow/__init__.py:501
 #: ./src/pyams_content/workflow/__init__.py:513
 #: ./src/pyams_content/workflow/__init__.py:525
@@ -1854,50 +1848,50 @@
 msgid "Create new version"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:708
+#: ./src/pyams_content/shared/common/zmi/workflow.py:705
 #: ./src/pyams_content/workflow/__init__.py:561
 #: ./src/pyams_content/workflow/basic.py:248
 msgid "Delete version"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:793
+#: ./src/pyams_content/shared/common/zmi/workflow.py:790
 msgid "Previewed content?"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:797
+#: ./src/pyams_content/shared/common/zmi/workflow.py:794
 msgid "Verified content?"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:183
-#: ./src/pyams_content/shared/common/zmi/workflow.py:365
+#: ./src/pyams_content/shared/common/zmi/workflow.py:180
+#: ./src/pyams_content/shared/common/zmi/workflow.py:362
 msgid "Publication start date is required"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:276
-#: ./src/pyams_content/shared/common/zmi/workflow.py:422
+#: ./src/pyams_content/shared/common/zmi/workflow.py:273
+#: ./src/pyams_content/shared/common/zmi/workflow.py:419
 msgid "A comment is required"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:732
+#: ./src/pyams_content/shared/common/zmi/workflow.py:729
 msgid "Delete content"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:741
+#: ./src/pyams_content/shared/common/zmi/workflow.py:738
 msgid "Delete definitively"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:863
+#: ./src/pyams_content/shared/common/zmi/workflow.py:860
 msgid ""
 "You must confirm that you previewed and checked this content before "
 "requesting publication!!"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:90
+#: ./src/pyams_content/shared/common/zmi/workflow.py:87
 #, python-format
 msgid "{state} | by {principal}"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/zmi/workflow.py:86
+#: ./src/pyams_content/shared/common/zmi/workflow.py:83
 #: ./src/pyams_content/workflow/__init__.py:648
 #: ./src/pyams_content/workflow/__init__.py:619
 #: ./src/pyams_content/workflow/basic.py:315
@@ -2344,8 +2338,8 @@
 
 #: ./src/pyams_content/shared/common/zmi/security.py:118
 #: ./src/pyams_content/shared/common/zmi/security.py:270
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:252
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:277
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:251
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:276
 msgid "Publication checks"
 msgstr ""
 
@@ -2722,199 +2716,199 @@
 msgid "List of fields associated with this data type"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:46
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:45
 #: ./src/pyams_content/root/interfaces/__init__.py:40
 msgid "Webmasters"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:47
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:46
 msgid "Webmasters can handle all contents, including published ones"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:50
+msgid "Pilots"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:51
-msgid "Pilots"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:52
 msgid ""
 "Pilots can handle tool configuration, manage access rules, grant users roles "
 "and manage managers restrictions"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:56
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:173
+msgid "Managers"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:57
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:174
-msgid "Managers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:58
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:175
 msgid ""
 "Managers can handle main operations in tool's workflow, like publish or "
 "retire contents"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:62
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:179
+msgid "Contributors"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:63
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:180
-msgid "Contributors"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:64
 msgid "Contributors are users which are allowed to create new contents"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:89
+msgid "Workflow name"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:90
-msgid "Workflow name"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:91
 msgid "Name of workflow utility used to manage tool contents"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:114
+msgid "Content URL"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:115
-msgid "Content URL"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:116
 msgid ""
 "URL used to access this content; this is important for SEO and should include"
 " most important words describing content; spaces and underscores will be "
 "automatically replaced by hyphens"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:121
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:120
 msgid "Version creator"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:122
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:121
 msgid ""
 "Name of content's version creator. The creator of the first version is also "
 "it's owner."
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:125
+msgid "First owner"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:126
-msgid "First owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:127
 msgid "Name of content's first version owner"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:131
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:130
 msgid "Version creation"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:133
+msgid "Version modifiers"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:134
-msgid "Version modifiers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:135
 msgid "List of principals who modified this content"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:137
+msgid "Last modifier"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:138
-msgid "Last modifier"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:139
 msgid "Last principal who modified this content"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:142
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:141
 msgid "Last update"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:146
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:145
 msgid ""
 "The content's description is 'hidden' into HTML's page headers; but it can be"
 " seen, for example, in some search engines results as content's description"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:151
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:150
 msgid "Keywords"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:152
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:151
 msgid "They will be included into HTML pages metadata"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:154
+#: ./src/pyams_content/shared/site/zmi/folder.py:76
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:66
+msgid "Notepad"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:155
-#: ./src/pyams_content/shared/site/zmi/folder.py:76
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:66
-msgid "Notepad"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:156
 #: ./src/pyams_content/shared/site/zmi/folder.py:77
 #: ./src/pyams_content/shared/site/interfaces/__init__.py:67
 msgid "Internal information to be known about this content"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:167
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:166
 msgid "Content owner"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:168
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:167
 msgid ""
 "The owner is the creator of content's first version, except if it was "
 "transferred afterwards to another owner"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:181
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:180
 msgid ""
 "Contributors are users which are allowed to update this content in addition "
 "to it's owner"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:185
+msgid "Readers"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:186
-msgid "Readers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:187
 msgid ""
 "Readers are users which are asked to verify and comment contents before they "
 "are published"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:191
+msgid "Guests"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:192
-msgid "Guests"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:193
 msgid ""
 "Guests are users which are allowed to view contents with restricted access"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:213
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:212
 msgid "Principal ID"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:253
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:252
 msgid ""
 "If 'yes', this contributor will have to confirm that contents have been "
 "previewed and checked before asking for publication"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:278
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:277
 msgid ""
 "If 'yes', this manager will have to confirm that contents have been previewed"
 " and checked before publishing a content"
 msgstr ""
 
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:282
+msgid "Restricted contents"
+msgstr ""
+
 #: ./src/pyams_content/shared/common/interfaces/__init__.py:283
-msgid "Restricted contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:284
 msgid ""
 "If 'yes', this manager will get restricted access to manage contents based on"
 " selected settings"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:289
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:288
 msgid "Selected owners"
 msgstr ""
 
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:290
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:289
 msgid "Manager will have access to contents owned by these principals"
 msgstr ""
 
@@ -3308,15 +3302,23 @@
 msgid "Specify how selected references are included into view results"
 msgstr ""
 
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:171
-msgid "Select context themes?"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:172
-msgid "If 'yes', themes will be extracted from context"
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:164
+msgid "Exclude context?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:165
+msgid "If 'yes', context will be excluded from results list"
 msgstr ""
 
 #: ./src/pyams_content/shared/view/interfaces/__init__.py:176
+msgid "Select context themes?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:177
+msgid "If 'yes', themes will be extracted from context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:181
 msgid "Other terms"
 msgstr ""
 
@@ -4163,6 +4165,18 @@
 msgid "Create new content"
 msgstr ""
 
+#: ./src/pyams_content/portlet/content/__init__.py:42
+msgid "Context content"
+msgstr ""
+
+#: ./src/pyams_content/portlet/content/zmi/preview.pt:3
+msgid "This is where the content will be displayed!!"
+msgstr ""
+
+#: ./src/pyams_content/portlet/content/skin/__init__.py:36
+msgid "Default content renderer"
+msgstr ""
+
 #: ./src/pyams_content/interfaces/__init__.py:95
 msgid "Unique key"
 msgstr ""
@@ -4231,6 +4245,10 @@
 msgid "Display pictogram properties"
 msgstr ""
 
+#: ./src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
+msgid "Default header: ${header}"
+msgstr ""
+
 #: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:45
 msgid "Pictogram content"
 msgstr ""
@@ -4429,17 +4447,17 @@
 msgid "Presentation template used for this footer"
 msgstr ""
 
-#: ./src/pyams_content/features/review/__init__.py:180
+#: ./src/pyams_content/features/review/__init__.py:181
 #, python-format
 msgid "Request comment: {comment}"
 msgstr ""
 
-#: ./src/pyams_content/features/review/__init__.py:210
+#: ./src/pyams_content/features/review/__init__.py:211
 #, python-format
 msgid "A new comment was added on content « {0} »"
 msgstr ""
 
-#: ./src/pyams_content/features/review/__init__.py:167
+#: ./src/pyams_content/features/review/__init__.py:168
 #, python-format
 msgid "[{service_name}] A content review is requested"
 msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,19 @@
+#
+# 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
+
+# import packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/content/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,44 @@
+#
+# 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.portlet.content.interfaces import ISharedContentPortletSettings
+from pyams_utils.interfaces import VIEW_PERMISSION
+
+# import packages
+from pyams_portal.portlet import PortletSettings, portlet_config, Portlet
+from zope.interface import implementer
+
+from pyams_content import _
+
+
+SHARED_CONTENT_PORTLET_NAME = 'pyams_content.portlet.content'
+
+
+@implementer(ISharedContentPortletSettings)
+class SharedContentPortletSettings(PortletSettings):
+    """Shared content portlet persistent settings"""
+
+
+@portlet_config(permission=VIEW_PERMISSION)
+class SharedContentPortlet(Portlet):
+    """Shared content portlet"""
+
+    name = SHARED_CONTENT_PORTLET_NAME
+    label = _("Context content")
+
+    settings_class = SharedContentPortletSettings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/content/interfaces.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,24 @@
+#
+# 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
+
+# import packages
+from pyams_portal.interfaces import IPortletSettings
+
+
+class ISharedContentPortletSettings(IPortletSettings):
+    """Shared content portlet settings interface"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/content/skin/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,54 @@
+#
+# 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.portlet.content.interfaces import ISharedContentPortletSettings
+from pyams_portal.interfaces import IPortalContext, IPortletRenderer
+from pyams_skin.layer import IPyAMSLayer
+
+# import packages
+from pyams_content.features.renderer import IContentRenderer
+from pyams_portal.portlet import PortletRenderer
+from pyams_utils.adapter import adapter_config
+from zope.interface import Interface
+
+from pyams_content import _
+
+
+@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, ISharedContentPortletSettings),
+                provides=IPortletRenderer)
+class SharedContentPortletRenderer(PortletRenderer):
+    """Shared content portlet renderer"""
+
+    label = _("Default content renderer")
+
+    def __init__(self, context, request, view, settings):
+        super(SharedContentPortletRenderer, self).__init__(context, request, view, settings)
+        registry = self.request.registry
+        self.renderers = [adapter for name, adapter in sorted(registry.getAdapters((self.context, self.request),
+                                                                                   IContentRenderer),
+                                                              key=lambda x: x[1].weight)]
+
+    def update(self):
+        super(SharedContentPortletRenderer, self).update()
+        [renderer.update() for renderer in self.renderers]
+
+    def render(self):
+        result = ''
+        for renderer in self.renderers:
+            if renderer is not None:
+                result += renderer.render()
+        return result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/content/zmi/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,52 @@
+#
+# 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.portlet.content.interfaces import ISharedContentPortletSettings
+from pyams_pagelet.interfaces import IPagelet
+from pyams_portal.interfaces import IPortletPreviewer
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
+
+# import packages
+from pyams_form.form import AJAXEditForm
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_portal.portlet import PortletPreviewer
+from pyams_portal.zmi.portlet import PortletSettingsEditor
+from pyams_template.template import template_config
+from pyams_utils.adapter import adapter_config
+from zope.interface import Interface
+
+
+@pagelet_config(name='properties.html', context=ISharedContentPortletSettings, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+class SharedContentPortletSettingsEditor(PortletSettingsEditor):
+    """Shared content portlet settings editor"""
+
+    settings = ISharedContentPortletSettings
+
+
+@adapter_config(name='properties.json', context=(ISharedContentPortletSettings, IPyAMSLayer), provides=IPagelet)
+class SharedContentPortletConfigurationAJAXEditor(AJAXEditForm, SharedContentPortletSettingsEditor):
+    """Shared content portlet settings editor, JSON renderer"""
+
+
+@adapter_config(context=(Interface, IPyAMSLayer, Interface, ISharedContentPortletSettings),
+                provides=IPortletPreviewer)
+@template_config(template='preview.pt', layer=IPyAMSLayer)
+class SharedContentPortletPreviewer(PortletPreviewer):
+    """Shared content portlet previewer"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/portlet/content/zmi/preview.pt	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,13 @@
+<tal:var define="settings view.settings" i18n:domain="pyams_content">
+	<tal:if condition="settings.visible">
+		<span class="padding-5" i18n:translate="">This is where the content will be displayed!!</span>
+	</tal:if>
+	<tal:if condition="not settings.visible">
+		<div class="text-center padding-y-5">
+			<span class="fa-stack fa-lg">
+				<i class="fa fa-eye fa-stack-1x"></i>
+				<i class="fa fa-ban fa-stack-2x text-danger"></i>
+			</span>
+		</div>
+	</tal:if>
+</tal:var>
--- a/src/pyams_content/reference/pictograms/zmi/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -44,6 +44,7 @@
 from pyams_viewlet.viewlet import viewlet_config
 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
 from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest
+from pyramid.renderers import render, render_to_response
 from pyramid.response import Response
 from pyramid.view import view_config
 from z3c.form import field
@@ -163,8 +164,8 @@
 
 @view_config(name='get-pictogram-header.html', context=IPictogramTable, request_type=IPyAMSLayer,
              permission=VIEW_SYSTEM_PERMISSION)
-def get_pictogram_label(request):
-    """Get alternate label associated with a given pictogram"""
+def get_pictogram_header_view(request):
+    """View used to get thumbnail and alternate label associated with a given pictogram"""
     name = request.params.get('value')
     if not name:
         raise HTTPBadRequest()
@@ -174,5 +175,13 @@
     pictogram = request.context.get(name)
     if pictogram is None:
         raise HTTPNotFound()
-    return Response(translate(_("Default header: {0}")).format(
-        II18n(pictogram).query_attribute('header', request=request) or '--'))
+    return render_to_response('templates/pictogram-header.pt', {
+        'context': pictogram
+    }, request=request)
+
+
+def get_pictogram_header(pictogram, request=None):
+    """Get thumbnail and alternate label associated with a given pictogram"""
+    return render('templates/pictogram-header.pt', {
+        'context': pictogram
+    }, request=request)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,9 @@
+<div i18n:domain="pyams_content">
+	<img class="padding-5"
+		 tal:define="image i18n:context.image"
+		 tal:attributes="src extension:absolute_url(image, '++thumb++32x32')" />
+	<span tal:define="header i18n:context.header"
+		  i18n:translate="">Default header:
+		<strong i18n:name="header" tal:content="header or '--'" />
+	</span>
+</div>
--- a/src/pyams_content/shared/blog/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/blog/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -23,16 +23,18 @@
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.blog.interfaces import IWfBlogPost, BLOG_CONTENT_TYPE, BLOG_CONTENT_NAME, IBlogPost, \
     IWfBlogPostFactory
+from pyams_portal.interfaces import IPortalContext, IPortalPage, PORTAL_PAGE_KEY
 from pyams_workflow.interfaces import IWorkflow, IWorkflowVersions, IWorkflowState
 
 # import packages
 from pyams_content.shared.common import WfSharedContent, register_content_type, SharedContent, IWfSharedContentFactory
-from pyams_utils.adapter import adapter_config
+from pyams_content.shared.common.portal import SharedContentPortalPage
+from pyams_utils.adapter import adapter_config, get_annotation_adapter
 from zope.interface import implementer, provider
 
 
-@implementer(IWfBlogPost, IParagraphContainerTarget, IThemesTarget,
-             IIllustrationTarget, IPreviewTarget, IReviewTarget)
+@implementer(IWfBlogPost, IParagraphContainerTarget, IThemesTarget, IIllustrationTarget,
+             IPortalContext, IPreviewTarget, IReviewTarget)
 class WfBlogPost(WfSharedContent):
     """Base blog post"""
 
@@ -58,3 +60,9 @@
 @adapter_config(context=IWfBlogPostFactory, provides=IWfSharedContentFactory)
 def blog_post_content_factory(context):
     return WfBlogPost
+
+
+@adapter_config(context=IWfBlogPost, provides=IPortalPage)
+def blog_post_portal_page_adapter(context):
+    """Blog post portal page adapter"""
+    return get_annotation_adapter(context, PORTAL_PAGE_KEY, SharedContentPortalPage)
--- a/src/pyams_content/shared/blog/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/blog/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -27,7 +27,6 @@
 from pyams_content.shared.blog.interfaces import IBlogManager, IBlogFolder, IBlogFolderFactory, IBlogManagerFactory
 from pyams_content.shared.common.interfaces import ISharedContentFactory
 from pyams_portal.interfaces import IPortalContext
-from zope.annotation.interfaces import IAttributeAnnotatable
 from zope.component.interfaces import ISite
 from zope.lifecycleevent.interfaces import IObjectAddedEvent, IObjectRemovedEvent
 
@@ -55,7 +54,7 @@
 
 
 @implementer(IBlogManager, IParagraphFactorySettings, IThemesManagerTarget, IPictogramManagerTarget,
-             IIllustrationTarget, IPortalContext, IHeaderTarget, IFooterTarget, IPreviewTarget, IAttributeAnnotatable)
+             IIllustrationTarget, IHeaderTarget, IFooterTarget, IPortalContext, IPreviewTarget)
 class BlogManager(Folder, BaseSharedTool, UserSkinnableContent):
     """Nlog manager class"""
 
--- a/src/pyams_content/shared/blog/zmi/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/blog/zmi/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -186,6 +186,6 @@
     def updateWidgets(self, prefix=None):
         super(BlogManagerWorkflowPublicationEditForm, self).updateWidgets(prefix)
         if 'publication_effective_date' in self.widgets:
-            widget = self.widgets['publication_effective_date']
-            if not widget.value:
-                widget.value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')
+            pub_info = IWorkflowPublicationInfo(self.context)
+            if pub_info.publication_effective_date is None:
+                self.widgets['publication_effective_date'].value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')
--- a/src/pyams_content/shared/common/interfaces/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/common/interfaces/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -18,7 +18,6 @@
 # import interfaces
 from pyams_content.interfaces import IBaseContent, MANAGE_CONTENT_PERMISSION, OWNER_ROLE, MANAGER_ROLE, \
     READER_ROLE, GUEST_ROLE, WEBMASTER_ROLE, PILOT_ROLE, CONTRIBUTOR_ROLE
-from pyams_content.root.interfaces import ISiteRoot
 from pyams_workflow.interfaces import IWorkflowManagedContent
 from zope.container.interfaces import IContainer
 
@@ -69,13 +68,13 @@
 class ISharedSite(IBaseContent, IDeletableElement):
     """Shared site interface"""
 
-    containers(ISiteRoot)
+    containers('pyams_content.root.interfaces.ISiteRoot')
 
 
 class ISharedToolContainer(IBaseContent, IContainer):
     """Shared tools container"""
 
-    containers(ISiteRoot)
+    containers('pyams_content.root.interfaces.ISiteRoot')
     contains('.ISharedTool')
 
 
--- a/src/pyams_content/shared/common/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/common/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -42,7 +42,7 @@
     short_name = FieldProperty(ISharedToolContainer['short_name'])
 
 
-@implementer(IDefaultProtectionPolicy, IBaseSharedTool, ISharedToolRoles, IAttributeAnnotatable)
+@implementer(IDefaultProtectionPolicy, IBaseSharedTool, ISharedToolRoles)
 class BaseSharedTool(ProtectedObject, I18nManagerMixin):
     """Base shared tool class"""
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/common/portal.py	Mon Jun 11 16:14:41 2018 +0200
@@ -0,0 +1,36 @@
+#
+# 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.shared.common.interfaces import IBaseSharedTool
+from pyams_portal.interfaces import IPortalPage
+
+# import packages
+from pyams_portal.page import PortalPage
+from pyams_utils.traversing import get_parent
+
+
+class SharedContentPortalPage(PortalPage):
+    """Shared content portal page"""
+
+    @property
+    def can_inherit(self):
+        return IPortalPage(self.parent).template is not None
+
+    @property
+    def parent(self):
+        return get_parent(self, IBaseSharedTool, allow_context=False)
--- a/src/pyams_content/shared/common/zmi/workflow.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/workflow.py	Mon Jun 11 16:14:41 2018 +0200
@@ -9,12 +9,6 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
-from z3c.form.browser.radio import RadioWidget
-from z3c.form.widget import FieldWidget
-
-from pyams_form.group import NamedWidgetsGroup
-from pyams_form.interfaces import IFormLayer
-from pyams_form.widget import widgettemplate_config
 
 __docformat__ = 'restructuredtext'
 
@@ -26,6 +20,7 @@
 from pyams_content.interfaces import PUBLISH_CONTENT_PERMISSION, CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION
 from pyams_content.shared.common.interfaces import IWfSharedContent, IBaseSharedTool, ISharedContent, \
     IContributorRestrictions, IManagerRestrictions
+from pyams_form.interfaces import IFormLayer
 from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager, IFormSuffixViewletsManager, IInnerSubForm
 from pyams_security.interfaces import ISecurityManager
 from pyams_skin.layer import IPyAMSLayer
@@ -38,6 +33,7 @@
 from pyams_content.workflow import DRAFT, DELETED
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_form.schema import CloseButton
+from pyams_form.widget import widgettemplate_config
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_template.template import template_config
 from pyams_utils.adapter import adapter_config
@@ -51,8 +47,9 @@
 from pyams_workflow.zmi.transition import WorkflowContentTransitionForm, WorkflowContentTransitionAJAXForm
 from pyams_zmi.form import InnerAdminAddForm
 from pyramid.events import subscriber
-from pyramid.view import view_config
 from z3c.form import field, button
+from z3c.form.browser.radio import RadioWidget
+from z3c.form.widget import FieldWidget
 from zope.interface import Interface, Invalid
 from zope.schema import Bool
 
--- a/src/pyams_content/shared/form/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/form/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -21,11 +21,13 @@
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.form.interfaces import IWfForm, IForm, FORM_CONTENT_TYPE, FORM_CONTENT_NAME, \
     IFormFieldContainerTarget, IFormHandler, IFormFieldContainer, IWfFormFactory
+from pyams_portal.interfaces import IPortalPage, PORTAL_PAGE_KEY, IPortalContext
 
 # import packages
 from pyams_content.shared.common import WfSharedContent, SharedContent, register_content_type, WfSharedContentChecker, \
     IWfSharedContentFactory
-from pyams_utils.adapter import adapter_config
+from pyams_content.shared.common.portal import SharedContentPortalPage
+from pyams_utils.adapter import adapter_config, get_annotation_adapter
 from pyams_utils.registry import get_global_registry
 from zope.interface import implementer, provider, alsoProvides, noLongerProvides
 from zope.schema.fieldproperty import FieldProperty
@@ -34,7 +36,7 @@
 
 
 @implementer(IWfForm, IFormFieldContainerTarget,
-             IPreviewTarget, IReviewTarget)
+             IPortalContext, IPreviewTarget, IReviewTarget)
 class WfForm(WfSharedContent):
     """Base form"""
 
@@ -88,6 +90,12 @@
     return WfForm
 
 
+@adapter_config(context=IWfForm, provides=IPortalPage)
+def form_portal_page_adapter(context):
+    """Form portal page adapter"""
+    return get_annotation_adapter(context, PORTAL_PAGE_KEY, SharedContentPortalPage)
+
+
 @adapter_config(name='properties', context=IWfForm, provides=IContentChecker)
 class WfFormContentChecker(WfSharedContentChecker):
     """Form content checker"""
--- a/src/pyams_content/shared/form/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/form/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -18,7 +18,7 @@
 # import interfaces
 from pyams_content.shared.common.interfaces import ISharedContentFactory
 from pyams_content.shared.form.interfaces import IFormsManager, FORM_CONTENT_TYPE, IFormsManagerFactory
-from zope.annotation.interfaces import IAttributeAnnotatable
+from pyams_portal.interfaces import IPortalContext
 from zope.component.interfaces import ISite
 from zope.lifecycleevent.interfaces import IObjectAddedEvent
 
@@ -32,7 +32,7 @@
 from zope.interface import implementer
 
 
-@implementer(IFormsManager, IAttributeAnnotatable)
+@implementer(IFormsManager, IPortalContext)
 class FormsManager(SharedTool):
     """Forms manager class"""
 
--- a/src/pyams_content/shared/news/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/news/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -23,15 +23,17 @@
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.news.interfaces import INewsEvent, IWfNewsEvent, NEWS_CONTENT_TYPE, NEWS_CONTENT_NAME, \
     IWfNewsEventFactory
+from pyams_portal.interfaces import IPortalContext, IPortalPage, PORTAL_PAGE_KEY
 
 # import packages
 from pyams_content.shared.common import SharedContent, WfSharedContent, register_content_type, IWfSharedContentFactory
-from pyams_utils.adapter import adapter_config
+from pyams_content.shared.common.portal import SharedContentPortalPage
+from pyams_utils.adapter import adapter_config, get_annotation_adapter
 from zope.interface import implementer, provider
 
 
 @implementer(IWfNewsEvent, IIllustrationTarget, IParagraphContainerTarget, IThemesTarget,
-             IPreviewTarget, IReviewTarget)
+             IPortalContext, IPreviewTarget, IReviewTarget)
 class WfNewsEvent(WfSharedContent):
     """Base news event"""
 
@@ -50,3 +52,9 @@
 @adapter_config(context=IWfNewsEventFactory, provides=IWfSharedContentFactory)
 def news_event_content_factory(context):
     return WfNewsEvent
+
+
+@adapter_config(context=IWfNewsEvent, provides=IPortalPage)
+def news_event_portal_page_adapter(context):
+    """News event portal page adapter"""
+    return get_annotation_adapter(context, PORTAL_PAGE_KEY, SharedContentPortalPage)
--- a/src/pyams_content/shared/news/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/news/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -21,6 +21,7 @@
 from pyams_content.reference.pictograms.interfaces import IPictogramManagerTarget
 from pyams_content.shared.common.interfaces import ISharedContentFactory
 from pyams_content.shared.news.interfaces import INewsManager, NEWS_CONTENT_TYPE, INewsManagerFactory
+from pyams_portal.interfaces import IPortalContext
 from zope.component.interfaces import ISite
 from zope.lifecycleevent.interfaces import IObjectAddedEvent
 
@@ -35,7 +36,8 @@
 from zope.schema.fieldproperty import FieldProperty
 
 
-@implementer(INewsManager, IParagraphFactorySettings, IThemesManagerTarget, IPictogramManagerTarget)
+@implementer(INewsManager, IParagraphFactorySettings, IThemesManagerTarget, IPictogramManagerTarget,
+             IPortalContext)
 class NewsManager(SharedTool):
     """News manager class"""
 
--- a/src/pyams_content/shared/site/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/site/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -23,16 +23,18 @@
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.site.interfaces import ITopic, IWfTopic, TOPIC_CONTENT_NAME, \
     TOPIC_CONTENT_TYPE, IWfTopicFactory
+from pyams_portal.interfaces import IPortalContext, IPortalPage, PORTAL_PAGE_KEY
 from pyams_workflow.interfaces import IWorkflow, IWorkflowVersions, IWorkflowState
 
 # import packages
 from pyams_content.shared.common import SharedContent, WfSharedContent, register_content_type, IWfSharedContentFactory
-from pyams_utils.adapter import adapter_config
+from pyams_content.shared.common.portal import SharedContentPortalPage
+from pyams_utils.adapter import adapter_config, get_annotation_adapter
 from zope.interface import implementer, provider
 
 
-@implementer(IWfTopic, IParagraphContainerTarget, IThemesTarget,
-             IIllustrationTarget, IPreviewTarget, IReviewTarget)
+@implementer(IWfTopic, IParagraphContainerTarget, IThemesTarget, IIllustrationTarget,
+             IPortalContext, IPreviewTarget, IReviewTarget)
 class WfTopic(WfSharedContent):
     """Base topic"""
 
@@ -60,3 +62,9 @@
 @adapter_config(context=IWfTopicFactory, provides=IWfSharedContentFactory)
 def topic_content_factory(context):
     return WfTopic
+
+
+@adapter_config(context=IWfTopic, provides=IPortalPage)
+def topic_portal_page_adapter(context):
+    """Topic portal page adapter"""
+    return get_annotation_adapter(context, PORTAL_PAGE_KEY, SharedContentPortalPage)
--- a/src/pyams_content/shared/site/folder.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/site/folder.py	Mon Jun 11 16:14:41 2018 +0200
@@ -24,7 +24,6 @@
 from pyams_i18n.interfaces import II18n
 from pyams_portal.interfaces import IPortalContext
 from pyams_security.interfaces import IDefaultProtectionPolicy
-from zope.annotation.interfaces import IAttributeAnnotatable
 from zope.intid.interfaces import IIntIds
 
 # import packages
@@ -45,7 +44,7 @@
 
 
 @implementer(IDefaultProtectionPolicy, ISiteFolder, ISiteFolderRoles,
-             IIllustrationTarget, IPortalContext, IPreviewTarget, IAttributeAnnotatable)
+             IIllustrationTarget, IPortalContext, IPreviewTarget)
 class SiteFolder(SiteContainerMixin, OrderedContainer, BaseSharedTool):
     """Site folder persistent class"""
 
--- a/src/pyams_content/shared/site/manager.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/site/manager.py	Mon Jun 11 16:14:41 2018 +0200
@@ -30,7 +30,6 @@
 from pyams_form.interfaces.form import IFormContextPermissionChecker
 from pyams_i18n.interfaces import II18n
 from pyams_portal.interfaces import IPortalContext
-from zope.annotation.interfaces import IAttributeAnnotatable
 from zope.component.interfaces import ISite
 from zope.lifecycleevent.interfaces import IObjectAddedEvent, IObjectRemovedEvent
 
@@ -53,7 +52,7 @@
 
 
 @implementer(ISiteManager, IParagraphFactorySettings, IThemesManagerTarget, IPictogramManagerTarget,
-             IIllustrationTarget, IPortalContext, IHeaderTarget, IFooterTarget, IPreviewTarget, IAttributeAnnotatable)
+             IIllustrationTarget, IPortalContext, IHeaderTarget, IFooterTarget, IPreviewTarget)
 class SiteManager(SiteContainerMixin, OrderedContainer, BaseSharedTool, UserSkinnableContent):
     """Site manager persistent class"""
 
--- a/src/pyams_content/shared/site/zmi/container.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/container.py	Mon Jun 11 16:14:41 2018 +0200
@@ -137,9 +137,9 @@
     def updateWidgets(self, prefix=None):
         super(SiteContainerWorkflowPublicationEditForm, self).updateWidgets(prefix)
         if 'publication_effective_date' in self.widgets:
-            widget = self.widgets['publication_effective_date']
-            if not widget.value:
-                widget.value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')
+            pub_info = IWorkflowPublicationInfo(self.context)
+            if pub_info.publication_effective_date is None:
+                self.widgets['publication_effective_date'].value = tztime(datetime.utcnow()).strftime('%d/%m/%y %H:%M')
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/shared/view/interfaces/__init__.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/view/interfaces/__init__.py	Mon Jun 11 16:14:41 2018 +0200
@@ -161,6 +161,11 @@
                              required=True,
                              default=ALWAYS_REFERENCE_MODE)
 
+    exclude_context = Bool(title=_("Exclude context?"),
+                           description=_("If 'yes', context will be excluded from results list"),
+                           required=True,
+                           default=True)
+
 
 VIEW_THEMES_SETTINGS_KEY = 'pyams_content.view.themes'
 
--- a/src/pyams_content/shared/view/reference.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/view/reference.py	Mon Jun 11 16:14:41 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_sequence.interfaces import ISequentialIdInfo
 
 __docformat__ = 'restructuredtext'
 
@@ -19,12 +20,12 @@
 # import interfaces
 from hypatia.interfaces import ICatalog
 from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewInternalReferencesSettings, \
-    IViewQueryFilterExtension, VIEW_REFERENCES_SETTINGS_KEY, ALWAYS_REFERENCE_MODE
+    IViewQueryParamsExtension, IViewQueryFilterExtension, VIEW_REFERENCES_SETTINGS_KEY, ALWAYS_REFERENCE_MODE
 
 # import packages
 from hypatia.catalog import CatalogQuery
-from hypatia.query import Any
-from pyams_catalog.query import CatalogResultSet
+from hypatia.query import Any, Not, NotEq
+from pyams_catalog.query import CatalogResultSet, and_
 from pyams_content.workflow import VISIBLE_STATES
 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter
 from pyams_utils.registry import get_utility
@@ -39,6 +40,7 @@
 
     references = FieldProperty(IViewInternalReferencesSettings['references'])
     references_mode = FieldProperty(IViewInternalReferencesSettings['references_mode'])
+    exclude_context = FieldProperty(IViewInternalReferencesSettings['exclude_context'])
 
     @property
     def is_using_context(self):
@@ -53,6 +55,23 @@
                                   name='++view:references++')
 
 
+@adapter_config(name='references', context=IWfView, provides=IViewQueryParamsExtension)
+class ViewThemesQueryParamsExtension(ContextAdapter):
+    """View internal references query params extension"""
+
+    weight = 50
+
+    def get_params(self, context):
+        catalog = get_utility(ICatalog)
+        settings = IViewInternalReferencesSettings(self.context)
+        params = None
+        # check themes
+        if settings.exclude_context:
+            oid = ISequentialIdInfo(context).hex_oid
+            params = and_(params, NotEq(catalog['oid'], oid))
+        return params
+
+
 @adapter_config(name='references', context=IWfView, provides=IViewQueryFilterExtension)
 class ViewInternalReferencesQueryFilterExtension(ContextAdapter):
     """View internal references filter extension"""
@@ -65,6 +84,7 @@
             return items
         if (not items) or (settings.references_mode == ALWAYS_REFERENCE_MODE):
             catalog = get_utility(ICatalog)
-            params = Any(catalog['oid'], settings.references) & Any(catalog['workflow_state'], VISIBLE_STATES)
+            params = Any(catalog['oid'], settings.references) & \
+                     Any(catalog['workflow_state'], VISIBLE_STATES)
             items.prepend(CatalogResultSet(CatalogQuery(catalog).query(params)))
         return items
--- a/src/pyams_content/shared/view/theme.py	Mon Jun 11 10:00:17 2018 +0200
+++ b/src/pyams_content/shared/view/theme.py	Mon Jun 11 16:14:41 2018 +0200
@@ -16,12 +16,18 @@
 # import standard library
 
 # import interfaces
+from hypatia.interfaces import ICatalog
 from pyams_content.component.theme.interfaces import IThemesInfo
-from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewThemesSettings, VIEW_THEMES_SETTINGS_KEY
+from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewThemesSettings, \
+    IViewQueryParamsExtension, VIEW_THEMES_SETTINGS_KEY
+from zope.intid.interfaces import IIntIds
 
 # import packages
+from hypatia.query import Any
 from persistent import Persistent
-from pyams_utils.adapter import adapter_config, get_annotation_adapter
+from pyams_catalog.query import and_
+from pyams_utils.adapter import adapter_config, get_annotation_adapter, ContextAdapter
+from pyams_utils.registry import get_utility
 from zope.container.contained import Contained
 from zope.interface import implementer
 from zope.schema.fieldproperty import FieldProperty
@@ -49,7 +55,8 @@
         return themes
 
     def get_themes_index(self, context):
-        return [theme.label for theme in self.get_themes(context)]
+        intids = get_utility(IIntIds)
+        return [intids.register(term) for term in self.get_themes(context)]
 
 
 @adapter_config(context=IWfView, provides=IViewThemesSettings)
@@ -58,3 +65,20 @@
     """View themes settings factory"""
     return get_annotation_adapter(view, VIEW_THEMES_SETTINGS_KEY, ViewThemesSettings,
                                   name='++view:themes++')
+
+
+@adapter_config(name='themes', context=IWfView, provides=IViewQueryParamsExtension)
+class ViewThemesQueryParamsExtension(ContextAdapter):
+    """View themes query params extension"""
+
+    weight = 50
+
+    def get_params(self, context):
+        catalog = get_utility(ICatalog)
+        settings = IViewThemesSettings(self.context)
+        params = None
+        # check themes
+        themes = settings.get_themes_index(context)
+        if themes:
+            params = and_(params, Any(catalog['themes'], themes))
+        return params