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()
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()
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
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
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))
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))
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')
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)
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)
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])
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')
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
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
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
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
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 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
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)
def render(self): self.nav_root = self.context.restrictedTraverse( getNavigationRoot(self.context), None) if ISubsite.providedBy(self.nav_root): return self.template() else: return ''
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 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
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
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
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)
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 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
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
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
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
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']
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 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()
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()
def render(self): self.nav_root = self.context.restrictedTraverse( getNavigationRoot(self.context)) if ISubsite.providedBy(self.nav_root): return self.template() else: return ''
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
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)
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
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])
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
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
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
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
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)
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
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