Пример #1
0
    def update(self):
        super(LogoViewlet, self).update()

        context = aq_inner(self.context)

        portal_state = getMultiAdapter(
            (context, self.request),
            name='plone_portal_state'
        )
        portal = portal_state.portal()
        nav_root = getNavigationRootObject(
            context,
            portal
        )

        logoTitle = portal_state.navigation_root_title()
        self.navigation_root_title = logoTitle

        logo = nav_root.page_banner_image
        if logo is None:
            self.logo_tag = """%s""" % cgi.escape(logoTitle)
        else:
            self.logo_tag = """<img
            src="%s/@@images/page_banner_image"
            alt="%s"
            title="%s"
            />""" % (nav_root.absolute_url(), logoTitle, logoTitle)
Пример #2
0
    def fix_organization_by_state(self, payload):
        wft = getToolByName(self.context, 'portal_workflow')
        source = uuidToObject(payload['object_uid'])

        if not source:
            return payload

        # we need to update the organization only for NON pending states
        if ('pending_syndication' in wft.getInfoFor(
                source, 'syndication_state') or 'pending_move'
                in wft.getInfoFor(source, 'syndication_move_state')):
            return payload

        if IProxy.providedBy(source):
            return payload

        proxies = referenceable.IReferenceable(source).getRefs(
            relationship='current_syndication_targets')
        organization_title = []
        for proxy in proxies:
            new_organization = getNavigationRootObject(proxy, self.context)
            organization_title.append(new_organization.title_or_id())
        payload['organization_title'] = ','.join(organization_title)

        return payload
Пример #3
0
    def selectedTabs(self, default_tab='index_html', portal_tabs=()):
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        plone_url = getNavigationRootObject(
            self.context, portal).absolute_url()
        plone_url_len = len(plone_url)
        request = self.request
        valid_actions = []

        url = request['URL']
        path = url[plone_url_len:]
        path_list = path.split('/')
        if len(path_list) <= 1:
            return {'portal': default_tab}

        for action in portal_tabs:
            if not action['url'].startswith(plone_url):
                # In this case the action url is an external link. Then, we
                # avoid issues (bad portal_tab selection) continuing with next
                # action.
                continue
            action_path = action['url'][plone_url_len:]
            if not action_path.startswith('/'):
                action_path = '/' + action_path
            action_path_list = action_path.split('/')
            if action_path_list[1] == path_list[1]:
                # Make a list of the action ids, along with the path length
                # for choosing the longest (most relevant) path.
                valid_actions.append((len(action_path_list), action['id']))

        # Sort by path length, the longest matching path wins
        valid_actions.sort()
        if valid_actions:
            return {'portal': valid_actions[-1][1]}

        return {'portal': default_tab}
Пример #4
0
 def remove(self):
     mtool = getToolByName(self.context, 'portal_membership')
     user = mtool.getAuthenticatedMember()
     portal = getToolByName(self.context, 'portal_url').getPortalObject()
     site = getNavigationRootObject(self.context, portal)
     IFavoriteStorage(site).remove_favorite(user.getId(),
                                            IUUID(self.context))
Пример #5
0
    def __init__(self, context, selectable_filter, navigation_tree_query=None):
        self.context = context
        nav_root = getNavigationRootObject(context, None)
        query_builder = getMultiAdapter((nav_root, self),
                                        INavigationQueryBuilder)
        query = query_builder()

        if navigation_tree_query is None:
            navigation_tree_query = {}

        # Copy path from selectable_filter into the navigation_tree_query
        # normally it does not make sense to show elements that wouldn't be
        # selectable anyway and are unneeded to navigate to selectable items
        if ('path' not in navigation_tree_query
                and 'path' in selectable_filter.criteria):
            navigation_tree_query['path'] = selectable_filter.criteria['path']

        query.update(navigation_tree_query)

        self.navigation_tree_query = query
        self.selectable_filter = selectable_filter

        self.catalog = getToolByName(context, "portal_catalog")

        portal_tool = getToolByName(context, "portal_url")
        self.portal_path = portal_tool.getPortalPath()
    def __init__(self, context, selectable_filter, navigation_tree_query=None, default=None, defaultFactory=None):
        self.context = context
        
        nav_root = getNavigationRootObject(context, None)
        query_builder = getMultiAdapter((nav_root, self),
                                        INavigationQueryBuilder)
        query = query_builder()

        if navigation_tree_query is None:
            navigation_tree_query = {}

        # Copy path from selectable_filter into the navigation_tree_query
        # normally it does not make sense to show elements that wouldn't be
        # selectable anyway and are unneeded to navigate to selectable items
        if ('path' not in navigation_tree_query
                and 'path' in selectable_filter.criteria):
            navigation_tree_query['path'] = selectable_filter.criteria['path']

        query.update(navigation_tree_query)

        self.navigation_tree_query = query
        self.selectable_filter = selectable_filter

        self.catalog = getToolByName(context, "portal_catalog")

        portal_tool = getToolByName(context, "portal_url")
        self.portal_path = portal_tool.getPortalPath()

        self._default_terms = []
        if default is not None:
            term = self.getTerm(default)
            self._default_terms = [term]
        elif defaultFactory is not None:
            term = self.getTerm(defaultFactory(context))
            self._default_terms = [term]
