Example #1
0
    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')
Example #4
0
    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
Example #5
0
 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
Example #7
0
    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 _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
Example #10
0
 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
Example #11
0
 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)
Example #12
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')
Example #13
0
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)
Example #14
0
    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
Example #15
0
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
Example #16
0
 def available(self):
     context = self.context
     if INavigationRoot.providedBy(context.__parent__) and IATDocument.providedBy(context):
         # Product is not installed
         return True
     else:
         return False
Example #17
0
 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
Example #18
0
    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
Example #19
0
    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
Example #20
0
    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(
            )
Example #21
0
 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
Example #22
0
    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()
Example #23
0
    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
Example #24
0
 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
Example #25
0
 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 ''
Example #28
0
 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
Example #29
0
    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
Example #31
0
 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
Example #32
0
        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
Example #33
0
 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
Example #34
0
 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
Example #35
0
 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 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
Example #38
0
    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
Example #39
0
    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()
Example #40
0
 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
Example #41
0
 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
Example #42
0
 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()
Example #44
0
 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"
Example #45
0
 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
Example #46
0
 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())
Example #48
0
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
Example #49
0
    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
Example #50
0
 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"
Example #51
0
 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
Example #52
0
    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)
Example #53
0
 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
Example #55
0
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
Example #56
0
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
Example #57
0
    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