def available(self): if self.disabled(): return False isDefaultPage = self.context_state.is_default_page() folder = None context = None folderLayouts = [] contextLayouts = [] # If this is a default page, also get menu items relative to the parent if isDefaultPage: folder = ISelectableBrowserDefault(utils.parent(self.context), None) context = ISelectableBrowserDefault(self.context, None) folderLayouts = [] folderCanSetLayout = False folderCanSetDefaultPage = False if folder is not None: folderLayouts = folder.getAvailableLayouts() folderCanSetLayout = folder.canSetLayout() folderCanSetDefaultPage = folder.canSetDefaultPage() contextLayouts = [] contextCanSetLayout = False contextCanSetDefaultPage = False if context is not None: contextLayouts = context.getAvailableLayouts() contextCanSetLayout = context.canSetLayout() contextCanSetDefaultPage = context.canSetDefaultPage() # Show the menu if we either can set a default-page, or we have more # than one layout to choose from. if (folderCanSetDefaultPage) or \ (folderCanSetLayout and len(folderLayouts) > 1) or \ (folder is None and contextCanSetDefaultPage) or \ (contextCanSetLayout and len(contextLayouts) > 1): return True else: return False
def getMenuItems(self, obj, request): """Return menu item entries in a TAL-friendly form.""" results = [] context_state = getMultiAdapter((obj, request), name='plone_context_state') isDefaultPage = context_state.is_default_page() parent = None folder = None context = None folderLayouts = [] contextLayouts = [] # If this is a default page, also get menu items relative to the parent if isDefaultPage: parent = utils.parent(obj) folder = ISelectableBrowserDefault(parent, None) context = ISelectableBrowserDefault(obj, None) folderLayouts = [] folderCanSetLayout = False folderCanSetDefaultPage = False if folder is not None: folderLayouts = folder.getAvailableLayouts() folderCanSetLayout = folder.canSetLayout() folderCanSetDefaultPage = folder.canSetDefaultPage() contextLayouts = [] contextCanSetLayout = False contextCanSetDefaultPage = False if context is not None: contextLayouts = context.getAvailableLayouts() contextCanSetLayout = context.canSetLayout() contextCanSetDefaultPage = context.canSetDefaultPage() # Short circuit if neither folder nor object will provide us with # items if not (folderCanSetLayout or folderCanSetDefaultPage or \ contextCanSetLayout or contextCanSetDefaultPage): return [] # Only show the block "Folder display" and "Item display" separators if # they are necessars useSeparators = False if folderCanSetLayout or folderCanSetDefaultPage: if (contextCanSetLayout and len(contextLayouts) > 1) or \ contextCanSetDefaultPage: useSeparators = True # 1. If this is a default-page, first render folder options if folder is not None: folderUrl = parent.absolute_url() if useSeparators: results.append({ 'title': _(u'label_current_folder_views', default=u'Folder display'), 'description': '', 'action': None, 'selected': False, 'icon': None, 'extra': {'id': 'folderHeader', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) if folderCanSetLayout: for id, title in folderLayouts: results.append({ 'title': title, 'description': '', 'action': '%s/selectViewTemplate?templateId=%s' % ( folderUrl, id,), 'selected': False, 'icon': None, 'extra': { 'id': 'folder-' + id, 'separator': None, 'class': ''}, 'submenu': None, }) # Display the selected item (i.e. the context) results.append({ 'title': _(u'label_item_selected', default=u'Item: ${contentitem}', mapping={'contentitem': escape( _safe_unicode(obj.Title()))}), 'description': '', 'action': None, 'selected': True, 'icon': None, 'extra': { 'id': 'folderDefaultPageDisplay', 'separator': 'actionSeparator', 'class': 'actionMenuSelected'}, 'submenu': None, }) # Let the user change the selection if folderCanSetDefaultPage: results.append({ 'title': _(u'label_change_default_item', default=u'Change content item as default view...'), 'description': _(u'title_change_default_view_item', default=u'Change the item used as default view in ' u'this folder'), 'action': '%s/select_default_page' % (folderUrl,), 'selected': False, 'icon': None, 'extra': { 'id': 'folderChangeDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) # 2. Render context options if context is not None: contextUrl = obj.absolute_url() selected = context.getLayout() defaultPage = context.getDefaultPage() layouts = context.getAvailableLayouts() if useSeparators: results.append({ 'title': _(u'label_current_item_views', default=u'Item display'), 'description': '', 'action': None, 'selected': False, 'icon': None, 'extra': { 'id': 'contextHeader', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) # If context is a default-page in a folder, that folder's views # will be shown. Only show context views if there are any to show. showLayouts = False if not isDefaultPage: showLayouts = True elif len(layouts) > 1: showLayouts = True if showLayouts and contextCanSetLayout: for id, title in contextLayouts: is_selected = (defaultPage is None and id == selected) results.append({ 'title': title, 'description': '', 'action': '%s/selectViewTemplate?templateId=%s' % ( contextUrl, id,), 'selected': is_selected, 'icon': None, 'extra': { 'id': 'plone-contentmenu-display-' + id, 'separator': None, 'class': is_selected and 'actionMenuSelected' or '' }, 'submenu': None, }) # Allow setting / changing the default-page, unless this is a # default-page in a parent folder. if not INonStructuralFolder.providedBy(obj): if defaultPage is None: if contextCanSetDefaultPage: results.append({ 'title': _(u'label_choose_item', default=u'Select a content item\n' u'as default view...'), 'description': _(u'title_select_default_view_item', default=u'Select an item to be used as ' u'default view in this folder...'), 'action': '%s/select_default_page' % (contextUrl,), 'selected': False, 'icon': None, 'extra': { 'id': 'contextSetDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) else: defaultPageObj = getattr(obj, defaultPage, None) defaultPageTitle = u"" if defaultPageObj is not None: if hasattr(aq_base(defaultPageObj), 'Title'): defaultPageTitle = defaultPageObj.Title() else: defaultPageTitle = getattr(aq_base(defaultPageObj), 'title', u'') results.append({ 'title': _(u'label_item_selected', default=u'Item: ${contentitem}', mapping={'contentitem': escape(_safe_unicode( defaultPageTitle))}), 'description': '', 'action': None, 'selected': True, 'icon': None, 'extra': { 'id': 'contextDefaultPageDisplay', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) if contextCanSetDefaultPage: results.append({ 'title': _(u'label_change_item', default=u'Change content item\nas ' u'default view...'), 'description': _(u'title_change_default_view_item', default=u'Change the item used as default ' u'view in this folder'), 'action': '%s/select_default_page' % (contextUrl,), 'selected': False, 'icon': None, 'extra': { 'id': 'contextChangeDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu': None, }) return results
def getMenuItems(self, obj, request): """Return menu item entries in a TAL-friendly form.""" results = [] context_state = getMultiAdapter((obj, request), name='plone_context_state') isDefaultPage = context_state.is_default_page() parent = None folder = None context = None folderLayouts = [] contextLayouts = [] # If this is a default page, also get menu items relative to the parent if isDefaultPage: parent = utils.parent(obj) folder = ISelectableBrowserDefault(parent, None) context = ISelectableBrowserDefault(obj, None) folderLayouts = [] folderCanSetLayout = False folderCanSetDefaultPage = False if folder is not None: folderLayouts = folder.getAvailableLayouts() folderCanSetLayout = folder.canSetLayout() folderCanSetDefaultPage = folder.canSetDefaultPage() contextLayouts = [] contextCanSetLayout = False contextCanSetDefaultPage = False if context is not None: contextLayouts = context.getAvailableLayouts() contextCanSetLayout = context.canSetLayout() contextCanSetDefaultPage = context.canSetDefaultPage() # Short circuit if neither folder nor object will provide us with # items if not (folderCanSetLayout or folderCanSetDefaultPage or \ contextCanSetLayout or contextCanSetDefaultPage): return [] # Only show the block "Folder display" and "Item display" separators if # they are necessars useSeparators = False if folderCanSetLayout or folderCanSetDefaultPage: if (contextCanSetLayout and len(contextLayouts) > 1) or \ contextCanSetDefaultPage: useSeparators = True # 1. If this is a default-page, first render folder options if folder is not None: folderUrl = parent.absolute_url() if useSeparators: results.append({ 'title' : _(u'label_current_folder_views', default=u'Folder display'), 'description' : '', 'action' : None, 'selected' : False, 'icon' : None, 'extra' : {'id': 'folderHeader', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) if folderCanSetLayout: for id, title in folderLayouts: results.append({ 'title' : title, 'description' : '', 'action' : '%s/selectViewTemplate?templateId=%s' % (folderUrl, id,), 'selected' : False, 'icon' : None, 'extra' : {'id': 'folder-' + id, 'separator': None, 'class': ''}, 'submenu' : None, }) # Display the selected item (i.e. the context) results.append({ 'title' : _(u'label_item_selected', default=u'Item: ${contentitem}', mapping={'contentitem' : escape(_safe_unicode(obj.Title()))}), 'description' : '', 'action' : None, 'selected' : True, 'icon' : None, 'extra' : {'id': 'folderDefaultPageDisplay', 'separator': 'actionSeparator', 'class': 'actionMenuSelected'}, 'submenu' : None, }) # Let the user change the selection if folderCanSetDefaultPage: results.append({ 'title' : _(u'label_change_default_item', default=u'Change content item as default view...'), 'description' : _(u'title_change_default_view_item', default=u'Change the item used as default view in this folder'), 'action' : '%s/select_default_page' % (folderUrl,), 'selected' : False, 'icon' : None, 'extra' : {'id': 'folderChangeDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) # 2. Render context options if context is not None: contextUrl = obj.absolute_url() selected = context.getLayout() defaultPage = context.getDefaultPage() layouts = context.getAvailableLayouts() if useSeparators: results.append({ 'title' : _(u'label_current_item_views', default=u'Item display'), 'description' : '', 'action' : None, 'selected' : False, 'icon' : None, 'extra' : {'id': 'contextHeader', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) # If context is a default-page in a folder, that folder's views will # be shown. Only show context views if there are any to show. showLayouts = False if not isDefaultPage: showLayouts = True elif len(layouts) > 1: showLayouts = True if showLayouts and contextCanSetLayout: for id, title in contextLayouts: is_selected = (defaultPage is None and id == selected) results.append({ 'title' : title, 'description' : '', 'action' : '%s/selectViewTemplate?templateId=%s' % (contextUrl, id,), 'selected' : is_selected, 'icon' : None, 'extra' : {'id': id, 'separator': None, 'class': is_selected and 'actionMenuSelected' or ''}, 'submenu' : None, }) # Allow setting / changing the default-page, unless this is a # default-page in a parent folder. if not INonStructuralFolder.providedBy(obj): if defaultPage is None: if contextCanSetDefaultPage: results.append({ 'title' : _(u'label_choose_item', default=u'Select a content item\nas default view...'), 'description' : _(u'title_select_default_view_item', default=u'Select an item to be used as default view in this folder...'), 'action' : '%s/select_default_page' % (contextUrl,), 'selected' : False, 'icon' : None, 'extra' : {'id': 'contextSetDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) else: defaultPageObj = getattr(obj, defaultPage, None) defaultPageTitle = u"" if defaultPageObj is not None: if hasattr(aq_base(defaultPageObj), 'Title'): defaultPageTitle = defaultPageObj.Title() else: defaultPageTitle = getattr(aq_base(defaultPageObj), 'title', u'') results.append({ 'title' : _(u'label_item_selected', default=u'Item: ${contentitem}', mapping={'contentitem' : escape(_safe_unicode(defaultPageTitle))}), 'description' : '', 'action' : None, 'selected' : True, 'icon' : None, 'extra' : {'id': 'contextDefaultPageDisplay', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) if contextCanSetDefaultPage: results.append({ 'title' : _(u'label_change_item', default=u'Change content item\nas default view...'), 'description' : _(u'title_change_default_view_item', default=u'Change the item used as default view in this folder'), 'action' : '%s/select_default_page' % (contextUrl,), 'selected' : False, 'icon' : None, 'extra' : {'id': 'contextChangeDefaultPage', 'separator': 'actionSeparator', 'class': ''}, 'submenu' : None, }) return results