Пример #7
0
def get_relateditems_options(context, value, separator, vocabulary_name,
                             vocabulary_view, field_name=None):
    portal = get_portal()
    options = get_ajaxselect_options(portal, value, separator,
                                     vocabulary_name, vocabulary_view,
                                     field_name)
    if IForm.providedBy(context):
        context = context.context
    request = getRequest()
    msgstr = translate(_(u'Search'), context=request)
    options.setdefault('searchText', msgstr)
    msgstr = translate(_(u'Entire site'), context=request)
    options.setdefault('searchAllText', msgstr)
    msgstr = translate(_('tabs_home',
                       default=u'Home'),
                       context=request)
    options.setdefault('homeText', msgstr)
    options.setdefault('folderTypes', ['Folder'])
    options.setdefault(
        'treeVocabularyUrl',
        '{}/@@getVocabulary?name=plone.app.vocabularies.Catalog'.format(
            portal is not None and portal.absolute_url() or '')
    )
    options.setdefault('sort_on', 'sortable_title')
    options.setdefault('sort_order', 'ascending')

    nav_root = getNavigationRootObject(context, portal)
    options['basePath'] = (
        '/'.join(nav_root.getPhysicalPath()) if nav_root else '/'
    )
    options['rootPath'] = (
        '/'.join(portal.getPhysicalPath()) if portal else '/'
    )
    return options
Пример #8
0
def listitems(context,
              portal_type=None,
              recursive=False,
              root=False,
              **kw):
    """
    List items visible to user, as filtered by catalog searchResults(),
    either directly within a path, or recursively in all subfolders; if
    root is specified as a non-False value, then use the navigation root
    as the search path.  Can be filtered on portal_type and on other
    search parameters as keyword arguments.
    """
    site = getSite()
    if root:
        context = getNavigationRootObject(context, site)
    query = {
        'path': {
            'query': '/'.join(context.getPhysicalPath()),
            }
        }
    if not recursive:
        query['path']['depth'] = 1
    if portal_type is not None:
        query['portal_type'] = portal_type
    result = site.portal_catalog.searchResults(
        query,
        **kw
        )
    return {
        'length': len(result),
        'items': remap_result(result),
        }
Пример #9
0
 def test_getNavigationRootObject_no_context(self):
     '''
     If you don't know the context then you also don't know what the
     navigation root is.
     '''
     self.portal = self.layer['portal']
     self.assertEqual(None, getNavigationRootObject(None, self.portal))
Пример #10
0
    def __call__(self, context, query=None):
        parsed = {}
        if query:
            parsed = queryparser.parseFormquery(context, query['criteria'])
            if 'sort_on' in query:
                parsed['sort_on'] = query['sort_on']
            if 'sort_order' in query:
                parsed['sort_order'] = str(query['sort_order'])
        try:
            catalog = getToolByName(context, 'portal_catalog')
        except AttributeError:
            context = getSite()
            catalog = getToolByName(context, 'portal_catalog')

        # If no path is specified check if we are in a sub-site and use that
        # as the path root for catalog searches
        if 'path' not in parsed:
            portal = getToolByName(context, 'portal_url').getPortalObject()
            nav_root = getNavigationRootObject(context, portal)
            if nav_root.getPhysicalPath() != portal.getPhysicalPath():
                parsed['path'] = {
                    'query': '/'.join(nav_root.getPhysicalPath()),
                    'depth': -1
                }
        brains = catalog(**parsed)
        return CatalogVocabulary.fromItems(brains, context)
Пример #11
0
    def __init__(self, context, selectable_filter, navigation_tree_query=None):
        self.context = context
        nav_root = getNavigationRootObject(context, None)
        query_builder = getMultiAdapter((nav_root, self),
                                        INavigationQueryBuilder)
        query = query_builder()

        if navigation_tree_query is None:
            navigation_tree_query = {}

        # Copy path from selectable_filter into the navigation_tree_query
        # normally it does not make sense to show elements that wouldn't be
        # selectable anyway and are unneeded to navigate to selectable items
        if ('path' not in navigation_tree_query
                and 'path' in selectable_filter.criteria):
            navigation_tree_query['path'] = selectable_filter.criteria['path']

        query.update(navigation_tree_query)

        # If we filter by portal_type, make sure those portal types are present
        # in the query, even if they would not appear in the navigation
        if ('portal_type' in query
                and 'portal_type' in selectable_filter.criteria):
            for ptype in selectable_filter.criteria['portal_type']:
                if ptype not in query['portal_type']:
                    query['portal_type'].append(ptype)

        self.navigation_tree_query = query
        self.selectable_filter = selectable_filter

        self.catalog = getToolByName(context, "portal_catalog")

        portal_tool = getToolByName(context, "portal_url")
        self.portal_path = portal_tool.getPortalPath()
