def update(self):
        super(SubsiteLogoViewlet, self).update()

        navroot = api.portal.get_navigation_root(self.context)
        is_subsite = bool(navroot.portal_type == 'ftw.subsite.Subsite')

        self.navigation_root_url = self.portal_state.navigation_root_url()

        subsite_logo = getattr(navroot, 'logo', None)
        subsite_logo_alt_text = getattr(navroot, 'logo_alt_text', None)

        if is_subsite and subsite_logo and subsite_logo.data:
            # we are in a subsite
            context = self.context
            if not IContentish.providedBy(context):
                context = context.aq_parent
            navigation_root_path = getNavigationRoot(context)
            scale = navroot.restrictedTraverse(
                navigation_root_path + '/@@images')

            self.logo_tag = scale.scale('logo', scale="logo").tag(
                alt=subsite_logo_alt_text, title=None)
            self.title = self.context.restrictedTraverse(
                getNavigationRoot(self.context)).Title()
            self.is_subsitelogo = True
        else:
            # standard plone logo
            portal = api.portal.get()
            logoName = navroot.restrictedTraverse('base_properties').logoName
            logo_alt_text = portal.getProperty('logo_alt_text', '')
            self.logo_tag = portal.restrictedTraverse(logoName).tag(
                alt=logo_alt_text, title='')
            self.title = self.portal_state.portal_title()
示例#2
0
    def update(self):
        super(SubsiteLogoViewlet, self).update()

        portal = self.portal_state.portal()
        self.navigation_root_url = self.portal_state.navigation_root_url()

        subsite_logo = getattr(self.context, 'logo', None)
        subsite_logo_alt_text = getattr(self.context, 'logo_alt_text', None)

        if subsite_logo and subsite_logo.data:
            # we are in a subsite
            context = self.context
            if not IContentish.providedBy(context):
                context = context.aq_parent
            navigation_root_path = getNavigationRoot(context)
            scale = portal.restrictedTraverse(navigation_root_path +
                                              '/@@images')

            self.logo_tag = scale.scale('logo', scale="logo").tag(
                alt=subsite_logo_alt_text, title=None)
            self.title = self.context.restrictedTraverse(
                getNavigationRoot(self.context)).Title()
            self.is_subsitelogo = True
        else:
            # standard plone logo
            logoName = portal.restrictedTraverse('base_properties').logoName
            logo_alt_text = portal.getProperty('logo_alt_text', '')
            self.logo_tag = portal.restrictedTraverse(logoName).tag(
                alt=logo_alt_text, title='')
            self.title = self.portal_state.portal_title()
示例#3
0
def get_organizations_by_target(context, uids):
    members = getToolByName(context, 'portal_membership').getMembersFolder()
    portal_catalog = getToolByName(context, 'portal_catalog')
    uid_catalog = getToolByName(context, 'uid_catalog')
    home_folder_path = members is not None and '/'.join(
        members.getPhysicalPath())
    context_path = '/'.join(context.getPhysicalPath())

    organizations = [
        brain.getObject()
        for brain in uid_catalog(UID=uids)
    ]
    result = {}
    for organization in organizations:
        if organization is None:
            continue
        organization_path = getNavigationRoot(organization)
        if members is not None and context_path.startswith(home_folder_path):
            # Special-case the member's home folder, since it is not a
            # navigation root but we still want to be able to request
            # syndication to the containing portal
            pass
        elif organization_path == getNavigationRoot(context):
            # Always exclude the current organization
            continue
        targets = portal_catalog(
            path=organization_path,
            object_provides=behaviors.ISyndicationTarget.__identifier__)
        for target in targets:
            if getNavigationRoot(target.getObject()) == organization_path:
                result[organization] = target.getObject()

    return result
示例#4
0
    def __init__(self, context, portlet):
        self.context = context
        self.portlet = portlet

        portal_properties = getToolByName(context, 'portal_properties')
        navtree_properties = getattr(portal_properties, 'navtree_properties')

        portal_url = getToolByName(context, 'portal_url')

        portal_languages = getToolByName(context, 'portal_languages')

        # Acquire a custom nav query if available
        customQuery = getattr(context, 'getCustomNavQuery', None)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}
        #import pdb;pdb.set_trace()
        # Construct the path query
        preferred_path = "/%s" % portal_languages.getPreferredLanguage()

        rootPathX = getNavigationRoot(context, relativeRoot=portlet.root)
        rootPathY = getNavigationRoot(context, relativeRoot=preferred_path)

        rootPath = portal_url.getPortalPath()+preferred_path

        print "X: portlet.root based. rootPath: %s, portlet.root: %s" %(rootPathX, portlet.root)
        print "Y: preferred_path based. rootPath: %s, preferred_path: %s" %(rootPathY, preferred_path)
        print "Current: rootPath+preferred_path: %s %s" %(rootPath, preferred_path)

        currentPath = '/'.join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        query['path'] = {'query' : rootPath, 'navtree' : 1, 'navtree_start': 1}

        topLevel = portlet.topLevel or navtree_properties.getProperty('topLevel', 0)
        topLevel = 0

        # Only list the applicable types
        query['portal_type'] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        # Filter on workflow states, if enabled
        if navtree_properties.getProperty('enable_wf_state_filtering', False):
            query['review_state'] = navtree_properties.getProperty('wf_states_to_show', ())

        self.query = query
示例#5
0
    def test_navigation_root_path(self):
        self.assertEqual(self.view.navigation_root_path(), "/plone")
        self.assertEqual(self.view.navigation_root_path(), getNavigationRoot(self.folder))

        # mark a folder "between" self.folder and self.portal with
        # INavigationRoot
        members = self.portal["Members"]
        zope.interface.alsoProvides(members, INavigationRoot)
        view = members.restrictedTraverse("@@plone_portal_state")
        self.assertEqual(view.navigation_root_path(), "/plone/Members")
        self.assertEqual(view.navigation_root_path(), getNavigationRoot(self.folder))
示例#6
0
    def test_navigation_root_path(self):
        self.assertEquals(self.view.navigation_root_path(), '/plone')
        self.assertEquals(self.view.navigation_root_path(), getNavigationRoot(self.folder))

        # mark a folder "between" self.folder and self.portal with
        # INavigationRoot
        members = self.portal['Members']
        zope.interface.alsoProvides(members, INavigationRoot)
        view = members.restrictedTraverse('@@plone_portal_state')
        self.assertEquals(view.navigation_root_path(),
                         '/plone/Members')
        self.assertEquals(view.navigation_root_path(), getNavigationRoot(self.folder))
