def testINavigationRootWithRelativeRootSet(self): """test that navigation portlet uses relative root set by user even in INavigationRoot case. """ self.assertFalse(INavigationRoot.providedBy(self.portal.folder1)) # make folder1 as navigation root directlyProvides(self.portal.folder1, INavigationRoot) self.assertTrue(INavigationRoot.providedBy(self.portal.folder1)) # add two nested subfolders in folder1 self.portal.folder1.invokeFactory("Folder", "folder1_1") self.portal.folder1.folder1_1.invokeFactory("Folder", "folder1_1_1") # make a navigation portlet with navigation root set view = self.renderer( self.portal.folder1.folder1_1, opts(bottomLevel=0, topLevel=0, root_path="/folder1/folder1_1"), ) tree = view(expand=True)["contextnavigation"] # check there is a portlet self.assertTrue(tree["items"]) # check that portlet root is actually the one specified self.assertTrue(tree["url"].endswith("/plone/folder1/folder1_1")) # check that portlet tree actually includes children self.assertEqual(len(tree["items"]), 1) self.assertTrue( tree["items"][0]["href"].endswith( "/plone/folder1/folder1_1/folder1_1_1", ) )
def testINavigationRootWithRelativeRootSet(self): """test that navigation portlet uses relative root set by user even in INavigationRoot case. """ self.assertFalse(INavigationRoot.providedBy(self.portal.folder1)) # make folder1 as navigation root directlyProvides(self.portal.folder1, INavigationRoot) self.assertTrue(INavigationRoot.providedBy(self.portal.folder1)) # add two nested subfolders in folder1 self.portal.folder1.invokeFactory('Folder', 'folder1_1') self.portal.folder1.folder1_1.invokeFactory('Folder', 'folder1_1_1') # make a navigation portlet with navigation root set assignment = navigation.Assignment(bottomLevel=0, topLevel=0, root='/folder1/folder1_1') portlet = self.renderer(self.portal.folder1.folder1_1, assignment=assignment) # check there is a portlet self.assertTrue(portlet.available) # check that portlet root is actually the one specified root = portlet.getNavRoot() self.assertEqual(root.getId(), 'folder1_1') # check that portlet tree actually includes children tree = portlet.getNavTree() self.assertEqual(len(tree['children']), 1) self.assertEqual(tree['children'][0]['item'].getPath(), '/plone/folder1/folder1_1/folder1_1_1')
def testINavigationRootWithRelativeRootSet(self): """test that navigation portlet uses relative root set by user even in INavigationRoot case. """ self.assertFalse(INavigationRoot.providedBy(self.portal.folder1)) # make folder1 as navigation root directlyProvides(self.portal.folder1, INavigationRoot) self.assertTrue(INavigationRoot.providedBy(self.portal.folder1)) # add two nested subfolders in folder1 self.portal.folder1.invokeFactory('Folder', 'folder1_1') self.portal.folder1.folder1_1.invokeFactory('Folder', 'folder1_1_1') # make a navigation portlet with navigation root set assignment = navigation.Assignment(bottomLevel=0, topLevel=0, root_uid=self.portal.folder1.folder1_1.UID()) portlet = self.renderer(self.portal.folder1.folder1_1, assignment=assignment) # check there is a portlet self.assertTrue(portlet.available) # check that portlet root is actually the one specified root = portlet.getNavRoot() self.assertEqual(root.getId(), 'folder1_1') # check that portlet tree actually includes children tree = portlet.getNavTree() self.assertEqual(len(tree['children']), 1) self.assertEqual(tree['children'][0]['item'].getPath(), '/plone/folder1/folder1_1/folder1_1_1')
def bodyClass(self, template, view): """Returns the CSS class to be used on the body tag. """ body_class = LayoutPolicyOriginal.bodyClass(self, template, view) columns = [] if self.have_portlets('plone.leftcolumn', view): columns.append('-one') if self.have_portlets('plone.rightcolumn', view): columns.append('-two') column_class = columns and ' has-columns%s' % ''.join(columns) or ' has-no-columns' body_class += column_class context = aq_inner(self.context) context_state = getMultiAdapter( (self.context, self.request), name=u'plone_context_state') if context_state.is_default_page(): is_nav_root = INavigationRoot.providedBy(aq_base(aq_parent(context))) else: is_nav_root = INavigationRoot.providedBy(context) if is_nav_root: body_class += ' navigation-root' portal_state = getMultiAdapter( (context, self.request), name=u'plone_portal_state') if portal_state.anonymous(): body_class += ' is-anonymous' # add classes from the registry # we have global classes (redomino.css3theme.classes) # and user defined classes (cookies) registry = getUtility(IRegistry) classes = set(registry.get('redomino.css3theme.classes', [])) userclasses = str2set(self.request.cookies.get('redomino.css3theme.userclasses', None)) useraddableclasses = set(registry.get('redomino.css3theme.useraddableclasses', [])) userclasses = userclasses & useraddableclasses classes = classes | userclasses if classes: body_class += ' %s' % ' '.join(classes) # add contextual classes contextual_classes = context.css3theme_get_contextual_classes() if contextual_classes: body_class += " %s" % contextual_classes return body_class
def is_navigation_root_or_default_page(self): context = aq_inner(self.context) context_state = getMultiAdapter( (context, self.request), name=u'plone_context_state') if context_state.is_default_page(): return INavigationRoot.providedBy(aq_parent(context)) else: return INavigationRoot.providedBy(context)
def publishTraverse(self, request, name): obj = self.default.publishTraverse(request, name) context = self.context if IFrontendLayer.providedBy(request) and not INavigationRoot.providedBy(context): interface.alsoProvides(context, INavigationRoot) elif not IFrontendLayer.providedBy(request) and INavigationRoot.providedBy(context): interface.noLongerProvides(context, INavigationRoot) return obj
def _translations(self, missing): # Figure out the "closest" translation in the parent chain of the # context. We stop at both an INavigationRoot or an ISiteRoot to look # for translations. # Exceptions: 1) If the object does not implement ITranslatable (= not # LP-aware) or # 2) if the object is set to be neutral # then return this object and don't look for a translation. context = aq_inner(self.context) translations = {} chain = aq_chain(context) first_pass = True _checkPermission = getSecurityManager().checkPermission for item in chain: if ISiteRoot.providedBy(item) \ or not ITranslatable.providedBy(item) \ or not item.Language(): # We have a site root, which works as a fallback has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, first_pass, has_view_permission) break translatable = ITranslatable(item, None) if translatable is None: continue item_trans = item.getTranslations(review_state=False) for code, trans in item_trans.items(): code = str(code) if code not in translations: # make a link to a translation only if the user # has view permission has_view_permission = bool(_checkPermission('View', trans)) if (not INavigationRoot.providedBy(item) and not has_view_permission): continue # If we don't yet have a translation for this language # add it and mark it as found translations[code] = (trans, first_pass, has_view_permission) missing = missing - set((code, )) if len(missing) <= 0: # We have translations for all break if INavigationRoot.providedBy(item): # Don't break out of the navigation root jail has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, False, has_view_permission) break first_pass = False # return a dict of language code to tuple. the first tuple element is # the translated object, the second argument indicates wether the # translation is a direct translation of the context or something from # higher up the translation chain return translations
def _translations(self, missing): # Figure out the "closest" translation in the parent chain of the # context. We stop at both an INavigationRoot or an ISiteRoot to look # for translations. We do want to find something that is definitely # in the language the user asked for. context = aq_inner(self.context) translations = {} chain = aq_chain(context) first_pass = True _checkPermission = getSecurityManager().checkPermission for item in chain: if ISiteRoot.providedBy(item): # We have a site root, which works as a fallback has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, first_pass, has_view_permission) break elif IFactoryTempFolder.providedBy(item) or \ IFactoryTool.providedBy(item): # TempFolder or portal_factory, can't have a translation continue canonical = ITranslationManager(item, None) item_trans = canonical.get_translations() for code, trans in item_trans.items(): code = str(code) if code not in translations: # make a link to a translation only if the user # has view permission has_view_permission = bool(_checkPermission('View', trans)) if (not INavigationRoot.providedBy(item) and not has_view_permission): continue # If we don't yet have a translation for this language # add it and mark it as found translations[code] = (trans, first_pass, has_view_permission) missing = missing - set((code, )) if len(missing) <= 0: # We have translations for all break if INavigationRoot.providedBy(item): # Don't break out of the navigation root jail has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, False, has_view_permission) break first_pass = False # return a dict of language code to tuple. the first tuple element is # the translated object, the second argument indicates wether the # translation is a direct translation of the context or something from # higher up the translation chain return translations
def publishTraverse(self, request, name): obj = self.default.publishTraverse(request, name) context = self.context if IFrontendLayer.providedBy( request) and not INavigationRoot.providedBy(context): interface.alsoProvides(context, INavigationRoot) elif not IFrontendLayer.providedBy( request) and INavigationRoot.providedBy(context): interface.noLongerProvides(context, INavigationRoot) return obj
def testINavigationRootAvailability(self): self.failIf(INavigationRoot.providedBy(self.portal.folder1)) self.portal.folder1.invokeFactory('Folder', 'folder1_1') directlyProvides(self.portal.folder1, INavigationRoot) self.failUnless(INavigationRoot.providedBy(self.portal.folder1)) view = self.renderer(self.portal.folder1, assignment=navigation.Assignment(bottomLevel=0, topLevel=1, root=None)) tree = view.getNavTree() root = view.getNavRoot() self.failIf(root is not None and len(tree['children']) > 0)
def testINavigationRootWithRelativeRootSet(self): self.failIf(INavigationRoot.providedBy(self.portal.folder1)) self.portal.folder1.invokeFactory('Folder', 'folder1_1') directlyProvides(self.portal.folder1, INavigationRoot) self.failUnless(INavigationRoot.providedBy(self.portal.folder1)) self.portal.folder1.folder1_1.invokeFactory('Folder', 'folder1_1_1') view = self.renderer(self.portal.folder1.folder1_1, assignment=navigation.Assignment(bottomLevel=0, topLevel=0, root='/folder1/folder1_1')) tree = view.getNavTree() self.failUnless(tree) root = view.getNavRoot() self.assertEqual(root.getId(), 'folder1_1') self.assertEqual(len(tree['children']), 1) self.assertEqual(tree['children'][0]['item'].getPath(), '/plone/folder1/folder1_1/folder1_1_1')
def _relativePath(context, row): # Walk through the tree obj = context values = row.values depthstr = "" if '::' in values: values, _depth = values.split('::', 1) depthstr = "::%s" % _depth for x in [r for r in values.split('/') if r]: if x == "..": if INavigationRoot.providedBy(obj): break parent = aq_parent(obj) if parent: obj = parent else: if base_hasattr(obj, x): child = getattr(obj, x, None) if child and base_hasattr(child, "getPhysicalPath"): obj = child row = Row(index=row.index, operator=row.operator, values='/'.join(obj.getPhysicalPath()) + depthstr) return _path(context, row)
def find_banner(self): types = api.portal.get_registry_record( 'collective.behavior.banner.browser.controlpanel.IBannerSettingsSchema.types' ) # noqa: E501 context = aq_inner(self.context) # first handle the obj itself if IBanner.providedBy(context): if context.banner_hide: return False banner = self.banner(context) if banner: return banner if context.banner_stop_inheriting: return False # if all the fields are empty and inheriting is not stopped if context.portal_type not in types: return False context = context.__parent__ # we walk up the path for item in context.aq_chain: if IBanner.providedBy(item): # we have a banner. check. if item.banner_stop_inheriting: return False banner = self.banner(item) if banner: return banner if INavigationRoot.providedBy(item): return False if item.portal_type not in types: return False return False
def get_latex_heading(context, layout, toc=None): title = layout.get_converter().convert(context.pretty_title_or_id()) # level: depth of rendering level = -1 max_level = len(HEADING_COMMANDS) - 1 obj = context while obj and not IBook.providedBy(obj) and level != max_level: obj = aq_parent(aq_inner(obj)) level += 1 if INavigationRoot.providedBy(obj): # cancel, use section level = 1 break command = HEADING_COMMANDS[level] hide_from_toc_field = context.Schema().getField('hideFromTOC') hide_from_toc = hide_from_toc_field and hide_from_toc_field.get(context) # generate latex tocmark = '' if toc is None and hide_from_toc is True or toc is False: tocmark = '*' latex = '\\%s%s{%s}\n' % (command, tocmark, title) return latex
def available(self): context = self.context if INavigationRoot.providedBy(context.__parent__) and IATDocument.providedBy(context): # Product is not installed return True else: return False
def _items(self, **query): adapter = IAdapter(self.context) sort_limit = adapter.get_feed_number(self.interface) if sort_limit: query['sort_limit'] = sort_limit if isinstance(self, BaseNewsEventFeedViewlet): query['sort_limit'] += adapter.get_feed_number( ITopPageMainFeed) base = IBaseAdapter(self.context) res = [] for item in base.get_content_listing(**query): obj = item.getObject() if not isinstance(self, BaseNewsEventFeedViewlet) or ( ISiteRoot.providedBy(self.context) and not ITopPageFeed.providedBy(obj)) or ( not ISiteRoot.providedBy(self.context) and INavigationRoot.providedBy(self.context) and not IMicroSiteFeed.providedBy(obj)): parent = aq_parent(aq_inner(obj)) res.append({ 'title': item.Title(), 'url': item.getURL(), 'parent_title': parent.Title(), 'parent_url': parent.absolute_url(), 'date': self._date(item), 'image': self._image(item), 'description': self._description(item), }) if sort_limit: return res[:sort_limit] return res
def get_chains(self): repository = [] chain = [] for obj in aq_chain(self.context): if INavigationRoot.providedBy(obj): break if IHideFromBreadcrumbs.providedBy(obj): continue if ISQLObjectWrapper.providedBy(obj): data = obj.get_breadcrumb() else: data = { 'absolute_url': obj.absolute_url(), 'title': obj.Title(), 'css_class': get_css_class(obj, type_icon_only=True) } if self.is_part_of_repo(obj): repository.append(data) else: chain.append(data) chain.reverse() return repository, chain
def _get_translations_by_dialog(self, supported_langs): """ """ context = aq_inner(self.context) default_view_for = getMultiAdapter((context, self.request), name='plone_context_state').canonical_object() _checkPermission = getSecurityManager().checkPermission translations = {} if ISiteRoot.providedBy(context): # We have a site root, which works as a fallback for code in supported_langs: has_view_permission = bool(_checkPermission('View', context)) translations[code] = (context, True, has_view_permission) elif INavigationRoot.providedBy(default_view_for): for code, content in ITranslationManager(default_view_for).get_translations().items(): code = str(code) has_view_permission = bool(_checkPermission('View', content)) translations[code] = (content, True, has_view_permission) else: for code, content in ITranslationManager(context).get_translations().items(): code = str(code) has_view_permission = bool(_checkPermission('View', content)) translations[code] = (content, True, has_view_permission) return translations
def update(self): super(LogoViewlet, self).update() portal = self.portal_state.portal() bprops = portal.restrictedTraverse('base_properties', None) if bprops is not None: logoName = bprops.logoName else: logoName = 'logo.jpg' context = aq_inner(self.context) while not INavigationRoot.providedBy(context): context = aq_parent(context) if ISubSite.providedBy(context): logoTitle = context.Title() if context.restrictedTraverse('@@images').scale('image', 'large'): self.logo_tag = context.restrictedTraverse('@@images').scale( 'image').tag() self.navigation_root_title = context.Title() else: logoTitle = self.portal_state.portal_title() self.logo_tag = portal.restrictedTraverse(logoName).tag( title=logoTitle, alt=logoTitle) self.navigation_root_title = context.Title() else: logoTitle = self.portal_state.portal_title() self.logo_tag = portal.restrictedTraverse(logoName).tag( title=logoTitle, alt=logoTitle) self.navigation_root_title = self.portal_state.navigation_root_title( )
def get_datacontext(self, obj): if ISectionImage.providedBy(obj): return ISectionImage(obj) if not IOrganisationFolder.providedBy(obj) \ and not INavigationRoot.providedBy(obj): return self.get_datacontext(aq_parent(obj)) return None
def run(self, resource, adapter, session, *args, **kwds): """ JSON-LD export of latest news within our homepage """ context = self.context if not has_linked_data: return if not INavigationRoot.providedBy(context) and \ not ILinkedDataHomepage.providedBy(context.aq_parent): return fview = context.restrictedTraverse('@@frontpage_highlights') ItemList = session.get_class(surf.ns.SCHEMA['ItemList']) ListElement = session.get_class(surf.ns.SCHEMA['ListItem']) ilist = ItemList("#itemList2") portal_properties = getToolByName(context, 'portal_properties') fp = getattr(portal_properties, 'frontpage_properties') # use news as latest news while keeping it flexible in case we want # other products promoted as latest news latest_category = fp.getProperty('getLatestNewsCategory', 'news') products = fview.getLatest(latest_category) position = 0 for brain in products: url = brain.getURL() position += 1 list_item = ListElement("LatestNewsListItem" + str(position)) list_item.schema_position = position list_item.schema_url = url list_item.update() ilist.schema_itemListElement.append(list_item) ilist.update()
def getMenuItems(self, context, request): menu = super(TranslateMenu, self).getMenuItems(context, request) url = context.absolute_url() is_neutral_content = ( ILanguage(context).get_language() == LANGUAGE_INDEPENDENT or is_language_independent(context) ) if not is_neutral_content and not INavigationRoot.providedBy(context): if ITranslatable.providedBy(context) and getSecurityManager().checkPermission('Manage portal', context): menu.append({ "title": _( u"title_mirror_content", default=u"Mirror this object to other languages" ), "description": _( u"description_mirror_content", default=u"" ), "action": url + "/mirror_content", "selected": False, "icon": None, "extra": { "id": "_mirror_content", "separator": None, "class": "" }, "submenu": None, }) return menu
def target(self): ''' The target for the calendar export view ''' for obj in self.context.aq_chain: if (IBaseWorkspaceFolder.providedBy(obj) or INavigationRoot.providedBy(obj)): return obj
def setupSharedFolder(self): """ Create the shared neutral language folder """ doneSomething = False folderId = "shared" folder = getattr(self.context, folderId, None) wftool = getToolByName(self.context, 'portal_workflow') if folder is None: self.context.invokeFactory(self.folder_type, folderId) folder = getattr(self.context, folderId) ILanguage(folder).set_language(LANGUAGE_INDEPENDENT) folder.setTitle("Language Shared") state = wftool.getInfoFor(folder, 'review_state', None) # This assumes a direct 'publish' transition from the initial state if state != 'published': wftool.doActionFor(folder, 'publish') folder.reindexObject() doneSomething = True LOG.info("Added LANGUAGE_INDEPENDENT folder: %s" % (folderId)) if not INavigationRoot.providedBy(folder): alsoProvides(folder, INavigationRoot) doneSomething = True LOG.info("INavigationRoot setup on shared folder ") return doneSomething
def index(self): sm = getSecurityManager() context = aq_inner(self.context) container = aq_parent(context) if isDefaultPage(container, context): context = container # avoid redirecting if we are visiting an url different from the url of the context viewname = self.context.getLayout() if self.request.URL != self.context.absolute_url() and self.request.URL != self.context.absolute_url() + '/' + viewname: return '' originalcontext = context while all([not INavigationRoot.providedBy(context), IRedirectToParent.providedBy(context), not sm.checkPermission(ModifyPortalContent, context)]): # contextid = context.id context = aq_parent(context) if context != originalcontext: viewurl = getMultiAdapter((context, self.request), name='plone_context_state').view_url() self.request.RESPONSE.redirect(viewurl + '#content=' + originalcontext.absolute_url()) return ''
def index(self): context = aq_inner(self.context) container = aq_parent(context) if isDefaultPage(container, context): context = container originalcontext = context # avoid redirecting if we are visiting an url different from the url of the context viewname = self.context.getLayout() if self.request.URL != self.context.absolute_url() and self.request.URL != self.context.absolute_url() + '/' + viewname: return '' while all([not INavigationRoot.providedBy(context), IRedirectToParent.providedBy(context)]): # contextid = context.id context = aq_parent(context) if context != originalcontext: viewurl = getMultiAdapter((context, self.request), name='plone_context_state').view_url() return u'<a class="redirect-to-parent" href="%s">%s</a>' % (viewurl + '#content=' + originalcontext.absolute_url(),context.Title()) else: return ''
def setUpLanguage(self, code, name): """ Create the language folders on top of the site """ doneSomething = False folderId = "%s" % code if code != 'id' else 'id-id' folder = getattr(self.context, folderId, None) wftool = getToolByName(self.context, 'portal_workflow') if folder is None: self.context.invokeFactory(self.folder_type, folderId) folder = getattr(self.context, folderId) ILanguage(folder).set_language(code) folder.setTitle(name) state = wftool.getInfoFor(folder, 'review_state', None) # This assumes a direct 'publish' transition from the initial state if state != 'published': wftool.doActionFor(folder, 'publish') folder.reindexObject() doneSomething = True LOG.info("Added '%s' folder: %s" % (code, folderId)) self.folders[code] = folder if not INavigationRoot.providedBy(folder): alsoProvides(folder, INavigationRoot) doneSomething = True LOG.info("INavigationRoot setup on folder '%s'" % code) return doneSomething
def heading_link_target(self): """ Get the href target where clicking the portlet header will take you. If this is a customized portlet with a custom root item set, we probably want to take the user to the custom root item instead of the sitemap of the navigation root. Plone does not have subsection sitemaps so there is no point of displaying /sitemap links for anything besides nav root. """ if not self.data.root_uid: # No particular root item assigned -> should get link to the # navigation root sitemap of the current context acquisition chain portal_state = getMultiAdapter((self.context, self.request), name="plone_portal_state") return portal_state.navigation_root_url() + "/sitemap" nav_root = self.getNavRoot() # Root content item gone away or similar issue if not nav_root: return None if INavigationRoot.providedBy(nav_root) or ISiteRoot.providedBy( nav_root): # For top level folders go to the sitemap return nav_root.absolute_url() + "/sitemap" else: # Go to the item /view we have chosen as root item return nav_root.absolute_url()
def _findSource(self, fieldname, search_refs=True): """Find a parent item that contains valid information in [fieldname]""" item = self.context source = None while not (source or INavigationRoot.providedBy(item) or IPloneSiteRoot.providedBy(item)): if hasattr(item, 'markedAs') and item.markedAs.lower() == u"dossier": # check whether item has field filled in if item.Schema()[fieldname].get(item): source = item else: if search_refs: # find theme through ref catalog theme = item.reference_catalog(targetUID=item.UID(), relationship='itemsInTheme') # Reference to Dossier found in Theme if theme: # Assume a Dossier is always related to ONE theme source = theme[0].getObject().getSourceObject() if not source: item = item.aq_parent return source
def can_translate(context, language): """ Check if required parent translations are in place so that we can translate this item :return: True if the item can be translated """ parent = aq_parent(context) if ISiteRoot.providedBy(parent): return True # Parent is a language base folder at plone site root if INavigationRoot.providedBy(parent): return True if ITranslatable.providedBy(parent): translatable = ITranslatable(parent) else: from logging import getLogger log = getLogger("silvuple.views.can_translate") log.info("Parent is not translatable: %s" % parent.absolute_url()) return False translation = translatable.getTranslation(language) return translation is not None
def is_subsite(self): context = aq_inner(self.context) while not INavigationRoot.providedBy(context): context = aq_parent(context) if ISubSite.providedBy(context): return True return False
def find_banner(self): registry = getUtility(IRegistry) settings = registry.forInterface(IBannerSettingsSchema) types = settings.types context = aq_inner(self.context) # first handle the obj itself if IBanner.providedBy(context): if context.banner_hide: return False banner = self.banner(context) if banner: return banner if context.banner_stop_inheriting: return False # if all the fields are empty and inheriting is not stopped if context.portal_type not in types: return False context = context.__parent__ # we walk up the path for item in context.aq_chain: if IBanner.providedBy(item): # we have a banner. check. if item.banner_stop_inheriting: return False banner = self.banner(item) if banner: return banner if INavigationRoot.providedBy(item): return False if item.portal_type not in types: return False return False
def subsite_element(self): context = aq_inner(self.context) while not INavigationRoot.providedBy(context): context = aq_parent(context) if ISubSite.providedBy(context): return context return None
def insertOrg(self, **kwa): """ kwa should be a dict with keys matching orgs columns. returns new oid. """ assert(self.db_org_id == 0) assert(INavigationRoot.providedBy(self.context)) assignments = [] for key in kwa.keys(): assert(key.replace('_', '').isalnum()) val = kwa[key] if val is None: val = '' if type(val) == type(u''): val = encodeString(val) assignments.append("""%s=%s""" % (key, self._sql_quote(val))) query = """ INSERT INTO Orgs SET %s """ % (", ".join(assignments)) self.reader.query(query) query = """ select distinct last_insert_id() as liid from Orgs """ self.db_org_id = Results(self.reader.query(query))[0].liid return self.db_org_id
def update(self): super(LogoViewlet, self).update() portal = self.portal_state.portal() bprops = portal.restrictedTraverse('base_properties', None) if bprops is not None: logoName = bprops.logoName else: logoName = 'logo.jpg' context = aq_inner(self.context) while not INavigationRoot.providedBy(context): context = aq_parent(context) if ISubSite.providedBy(context): logoTitle = context.Title() if context.restrictedTraverse('@@images').scale('image', 'large'): self.logo_tag = context.restrictedTraverse('@@images').scale('image').tag() self.navigation_root_title = context.Title() else: logoTitle = self.portal_state.portal_title() self.logo_tag = portal.restrictedTraverse(logoName).tag(title=logoTitle, alt=logoTitle) self.navigation_root_title = context.Title() else: logoTitle = self.portal_state.portal_title() self.logo_tag = portal.restrictedTraverse(logoName).tag(title=logoTitle, alt=logoTitle) self.navigation_root_title = self.portal_state.navigation_root_title()
def setUpLanguage(self, code, name): """ Create the language folders on top of the site """ doneSomething = False folderId = "%s" % code if code != 'id' else 'id-id' folder = getattr(self.context, folderId, None) wftool = getToolByName(self.context, 'portal_workflow') if folder is None: self.context.invokeFactory(self.folder_type, folderId) folder = getattr(self.context, folderId) ILanguage(folder).set_language(code) folder.setTitle(name) state = wftool.getInfoFor(folder, 'review_state', None) # This assumes a direct 'publish' transition from the initial state # We are going to check if its private and has publish action for the out of the box case # otherwise don't do anything available_transitions = [t['id'] for t in wftool.getTransitionsFor(folder)] if state != 'published' and 'publish' in available_transitions: wftool.doActionFor(folder, 'publish') folder.reindexObject() doneSomething = True LOG.info("Added '%s' folder: %s" % (code, folderId)) self.folders[code] = folder if not INavigationRoot.providedBy(folder): alsoProvides(folder, INavigationRoot) doneSomething = True LOG.info("INavigationRoot setup on folder '%s'" % code) return doneSomething
def _items(self, **query): adapter = IAdapter(self.context) sort_limit = adapter.get_feed_number(self.interface) if sort_limit: query['sort_limit'] = sort_limit if isinstance(self, BaseNewsEventFeedViewlet): query['sort_limit'] += adapter.get_feed_number(ITopPageMainFeed) base = IBaseAdapter(self.context) res = [] for item in base.get_content_listing(**query): obj = item.getObject() if not isinstance(self, BaseNewsEventFeedViewlet) or ( ISiteRoot.providedBy(self.context) and not ITopPageFeed.providedBy(obj)) or ( not ISiteRoot.providedBy(self.context) and INavigationRoot.providedBy(self.context) and not IMicroSiteFeed.providedBy(obj)): parent = aq_parent(aq_inner(obj)) res.append({ 'title': item.Title(), 'url': item.getURL(), 'parent_title': parent.Title(), 'parent_url': parent.absolute_url(), 'date': self._date(item), 'image': self._image(item), 'description': self._description(item), }) if sort_limit: return res[:sort_limit] return res
def setupSharedFolder(self): """ Create the shared neutral language folder """ doneSomething = False folderId = SHARED_NAME folder = getattr(self.context, folderId, None) wftool = getToolByName(self.context, 'portal_workflow') if folder is None: # bypass all settings that don't allow creating # content in the Plone root _createObjectByType(self.folder_type, self.context, folderId) #self.context.invokeFactory(self.folder_type, folderId) folder = getattr(self.context, folderId) ILanguage(folder).set_language(LANGUAGE_INDEPENDENT) folder.setTitle("Language Shared") state = wftool.getInfoFor(folder, 'review_state', None) # This assumes a direct 'publish' transition from the initial state available_transitions = [t['id'] for t in wftool.getTransitionsFor(folder)] if state != 'published' and 'publish' in available_transitions: wftool.doActionFor(folder, 'publish') folder.reindexObject() doneSomething = True LOG.info("Added LANGUAGE_INDEPENDENT folder: %s" % (folderId)) if not INavigationRoot.providedBy(folder): alsoProvides(folder, INavigationRoot) doneSomething = True LOG.info("INavigationRoot setup on shared folder ") return doneSomething
def heading_link_target(self): """ Get the href target where clicking the portlet header will take you. If this is a customized portlet with a custom root item set, we probably want to take the user to the custom root item instead of the sitemap of the navigation root. Plone does not have subsection sitemaps so there is no point of displaying /sitemap links for anything besides nav root. """ if not self.data.root: # No particular root item assigned -> should get link to the # navigation root sitemap of the current context acquisition chain portal_state = getMultiAdapter((self.context, self.request), name="plone_portal_state") return portal_state.navigation_root_url() + "/sitemap" nav_root = self.getNavRoot() # Root content item gone away or similar issue if not nav_root: return None if INavigationRoot.providedBy(nav_root) or ISiteRoot.providedBy(nav_root): # For top level folders go to the sitemap return nav_root.absolute_url() + "/sitemap" else: # Go to the item /view we have chosen as root item return nav_root.absolute_url()
def __call__(self): cfg = authomatic_cfg() if cfg is None: return "Authomatic is not configured" if not ( ISiteRoot.providedBy(self.context) or INavigationRoot.providedBy(self.context) ): # callback url is expected on either navigationroot or site root # so bevor going on redirect root = api.portal.get_navigation_root(self.context) self.request.response.redirect( "{0}/authomatic-handler/{1}".format( root.absolute_url(), getattr(self, 'provider', '') ) ) return "redirecting" if not hasattr(self, 'provider'): return self.template() if self.provider not in cfg: return "Provider not supported" if not self.is_anon: if self.provider in self._provider_names: raise ValueError( 'Provider {0} is already connected to current ' 'user.'.format(self.provider) ) # TODO: some sort of CSRF check might be needed, so that # not an account got connected by CSRF. Research needed. pass auth = Authomatic( cfg, secret=authomatic_settings().secret.encode('utf8') ) result = auth.login( ZopeRequestAdapter(self), self.provider ) if not result: logger.info('return from view') # let authomatic do its work return if result.error: return result.error.message display = cfg[self.provider].get('display', {}) provider_name = display.get('title', self.provider) if not self.is_anon: # now we delegate to PAS plugin to add the identity self._add_identity(result, provider_name) self.request.response.redirect( "{0}".format(self.context.absolute_url()) ) else: # now we delegate to PAS plugin in order to login self._remember_identity(result, provider_name) self.request.response.redirect( "{0}/login_success".format(self.context.absolute_url()) ) return "redirecting"
def on_homepage(self): """Verifiy if we are on the homepage""" context_helper = getMultiAdapter((self.context, self.request), name="plone_context_state") if INavigationRoot.providedBy(context_helper.canonical_object()): return True return False
def setUpLanguage(self, code, name): result = [] folderId = "%s" % code folder = getattr(self.context, folderId, None) wftool = getToolByName(self.context, 'portal_workflow') if folder is None: self.context.invokeFactory('Folder', folderId) folder = getattr(self.context, folderId) folder.setLanguage(code) folder.setTitle(name) state = wftool.getInfoFor(folder, 'review_state', None) # This assumes a direct 'publish' transition from the initial state # Re: Sorry but in the real world assumptions aren't reliable enough forward_star = [ tr['id'] for tr in wftool.getTransitionsFor(folder) ] if state != 'published' and 'publish' in forward_star: wftool.doActionFor(folder, 'publish') folder.reindexObject() result.append("Added '%s' folder: %s" % (code, folderId)) self.folders[code] = folder if not INavigationRoot.providedBy(folder): alsoProvides(folder, INavigationRoot) result.append("INavigationRoot setup on folder '%s'" % code) return result
def test_past_events_url_and_navigation_root(self): # ensure support of INavigationRoot features dosen't break #9246 #9668 # remove default plone content(s) if "events" in self.portal: self.portal._delObject("events") # lets create mynewsite self.portal.invokeFactory("Folder", "mynewsite") directlyProvides(self.portal.mynewsite, INavigationRoot) self.failUnless(INavigationRoot.providedBy(self.portal.mynewsite)) lb = ICalendarLinkbase(self.portal.mynewsite) # mynewsite events: # -- events # ---- aggregator # ------ previous self.portal.mynewsite.invokeFactory("Folder", "events") self.portal.mynewsite.events.invokeFactory("Folder", "aggregator") self.portal.mynewsite.events.aggregator.invokeFactory("Folder", "previous") self.failUnless(lb.past_events_url().endswith("/mynewsite/events/aggregator/previous")) # mynewsite events: # -- events # ---- previous self.portal.mynewsite._delObject("events") self.portal.mynewsite.invokeFactory("Folder", "events") self.portal.mynewsite.events.invokeFactory("Folder", "previous") self.failUnless(lb.past_events_url().endswith("/mynewsite/events/previous")) # no mynewsite events self.portal.mynewsite._delObject("events") self.assertTrue("@@search?advanced_search=True&end.query" in lb.past_events_url())
def get_latex_heading(context, layout, toc=None): title = layout.get_converter().convert(context.pretty_title_or_id()) # level: depth of rendering level = -1 max_level = len(HEADING_COMMANDS) - 1 obj = context while obj and not IBook.providedBy(obj) and level != max_level: obj = aq_parent(aq_inner(obj)) level += 1 if INavigationRoot.providedBy(obj): # cancel, use section level = 1 break command = HEADING_COMMANDS[level] hide_from_toc_field = context.Schema().getField('hideFromTOC') hide_from_toc = hide_from_toc_field and hide_from_toc_field.get(context) # generate latex tocmark = '' if toc is None and hide_from_toc is True or toc is False: tocmark = '*' latex = '\\%s%s{%s}\n' % ( command, tocmark, title) return latex
def _check_context(self): """ check if we should show slider in current context """ for obj in self.chain: if INavigationRoot.providedBy(obj): #Plone site return default view default = obj.getDefaultPage() if default: try: obj = obj[default] except KeyError: obj = obj extended = getattr(obj, 'getField', None) if extended: field = extended('show_slider') if field: show = field.getAccessor(obj)() if show == SLIDER_PARENT: #skip context go up continue elif show == SLIDER_NO: return False elif show == SLIDER_YES: return True elif show == SLIDER_MYSELF: return True return False
def __call__(self): cfg = authomatic_cfg() if cfg is None: return "Authomatic is not configured" if not ( ISiteRoot.providedBy(self.context) or INavigationRoot.providedBy(self.context) ): # callback url is expected on either navigationroot or site root # so bevor going on redirect root = api.portal.get_navigation_root(self.context) self.request.response.redirect( "{0}/authomatic-handler/{1}".format( root.absolute_url(), getattr(self, 'provider', '') ) ) return "redirecting" if not hasattr(self, 'provider'): return self.template() if self.provider not in cfg: return "Provider not supported" if not self.is_anon: if self.provider in self._provider_names: raise ValueError( 'Provider {0} is already connected to current ' 'user.'.format(self.provider) ) # TODO: some sort of CSRF check might be needed, so that # not an account got connected by CSRF. Research needed. pass secret = authomatic_settings().secret if six.PY2 and isinstance(secret, six.text_type): secret = secret.encode('utf8') auth = Authomatic(cfg, secret=secret) result = auth.login(ZopeRequestAdapter(self), self.provider) if not result: logger.info('return from view') # let authomatic do its work return if result.error: return result.error.message display = cfg[self.provider].get('display', {}) provider_name = display.get('title', self.provider) if not self.is_anon: # now we delegate to PAS plugin to add the identity self._add_identity(result, provider_name) self.request.response.redirect( "{0}".format(self.context.absolute_url()) ) else: # now we delegate to PAS plugin in order to login self._remember_identity(result, provider_name) if api.env.plone_version() < '5.2': self.request.response.redirect( "{0}/login_success".format(self.context.absolute_url()) ) else: self.request.response.redirect(self.context.absolute_url()) return "redirecting"
def is_homepage(self): """ Returns true if we are on navigation root """ obj = aq_inner(self.context) if INavigationRoot.providedBy(obj): return True return False
def test_get_navigation_root(self): """Test to see if the navigation_root is returned.""" navigation_root = portal.get_navigation_root(portal.get()) self.assertTrue(INavigationRoot.providedBy(navigation_root)) from plone.api.exc import MissingParameterError self.assertRaises(MissingParameterError, portal.get_navigation_root)
def is_homepage(self): """Determine whether the current context is the home page of the website. """ pcs = getMultiAdapter((self.context, self.request), name=u'plone_context_state') canonical = pcs.canonical_object() return INavigationRoot.providedBy(canonical)
def _getSubSiteParentFolder(self): """Return the first parent folder found that implements the interface IMonetCalendarSearchRoot""" for parent in aq_chain(aq_inner(self.context)): if IMonetCalendarSearchRoot.providedBy(parent): return parent # If linguaplone is there we need to stop before reaching the site, but onto the en/es/it folders... if INavigationRoot.providedBy(parent) and not IPloneSiteRoot.providedBy(parent): return parent return None
def getNavigationRootObject(context, portal): if context is None: return None obj = context while (not INavigationRoot.providedBy(obj) and aq_base(obj) is not aq_base(portal)): obj = utils.parent(obj) return obj
def getNavigationRootObject(context, portal): obj = context while (not INavigationRoot.providedBy(obj) and aq_base(obj) is not aq_base(portal)): parent = aq_parent(aq_inner(obj)) if parent is None: return obj obj = parent return obj
def __call__(self): context = aq_inner(self.context) while not INavigationRoot.providedBy(context): context = aq_parent(context) if ISubSite.providedBy(context): return True else: return False