Пример #12
0
def get_portal_url(context):
    portal = get_portal()
    if portal:
        root = getNavigationRootObject(context, portal)
        if root:
            return root.absolute_url()
    return ''
Пример #13
0
def listitems(context, portal_type=None, recursive=False, root=False, **kw):
    """
    List items visible to user, as filtered by catalog searchResults(),
    either directly within a path, or recursively in all subfolders; if
    root is specified as a non-False value, then use the navigation root
    as the search path.  Can be filtered on portal_type and on other
    search parameters as keyword arguments.
    """
    site = getSite()
    if root:
        context = getNavigationRootObject(context, site)
    query = {
        'path': {
            'query': '/'.join(context.getPhysicalPath()),
        }
    }
    if not recursive:
        query['path']['depth'] = 1
    if portal_type is not None:
        query['portal_type'] = portal_type
    result = site.portal_catalog.searchResults(query, **kw)
    return {
        'length': len(result),
        'items': remap_result(result),
    }
Пример #14
0
 def getTitle(self):
     from genweb.organs.content.organsfolder import IOrgansfolder
     if IOrgansfolder.providedBy(self.context):
         if self.context.customImage:
             return 'Govern UPC - ' + str(self.context.title)
         else:
             return 'Govern UPC'
     else:
         portal_state = self.context.unrestrictedTraverse(
             '@@plone_portal_state')
         root = getNavigationRootObject(self.context, portal_state.portal())
         physical_path = aq_inner(self.context).getPhysicalPath()
         relative = physical_path[len(root.getPhysicalPath()):]
         for i in range(len(relative)):
             now = relative[:i + 1]
             try:
                 # Some objects in path are in pending state
                 obj = aq_inner(root.restrictedTraverse(now))
             except:
                 # return default image
                 return None
             if IOrgansfolder.providedBy(obj):
                 if self.context.customImage:
                     return 'Govern UPC - ' + str(obj.title)
                 else:
                     return 'Govern UPC'
Пример #15
0
    def is_syndication_auto_approved(self):
        """
        Is syndication approved from the source to this target site and type.
        """
        portal = getToolByName(self.context, 'portal_url').getPortalObject()

        proxy = self.context
        target_site = root.getNavigationRootObject(proxy, portal)

        source = utils.get_proxy_source(proxy)
        source_site = root.getNavigationRootObject(source, portal)

        return source_site in referenceable.IReferenceable(
            target_site).getBRefs(
                relationship=self.RELATIONSHIP_TEMPLATE.format(
                    source.getPortalTypeName()))
Пример #16
0
 def links(self):
     """
     returns list of dict containing icon link, link target, title.
     should only be accessed after calling self.update() (called
     by template should be fine).
     """
     result = []
     portal = self.portal_state.portal()
     navroot = getNavigationRootObject(self.context, portal)
     if navroot is portal:
         return result  # empty links: in non-workspace (indirect) contexts
     result.append({
         'url': self.navigation_root_url,
         'icon': '%s/%s' % (
             self.site_url,
             '++resource++uu.qiext/homefolder.png',
             ),
         'title': u'Go to home workspace / project',
         })
     result.append({
         'url': self.site_url,
         'icon': '%s/%s' % (
             self.site_url,
             '++resource++uu.qiext/go-top.png',
             ),
         'title': u'Go to site root',
         })
     return result
Пример #17
0
def get_relateditems_options(context, value, separator, vocabulary_name,
                             vocabulary_view, field_name=None):
    if IForm.providedBy(context):
        context = context.context
    request = getRequest()
    site = get_top_site_from_url(context, request)
    options = get_ajaxselect_options(site, value, separator,
                                     vocabulary_name, vocabulary_view,
                                     field_name)
    msgstr = translate(_(u'Search'), context=request)
    options.setdefault('searchText', msgstr)
    msgstr = translate(_(u'Entire site'), context=request)
    options.setdefault('searchAllText', msgstr)
    msgstr = translate(_('tabs_home',
                       default=u'Home'),
                       context=request)
    options.setdefault('homeText', msgstr)
    options.setdefault('folderTypes', ['Folder'])
    options.setdefault('sort_on', 'sortable_title')
    options.setdefault('sort_order', 'ascending')

    nav_root = getNavigationRootObject(context, site)
    options['basePath'] = '/'.join(nav_root.getPhysicalPath()) if nav_root else '/'  # noqa
    options['rootPath'] = '/'.join(site.getPhysicalPath()) if site else '/'
    options['rootUrl'] = site.absolute_url() if site else ''
    return options
