# HG changeset patch # User Thierry Florac # Date 1535557774 -7200 # Node ID 6df8dd91e90a265bdaf59029e06fcb260304bcc6 # Parent fc47e4291352e2567dc28541a74e248d2358103c Added navigation properties to site folders and contents links diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo Binary file src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo has changed diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po --- a/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po Wed Aug 29 17:49:34 2018 +0200 @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2018-08-29 10:31+0200\n" +"POT-Creation-Date: 2018-08-29 16:28+0200\n" "PO-Revision-Date: 2015-09-10 10:42+0200\n" "Last-Translator: Thierry Florac \n" "Language-Team: French\n" @@ -410,7 +410,6 @@ #: src/pyams_content/component/extfile/interfaces/__init__.py:36 #: src/pyams_content/component/links/interfaces/__init__.py:35 #: src/pyams_content/shared/imagemap/interfaces/__init__.py:55 -#: src/pyams_content/shared/site/interfaces/__init__.py:114 msgid "Alternate title" msgstr "Titre de substitution" @@ -560,7 +559,7 @@ #: src/pyams_content/component/paragraph/interfaces/pictogram.py:41 #: src/pyams_content/component/association/interfaces/__init__.py:42 #: src/pyams_content/shared/form/interfaces/__init__.py:87 -#: src/pyams_content/shared/site/interfaces/__init__.py:118 +#: src/pyams_content/shared/site/interfaces/__init__.py:144 #: src/pyams_content/features/alert/interfaces.py:54 #: src/pyams_content/features/menu/interfaces/__init__.py:59 msgid "Visible?" @@ -3250,13 +3249,13 @@ #: src/pyams_content/shared/common/interfaces/__init__.py:168 #: src/pyams_content/shared/site/zmi/folder.py:78 -#: src/pyams_content/shared/site/interfaces/__init__.py:67 +#: src/pyams_content/shared/site/interfaces/__init__.py:76 msgid "Notepad" msgstr "Bloc-notes" #: src/pyams_content/shared/common/interfaces/__init__.py:169 #: src/pyams_content/shared/site/zmi/folder.py:79 -#: src/pyams_content/shared/site/interfaces/__init__.py:68 +#: src/pyams_content/shared/site/interfaces/__init__.py:77 msgid "Internal information to be known about this content" msgstr "" "Pour prendre note d'informations internes utiles ou importantes à propos de " @@ -4093,7 +4092,7 @@ msgid "Image map template" msgstr "Mode de rendu" -#: src/pyams_content/shared/site/folder.py:59 +#: src/pyams_content/shared/site/folder.py:62 msgid "Site folder" msgstr "Rubrique" @@ -4118,10 +4117,14 @@ msgid "Site folder management" msgstr "Gérer cette rubrique" -#: src/pyams_content/shared/site/zmi/folder.py:188 +#: src/pyams_content/shared/site/zmi/folder.py:189 msgid "Site folder properties" msgstr "Propriétés de la rubrique" +#: src/pyams_content/shared/site/zmi/folder.py:206 +msgid "Navigation properties" +msgstr "Propriétés de navigation" + #: src/pyams_content/shared/site/zmi/folder.py:71 #: src/pyams_content/interfaces/__init__.py:102 msgid "Visible label used to display content" @@ -4248,37 +4251,70 @@ msgid "A site manager is already registered with this name!!" msgstr "Un site est déjà inscrit dans le registre avec ce nom !" -#: src/pyams_content/shared/site/interfaces/__init__.py:96 +#: src/pyams_content/shared/site/interfaces/__init__.py:121 msgid "Topic" msgstr "Article" -#: src/pyams_content/shared/site/interfaces/__init__.py:59 +#: src/pyams_content/shared/site/interfaces/__init__.py:42 +msgid "Redirect to first visible sub-folder or content" +msgstr "Re-diriger vers le premier contenu publié" + +#: src/pyams_content/shared/site/interfaces/__init__.py:43 +msgid "Use presentation template" +msgstr "Afficher le modèle de présentation de la rubrique" + +#: src/pyams_content/shared/site/interfaces/__init__.py:72 msgid "Heading" msgstr "Chapô" -#: src/pyams_content/shared/site/interfaces/__init__.py:60 +#: src/pyams_content/shared/site/interfaces/__init__.py:73 msgid "Heading displayed according to presentation template" msgstr "" "Ce chapô pourra être affiché ou non en fonction du modèle de présentation " "retenu" -#: src/pyams_content/shared/site/interfaces/__init__.py:63 +#: src/pyams_content/shared/site/interfaces/__init__.py:80 +#: src/pyams_content/shared/site/interfaces/__init__.py:139 msgid "Navigation title" msgstr "Titre de navigation" -#: src/pyams_content/shared/site/interfaces/__init__.py:64 -msgid "Title displayed in navigation items" +#: src/pyams_content/shared/site/interfaces/__init__.py:81 +msgid "" +"Folder's title displayed in navigation pages; original title will be used if " +"none is specified" msgstr "" -"Libellé utilisé en lieu et place du titre dans les blocs de navigation, " -"notamment dans les pages carrefours" - -#: src/pyams_content/shared/site/interfaces/__init__.py:115 -msgid "Content title, as shown in front-office" -msgstr "Titre présenté aux internautes" - -#: src/pyams_content/shared/site/interfaces/__init__.py:119 +"Titre de substitution affiché dans les composants de navigation ; " +"si rien n'est indiqué, le titre original de la rubrique sera utilisé" + +#: src/pyams_content/shared/site/interfaces/__init__.py:85 +msgid "Navigation mode" +msgstr "Mode de navigation" + +#: src/pyams_content/shared/site/interfaces/__init__.py:86 +msgid "Folder behaviour when navigating to folder URL" +msgstr "Comportement à adopter lorsqu'un internaute accède à cette rubrique" + +#: src/pyams_content/shared/site/interfaces/__init__.py:91 +msgid "Visible in folders list" +msgstr "Visible dans la liste des rubriques ?" + +#: src/pyams_content/shared/site/interfaces/__init__.py:92 +msgid "If 'no', folder will not be displayed into folders list" +msgstr "" +"Si 'non', cette rubrique ne sera pas affichée dans la liste des " +"rubriques affichée par un composant de navigation" + +#: src/pyams_content/shared/site/interfaces/__init__.py:140 +msgid "" +"Alternate content's title displayed in navigation pages; original title will " +"be used if none is specified" +msgstr "" +"Titre de substitution affiché dans les composants de navigation ; " +"si rien n'est indiqué, le titre original du contenu référencé sera utilisé" + +#: src/pyams_content/shared/site/interfaces/__init__.py:145 msgid "If 'no', link is not visible" -msgstr "Si 'non', le lien ne sera pas visible" +msgstr "Si 'non', le lien ne sera pas visible même si le contenu référencé est publié" #: src/pyams_content/shared/logo/paragraph.py:95 msgid "no selected logo" @@ -5651,6 +5687,14 @@ msgid "Hidden header" msgstr "Ne pas afficher d'en-tête de pages" +#~ msgid "Title displayed in navigation items" +#~ msgstr "" +#~ "Libellé utilisé en lieu et place du titre dans les blocs de navigation, " +#~ "notamment dans les pages carrefours" + +#~ msgid "Content title, as shown in front-office" +#~ msgstr "Titre présenté aux internautes" + #~ msgid "Success" #~ msgstr "Levée d'alerte" @@ -5987,9 +6031,6 @@ #~ msgid "Visible gallery?" #~ msgstr "Galerie visible ?" -#~ msgid "If 'no', this gallery won't be displayed in front office" -#~ msgstr "Si 'non', cette galerie ne sera pas affichée en front-office" - #~ msgid "Contained galleries" #~ msgstr "Galeries d'images" diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/locales/pyams_content.pot --- a/src/pyams_content/locales/pyams_content.pot Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/locales/pyams_content.pot Wed Aug 29 17:49:34 2018 +0200 @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2018-08-29 10:31+0200\n" +"POT-Creation-Date: 2018-08-29 16:28+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" @@ -397,7 +397,6 @@ #: ./src/pyams_content/component/extfile/interfaces/__init__.py:36 #: ./src/pyams_content/component/links/interfaces/__init__.py:35 #: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:55 -#: ./src/pyams_content/shared/site/interfaces/__init__.py:114 msgid "Alternate title" msgstr "" @@ -540,7 +539,7 @@ #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:41 #: ./src/pyams_content/component/association/interfaces/__init__.py:42 #: ./src/pyams_content/shared/form/interfaces/__init__.py:87 -#: ./src/pyams_content/shared/site/interfaces/__init__.py:118 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:144 #: ./src/pyams_content/features/alert/interfaces.py:54 #: ./src/pyams_content/features/menu/interfaces/__init__.py:59 msgid "Visible?" @@ -3064,13 +3063,13 @@ #: ./src/pyams_content/shared/common/interfaces/__init__.py:168 #: ./src/pyams_content/shared/site/zmi/folder.py:78 -#: ./src/pyams_content/shared/site/interfaces/__init__.py:67 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:76 msgid "Notepad" msgstr "" #: ./src/pyams_content/shared/common/interfaces/__init__.py:169 #: ./src/pyams_content/shared/site/zmi/folder.py:79 -#: ./src/pyams_content/shared/site/interfaces/__init__.py:68 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:77 msgid "Internal information to be known about this content" msgstr "" @@ -3822,7 +3821,7 @@ msgid "Image map template" msgstr "" -#: ./src/pyams_content/shared/site/folder.py:59 +#: ./src/pyams_content/shared/site/folder.py:62 msgid "Site folder" msgstr "" @@ -3847,10 +3846,14 @@ msgid "Site folder management" msgstr "" -#: ./src/pyams_content/shared/site/zmi/folder.py:188 +#: ./src/pyams_content/shared/site/zmi/folder.py:189 msgid "Site folder properties" msgstr "" +#: ./src/pyams_content/shared/site/zmi/folder.py:206 +msgid "Navigation properties" +msgstr "" + #: ./src/pyams_content/shared/site/zmi/folder.py:71 #: ./src/pyams_content/interfaces/__init__.py:102 msgid "Visible label used to display content" @@ -3973,31 +3976,60 @@ msgid "A site manager is already registered with this name!!" msgstr "" -#: ./src/pyams_content/shared/site/interfaces/__init__.py:96 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:121 msgid "Topic" msgstr "" -#: ./src/pyams_content/shared/site/interfaces/__init__.py:59 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:42 +msgid "Redirect to first visible sub-folder or content" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:43 +msgid "Use presentation template" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:72 msgid "Heading" msgstr "" -#: ./src/pyams_content/shared/site/interfaces/__init__.py:60 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:73 msgid "Heading displayed according to presentation template" msgstr "" -#: ./src/pyams_content/shared/site/interfaces/__init__.py:63 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:80 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:139 msgid "Navigation title" msgstr "" -#: ./src/pyams_content/shared/site/interfaces/__init__.py:64 -msgid "Title displayed in navigation items" -msgstr "" - -#: ./src/pyams_content/shared/site/interfaces/__init__.py:115 -msgid "Content title, as shown in front-office" -msgstr "" - -#: ./src/pyams_content/shared/site/interfaces/__init__.py:119 +#: ./src/pyams_content/shared/site/interfaces/__init__.py:81 +msgid "" +"Folder's title displayed in navigation pages; original title will be used if " +"none is specified" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:85 +msgid "Navigation mode" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:86 +msgid "Folder behaviour when navigating to folder URL" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:91 +msgid "Visible in folders list" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:92 +msgid "If 'no', folder will not be displayed into folders list" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:140 +msgid "" +"Alternate content's title displayed in navigation pages; original title will " +"be used if none is specified" +msgstr "" + +#: ./src/pyams_content/shared/site/interfaces/__init__.py:145 msgid "If 'no', link is not visible" msgstr "" diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/folder.py --- a/src/pyams_content/shared/site/folder.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/folder.py Wed Aug 29 17:49:34 2018 +0200 @@ -53,8 +53,11 @@ roles_interface = ISiteFolderRoles heading = FieldProperty(ISiteFolder['heading']) + notepad = FieldProperty(ISiteFolder['notepad']) + + visible_in_list = FieldProperty(ISiteFolder['visible_in_list']) navigation_title = FieldProperty(ISiteFolder['navigation_title']) - notepad = FieldProperty(ISiteFolder['notepad']) + navigation_mode = FieldProperty(ISiteFolder['navigation_mode']) content_name = _("Site folder") diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/interfaces/__init__.py --- a/src/pyams_content/shared/site/interfaces/__init__.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/interfaces/__init__.py Wed Aug 29 17:49:34 2018 +0200 @@ -14,6 +14,7 @@ # import standard library +from collections import OrderedDict # import interfaces from pyams_content.interfaces import IBaseContent @@ -28,11 +29,23 @@ from pyams_i18n.schema import I18nTextLineField, I18nTextField from zope.container.constraints import containers, contains from zope.interface import Interface, Attribute -from zope.schema import Text, Bool +from zope.schema import Text, Bool, Choice +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm from pyams_content import _ +FOLDER_REDIRECT_DISPLAY_MODE = 'redirect' +FOLDER_TEMPLATE_DISPLAY_MODE = 'template' + +FOLDER_DISPLAY_MODES = OrderedDict(( + (FOLDER_REDIRECT_DISPLAY_MODE, _("Redirect to first visible sub-folder or content")), + (FOLDER_TEMPLATE_DISPLAY_MODE, _("Use presentation template")) +)) + +FOLDER_DISPLAY_MODE_VOCABULARY = SimpleVocabulary([SimpleTerm(v, title=t) for v, t in FOLDER_DISPLAY_MODES.items()]) + + class ISiteElement(IContained, IDeletableElement): """Base site element interface""" @@ -60,14 +73,26 @@ description=_("Heading displayed according to presentation template"), required=False) - navigation_title = I18nTextLineField(title=_("Navigation title"), - description=_("Title displayed in navigation items"), - required=False) - notepad = Text(title=_("Notepad"), description=_("Internal information to be known about this content"), required=False) + visible_in_list = Bool(title=_("Visible in folders list"), + description=_("If 'no', folder will not be displayed into folders list"), + required=True, + default=True) + + navigation_title = I18nTextLineField(title=_("Navigation title"), + description=_("Folder's title displayed in navigation pages; " + "original title will be used if none is specified"), + required=False) + + navigation_mode = Choice(title=_("Navigation mode"), + description=_("Folder behaviour when navigating to folder URL"), + required=True, + vocabulary=FOLDER_DISPLAY_MODE_VOCABULARY, + default=FOLDER_REDIRECT_DISPLAY_MODE) + class ISiteFolderFactory(Interface): """Site folder factory interface""" @@ -111,9 +136,10 @@ class IContentLink(ISiteElement, IInternalReference, IAttributeAnnotatable): """Rented content interface""" - alt_title = I18nTextLineField(title=_("Alternate title"), - description=_("Content title, as shown in front-office"), - required=False) + navigation_title = I18nTextLineField(title=_("Navigation title"), + description=_("Alternate content's title displayed in navigation pages; " + "original title will be used if none is specified"), + required=False) visible = Bool(title=_("Visible?"), description=_("If 'no', link is not visible"), diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/link.py --- a/src/pyams_content/shared/site/link.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/link.py Wed Aug 29 17:49:34 2018 +0200 @@ -43,7 +43,7 @@ """ reference = FieldProperty(IContentLink['reference']) - alt_title = FieldProperty(IContentLink['alt_title']) + navigation_title = FieldProperty(IContentLink['navigation_title']) visible = FieldProperty(IContentLink['visible']) content_name = _("Content link") diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/zmi/container.py --- a/src/pyams_content/shared/site/zmi/container.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/zmi/container.py Wed Aug 29 17:49:34 2018 +0200 @@ -334,7 +334,7 @@ icon_class = 'fa-eye-slash text-danger opaque' return ''.format( icon_class=icon_class, - title=self.request.localizer.translate(self.icon_hint)) + title=self.request.localizer.translate(self.get_icon_hint(item))) def get_icon_hint(self, item): translate = self.request.localizer.translate diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/zmi/folder.py --- a/src/pyams_content/shared/site/zmi/folder.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/zmi/folder.py Wed Aug 29 17:49:34 2018 +0200 @@ -9,6 +9,8 @@ # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # +from pyams_form.group import NamedWidgetsGroup +from pyams_form.interfaces.form import IInnerSubForm __docformat__ = 'restructuredtext' @@ -31,7 +33,7 @@ # import packages from pyams_content.shared.common.zmi.manager import SharedToolPropertiesEditForm from pyams_content.shared.site.zmi.widget import SiteManagerFoldersSelectorFieldWidget -from pyams_form.form import AJAXAddForm, AJAXEditForm, ajax_config +from pyams_form.form import AJAXAddForm, ajax_config from pyams_i18n.schema import I18nTextLineField from pyams_pagelet.pagelet import pagelet_config from pyams_skin.table import DefaultElementEditorAdapter @@ -42,10 +44,9 @@ from pyams_utils.unicode import translate_string from pyams_utils.url import absolute_url from pyams_viewlet.viewlet import viewlet_config -from pyams_zmi.form import AdminDialogAddForm +from pyams_zmi.form import AdminDialogAddForm, InnerAdminEditForm from pyramid.events import subscriber from pyramid.path import DottedNameResolver -from pyramid.view import view_config from z3c.form import field from zope.interface import Interface, Invalid from zope.schema import Text, Int @@ -182,16 +183,45 @@ @pagelet_config(name='properties.html', context=ISiteFolder, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION) +@ajax_config(name='properties.json', context=ISiteFolder, layer=IPyAMSLayer) class SiteFolderPropertiesEditForm(SharedToolPropertiesEditForm): """Site folder properties edit form""" legend = _("Site folder properties") - fields = field.Fields(ISiteFolder).select('title', 'short_name', 'heading', 'navigation_title', 'notepad') + \ + fields = field.Fields(ISiteFolder).select('title', 'short_name', 'heading', 'notepad') + \ field.Fields(IBaseSharedTool).select('shared_content_workflow') -@view_config(name='properties.json', context=ISiteFolder, request_type=IPyAMSLayer, - permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True) -class SiteFolderPropertiesAJAXEditForm(AJAXEditForm, SiteFolderPropertiesEditForm): - """Site folder properties edit form, JSON renderer""" +@adapter_config(name='navigation', context=(ISiteFolder, IPyAMSLayer, SiteFolderPropertiesEditForm), + provides=IInnerSubForm) +class SiteFolderNavigationPropertiesEditForm(InnerAdminEditForm): + """Site folder navigation properties edit form""" + + prefix = 'navigation_form.' + + css_class = 'form-group' + padding_class = '' + fieldset_class = 'bordered margin-top-10 padding-y-5' + + legend = None + main_group_legend = _("Navigation properties") + main_group_class = 'inner switcher no-y-padding' + + fields = field.Fields(ISiteFolder).select('visible_in_list', 'navigation_title', 'navigation_mode') + + weight = 5 + + def check_mode(self): + if self.parent_form is not None: + self.mode = self.parent_form.mode + + def updateGroups(self): + self.add_group(NamedWidgetsGroup(self, 'navigation', self.widgets, + ('visible_in_list', 'navigation_title', 'navigation_mode'), + fieldset_class=self.fieldset_class, + legend=self.main_group_legend, + css_class=self.main_group_class, + switch=True, + display_mode='auto')) + super(SiteFolderNavigationPropertiesEditForm, self).updateGroups() diff -r fc47e4291352 -r 6df8dd91e90a src/pyams_content/shared/site/zmi/link.py --- a/src/pyams_content/shared/site/zmi/link.py Wed Aug 29 15:07:13 2018 +0200 +++ b/src/pyams_content/shared/site/zmi/link.py Wed Aug 29 17:49:34 2018 +0200 @@ -75,7 +75,7 @@ legend = _("Rent existing content") - fields = field.Fields(IContentLinkAddFormFields).select('reference', 'alt_title', 'parent') + fields = field.Fields(IContentLinkAddFormFields).select('reference', 'navigation_title', 'parent') fields['parent'].widgetFactory = SiteManagerFoldersSelectorFieldWidget edit_permission = CREATE_CONTENT_PERMISSION @@ -93,7 +93,7 @@ def update_content(self, content, data): data = data.get(self, data) content.reference = data.get('reference') - content.alt_title = data['alt_title'] + content.navigation_title = data['navigation_title'] intids = get_utility(IIntIds) parent = intids.queryObject(data.get('parent')) if parent is not None: @@ -114,7 +114,7 @@ @property def name(self): - title = II18n(self.context).query_attribute('alt_title', request=self.request) + title = II18n(self.context).query_attribute('navigation_title', request=self.request) if not title: target = self.context.get_target() if target is not None: @@ -133,7 +133,7 @@ legend = _("Edit content link properties") - fields = field.Fields(IContentLink).omit('__parent__', '__name__') + fields = field.Fields(IContentLink).omit('__parent__', '__name__', 'visible') edit_permission = MANAGE_CONTENT_PERMISSION def get_ajax_output(self, changes):