# HG changeset patch # User Thierry Florac # Date 1542971572 -3600 # Node ID b368b0b2c5d2e944a6f18a7a5e127d7151c8ad45 # Parent fa671427ce7c0066bcd102d84fe0b30d046bf5e9 Updated menu interface diff -r fa671427ce7c -r b368b0b2c5d2 src/pyams_content/features/menu/__init__.py --- a/src/pyams_content/features/menu/__init__.py Fri Nov 23 09:23:38 2018 +0100 +++ b/src/pyams_content/features/menu/__init__.py Fri Nov 23 12:12:52 2018 +0100 @@ -16,11 +16,17 @@ from zope.schema.fieldproperty import FieldProperty from pyams_content.component.association.container import AssociationContainer -from pyams_content.component.links import InternalReferenceMixin +from pyams_content.component.association.interfaces import IAssociationInfo +from pyams_content.component.links import InternalReferenceMixin, InternalLinkAssociationInfoAdapter from pyams_content.features.menu.interfaces import IMenu, IMenuLink, IMenusContainer from pyams_content.reference.pictograms import IPictogramTable +from pyams_utils.adapter import adapter_config from pyams_utils.registry import query_utility +from pyams_utils.request import check_request +from pyams_utils.url import relative_url from pyams_utils.zodb import volatile_property +from pyams_workflow.interfaces import IWorkflowPublicationInfo +from pyams_zmi.layer import IAdminLayer # @@ -52,10 +58,35 @@ if table is not None: return table.get(self._pictogram_name) + def is_visible(self, request=None): + if not self.reference: + return True + target = self.get_target() + if target is not None: + publication_info = IWorkflowPublicationInfo(target, None) + if publication_info is not None: + return publication_info.is_visible(request) + + def get_url(self, request=None, view_name=None): + target = self.get_target() + if target is not None: + if request is None: + request = check_request() + return relative_url(target, request, view_name=view_name) + else: + return '' + + +@adapter_config(context=IMenu, provides=IAssociationInfo) +class MenuAssociationInfoAdapter(InternalLinkAssociationInfoAdapter): + """Menu association adapter""" + @implementer(IMenusContainer) class MenusContainer(AssociationContainer): """Associations menus container""" def get_visible_items(self, request=None): - yield from filter(lambda x: IMenu(x).visible, self.values()) + for menu in filter(lambda x: IMenu(x).visible, self.values()): + if IAdminLayer.providedBy(request) or menu.is_visible(request): + yield menu diff -r fa671427ce7c -r b368b0b2c5d2 src/pyams_content/features/menu/interfaces.py --- a/src/pyams_content/features/menu/interfaces.py Fri Nov 23 09:23:38 2018 +0100 +++ b/src/pyams_content/features/menu/interfaces.py Fri Nov 23 12:12:52 2018 +0100 @@ -57,6 +57,9 @@ required=True, default=True) + def is_visible(self, request=None): + """Is menu visible?""" + title = I18nTextLineField(title=_("Menu title"), description=_("Displayed menu label"), required=True) @@ -72,6 +75,9 @@ pictogram = Attribute("Pictogram object reference") + def get_url(self, request=None, view_name=None): + """Menu menu target URL""" + class IMenusContainer(IAssociationContainer): """Menus container interface"""