Пример #18
0
 def links(self):
     """
     returns list of dict containing icon link, link target, title.
     should only be accessed after calling self.update() (called
     by template should be fine).
     """
     result = []
     portal = self.portal_state.portal()
     navroot = getNavigationRootObject(self.context, portal)
     if navroot is portal:
         return result  # empty links: in non-workspace (indirect) contexts
     result.append({
         'url': self.navigation_root_url,
         'icon': '%s/%s' % (
             self.site_url,
             '++resource++collective.teamwork/homefolder.png',
             ),
         'title': u'Go to home workspace / project',
         })
     result.append({
         'url': self.site_url,
         'icon': '%s/%s' % (
             self.site_url,
             '++resource++collective.teamwork/go-top.png',
             ),
         'title': u'Go to site root',
         })
     return result
Пример #19
0
    def get_all_events(self, batch=True):
        # Fall back to default language for local events
        kw = {}
        default_lang = api.portal.get_tool(
            "portal_languages").getDefaultLanguage()
        if ITranslatable.providedBy(self.context):
            if default_lang != self.context.Language():
                portal = getSite()
                trans = ITranslationManager(self.context).get_translation(
                    default_lang)
                root = getNavigationRootObject(trans, portal)
                kw['path'] = '/'.join(root.getPhysicalPath())
                kw['Language'] = [default_lang, '']
        start, end = self._start_end
        sort = 'start'
        sort_reverse = False
        if self.mode in ('past', 'all'):
            sort_reverse = True
        expand = True
        local_events = get_events(
            self.context, start=start, end=end, sort=sort,
            sort_reverse=sort_reverse, ret_mode=RET_MODE_ACCESSORS,
            expand=expand, **kw)

        remote_events = self._remote_events()
        reverse = self.mode == 'past'
        all_events = sorted(local_events + remote_events, key=lambda x: x.start, reverse=reverse)
        if batch:
            b_start = self.b_start
            b_size = self.b_size
            res = Batch(all_events, size=b_size, start=b_start, orphan=self.orphan)
        else:
            res = all_events
        return res
Пример #20
0
    def selectedTabs(self, default_tab='index_html', portal_tabs=()):
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        plone_url = getNavigationRootObject(self.context, portal).absolute_url()
        plone_url_len = len(plone_url)
        request = self.request
        valid_actions = []

        url = request['URL']
        path = url[plone_url_len:]
        path_list = path.split('/')
        if len(path_list) <= 1:
            return {'portal': default_tab}

        for action in portal_tabs:
            if not action['url'].startswith(plone_url):
                # In this case the action url is an external link. Then, we
                # avoid issues (bad portal_tab selection) continuing with next
                # action.
                continue
            action_path = action['url'][plone_url_len:]
            if not action_path.startswith('/'):
                action_path = '/' + action_path
            action_path_list = action_path.split('/')
            if action_path_list[1] == path_list[1]:
                # Make a list of the action ids, along with the path length
                # for choosing the longest (most relevant) path.
                valid_actions.append((len(action_path_list), action['id']))

        # Sort by path length, the longest matching path wins
        valid_actions.sort()
        if valid_actions:
            return {'portal': valid_actions[-1][1]}

        return {'portal': default_tab}
Пример #21
0
def downloadImage(self, url):
    """ Get remote image data and store.
    """
    # check if the image is inside the Plone site
    site = getSite()
    if url.startswith(site.absolute_url()) and not '@@practice' in url:
        image_url_parts = urlparse.urlparse(url)
        # we strip the leading slash since we are traversing from the
        # site root
        path = image_url_parts.path[1:]

        # get the navigation root which might be different to the site
        context = aq_inner(site.REQUEST.PARENTS[0])
        navroot = getNavigationRootObject(context, site)

        # check for ImageScaling view
        if '/@@images/' in path:
            path, name = path.split('/@@images/')
            scalingview = navroot.restrictedTraverse(path + '/@@images/')
            imagescale = scalingview.publishTraverse(site.REQUEST, name)
            io = cStringIO.StringIO(imagescale.data)
        else:
            image = navroot.restrictedTraverse(path)
            io = cStringIO.StringIO(image.getImage().data)
        return PIL.Image.open(io)
    else:
        req = urllib2.Request(url)
        try:
            response = urllib2.urlopen(req)
        except urllib2.HTTPError:
            raise NotFound('The URL:%s could not be found' %url)
        data = response.read()
        io = cStringIO.StringIO(data)
        return PIL.Image.open(io)
Пример #22
0
    def filterTabs(self, tabs):
        """
        Filter out portal tabs.
        """

        portal_state = getMultiAdapter((self.context, self.request),
                                           name='plone_portal_state')

        root = getNavigationRootObject(self.context, portal_state.portal())
        allowed_items = getMenuItemIds(root)

        if not allowed_items:
            # Filter / reorder not enabled for this nav root
            return tabs

        filtered = []

        for tab in tabs:
            if tab.get("category", None):
                # This is manually set tab in portal_tabs
                # Never filter out
                filtered.append(tab)
                continue

        # Reorder the remaining according to
        # the menu item order set in the settings
        for allowed in allowed_items:
            for tab in tabs:

                # Check if catalog brain id is on the allowed items list
                if tab["id"] == allowed:
                    filtered.append(tab)

        return filtered