示例#7
0
    def update(self):
        super(ZugSiteActions, self).update()
        portal_root = getToolByName(self.context,'portal_url').getPortalObject()
        nav_root = getNavigationRoot(self.context)

        if nav_root != '/'.join(portal_root.getPhysicalPath()):
            parent_nav_root = getNavigationRoot(aq_parent(self.context.restrictedTraverse(nav_root)))
            parent_obj = self.context.restrictedTraverse(parent_nav_root)
        else:
            parent_obj = portal_root

        self.backtoparent_link = parent_obj.absolute_url()
        self.backtoparent_title = getattr(parent_obj,'title',',Kanton Zug')
示例#8
0
    def test_navigation_root_url(self):
        url = self.app.REQUEST.physicalPathToURL(getNavigationRoot(self.folder))
        self.assertEqual(self.view.navigation_root_url(), "http://nohost/plone")
        self.assertEqual(self.view.navigation_root_url(), url)

        # mark a folder "between" self.folder and self.portal with
        # INavigationRoot
        members = self.portal["Members"]
        zope.interface.alsoProvides(members, INavigationRoot)
        view = members.restrictedTraverse("@@plone_portal_state")
        self.assertEqual(view.navigation_root_url(), "http://nohost/plone/Members")
        url = self.app.REQUEST.physicalPathToURL(getNavigationRoot(members))
        self.assertEqual(view.navigation_root_url(), url)
示例#9
0
    def test_navigation_root_url(self):
        url = self.app.REQUEST.physicalPathToURL(getNavigationRoot(self.folder))
        self.assertEquals(self.view.navigation_root_url(), 'http://nohost/plone')
        self.assertEquals(self.view.navigation_root_url(), url)

        # mark a folder "between" self.folder and self.portal with
        # INavigationRoot
        members = self.portal['Members']
        zope.interface.alsoProvides(members, INavigationRoot)
        view = members.restrictedTraverse('@@plone_portal_state')
        self.assertEquals(view.navigation_root_url(),
                          'http://nohost/plone/Members')
        url = self.app.REQUEST.physicalPathToURL(getNavigationRoot(members))
        self.assertEquals(view.navigation_root_url(), url)
示例#10
0
    def send_feedback(self, recipient, subject, message, sender):
        """Send a feedback email to the email address defined in subsite.
        """
        mh = getToolByName(self.context, 'MailHost')
        portal = getToolByName(self.context, 'portal_url').getPortalObject()
        nav_root = None
        if not '/'.join(portal.getPhysicalPath()) == getNavigationRoot(
                self.context):
            nav_root = self.context.restrictedTraverse(
                getNavigationRoot(self.context))
        if nav_root:
            site_title = nav_root.Title()
            site_url = nav_root.absolute_url()
        else:
            site_title = portal.Title()
            site_url = portal.absolute_url()

        text = translate(
            u'feedback_mail_text',
            domain='ftw.subsite',
            default=
            '${sender} sends you a message from your site ${site_title}(${site_url}):\n${msg}',
            context=self.request,
            mapping={
                'sender': "%s (%s)" % (sender, recipient),
                'msg': message,
                'site_title': site_title,
                'site_url': site_url
            })

        # create the message root with from, to, and subject headers
        msg = MIMEText(text.encode('windows-1252'), 'plain', 'windows-1252')
        msg['Subject'] = Header(subject, 'windows-1252')

        default_from_name = portal.getProperty('email_from_name', '')
        default_from_email = portal.getProperty('email_from_address', '')

        if nav_root:
            email_from_name = nav_root.from_name or default_from_name
            email_from_email = nav_root.from_email or default_from_email
        else:
            email_from_name = default_from_name
            email_from_email = default_from_email
        msg['From'] = "%s <%s>" % (email_from_name, email_from_email)

        msg['reply-to'] = "%s <%s>" % (sender, recipient)

        # send the message
        mh.send(msg, mto=email_from_email, mfrom=[email_from_email])
示例#11
0
    def update(self):
        super(ZugSiteActions, self).update()
        portal_root = getToolByName(self.context,
                                    'portal_url').getPortalObject()
        nav_root = getNavigationRoot(self.context)

        if nav_root != '/'.join(portal_root.getPhysicalPath()):
            parent_nav_root = getNavigationRoot(
                aq_parent(self.context.restrictedTraverse(nav_root)))
            parent_obj = self.context.restrictedTraverse(parent_nav_root)
        else:
            parent_obj = portal_root

        self.backtoparent_link = parent_obj.absolute_url()
        self.backtoparent_title = getattr(parent_obj, 'title', ',Kanton Zug')
示例#12
0
 def getTagOccurrences(self, portlet):
     portlet_data = portlet
     types = self.getSearchTypes(portlet)
     tags = self.getSearchSubjects(portlet)
     catalog = getToolByName(self.context, 'portal_catalog')
     filterTags = portlet_data.filterSubjects
     tagOccs = {}
     query = {}
     L = []
     query['portal_type'] = ['Post','Author']
     query['path'] = getNavigationRoot(self.context)
     if portlet_data.wfStates:
         query['review_state'] = portlet_data.wfStates
     for tag in tags:
         result = []
         if filterTags:
             query['Subject'] = {'query': filterTags+[tag],
                                 'operator': 'and'}
         else:
             query['Subject'] = tag
         result = catalog.searchResults(**query)
         if result:
             tagOccs[tag] = len(result)
             for i in result:
                 L.append(i)
             
     tagOccs['result'] = L
     return tagOccs
    def solr_query_builder(self, fdata, pquery):
        """ build query for solr search """
        fdata.update(self.get_request_data())
        query = dict([(k, self.safe_subject_encode(k, v)) for k, v \
            in fdata.items() if k not in self.ignored_keys])
        or_exclude = set(self.OR_exclude()).union(query.keys())
        or_q = dict([(k, v.get('query', v)) for k, v in pquery.items() \
            if k not in or_exclude])
        query.update(or_q)

        # special case for event listing filter
        if fdata.get(self.start_filter):
            st = DateTime(fdata[self.start_filter]).earliestTime()
            se = DateTime(fdata[self.start_filter]).latestTime()
            query.update({'start': {'query': [st, se], 'range': 'minmax'}})
        elif pquery.get('start'):
            query.update({'start': pquery['start']})

        # portal type
        if fdata.get('portal_type') or pquery.get('portal_type'):
            query.update({'portal_type': fdata.get('portal_type') or \
                pquery.get('portal_type')})

        # path
        query.update({'path': fdata.get('path') or pquery.get('path') or \
            getNavigationRoot(self.context)})

        return query
示例#14
0
    def navigationTreeRootPath(self):
        context = aq_inner(self.context)

        portal_properties = getToolByName(context, 'portal_properties')

        navtree_properties = getattr(portal_properties, 'navtree_properties')

        currentFolderOnlyInNavtree = navtree_properties.getProperty('currentFolderOnlyInNavtree', False)
        if currentFolderOnlyInNavtree:
            if context.restrictedTraverse('@@plone').isStructuralFolder():
                return '/'.join(context.getPhysicalPath())
            else:
                return '/'.join(utils.parent(context).getPhysicalPath())

        rootPath = getNavigationRoot(context)

        # Adjust for topLevel
        topLevel = navtree_properties.getProperty('topLevel', None)
        if topLevel is not None and topLevel > 0:
            contextPath = '/'.join(context.getPhysicalPath())
            if not contextPath.startswith(rootPath):
                return None
            contextSubPathElements = contextPath[len(rootPath)+1:].split('/')
            if len(contextSubPathElements) < topLevel:
                return None
            rootPath = rootPath + '/' + '/'.join(contextSubPathElements[:topLevel])

        return rootPath