Пример #23
0
    def __init__(self, *args):
        base.Renderer.__init__(self, *args)

        portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state')
        self.navigation_root_url = portal_state.navigation_root_url()
        self.portal = portal_state.portal()
        self.navigation_root_path = portal_state.navigation_root_path()
        self.navigation_root_object = getNavigationRootObject(self.context, self.portal)
    def _data(self):
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        site = getNavigationRootObject(self.context, portal)
        suggestions_list = ISuggestionsStorage(site).list_suggestions()

        suggestions_infos = self.get_suggestions_infos(self.context, suggestions_list)
        suggestions_infos.sort(key=lambda x: x['index'])
        return suggestions_infos
Пример #25
0
 def all_news_link(self):
     context = aq_inner(self.context)
     portal_state = getMultiAdapter((context, self.request),
                                    name='plone_portal_state')
     portal = portal_state.portal()
     if 'news' in getNavigationRootObject(context, portal).objectIds():
         return '%s/news' % portal_state.navigation_root_url()
     return None
Пример #26
0
def get_calendar_url(context, link_base, view_name=None):
    portal = api.portal.get()
    calendar_url = None
    if link_base:
        navigation_root = getNavigationRootObject(context, portal)
        link_base = '/'.join(link_base.split('/')[2:])
        calendar_url = navigation_root.unrestrictedTraverse(
            link_base.lstrip('/')  # start relative, first slash is omitted
        ).absolute_url()
    else:
        navigation_root = getNavigationRootObject(context, portal)
        calendar_url = navigation_root.absolute_url()

    if view_name:
        calendar_url = '{}/{}'.format(calendar_url, view_name)

    return calendar_url
Пример #27
0
 def all_news_link(self):
     context = aq_inner(self.context)
     portal_state = getMultiAdapter((context, self.request),
         name=u'plone_portal_state')
     portal = portal_state.portal()
     if 'news' in getNavigationRootObject(context, portal).objectIds():
         return '%s/news' % portal_state.navigation_root_url()
     return None
Пример #28
0
    def __init__(self, *args):
        base.Renderer.__init__(self, *args)

        portal_state = getMultiAdapter(
            (self.context, self.request), name='plone_portal_state')
        self.navigation_root_url = portal_state.navigation_root_url()
        self.portal = portal_state.portal()
        self.navigation_root_path = portal_state.navigation_root_path()
        self.navigation_root_object = getNavigationRootObject(self.context, self.portal)
Пример #29
0
 def section(self, context):
     """gets section from which subjects are used."""
     registry = queryUtility(IRegistry)
     if registry is None:
         return None
     if registry.get("plone.subjects_of_navigation_root", False):
         portal = getToolByName(context, "portal_url").getPortalObject()
         return getNavigationRootObject(context, portal)
     return None
Пример #30
0
 def test_getNavigationRootObject_no_context(self):
     '''
     If you don't know the context then you also don't know what the
     navigation root is.
     '''
     self.assertEqual(
         None,
         getNavigationRootObject(None, self.portal)
     )
Пример #31
0
 def remove(self):
     request = self.request
     view = request.get('view', '')
     portal = getToolByName(self.context, 'portal_url').getPortalObject()
     site = getNavigationRootObject(self.context, portal)
     ISuggestionsStorage(site).remove_suggestion(id=IUUID(self.context))
     IStatusMessage(self.request).addStatusMessage(
                 _("The element has been removed from suggestions"))
     self.request.response.redirect(self.context.absolute_url() + '/' + view)
    def __init__(self, *args):
        base.Renderer.__init__(self, *args)

        portal_state = getMultiAdapter((self.context, self.request), name=u"plone_portal_state")
        self.navigation_root_url = portal_state.navigation_root_url()
        self.portal = portal_state.portal()
        self.navigation_root_path = portal_state.navigation_root_path()

        self.have_events_folder = "events" in getNavigationRootObject(self.context, self.portal).objectIds()
Пример #33
0
 def get_language(self):
     language = self.context.Language()
     portal_factory = getToolByName(self, 'portal_factory', None)
     if portal_factory is not None and portal_factory.isTemporary(self):
         navroot = getNavigationRootObject(self.context, getSite())
         if navroot != self.context:
             language = ILanguage(navroot).get_language()
     if not language:
         language = LANGUAGE_INDEPENDENT
     return language
Пример #34
0
 def get_privacy_link(self):
     portal = api.portal.get()
     root = getNavigationRootObject(self.context, portal)
     document = root.restrictedTraverse(PRIVACY_POLICY_NAME, None)
     if document:
         return document.absolute_url()
     else:
         log.error('Privacy policy document "{0}" not found under {1}'.format(
             PRIVACY_POLICY_NAME, root.absolute_url()))
         return ""
Пример #35
0
def navigation_root_uuid(obj):
    """
    Return the UUID for the navigation root.
    """
    portal_url = getToolByName(obj, 'portal_url')
    portal = portal_url.getPortalObject()
    nav_root = root.getNavigationRootObject(obj, portal)
    if nav_root is portal:
        return
    return uuid_ifaces.IUUID(nav_root)
Пример #36
0
 def section(self, context):
     """gets section from which subjects are used.
     """
     registry = queryUtility(IRegistry)
     if registry is None:
         return None
     if registry.get('plone.subjects_of_navigation_root', False):
         portal = getToolByName(context, 'portal_url').getPortalObject()
         return getNavigationRootObject(context, portal)
     return None
Пример #37
0
 def __init__(self, context, request):
     self.context = context
     self.request = request
     self.settings = getUtility(IRegistry).forInterface(ITinyMCESchema,
                                                        prefix="plone",
                                                        check=False)
     self.nav_root = getNavigationRootObject(
         self.context,
         get_portal(),
     )
     self.nav_root_url = self.nav_root.absolute_url()
 def _findNavRoots(self, navroot, portal):
     """Find all the nav roots going up the tree
     """
     navroot_ids = []
     while True:
         if navroot.meta_type == 'Plone Site':
             break
         navroot_ids.append(navroot.getId())
         navroot = getNavigationRootObject(utils.parent(navroot), portal)
     navroot_ids.reverse()
     return navroot_ids
Пример #39
0
 def getItem(self, tab):
     site = getNavigationRootObject(self.context, getSite())
     context = aq_inner(self.context)
     if tab.get('available'):
         item = site
     else:
         item = site.restrictedTraverse(tab['id'])
     #def_page = getDefaultPage(item)
     #if def_page:
         #item = item.restrictedTraverse(def_page)
     return item
Пример #40
0
def get_theming_css_url(context):
    """Returns the theming.css URL for a context, relative to
    its navigation root.
    Cachekey params may be added.
    """
    portal = getToolByName(context, "portal_url").getPortalObject()
    navroot = getNavigationRootObject(context, portal)
    css_url = "{0}/theming.css".format(navroot.absolute_url())
    cachekey = get_css_cache_key(context)
    if cachekey:
        css_url += "?cachekey={0}".format(cachekey)
    return css_url
Пример #41
0
def get_portal_events(context, range_start=None, range_end=None, limit=None,
                      sort='start', sort_reverse=False, **kw):
    """Return all events as catalog brains, possibly within a given
    timeframe.

    :param context: [required] A context object.
    :type context: Content object
    :param range_start: Date, from which on events should be searched.
    :type range_start: Python datetime.
    :param range_end: Date, until which events should be searched.
    :type range_end: Python datetime
    :param limit: Number of items to be returned.
    :type limit: integer
    :param sort: Catalog index id to sort on.
    :type sort: string
    :param sort_reverse: Change the order of the sorting.
    :type sort_reverse: boolean
    :returns: Portal events, matching the search criteria.
    :rtype: catalog brains

    """
    range_start, range_end = _prepare_range(context, range_start, range_end)

    query = {}
    query['object_provides'] = IEvent.__identifier__

    if 'path' not in kw:
        # limit to the current navigation root, usually (not always) site
        portal = getSite()
        navroot = getNavigationRootObject(context, portal)
        query['path'] = navroot.getPhysicalPath()

    if range_start:
        # All events from range_start ongoing:
        # The minimum end date must be the date from which we search.
        query['end'] = {'query': range_start, 'range': 'min'}
    if range_end:
        # All events until range_end:
        # The maximum start date must be the date until we search.
        query['start'] = {'query': range_end, 'range': 'max'}
    query['sort_on'] = sort
    if sort_reverse: query['sort_order'] = 'reverse'

    query.update(kw)

    cat = getToolByName(context, 'portal_catalog')
    if limit:
        query['sort_limit'] = limit
        result = cat(**query)[:limit]
    else:
        result = cat(**query)

    return result
Пример #42
0
 def all_news_link(self):
     context = aq_inner(self.context)
     portal_state = getMultiAdapter((context, self.request),
                                    name='plone_portal_state')
     portal = portal_state.portal()
     menu = portal['menu-principal']
     if 'noticies' in getNavigationRootObject(context, portal).objectIds():
         return '%s/noticies/noticies' % portal_state.navigation_root_url()
     elif 'noticies' in menu.objectIds():
         return '%s/menu-principal/noticies' % portal_state.navigation_root_url(
         )
     return None
Пример #43
0
def get_portal_url(context):
    portal = get_portal()
    if portal:
        root = getNavigationRootObject(context, portal)
        if root:
            try:
                return root.absolute_url()
            except AttributeError:
                return portal.absolute_url()
        else:
            return portal.absolute_url()
    return ''