示例#15
0
    def _getNavQuery(self):
        context = self.context
        navtree_properties = self.navtree_properties

        customQuery = getattr(context, 'getCustomNavQuery', False)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        rootPath = getNavigationRoot(context)
        query['path'] = {'query': rootPath, 'depth': 1}

        blacklist = navtree_properties.getProperty('metaTypesNotToList', ())
        all_types = self.portal_catalog.uniqueValuesFor('portal_type')
        query['portal_type'] = [t for t in all_types if t not in blacklist]

        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        if navtree_properties.getProperty('enable_wf_state_filtering', False):
            query['review_state'] = navtree_properties.getProperty(
                                                    'wf_states_to_show', [])

        query['is_default_page'] = False

        if self.site_properties.getProperty('disable_nonfolderish_sections',
                                            False):
            query['is_folderish'] = True

        return query
示例#16
0
def getRootPath(context, currentFolderOnly, topLevel, root):
    """Helper function to calculate the real root path."""
    context = aq_inner(context)
    if currentFolderOnly:
        folderish = getattr(aq_base(context), 'isPrincipiaFolderish', False)
        folderish &= not INonStructuralFolder.providedBy(context)
        parent = aq_parent(context)

        is_default_page = False
        browser_default = IBrowserDefault(parent, None)
        if browser_default is not None:
            browser_default_page = browser_default.getDefaultPage()
            is_default_page = (browser_default_page == context.getId())

        if not folderish or is_default_page:
            return '/'.join(parent.getPhysicalPath())
        else:
            return '/'.join(context.getPhysicalPath())

    rootPath = getNavigationRoot(context, relativeRoot=root)

    # Adjust for topLevel
    if topLevel > 0:
        contextPath = '/'.join(context.getPhysicalPath())
        if not contextPath.startswith(rootPath):
            return None
        contextSubPathElements = contextPath[len(rootPath) + 1:]
        if not contextSubPathElements:
            return None
        contextSubPathElements = contextSubPathElements.split('/')
        if len(contextSubPathElements) < topLevel:
            return None
        rootPath = '/'.join([rootPath] + contextSubPathElements[:topLevel])
    return rootPath