Пример #44
0
    def get_footer(self):
        root = getNavigationRootObject(self.context, self.portal)
        #lang = self.context.Language()
        lang = getToolByName(self.context,
                            'portal_languages').getPreferredLanguage()
        #print "Langage : %s" % lang
        doc_ids = ['footer-%s' % lang, 'footer']

        for doc_id in doc_ids:
            if doc_id in root.contentIds():
                return get_document(root, doc_id)
        return self.get_site_map()
Пример #45
0
    def __init__(self, context, request):
        super(SiteRootView, self).__init__(context, request)

        self.portal_state = getMultiAdapter(
            (aq_inner(self.context), self.request),
            name='plone_portal_state'
        )
        self.nav_root = getNavigationRootObject(
            context,
            self.portal_state.portal()
        )
        self.is_simple_site = ISimpleSite.providedBy(self.nav_root)
Пример #46
0
 def add(self):
     request = self.request
     mtool = getToolByName(self.context, 'portal_membership')
     user = mtool.getAuthenticatedMember()
     view = request.get('view', '')
     portal = getToolByName(self.context, 'portal_url').getPortalObject()
     site = getNavigationRootObject(self.context, portal)
     IFavoriteStorage(site).add_favorite(user.getId(),
             id=IUUID(self.context),
             type='uid',
             view=view,
             date=datetime.now())
Пример #47
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        # Retrieve list_id either from a hidden field in the form or fetch
        # the first list from mailchimp.
        list_id = data.get('list_id') or self.mailchimp.default_list_id()
        # list_id has to be updated for merge_fields=data to work if None
        if "list_id" in data and not data.get('list_id'):
            data['list_id'] = list_id

        # interest groups
        interests = {}
        interest_groups = data.pop('interest_groups', [])
        if self.available_interest_groups and interest_groups:
            # Create dictionary with as keys the interest groups, and as
            # values always True.
            interests = dict.fromkeys(interest_groups, True)

        # Use email_type if one is provided by the form, if not choose the
        # default email type from the control panel settings.
        email_type = data.get(
            'email_type') or self.mailchimp_settings.email_type

        # Subscribe to MailChimp list
        try:
            self.mailchimp.subscribe(
                list_id=list_id,
                email_address=data['email'],
                email_type=email_type,
                interests=interests,
                merge_fields=data,
            )
        except MailChimpException as error:
            return self.handle_error(error, data)

        if self.mailchimp_settings.double_optin:
            message = _(
                u"We have to confirm your email address. In order to " +
                u"finish the newsletter subscription, click on the link " +
                u"inside the email we just send you.")
        else:
            message = _(
                u"You have been subscribed to our newsletter succesfully.")

        IStatusMessage(self.context.REQUEST).addStatusMessage(message,
                                                              type="info")
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        site = getNavigationRootObject(self.context, portal)
        self.request.response.redirect(site.absolute_url())
Пример #48
0
    def getRowForm(self, row, action='save'):
        """
        Delegate each row to a separate form.
        """
        # Assemble a form submission from the row
        request = self.request.clone()
        for idx, header_cell in enumerate(self.header):
            key = header_cell.internal_value
            request.form[key] = row[idx].internal_value

        # Process the path before processing the form
        container_path = request.form.pop('path', '').strip()
        nav = self.context
        if container_path.startswith('/'):
            # Start at the portal root
            container_path = container_path[1:]
            portal = getToolByName(self.context,
                                   'portal_url').getPortalObject()
            nav = root.getNavigationRootObject(self.context, portal)
        container = nav.restrictedTraverse(str(container_path))

        portal_type = request.form.pop('portal_type')
        if portal_type not in self.types:
            raise ValueError('TODO Validation error on type')
        info = self.types[portal_type]

        # Lookup a form for the individual row
        id_ = request.form.pop('get', '').strip()
        if id_ and id_ in container:
            # Lookup the form based on existing content
            context = container[id_]
            if context.getPortalTypeName() != portal_type:
                # Replace existing content of a different type
                # TODO make configurable to raise a validation error
                container.manage_delObjects([id_])
                row_form = component.getMultiAdapter(
                    (container, request, info), interfaces.IRowAddForm)
            else:
                # Update existing content
                # TODO make configurable to raise a validation error
                row_form = component.getMultiAdapter((context, request),
                                                     interfaces.IRowEditForm)
        else:
            # Lookup the form based on the content type
            row_form = component.getMultiAdapter((container, request, info),
                                                 interfaces.IRowAddForm)

        row_form.update()
        action = row_form.actions[action]
        row_form.request.form[action.name] = True

        return row_form
Пример #49
0
    def update(self):
        mtool = getToolByName(self.context, 'portal_membership')
        self.anonymous = mtool.isAnonymousUser()
        if self.anonymous:
            return

        user_id = mtool.getAuthenticatedMember().getId()
        super(SwitchFavorite, self).update()
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        site = getNavigationRootObject(self.context, portal)
        self.template = self.request.steps[-1]
        self.isfavorite = IFavoriteStorage(site).is_favorite(user_id,
                                                             IUUID(self.context))
Пример #50
0
    def handle_unsubscribe(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        list_id = data.get('list_id') or self.mailchimp.default_list_id()
        email = data['email']

        update_data = {}
        if data.get('unsubscribe'):
            update_data['status'] = 'unsubscribed'
        else:
            interest_groups = {}
            if data.get('interest_groups'):
                for group in data.get('interest_groups', []):
                    interest_groups[group] = False
                update_data['interests'] = interest_groups

        try:
            self.mailchimp.update_subscriber(list_id,
                                             email_address=email,
                                             **update_data)
        except MailChimpException as error:
            if error.code != 404:
                # If a subscriber did not exist we don't want to announce
                # it. Treat only != 404 as an error.
                IStatusMessage(self.request).addStatusMessage(
                    _(
                        u'mailchimp_unsubscribe_error_msg',
                        default=u'We could not unsubscribe you from '
                        u'the newsletter. '
                        u"Please contact the site administrator: "
                        u"'${error}'",
                        mapping={u"error": error},
                    ),
                    type="info",
                )

        IStatusMessage(self.request).addStatusMessage(
            _(
                u'mailchimp_unsubscribed_msg',
                default=(u'Thank you. You have been unsubscribed from '
                         u'the Newsletter.'),
            ),
            type="info",
        )

        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        site = getNavigationRootObject(self.context, portal)
        self.request.response.redirect(site.absolute_url())
Пример #51
0
 def _root(self):
     # This is only called if the instance doesn't have a root_uid
     # attribute, which is probably because it has an old 'root'
     # attribute that needs to be converted.
     root = self.root
     if not root:
         return None
     portal = getToolByName(self, 'portal_url').getPortalObject()
     navroot = getNavigationRootObject(self, portal)
     try:
         root = navroot.unrestrictedTraverse(root.lstrip('/'))
     except (AttributeError, KeyError, TypeError, NotFound):
         return
     return root.UID()
Пример #52
0
 def update(self):
     context = self.context
     portal = getToolByName(context, 'portal_url').getPortalObject()
     common.ViewletBase.update(self)  # Get portal_state and portal_url
     super(DropdownMenuViewlet, self).update()
     portal_props = getToolByName(context, 'portal_properties')
     self.properties = portal_props.navtree_properties
     self.dropdown_properties = portal_props.dropdown_properties
     self.enable_caching = self.dropdown_properties.getProperty(
         'enable_caching', False)
     self.enable_parent_clickable = self.dropdown_properties.getProperty(
         'enable_parent_clickable', True)
     self.data = Assignment(root=getNavigationRoot(context))
     self.root_url=getNavigationRootObject(context, portal).absolute_url()
Пример #53
0
def get_navigation_root(context=None):
    """Get the navigation root object for the context.

    This traverses the path up and returns the nearest navigation root.
    Useful for multi-lingual installations and sites with subsites.

    :param context: [required] Context on which to get the navigation root.
    :type context: context object
    :returns: Navigation Root
    :rtype: Portal object
    :Example: :ref:`portal_get_navigation_root_example`
    """
    context = aq_inner(context)
    return getNavigationRootObject(context, get())
Пример #54
0
def get_relateditems_options(context,
                             value,
                             separator,
                             vocabulary_name,
                             vocabulary_view,
                             field_name=None):

    if IForm.providedBy(context):
        context = context.context

    request = getRequest()
    site = get_top_site_from_url(context, request)
    options = get_ajaxselect_options(site, value, separator, vocabulary_name,
                                     vocabulary_view, field_name)

    nav_root = getNavigationRootObject(context, site)

    # basePath - start to search/browse in here.
    base_path_context = context
    if not IFolder.providedBy(base_path_context):
        base_path_context = aq_parent(base_path_context)
    if not base_path_context:
        base_path_context = nav_root
    options['basePath'] = '/'.join(base_path_context.getPhysicalPath())

    # rootPath - Only display breadcrumb elements deeper than this path.
    options['rootPath'] = '/'.join(site.getPhysicalPath()) if site else '/'

    # rootUrl: Visible URL up to the rootPath. This is prepended to the
    # currentPath to generate submission URLs.
    options['rootUrl'] = site.absolute_url() if site else ''

    # contextPath - current edited object. Will not be available to select.
    options['contextPath'] = '/'.join(context.getPhysicalPath())

    if base_path_context != nav_root:
        options['favorites'] = [
            {
                # 'title': _(u'Current Content'),
                'title': u'Aktueller Inhalt',
                'path': '/'.join(base_path_context.getPhysicalPath())
            },
            {
                'title': _(u'Start Page'),
                'path': '/'.join(nav_root.getPhysicalPath())
            }
        ]

    return options