示例#17
0
 def testGetNavigationRootPropertyIsFolder(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     portalPath = '/'.join(self.portal.getPhysicalPath())
     relativePath = folderPath[len(portalPath):]
     self.portal.portal_properties.navtree_properties.manage_changeProperties(root=relativePath)
     root = getNavigationRoot(self.portal)
     self.assertEqual(root, folderPath)
示例#18
0
 def navStrategy(self):
     context = aq_inner(self.context)
     root = getNavigationRoot(context)
     query = {
         'path': root,
         'review_state': 'published',
         'portal_type': ('isps.sitecontent.previewfolder',
                         'isps.sitecontent.contentpage'),
         'sort_order': 'getObjPositionInParent'
     }
     root_obj = context.unrestrictedTraverse(root)
     strategy = DefaultNavtreeStrategy(root_obj)
     strategy.rootPath = '/'.join(root_obj.getPhysicalPath())
     strategy.showAllParents = False
     strategy.bottomLevel = 999
     tree = buildFolderTree(root_obj, root_obj, query, strategy=strategy)
     items = []
     for c in tree['children']:
         item = {}
         item['item'] = c['item']
         item['children'] = c.get('children', '')
         item['itemid'] = c['normalized_id']
         item_id = c['normalized_id']
         if item_id == context.getId():
             item['class'] = 'active'
         else:
             item['class'] = ''
         items.append(item)
     return items
    def getTagOccurrences(self):
        types = self.getSearchTypes()
        tags = self.getSearchSubjects()
        filterTags = self.data.filterSubjects
        tagOccs = {}
        query = {}
        query['portal_type'] = types
        if self.data.root:
            query['path'] = getNavigationRoot(self.context,
                                              relativeRoot=self.data.root)
        if self.wfStates:
            query['review_state'] = self.wfStates
        for tag in tags:
            result = []
            if filterTags:
                query['Subject'] = {
                    'query': filterTags + [tag],
                    'operator': 'and'
                }
            else:
                query['Subject'] = tag
            result = self.catalog.searchResults(**query)
            if result:
                tagOccs[tag] = len(result)

        return tagOccs
示例#20
0
    def breadcrumbs(self):
        context = aq_inner(self.context)
        request = self.request
        container = utils.parent(context)
        try:
            name, item_url = get_view_url(context)
        except AttributeError:
            print context
            raise

        if container is None:
            return ({'absolute_url': item_url,
                     'Title': utils.pretty_title_or_id(context, context),
                    },)

        view = getMultiAdapter((container, request), name='breadcrumbs_view')
        base = tuple(view.breadcrumbs())

        # Some things want to be hidden from the breadcrumbs
        if IHideFromBreadcrumbs.providedBy(context):
            return base

        rootPath = getNavigationRoot(context)
        itemPath = '/'.join(context.getPhysicalPath())

        # don't show default pages in breadcrumbs or pages above the navigation root
        if not utils.isDefaultPage(context, request) and not rootPath.startswith(itemPath):
            base += ({'absolute_url': _checkPermission('View', context) and item_url or None,
                      'Title': utils.pretty_title_or_id(context, context),
                     },)

        return base
 def testGetNavigationRootPropertyIsFolder(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     portalPath = '/'.join(self.portal.getPhysicalPath())
     relativePath = folderPath[len(portalPath):]
     self.portal.portal_registry['plone.root'] = six.text_type(relativePath)
     root = getNavigationRoot(self.portal)
     self.assertEqual(root, folderPath)
示例#22
0
 def render(self):
     self.nav_root = self.context.restrictedTraverse(
         getNavigationRoot(self.context), None)
     if ISubsite.providedBy(self.nav_root):
         return self.template()
     else:
         return ''
示例#23
0
 def _path_query(self):
     form_type = self._source_type()
     spec_uids = getattr(self, 'locations', [])
     if not spec_uids:
         navroot = getNavigationRoot(self)
         return {'portal_type': form_type, 'path': navroot}, []
     # first use catalog to get brains for all matches to these
     # UIDs where portal_type is form_type
     catalog = getSite().portal_catalog
     filter_q = {
         'portal_type': form_type,
         'UID': {
             'query': spec_uids,
             'operator': 'or',
             },
         }
     form_uids = [
         b.UID for b in catalog.unrestrictedSearchResults(filter_q)
         ]
     folder_uids = list(set(spec_uids).difference(form_uids))
     folder_q = {'UID': {'query': folder_uids, 'operator': 'or'}}
     folder_paths = [
         b.getPath() for b in catalog.unrestrictedSearchResults(folder_q)
         ]
     path_q = {
         'portal_type': form_type,
         'path': {
             'query': folder_paths,
             'operator': 'or',
             },
         }
     return path_q, form_uids
示例#24
0
 def testGetNavigationRootWithINavigationRoot(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     self.folder.invokeFactory('Folder', 'folder1')
     self.folder.folder1.invokeFactory('Document', 'doc1')
     directlyProvides(self.folder, INavigationRoot)
     root = getNavigationRoot(self.folder.folder1.doc1)
     self.assertEqual(root, folderPath)
    def _getNavQuery(self):
                # check whether we only want actions
        registry = getUtility(IRegistry)
        navigation_settings = registry.forInterface(
            INavigationSchema,
            prefix="plone",
            check=False
        )
        customQuery = getattr(self.context, 'getCustomNavQuery', False)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        query['path'] = {
            'query': getNavigationRoot(self.context),
            'depth': 1
        }
        query['portal_type'] = [t for t in navigation_settings.displayed_types]
        query['sort_on'] = navigation_settings.sort_tabs_on
        if navigation_settings.sort_tabs_reversed:
            query['sort_order'] = 'reverse'
        else:
            query['sort_order'] = 'ascending'

        if navigation_settings.filter_on_workflow:
            query['review_state'] = navigation_settings.workflow_states_to_show

        query['is_default_page'] = False

        if not navigation_settings.nonfolderish_tabs:
            query['is_folderish'] = True

        return query
示例#26
0
def update_payload(source, payload):
    """Update the given payload with current data for source
    (which could have been deleted since the payload was created)
    """
    if source is None:
        return payload
    payload['last_changed'] = source.modified()
    payload['object_title'] = source.title_or_id()
    wft = getToolByName(source, 'portal_workflow')
    nav_root_path = getNavigationRoot(source)
    nav_root = source.restrictedTraverse(nav_root_path)
    nav_root_uid = api.content.get_uuid(nav_root)
    state_changes = []
    try:
        review_state = wft.getInfoFor(source, 'review_state')
        state_title = wft.getTitleForStateOnType(review_state,
                                                 source.portal_type)
        state_changes.append(state_title)
        if payload['organization_uid'] == nav_root_uid:
            syndication_state = wft.getInfoFor(source, 'syndication_state')
            state_title = wft.getTitleForStateOnType(syndication_state,
                                                     source.portal_type)
        else:
            state_title = 'Content Moved'
        state_changes.append(state_title)
    except WorkflowException:
        pass
    payload['state_changes'] = state_changes
    return payload
示例#27
0
    def getTagOccurrences(self):
        types = self.getSearchTypes()
        tags = self.getSearchSubjects()
        filterTags = self.data.filterSubjects
        tagOccs = {}
        query = {}
        query['portal_type'] = types
        if self.data.root:
            query['path'] = getNavigationRoot(
                self.context,
                relativeRoot=self.data.root)
        if self.wfStates:
            query['review_state'] = self.wfStates
        for tag in tags:
            result = []
            if filterTags:
                query['Subject'] = {'query': filterTags+[tag],
                                    'operator': 'and'}
            else:
                query['Subject'] = tag
            result = self.catalog.searchResults(**query)
            if result:
                tagOccs[tag] = len(result)

        return tagOccs
    def getBreadcrumbs(self, path=None):
        """ Get breadcrumbs """
        result = []
        root_url = getNavigationRoot(self.obj)
        root = aq_inner(self.obj.restrictedTraverse(root_url))
        root_url = root.absolute_url()

        if path is not None:
            root_abs_url = root.absolute_url()
            path = path.replace(root_abs_url, '', 1)
            path = path.strip('/')
            root = aq_inner(root.restrictedTraverse(path))

        relative = aq_inner(
            self.obj).getPhysicalPath()[len(root.getPhysicalPath()):]
        if path is None:
            # Add siteroot
            result.append({
                'title': root.title_or_id(),
                'url': '/'.join(root.getPhysicalPath())
            })

        for i in range(len(relative)):
            now = relative[:i + 1]
            obj = aq_inner(root.restrictedTraverse(now))

            if IFolderish.providedBy(obj):
                if not now[-1] == 'talkback':
                    result.append({
                        'title': obj.title_or_id(),
                        'url': root_url + '/' + '/'.join(now)
                    })
        return result
示例#29
0
    def getTagOccurrences(self, portlet):
        portlet_data = portlet
        types = self.getSearchTypes(portlet)
        tags = self.getSearchSubjects(portlet)
        catalog = getToolByName(self.context, 'portal_catalog')
        filterTags = portlet_data.filterSubjects
        tagOccs = {}
        query = {}
        L = []
        query['portal_type'] = ['Post', 'Author']
        query['path'] = getNavigationRoot(self.context)
        if portlet_data.wfStates:
            query['review_state'] = portlet_data.wfStates
        for tag in tags:
            result = []
            if filterTags:
                query['Subject'] = {
                    'query': filterTags + [tag],
                    'operator': 'and'
                }
            else:
                query['Subject'] = tag
            result = catalog.searchResults(**query)
            if result:
                tagOccs[tag] = len(result)
                for i in result:
                    L.append(i)

        tagOccs['result'] = L
        return tagOccs
 def testGetNavigationRootPropertyIsFolder(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     portalPath = '/'.join(self.portal.getPhysicalPath())
     relativePath = folderPath[len(portalPath):]
     self.portal.portal_registry['plone.root'] = unicode(relativePath)
     root = getNavigationRoot(self.portal)
     self.assertEqual(root, folderPath)
示例#31
0
    def breadcrumbs(self):
        context = self.context
        request = self.request
        parent = aq_parent(context)

        name, item_url = get_view_url(context)

        if parent is None:
            return ({'absolute_url': item_url,
                     'Title': utils.pretty_title_or_id(context, context), },)

        view = getMultiAdapter((parent, request), name='breadcrumbs_view')
        base = tuple(view.breadcrumbs())

        # Some things want to be hidden from breadcrumbs
        if IHideFromBreadcrumbs.providedBy(context):
            return base

        if base:
            item_url = '%s/%s' % (base[-1]['absolute_url'], name)
        else:
            item_url = '%s/%s' % (parent.absolute_url(), name)

        rootPath = getNavigationRoot(context)
        itemPath = '/'.join(context.getPhysicalPath())

        # Don't show default pages in breadcrumbs or pages above the navigation root
        if not utils.isDefaultPage(context, request) and not rootPath.startswith(itemPath):
            base += ({'absolute_url': item_url,
                      'Title': utils.pretty_title_or_id(context, context), },)

        return base
 def testGetNavigationRootWithINavigationRoot(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     self.folder.invokeFactory('Folder', 'folder1')
     self.folder.folder1.invokeFactory('Document', 'doc1')
     directlyProvides(self.folder, INavigationRoot)
     root = getNavigationRoot(self.folder.folder1.doc1)
     self.assertEqual(root, folderPath)
示例#33
0
def reject_syndication(obj, event):
    """
    Update the source object's rejected_syndication_sites
    with a reference to the proxy object's site and remove
    proxy object.
    """
    # Bail out if this isn't our workflow
    if event.workflow.id != 'syndication_proxy_workflow':
        return

    # and not our transition
    transition_id = event.transition and event.transition.id or None
    if transition_id != 'reject_syndication':
        return

    workflow = getToolByName(obj, 'portal_workflow')

    organization_path = getNavigationRoot(obj)
    organization = obj.restrictedTraverse(organization_path)

    source = utils.get_proxy_source(obj)

    referenceable.IReferenceable(source).addReference(
        referenceable.IReferenceable(organization),
        relationship='rejected_syndication_sites')
    referenceable.IReferenceable(source).deleteReference(
        referenceable.IReferenceable(obj),
        relationship='current_syndication_targets')

    # Use the workflow object's doActionFor so that IAfterTransitionEvent
    # gets fired correctly
    sudo(workflow.doActionFor, source, 'review_syndication')

    # Remove the proxy for this syndication request
    aq_parent(obj).manage_delObjects([obj.getId()])
    def _getNavQuery(self):
        # check whether we only want actions
        registry = getUtility(IRegistry)
        navigation_settings = registry.forInterface(INavigationSchema,
                                                    prefix="plone",
                                                    check=False)
        customQuery = getattr(self.context, 'getCustomNavQuery', False)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        query['path'] = {'query': getNavigationRoot(self.context), 'depth': 1}
        query['portal_type'] = [t for t in navigation_settings.displayed_types]
        query['sort_on'] = navigation_settings.sort_tabs_on
        if navigation_settings.sort_tabs_reversed:
            query['sort_order'] = 'reverse'
        else:
            query['sort_order'] = 'ascending'

        if navigation_settings.filter_on_workflow:
            query['review_state'] = navigation_settings.workflow_states_to_show

        query['is_default_page'] = False

        if not navigation_settings.nonfolderish_tabs:
            query['is_folderish'] = True

        return query
示例#35
0
文件: navbar.py 项目: a25kk/hfph
 def navStrategy(self, obj, types, start):
     context = aq_inner(self.context)
     root = getNavigationRoot(context)
     path = {'query': '/'.join(obj.getPhysicalPath()),
             'navtree': 1,
             'navtree_start': start}
     query = {
         'path': path,
         'review_state': 'published',
         'portal_type': types,
         'sort_order': 'getObjPositionInParent'
     }
     root_obj = context.unrestrictedTraverse(root)
     strategy = DefaultNavtreeStrategy(root_obj)
     strategy.rootPath = '/'.join(root_obj.getPhysicalPath())
     strategy.showAllParents = False
     strategy.topLevel = 2
     strategy.bottomLevel = 999
     tree = buildFolderTree(root_obj, root_obj,
                            query, strategy=NavtreeStrategyBase())
     items = []
     for c in tree['children']:
         item = {}
         item['item'] = c['item']
         item['children'] = c.get('children', '')
         item['current'] = c['currentItem']
         item['is_parent'] = c['currentParent']
         item_id = c['item'].getId
         item['itemid'] = item_id
         item['marker'] = self.compute_navitem_marker(item_id)
         items.append(item)
     return items
示例#36
0
    def _getNavQuery(self):
        context = self.context
        navtree_properties = self.navtree_properties

        customQuery = getattr(context, 'getCustomNavQuery', False)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        rootPath = getNavigationRoot(context)
        query['path'] = {'query': rootPath, 'depth': 1}

        blacklist = navtree_properties.getProperty('metaTypesNotToList', ())
        all_types = self.portal_catalog.uniqueValuesFor('portal_type')
        query['portal_type'] = [t for t in all_types if t not in blacklist]

        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        if navtree_properties.getProperty('enable_wf_state_filtering', False):
            query['review_state'] = navtree_properties.getProperty(
                                                    'wf_states_to_show', [])

        query['is_default_page'] = False

        if self.site_properties.getProperty('disable_nonfolderish_sections',
                                            False):
            query['is_folderish'] = True

        return query
示例#37
0
    def breadcrumbs(self):
        context = aq_inner(self.context)
        request = self.request
        container = utils.parent(context)

        name, item_url = get_view_url(context)

        if container is None:
            return ({
                'absolute_url': item_url,
                'Title': utils.pretty_title_or_id(context, context),
            },)

        view = getMultiAdapter((container, request), name='breadcrumbs_view')
        base = tuple(view.breadcrumbs())

        # Some things want to be hidden from the breadcrumbs
        if IHideFromBreadcrumbs.providedBy(context):
            return base

        rootPath = getNavigationRoot(context)
        itemPath = '/'.join(context.getPhysicalPath())

        # don't show default pages in breadcrumbs or pages above the navigation
        # root
        if not utils.isDefaultPage(context, request) \
           and not rootPath.startswith(itemPath):
            base += ({
                'absolute_url': item_url,
                'Title': utils.pretty_title_or_id(context, context),
            },)
        return base
示例#38
0
    def getBreadcrumbs(self, path=None):
        """ Get breadcrumbs """
        result = []
        root_url = getNavigationRoot(self.obj)
        root = aq_inner(self.obj.restrictedTraverse(root_url))
        root_url = root.absolute_url()

        if path is not None:
            root_abs_url = root.absolute_url()
            path = path.replace(root_abs_url, '', 1)
            path = path.strip('/')
            root = aq_inner(root.restrictedTraverse(path))

        relative = aq_inner(self.obj).getPhysicalPath()[len(root.getPhysicalPath()):]
        if path is None:
            # Add siteroot
            result.append({'title': root.title_or_id(),
                           'url': '/'.join(root.getPhysicalPath())})

        for i in range(len(relative)):
            now = relative[:i + 1]
            obj = aq_inner(root.restrictedTraverse(now))

            if IFolderish.providedBy(obj):
                if not now[-1] == 'talkback':
                    result.append({'title': obj.title_or_id(),
                                   'url': root_url + '/' + '/'.join(now)})
        return result
示例#39
0
    def navigationTreeRootPath(self):
        context = aq_inner(self.context)

        portal_properties = getToolByName(context, 'portal_properties')

        navtree_properties = getattr(portal_properties, 'navtree_properties')

        currentFolderOnlyInNavtree = navtree_properties.getProperty('currentFolderOnlyInNavtree', False)
        if currentFolderOnlyInNavtree:
            if context.restrictedTraverse('@@plone').isStructuralFolder():
                return '/'.join(context.getPhysicalPath())
            else:
                return '/'.join(utils.parent(context).getPhysicalPath())

        rootPath = getNavigationRoot(context)

        # Adjust for topLevel
        topLevel = navtree_properties.getProperty('topLevel', None)
        if topLevel is not None and topLevel > 0:
            contextPath = '/'.join(context.getPhysicalPath())
            if not contextPath.startswith(rootPath):
                return None
            contextSubPathElements = contextPath[len(rootPath)+1:].split('/')
            if len(contextSubPathElements) < topLevel:
                return None
            rootPath = rootPath + '/' + '/'.join(contextSubPathElements[:topLevel])

        return rootPath
示例#40
0
    def update(self):
        context = aq_inner(self.context)
        portal_tabs_view = getMultiAdapter((context, self.request),
                                           name='portal_tabs_view')
        portal_tabs = portal_tabs_view.topLevelTabs()
        self.portal_tabs = portal_tabs[:1]
        query = {}
        rootPath = getNavigationRoot(context)
        query['path'] = {'query' : rootPath, 'depth' : 1}
        query['portal_type'] = ['SectionFolder', 'AcademicFolder', 'TestimonialFolder']
        query['sort_on'] = 'getObjPositionInParent'
        query['review_state'] = 'published'
        portal_catalog = getToolByName(context, 'portal_catalog')
        results = portal_catalog.searchResults(query)
        for result in results:
            id, item_url = get_view_url(result)
            if id not in ['Members',]:
                data = {'name' : utils.pretty_title_or_id(context, result),
                        'id' : result.getId,
                        'url' : item_url,
                        'description': result.Description}
                self.portal_tabs.append(data)
        if len(portal_tabs) > 1:
            self.portal_tabs.append(portal_tabs[1])

        self.selected_tabs = self.selectedTabs(portal_tabs=self.portal_tabs)
        self.selected_portal_tab = self.selected_tabs['portal']
示例#41
0
    def __call__(self):
        context = self.context

        portal_properties = getToolByName(context, 'portal_properties')
        navtree_properties = getattr(portal_properties, 'navtree_properties')

        query = {}

        # Construct the path query

        rootPath = getNavigationRoot(context)
        currentPath = '/'.join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        if not currentPath.startswith(rootPath):
            query['path'] = {'query': rootPath, 'depth': 1}
        else:
            query['path'] = {'query': currentPath, 'navtree': 1}

        # Only list the applicable types
        query['portal_type'] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        return query
    def __call__(self):
        context = self.context

        portal_properties = getToolByName(context, 'portal_properties')
        navtree_properties = getattr(portal_properties, 'navtree_properties')

        query = {}

        # Construct the path query

        rootPath = getNavigationRoot(context)
        currentPath = '/'.join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        if not currentPath.startswith(rootPath):
            query['path'] = {'query': rootPath, 'depth': 1}
        else:
            query['path'] = {'query': currentPath, 'navtree': 1}

        # Only list the applicable types
        query['portal_type'] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        return query
示例#43
0
    def subsite_logo_behaviour(self):
        # Copy of ftw.subsite.viewlets.subsitelogoviewlet
        self.navigation_root_url = self.portal_state.navigation_root_url()
        portal = self.portal_state.portal()

        subsite_logo = getattr(self.context, 'getLogo', None)
        in_factory = IFactoryTempFolder.providedBy(
            self.context.aq_inner.aq_parent)

        if subsite_logo and subsite_logo() and not in_factory:
            # we are in a subsite
            navigation_root_path = self.portal_state.navigation_root_path()

            self.title = self.context.restrictedTraverse(
                getNavigationRoot(self.context)).Title()

            scales = portal.restrictedTraverse(
                navigation_root_path + '/@@images')
            # Create our own tag, because we want to prune the title attr
            scale = scales.scale('logo', scale="logo")
            self.logo_tag = ('<img src="{url}" width="{width}" '
                             'height="{height}" alt="{alt}" />'.format(
                                 **dict(url=scale.url,
                                        width=scale.width,
                                        height=scale.height,
                                        alt=self.navigation_root_title)))
        else:
            # onegov default
            self.onegov_logo_behaviour()
示例#44
0
    def subsite_logo_behaviour(self):
        # Copy of ftw.subsite.viewlets.subsitelogoviewlet
        self.navigation_root_url = self.portal_state.navigation_root_url()
        portal = self.portal_state.portal()

        subsite_logo = getattr(self.context, 'getLogo', None)
        in_factory = IFactoryTempFolder.providedBy(
            self.context.aq_inner.aq_parent)

        if subsite_logo and subsite_logo() and not in_factory:
            # we are in a subsite
            navigation_root_path = self.portal_state.navigation_root_path()

            self.title = self.context.restrictedTraverse(
                getNavigationRoot(self.context)).Title()

            scales = portal.restrictedTraverse(navigation_root_path +
                                               '/@@images')
            # Create our own tag, because we want to prune the title attr
            scale = scales.scale('logo', scale="logo")
            self.logo_tag = ('<img src="{url}" width="{width}" '
                             'height="{height}" alt="{alt}" />'.format(
                                 **dict(url=scale.url,
                                        width=scale.width,
                                        height=scale.height,
                                        alt=self.navigation_root_title)))
        else:
            # onegov default
            self.onegov_logo_behaviour()
示例#45
0
 def render(self):
     self.nav_root = self.context.restrictedTraverse(
         getNavigationRoot(self.context))
     if ISubsite.providedBy(self.nav_root):
         return self.template()
     else:
         return ''
示例#46
0
 def testGetNavigationRootPropertyIsFolder(self):
     folderPath = '/'.join(self.folder.getPhysicalPath())
     portalPath = '/'.join(self.portal.getPhysicalPath())
     relativePath = folderPath[len(portalPath):]
     self.portal.portal_properties.navtree_properties.manage_changeProperties(root=relativePath)
     root = getNavigationRoot(self.portal)
     self.assertEqual(root, folderPath)
def getRootPath(context, currentFolderOnly, topLevel, root):
    """Helper function to calculate the real root path
    """
    context = aq_inner(context)
    if currentFolderOnly:
        folderish = getattr(aq_base(context), 'isPrincipiaFolderish', False) and not INonStructuralFolder.providedBy(context)
        parent = aq_parent(context)
        
        is_default_page = False
        browser_default = IBrowserDefault(parent, None)
        if browser_default is not None:
            is_default_page = (browser_default.getDefaultPage() == context.getId())
        
        if not folderish or is_default_page:
            return '/'.join(parent.getPhysicalPath())
        else:
            return '/'.join(context.getPhysicalPath())

    rootPath = getNavigationRoot(context, relativeRoot=root)

    # Adjust for topLevel
    if topLevel > 0:
        contextPath = '/'.join(context.getPhysicalPath())
        if not contextPath.startswith(rootPath):
            return None
        contextSubPathElements = contextPath[len(rootPath)+1:]
        if contextSubPathElements:
            contextSubPathElements = contextSubPathElements.split('/')
            if len(contextSubPathElements) < topLevel:
                return None
            rootPath = rootPath + '/' + '/'.join(contextSubPathElements[:topLevel])
        else:
            return None
    
    return rootPath
示例#48
0
 def _path_query(self):
     form_type = self._source_type()
     spec_uids = getattr(self, 'locations', [])
     if not spec_uids:
         navroot = getNavigationRoot(self)
         return {'portal_type': form_type, 'path': navroot}, []
     # first use catalog to get brains for all matches to these
     # UIDs where portal_type is form_type
     catalog = getSite().portal_catalog
     filter_q = {
         'portal_type': form_type,
         'UID': {
             'query': spec_uids,
             'operator': 'or',
         },
     }
     form_uids = [
         b.UID for b in catalog.unrestrictedSearchResults(filter_q)
     ]
     folder_uids = list(set(spec_uids).difference(form_uids))
     folder_q = {'UID': {'query': folder_uids, 'operator': 'or'}}
     folder_paths = [
         b.getPath() for b in catalog.unrestrictedSearchResults(folder_q)
     ]
     path_q = {
         'portal_type': form_type,
         'path': {
             'query': folder_paths,
             'operator': 'or',
         },
     }
     return path_q, form_uids
    def update(self):
        self.navroot_path = getNavigationRoot(self.context)
        self.data = {}

        tab = aq_inner(self.context)

        portal_type = getattr(self.context, 'portal_type', None)

        if hasattr(self.context, 'section') and (portal_type == 'collective.nitf.content' or
                                                 portal_type == 'openmultimedia.contenttypes.gallery'):

            section = self.context.section
            oid = idnormalizer.normalize(section, 'es')
            news_folder = getattr(self.context.portal_url, 'noticias', None)
            if news_folder:
                tab = getattr(news_folder, oid, None)

        #XXX this should be generalized... this hardcoded cases are so so lame.. sorry
        # if  getattr(self.context, 'portal_type', None) == 'collective.polls.poll':
        #     polls_folder = getattr(self.context.portal_url, 'encuestas', None)
        #     if polls_folder:
        #         tab = polls_folder

        if not tab:
            return

        strategy = getMultiAdapter((tab, Assignment(root=self.navroot_path)),
                                   INavtreeStrategy)
        queryBuilder = DropdownQueryBuilder(tab)
        query = queryBuilder()

        if query['path']['query'] != self.navroot_path:
            self.data = buildFolderTree(tab, obj=tab, query=query, strategy=strategy)
示例#50
0
    def update(self):
        self.result = []
        sections = ['noticias', 'opinion']
        self.navroot_path = getNavigationRoot(self.context)
        self.data = Assignment(root=self.navroot_path)
        self.year = datetime.date.today().strftime("%Y")
        for section in sections:
            catalog_news = self.context.portal_catalog({'portal_type': 'Folder',
                                'path': '%s/%s/' % (self.navroot_path, section)})
            if catalog_news:
                tab = catalog_news[0].getObject()
                strategy = getMultiAdapter((tab, self.data), INavtreeStrategy)
                queryBuilder = DropdownQueryBuilder(tab)
                query = queryBuilder()

                if query['path']['query'] != self.navroot_path:
                    news_dict = buildFolderTree(tab, obj=tab, query=query,
                        strategy=strategy)
                    self.result += news_dict.get('children', [])
                else:
                    news_dict = {}

        for item in self.result:
            if self.context.getId() == item['id']:
                item['is_selected'] = True
            else:
                item['is_selected'] = False
示例#51
0
    def send_feedback(self, recipient, subject, message, sender):
        """Send a feedback email to the email address defined in subsite.
        """
        mh = getToolByName(self.context, "MailHost")
        portal = getToolByName(self.context, "portal_url").getPortalObject()
        nav_root = None
        if not "/".join(portal.getPhysicalPath()) == getNavigationRoot(self.context):
            nav_root = self.context.restrictedTraverse(getNavigationRoot(self.context))
        if nav_root:
            site_title = nav_root.Title()
            site_url = nav_root.absolute_url()
        else:
            site_title = portal.Title()
            site_url = portal.absolute_url()

        text = translate(
            u"feedback_mail_text",
            domain="ftw.subsite",
            default="${sender} sends you a message from your site ${site_title}(${site_url}):\n${msg}",
            context=self.request,
            mapping={
                "sender": "%s (%s)" % (sender, recipient),
                "msg": message,
                "site_title": site_title,
                "site_url": site_url,
            },
        )

        # create the message root with from, to, and subject headers
        msg = MIMEText(text.encode("windows-1252"), "plain", "windows-1252")
        msg["Subject"] = Header(subject, "windows-1252")

        default_from_name = portal.getProperty("email_from_name", "")
        default_from_email = portal.getProperty("email_from_address", "")

        if nav_root:
            email_from_name = nav_root.from_name or default_from_name
            email_from_email = nav_root.from_email or default_from_email
        else:
            email_from_name = default_from_name
            email_from_email = default_from_email
        msg["From"] = "%s <%s>" % (email_from_name, email_from_email)

        msg["reply-to"] = "%s <%s>" % (sender, recipient)

        # send the message
        mh.send(msg, mto=email_from_email, mfrom=[email_from_email])
示例#52
0
    def __init__(self, context, data):
        self.context = context
        self.data = data

        portal_properties = getToolByName(context, "portal_properties")
        navtree_properties = getattr(portal_properties, "navtree_properties")

        # Acquire a custom nav query if available
        customQuery = getattr(context, "getCustomNavQuery", None)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        # Construct the path query
        root = get_root(context, data.root_path)
        if root is not None:
            rootPath = "/".join(root.getPhysicalPath())
        else:
            rootPath = getNavigationRoot(context)

        currentPath = "/".join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        if currentPath != rootPath and not currentPath.startswith(rootPath +
                                                                  "/"):
            query["path"] = {"query": rootPath, "depth": 1}
        else:
            query["path"] = {"query": currentPath, "navtree": 1}

        topLevel = data.topLevel
        if topLevel and topLevel > 0:
            query["path"]["navtree_start"] = topLevel + 1

        # XXX: It'd make sense to use 'depth' for bottomLevel, but it doesn't
        # seem to work with EPI.

        # Only list the applicable types
        query["portal_type"] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty("sortAttribute", None)
        if sortAttribute is not None:
            query["sort_on"] = sortAttribute
            sortOrder = navtree_properties.getProperty("sortOrder", None)
            if sortOrder is not None:
                query["sort_order"] = sortOrder

        # Filter on workflow states, if enabled
        registry = getUtility(IRegistry)
        navigation_settings = registry.forInterface(INavigationSchema,
                                                    prefix="plone")
        if navigation_settings.filter_on_workflow:
            query["review_state"] = navigation_settings.workflow_states_to_show

        self.query = query
示例#53
0
    def __init__(self, context, portlet):
        self.context = context
        self.portlet = portlet

        portal_properties = getToolByName(context, 'portal_properties')
        navtree_properties = getattr(portal_properties, 'navtree_properties')

        # Acquire a custom nav query if available
        customQuery = getattr(context, 'getCustomNavQuery', None)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        # Construct the path query
        root = uuidToObject(portlet.root_uid)
        if root is not None:
            rootPath = '/'.join(root.getPhysicalPath())
        else:
            rootPath = getNavigationRoot(context)
        currentPath = '/'.join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        if currentPath != rootPath and not currentPath.startswith(rootPath + '/'):
            query['path'] = {'query': rootPath, 'depth': 1}
        else:
            query['path'] = {'query': currentPath, 'navtree': 1}

        topLevel = portlet.topLevel
        if topLevel and topLevel > 0:
            query['path']['navtree_start'] = topLevel + 1

        # XXX: It'd make sense to use 'depth' for bottomLevel, but it doesn't
        # seem to work with EPI.

        # Only list the applicable types
        query['portal_type'] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        # Filter on workflow states, if enabled
        registry = getUtility(IRegistry)
        navigation_settings = registry.forInterface(
            INavigationSchema,
            prefix="plone"
        )
        if navigation_settings.filter_on_workflow:
            query['review_state'] = navigation_settings.workflow_states_to_show

        self.query = query
示例#54
0
def content_path(item):
    """
    Path to the content item relative to the navigation root of the
    context.
    """
    navroot_path = getNavigationRoot(item).split('/')
    exclude_count = len(navroot_path)
    return '/'.join(item.getPhysicalPath()[exclude_count:])  # rel. to root
示例#55
0
 def getMimeTypeIcon(self, obj):
     fileo = obj.getObject().file
     portal_url = getNavigationRoot(self.context)
     mtt = getToolByName(self.context, 'mimetypes_registry')
     if fileo.contentType:
         ctype = mtt.lookup(fileo.contentType)
         return os.path.join(portal_url, guess_icon_path(ctype[0]))
     return None
示例#56
0
def content_path(item):
    """
    Path to the content item relative to the navigation root of the
    context.
    """
    navroot_path = getNavigationRoot(item).split('/')
    exclude_count = len(navroot_path)
    return '/'.join(item.getPhysicalPath()[exclude_count:])  # rel. to root
示例#57
0
 def update(self):
     common.ViewletBase.update(self)  # Get portal_state and portal_url
     super(DropdownMenuViewlet, self).update()
     context = aq_inner(self.context)
     portal_props = getToolByName(context, 'portal_properties')
     self.properties = portal_props.navtree_properties
     self.navroot_path = getNavigationRoot(context)
     self.data = Assignment(root=self.navroot_path)
示例#58
0
    def __init__(self, context, portlet):
        self.context = context
        self.portlet = portlet

        portal_properties = getToolByName(context, 'portal_properties')
        navtree_properties = getattr(portal_properties, 'navtree_properties')

        # Acquire a custom nav query if available
        customQuery = getattr(context, 'getCustomNavQuery', None)
        if customQuery is not None and utils.safe_callable(customQuery):
            query = customQuery()
        else:
            query = {}

        # Construct the path query
        root = uuidToObject(portlet.root_uid)
        if root is not None:
            rootPath = '/'.join(root.getPhysicalPath())
        else:
            rootPath = getNavigationRoot(context)
        currentPath = '/'.join(context.getPhysicalPath())

        # If we are above the navigation root, a navtree query would return
        # nothing (since we explicitly start from the root always). Hence,
        # use a regular depth-1 query in this case.

        if currentPath != rootPath and not currentPath.startswith(rootPath +
                                                                  '/'):
            query['path'] = {'query': rootPath, 'depth': 1}
        else:
            query['path'] = {'query': currentPath, 'navtree': 1}

        topLevel = portlet.topLevel
        if topLevel and topLevel > 0:
            query['path']['navtree_start'] = topLevel + 1

        # XXX: It'd make sense to use 'depth' for bottomLevel, but it doesn't
        # seem to work with EPI.

        # Only list the applicable types
        query['portal_type'] = utils.typesToList(context)

        # Apply the desired sort
        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute
            sortOrder = navtree_properties.getProperty('sortOrder', None)
            if sortOrder is not None:
                query['sort_order'] = sortOrder

        # Filter on workflow states, if enabled
        registry = getUtility(IRegistry)
        navigation_settings = registry.forInterface(INavigationSchema,
                                                    prefix="plone")
        if navigation_settings.filter_on_workflow:
            query['review_state'] = navigation_settings.workflow_states_to_show

        self.query = query
示例#59
0
    def getsublevel(self, context, *path):
        query = {}
        result = []
        raw_path = []

        portal_properties = getToolByName(context, 'portal_properties')
        portal_catalog = getToolByName(context, 'portal_catalog')
        navtree_properties = getattr(portal_properties, 'navtree_properties')
        site_properties = getattr(portal_properties, 'site_properties')

        rootPath = getNavigationRoot(context)
        raw_path.append(rootPath)
        for obj in path:
            raw_path.append(obj)

        dpath = '/'.join(raw_path)
        query['path'] = {'query': dpath, 'depth': 1}

        query['portal_type'] = ['RichDocument', 'Folder', 'GeoLocation']

        sortAttribute = navtree_properties.getProperty('sortAttribute', None)
        if sortAttribute is not None:
            query['sort_on'] = sortAttribute

        sortOrder = navtree_properties.getProperty('sortOrder', None)
        if sortOrder is not None:
            query['sort_order'] = sortOrder

        if navtree_properties.getProperty('enable_wf_state_filtering', False):
            query['review_state'] = navtree_properties.getProperty(
                'wf_states_to_show', [])

        query['is_default_page'] = False

        if site_properties.getProperty('disable_nonfolderish_sections',
                                       False) and len(path) == 1:
            query['is_folderish'] = False

        # Get ids not to list and make a dict to make the search fast
        idsNotToList = navtree_properties.getProperty('idsNotToList', ())
        excludedIds = {}
        for id in idsNotToList:
            excludedIds[id] = 1

        rawresult = portal_catalog.searchResults(**query)

        # now add the content to results
        for item in rawresult:
            if not (excludedIds.has_key(item.getId) or item.exclude_from_nav):
                id, item_url = get_view_url(item)
                data = {
                    'name': utils.pretty_title_or_id(context, item),
                    'id': item.getId,
                    'url': item_url,
                    'description': item.Description
                }
                result.append(data)
        return result