def update(self): super(LogoViewlet, self).update() context = aq_inner(self.context) portal_state = getMultiAdapter( (context, self.request), name='plone_portal_state' ) portal = portal_state.portal() nav_root = getNavigationRootObject( context, portal ) logoTitle = portal_state.navigation_root_title() self.navigation_root_title = logoTitle logo = nav_root.page_banner_image if logo is None: self.logo_tag = """%s""" % cgi.escape(logoTitle) else: self.logo_tag = """<img src="%s/@@images/page_banner_image" alt="%s" title="%s" />""" % (nav_root.absolute_url(), logoTitle, logoTitle)
def fix_organization_by_state(self, payload): wft = getToolByName(self.context, 'portal_workflow') source = uuidToObject(payload['object_uid']) if not source: return payload # we need to update the organization only for NON pending states if ('pending_syndication' in wft.getInfoFor( source, 'syndication_state') or 'pending_move' in wft.getInfoFor(source, 'syndication_move_state')): return payload if IProxy.providedBy(source): return payload proxies = referenceable.IReferenceable(source).getRefs( relationship='current_syndication_targets') organization_title = [] for proxy in proxies: new_organization = getNavigationRootObject(proxy, self.context) organization_title.append(new_organization.title_or_id()) payload['organization_title'] = ','.join(organization_title) return payload
def selectedTabs(self, default_tab='index_html', portal_tabs=()): portal = getToolByName(self.context, 'portal_url').getPortalObject() plone_url = getNavigationRootObject( self.context, portal).absolute_url() plone_url_len = len(plone_url) request = self.request valid_actions = [] url = request['URL'] path = url[plone_url_len:] path_list = path.split('/') if len(path_list) <= 1: return {'portal': default_tab} for action in portal_tabs: if not action['url'].startswith(plone_url): # In this case the action url is an external link. Then, we # avoid issues (bad portal_tab selection) continuing with next # action. continue action_path = action['url'][plone_url_len:] if not action_path.startswith('/'): action_path = '/' + action_path action_path_list = action_path.split('/') if action_path_list[1] == path_list[1]: # Make a list of the action ids, along with the path length # for choosing the longest (most relevant) path. valid_actions.append((len(action_path_list), action['id'])) # Sort by path length, the longest matching path wins valid_actions.sort() if valid_actions: return {'portal': valid_actions[-1][1]} return {'portal': default_tab}
def remove(self): mtool = getToolByName(self.context, 'portal_membership') user = mtool.getAuthenticatedMember() portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) IFavoriteStorage(site).remove_favorite(user.getId(), IUUID(self.context))
def __init__(self, context, selectable_filter, navigation_tree_query=None): self.context = context nav_root = getNavigationRootObject(context, None) query_builder = getMultiAdapter((nav_root, self), INavigationQueryBuilder) query = query_builder() if navigation_tree_query is None: navigation_tree_query = {} # Copy path from selectable_filter into the navigation_tree_query # normally it does not make sense to show elements that wouldn't be # selectable anyway and are unneeded to navigate to selectable items if ('path' not in navigation_tree_query and 'path' in selectable_filter.criteria): navigation_tree_query['path'] = selectable_filter.criteria['path'] query.update(navigation_tree_query) self.navigation_tree_query = query self.selectable_filter = selectable_filter self.catalog = getToolByName(context, "portal_catalog") portal_tool = getToolByName(context, "portal_url") self.portal_path = portal_tool.getPortalPath()
def __init__(self, context, selectable_filter, navigation_tree_query=None, default=None, defaultFactory=None): self.context = context nav_root = getNavigationRootObject(context, None) query_builder = getMultiAdapter((nav_root, self), INavigationQueryBuilder) query = query_builder() if navigation_tree_query is None: navigation_tree_query = {} # Copy path from selectable_filter into the navigation_tree_query # normally it does not make sense to show elements that wouldn't be # selectable anyway and are unneeded to navigate to selectable items if ('path' not in navigation_tree_query and 'path' in selectable_filter.criteria): navigation_tree_query['path'] = selectable_filter.criteria['path'] query.update(navigation_tree_query) self.navigation_tree_query = query self.selectable_filter = selectable_filter self.catalog = getToolByName(context, "portal_catalog") portal_tool = getToolByName(context, "portal_url") self.portal_path = portal_tool.getPortalPath() self._default_terms = [] if default is not None: term = self.getTerm(default) self._default_terms = [term] elif defaultFactory is not None: term = self.getTerm(defaultFactory(context)) self._default_terms = [term]
def get_relateditems_options(context, value, separator, vocabulary_name, vocabulary_view, field_name=None): portal = get_portal() options = get_ajaxselect_options(portal, value, separator, vocabulary_name, vocabulary_view, field_name) if IForm.providedBy(context): context = context.context request = getRequest() msgstr = translate(_(u'Search'), context=request) options.setdefault('searchText', msgstr) msgstr = translate(_(u'Entire site'), context=request) options.setdefault('searchAllText', msgstr) msgstr = translate(_('tabs_home', default=u'Home'), context=request) options.setdefault('homeText', msgstr) options.setdefault('folderTypes', ['Folder']) options.setdefault( 'treeVocabularyUrl', '{}/@@getVocabulary?name=plone.app.vocabularies.Catalog'.format( portal is not None and portal.absolute_url() or '') ) options.setdefault('sort_on', 'sortable_title') options.setdefault('sort_order', 'ascending') nav_root = getNavigationRootObject(context, portal) options['basePath'] = ( '/'.join(nav_root.getPhysicalPath()) if nav_root else '/' ) options['rootPath'] = ( '/'.join(portal.getPhysicalPath()) if portal else '/' ) return options
def listitems(context, portal_type=None, recursive=False, root=False, **kw): """ List items visible to user, as filtered by catalog searchResults(), either directly within a path, or recursively in all subfolders; if root is specified as a non-False value, then use the navigation root as the search path. Can be filtered on portal_type and on other search parameters as keyword arguments. """ site = getSite() if root: context = getNavigationRootObject(context, site) query = { 'path': { 'query': '/'.join(context.getPhysicalPath()), } } if not recursive: query['path']['depth'] = 1 if portal_type is not None: query['portal_type'] = portal_type result = site.portal_catalog.searchResults( query, **kw ) return { 'length': len(result), 'items': remap_result(result), }
def test_getNavigationRootObject_no_context(self): ''' If you don't know the context then you also don't know what the navigation root is. ''' self.portal = self.layer['portal'] self.assertEqual(None, getNavigationRootObject(None, self.portal))
def __call__(self, context, query=None): parsed = {} if query: parsed = queryparser.parseFormquery(context, query['criteria']) if 'sort_on' in query: parsed['sort_on'] = query['sort_on'] if 'sort_order' in query: parsed['sort_order'] = str(query['sort_order']) try: catalog = getToolByName(context, 'portal_catalog') except AttributeError: context = getSite() catalog = getToolByName(context, 'portal_catalog') # If no path is specified check if we are in a sub-site and use that # as the path root for catalog searches if 'path' not in parsed: portal = getToolByName(context, 'portal_url').getPortalObject() nav_root = getNavigationRootObject(context, portal) if nav_root.getPhysicalPath() != portal.getPhysicalPath(): parsed['path'] = { 'query': '/'.join(nav_root.getPhysicalPath()), 'depth': -1 } brains = catalog(**parsed) return CatalogVocabulary.fromItems(brains, context)
def __init__(self, context, selectable_filter, navigation_tree_query=None): self.context = context nav_root = getNavigationRootObject(context, None) query_builder = getMultiAdapter((nav_root, self), INavigationQueryBuilder) query = query_builder() if navigation_tree_query is None: navigation_tree_query = {} # Copy path from selectable_filter into the navigation_tree_query # normally it does not make sense to show elements that wouldn't be # selectable anyway and are unneeded to navigate to selectable items if ('path' not in navigation_tree_query and 'path' in selectable_filter.criteria): navigation_tree_query['path'] = selectable_filter.criteria['path'] query.update(navigation_tree_query) # If we filter by portal_type, make sure those portal types are present # in the query, even if they would not appear in the navigation if ('portal_type' in query and 'portal_type' in selectable_filter.criteria): for ptype in selectable_filter.criteria['portal_type']: if ptype not in query['portal_type']: query['portal_type'].append(ptype) self.navigation_tree_query = query self.selectable_filter = selectable_filter self.catalog = getToolByName(context, "portal_catalog") portal_tool = getToolByName(context, "portal_url") self.portal_path = portal_tool.getPortalPath()
def get_portal_url(context): portal = get_portal() if portal: root = getNavigationRootObject(context, portal) if root: return root.absolute_url() return ''
def listitems(context, portal_type=None, recursive=False, root=False, **kw): """ List items visible to user, as filtered by catalog searchResults(), either directly within a path, or recursively in all subfolders; if root is specified as a non-False value, then use the navigation root as the search path. Can be filtered on portal_type and on other search parameters as keyword arguments. """ site = getSite() if root: context = getNavigationRootObject(context, site) query = { 'path': { 'query': '/'.join(context.getPhysicalPath()), } } if not recursive: query['path']['depth'] = 1 if portal_type is not None: query['portal_type'] = portal_type result = site.portal_catalog.searchResults(query, **kw) return { 'length': len(result), 'items': remap_result(result), }
def getTitle(self): from genweb.organs.content.organsfolder import IOrgansfolder if IOrgansfolder.providedBy(self.context): if self.context.customImage: return 'Govern UPC - ' + str(self.context.title) else: return 'Govern UPC' else: portal_state = self.context.unrestrictedTraverse( '@@plone_portal_state') root = getNavigationRootObject(self.context, portal_state.portal()) physical_path = aq_inner(self.context).getPhysicalPath() relative = physical_path[len(root.getPhysicalPath()):] for i in range(len(relative)): now = relative[:i + 1] try: # Some objects in path are in pending state obj = aq_inner(root.restrictedTraverse(now)) except: # return default image return None if IOrgansfolder.providedBy(obj): if self.context.customImage: return 'Govern UPC - ' + str(obj.title) else: return 'Govern UPC'
def is_syndication_auto_approved(self): """ Is syndication approved from the source to this target site and type. """ portal = getToolByName(self.context, 'portal_url').getPortalObject() proxy = self.context target_site = root.getNavigationRootObject(proxy, portal) source = utils.get_proxy_source(proxy) source_site = root.getNavigationRootObject(source, portal) return source_site in referenceable.IReferenceable( target_site).getBRefs( relationship=self.RELATIONSHIP_TEMPLATE.format( source.getPortalTypeName()))
def links(self): """ returns list of dict containing icon link, link target, title. should only be accessed after calling self.update() (called by template should be fine). """ result = [] portal = self.portal_state.portal() navroot = getNavigationRootObject(self.context, portal) if navroot is portal: return result # empty links: in non-workspace (indirect) contexts result.append({ 'url': self.navigation_root_url, 'icon': '%s/%s' % ( self.site_url, '++resource++uu.qiext/homefolder.png', ), 'title': u'Go to home workspace / project', }) result.append({ 'url': self.site_url, 'icon': '%s/%s' % ( self.site_url, '++resource++uu.qiext/go-top.png', ), 'title': u'Go to site root', }) return result
def get_relateditems_options(context, value, separator, vocabulary_name, vocabulary_view, field_name=None): if IForm.providedBy(context): context = context.context request = getRequest() site = get_top_site_from_url(context, request) options = get_ajaxselect_options(site, value, separator, vocabulary_name, vocabulary_view, field_name) msgstr = translate(_(u'Search'), context=request) options.setdefault('searchText', msgstr) msgstr = translate(_(u'Entire site'), context=request) options.setdefault('searchAllText', msgstr) msgstr = translate(_('tabs_home', default=u'Home'), context=request) options.setdefault('homeText', msgstr) options.setdefault('folderTypes', ['Folder']) options.setdefault('sort_on', 'sortable_title') options.setdefault('sort_order', 'ascending') nav_root = getNavigationRootObject(context, site) options['basePath'] = '/'.join(nav_root.getPhysicalPath()) if nav_root else '/' # noqa options['rootPath'] = '/'.join(site.getPhysicalPath()) if site else '/' options['rootUrl'] = site.absolute_url() if site else '' return options
def links(self): """ returns list of dict containing icon link, link target, title. should only be accessed after calling self.update() (called by template should be fine). """ result = [] portal = self.portal_state.portal() navroot = getNavigationRootObject(self.context, portal) if navroot is portal: return result # empty links: in non-workspace (indirect) contexts result.append({ 'url': self.navigation_root_url, 'icon': '%s/%s' % ( self.site_url, '++resource++collective.teamwork/homefolder.png', ), 'title': u'Go to home workspace / project', }) result.append({ 'url': self.site_url, 'icon': '%s/%s' % ( self.site_url, '++resource++collective.teamwork/go-top.png', ), 'title': u'Go to site root', }) return result
def get_all_events(self, batch=True): # Fall back to default language for local events kw = {} default_lang = api.portal.get_tool( "portal_languages").getDefaultLanguage() if ITranslatable.providedBy(self.context): if default_lang != self.context.Language(): portal = getSite() trans = ITranslationManager(self.context).get_translation( default_lang) root = getNavigationRootObject(trans, portal) kw['path'] = '/'.join(root.getPhysicalPath()) kw['Language'] = [default_lang, ''] start, end = self._start_end sort = 'start' sort_reverse = False if self.mode in ('past', 'all'): sort_reverse = True expand = True local_events = get_events( self.context, start=start, end=end, sort=sort, sort_reverse=sort_reverse, ret_mode=RET_MODE_ACCESSORS, expand=expand, **kw) remote_events = self._remote_events() reverse = self.mode == 'past' all_events = sorted(local_events + remote_events, key=lambda x: x.start, reverse=reverse) if batch: b_start = self.b_start b_size = self.b_size res = Batch(all_events, size=b_size, start=b_start, orphan=self.orphan) else: res = all_events return res
def selectedTabs(self, default_tab='index_html', portal_tabs=()): portal = getToolByName(self.context, 'portal_url').getPortalObject() plone_url = getNavigationRootObject(self.context, portal).absolute_url() plone_url_len = len(plone_url) request = self.request valid_actions = [] url = request['URL'] path = url[plone_url_len:] path_list = path.split('/') if len(path_list) <= 1: return {'portal': default_tab} for action in portal_tabs: if not action['url'].startswith(plone_url): # In this case the action url is an external link. Then, we # avoid issues (bad portal_tab selection) continuing with next # action. continue action_path = action['url'][plone_url_len:] if not action_path.startswith('/'): action_path = '/' + action_path action_path_list = action_path.split('/') if action_path_list[1] == path_list[1]: # Make a list of the action ids, along with the path length # for choosing the longest (most relevant) path. valid_actions.append((len(action_path_list), action['id'])) # Sort by path length, the longest matching path wins valid_actions.sort() if valid_actions: return {'portal': valid_actions[-1][1]} return {'portal': default_tab}
def downloadImage(self, url): """ Get remote image data and store. """ # check if the image is inside the Plone site site = getSite() if url.startswith(site.absolute_url()) and not '@@practice' in url: image_url_parts = urlparse.urlparse(url) # we strip the leading slash since we are traversing from the # site root path = image_url_parts.path[1:] # get the navigation root which might be different to the site context = aq_inner(site.REQUEST.PARENTS[0]) navroot = getNavigationRootObject(context, site) # check for ImageScaling view if '/@@images/' in path: path, name = path.split('/@@images/') scalingview = navroot.restrictedTraverse(path + '/@@images/') imagescale = scalingview.publishTraverse(site.REQUEST, name) io = cStringIO.StringIO(imagescale.data) else: image = navroot.restrictedTraverse(path) io = cStringIO.StringIO(image.getImage().data) return PIL.Image.open(io) else: req = urllib2.Request(url) try: response = urllib2.urlopen(req) except urllib2.HTTPError: raise NotFound('The URL:%s could not be found' %url) data = response.read() io = cStringIO.StringIO(data) return PIL.Image.open(io)
def filterTabs(self, tabs): """ Filter out portal tabs. """ portal_state = getMultiAdapter((self.context, self.request), name='plone_portal_state') root = getNavigationRootObject(self.context, portal_state.portal()) allowed_items = getMenuItemIds(root) if not allowed_items: # Filter / reorder not enabled for this nav root return tabs filtered = [] for tab in tabs: if tab.get("category", None): # This is manually set tab in portal_tabs # Never filter out filtered.append(tab) continue # Reorder the remaining according to # the menu item order set in the settings for allowed in allowed_items: for tab in tabs: # Check if catalog brain id is on the allowed items list if tab["id"] == allowed: filtered.append(tab) return filtered
def __init__(self, *args): base.Renderer.__init__(self, *args) portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') self.navigation_root_url = portal_state.navigation_root_url() self.portal = portal_state.portal() self.navigation_root_path = portal_state.navigation_root_path() self.navigation_root_object = getNavigationRootObject(self.context, self.portal)
def _data(self): portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) suggestions_list = ISuggestionsStorage(site).list_suggestions() suggestions_infos = self.get_suggestions_infos(self.context, suggestions_list) suggestions_infos.sort(key=lambda x: x['index']) return suggestions_infos
def all_news_link(self): context = aq_inner(self.context) portal_state = getMultiAdapter((context, self.request), name='plone_portal_state') portal = portal_state.portal() if 'news' in getNavigationRootObject(context, portal).objectIds(): return '%s/news' % portal_state.navigation_root_url() return None
def get_calendar_url(context, link_base, view_name=None): portal = api.portal.get() calendar_url = None if link_base: navigation_root = getNavigationRootObject(context, portal) link_base = '/'.join(link_base.split('/')[2:]) calendar_url = navigation_root.unrestrictedTraverse( link_base.lstrip('/') # start relative, first slash is omitted ).absolute_url() else: navigation_root = getNavigationRootObject(context, portal) calendar_url = navigation_root.absolute_url() if view_name: calendar_url = '{}/{}'.format(calendar_url, view_name) return calendar_url
def all_news_link(self): context = aq_inner(self.context) portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state') portal = portal_state.portal() if 'news' in getNavigationRootObject(context, portal).objectIds(): return '%s/news' % portal_state.navigation_root_url() return None
def __init__(self, *args): base.Renderer.__init__(self, *args) portal_state = getMultiAdapter( (self.context, self.request), name='plone_portal_state') self.navigation_root_url = portal_state.navigation_root_url() self.portal = portal_state.portal() self.navigation_root_path = portal_state.navigation_root_path() self.navigation_root_object = getNavigationRootObject(self.context, self.portal)
def section(self, context): """gets section from which subjects are used.""" registry = queryUtility(IRegistry) if registry is None: return None if registry.get("plone.subjects_of_navigation_root", False): portal = getToolByName(context, "portal_url").getPortalObject() return getNavigationRootObject(context, portal) return None
def test_getNavigationRootObject_no_context(self): ''' If you don't know the context then you also don't know what the navigation root is. ''' self.assertEqual( None, getNavigationRootObject(None, self.portal) )
def remove(self): request = self.request view = request.get('view', '') portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) ISuggestionsStorage(site).remove_suggestion(id=IUUID(self.context)) IStatusMessage(self.request).addStatusMessage( _("The element has been removed from suggestions")) self.request.response.redirect(self.context.absolute_url() + '/' + view)
def __init__(self, *args): base.Renderer.__init__(self, *args) portal_state = getMultiAdapter((self.context, self.request), name=u"plone_portal_state") self.navigation_root_url = portal_state.navigation_root_url() self.portal = portal_state.portal() self.navigation_root_path = portal_state.navigation_root_path() self.have_events_folder = "events" in getNavigationRootObject(self.context, self.portal).objectIds()
def get_language(self): language = self.context.Language() portal_factory = getToolByName(self, 'portal_factory', None) if portal_factory is not None and portal_factory.isTemporary(self): navroot = getNavigationRootObject(self.context, getSite()) if navroot != self.context: language = ILanguage(navroot).get_language() if not language: language = LANGUAGE_INDEPENDENT return language
def get_privacy_link(self): portal = api.portal.get() root = getNavigationRootObject(self.context, portal) document = root.restrictedTraverse(PRIVACY_POLICY_NAME, None) if document: return document.absolute_url() else: log.error('Privacy policy document "{0}" not found under {1}'.format( PRIVACY_POLICY_NAME, root.absolute_url())) return ""
def navigation_root_uuid(obj): """ Return the UUID for the navigation root. """ portal_url = getToolByName(obj, 'portal_url') portal = portal_url.getPortalObject() nav_root = root.getNavigationRootObject(obj, portal) if nav_root is portal: return return uuid_ifaces.IUUID(nav_root)
def section(self, context): """gets section from which subjects are used. """ registry = queryUtility(IRegistry) if registry is None: return None if registry.get('plone.subjects_of_navigation_root', False): portal = getToolByName(context, 'portal_url').getPortalObject() return getNavigationRootObject(context, portal) return None
def __init__(self, context, request): self.context = context self.request = request self.settings = getUtility(IRegistry).forInterface(ITinyMCESchema, prefix="plone", check=False) self.nav_root = getNavigationRootObject( self.context, get_portal(), ) self.nav_root_url = self.nav_root.absolute_url()
def _findNavRoots(self, navroot, portal): """Find all the nav roots going up the tree """ navroot_ids = [] while True: if navroot.meta_type == 'Plone Site': break navroot_ids.append(navroot.getId()) navroot = getNavigationRootObject(utils.parent(navroot), portal) navroot_ids.reverse() return navroot_ids
def getItem(self, tab): site = getNavigationRootObject(self.context, getSite()) context = aq_inner(self.context) if tab.get('available'): item = site else: item = site.restrictedTraverse(tab['id']) #def_page = getDefaultPage(item) #if def_page: #item = item.restrictedTraverse(def_page) return item
def get_theming_css_url(context): """Returns the theming.css URL for a context, relative to its navigation root. Cachekey params may be added. """ portal = getToolByName(context, "portal_url").getPortalObject() navroot = getNavigationRootObject(context, portal) css_url = "{0}/theming.css".format(navroot.absolute_url()) cachekey = get_css_cache_key(context) if cachekey: css_url += "?cachekey={0}".format(cachekey) return css_url
def get_portal_events(context, range_start=None, range_end=None, limit=None, sort='start', sort_reverse=False, **kw): """Return all events as catalog brains, possibly within a given timeframe. :param context: [required] A context object. :type context: Content object :param range_start: Date, from which on events should be searched. :type range_start: Python datetime. :param range_end: Date, until which events should be searched. :type range_end: Python datetime :param limit: Number of items to be returned. :type limit: integer :param sort: Catalog index id to sort on. :type sort: string :param sort_reverse: Change the order of the sorting. :type sort_reverse: boolean :returns: Portal events, matching the search criteria. :rtype: catalog brains """ range_start, range_end = _prepare_range(context, range_start, range_end) query = {} query['object_provides'] = IEvent.__identifier__ if 'path' not in kw: # limit to the current navigation root, usually (not always) site portal = getSite() navroot = getNavigationRootObject(context, portal) query['path'] = navroot.getPhysicalPath() if range_start: # All events from range_start ongoing: # The minimum end date must be the date from which we search. query['end'] = {'query': range_start, 'range': 'min'} if range_end: # All events until range_end: # The maximum start date must be the date until we search. query['start'] = {'query': range_end, 'range': 'max'} query['sort_on'] = sort if sort_reverse: query['sort_order'] = 'reverse' query.update(kw) cat = getToolByName(context, 'portal_catalog') if limit: query['sort_limit'] = limit result = cat(**query)[:limit] else: result = cat(**query) return result
def all_news_link(self): context = aq_inner(self.context) portal_state = getMultiAdapter((context, self.request), name='plone_portal_state') portal = portal_state.portal() menu = portal['menu-principal'] if 'noticies' in getNavigationRootObject(context, portal).objectIds(): return '%s/noticies/noticies' % portal_state.navigation_root_url() elif 'noticies' in menu.objectIds(): return '%s/menu-principal/noticies' % portal_state.navigation_root_url( ) return None
def get_portal_url(context): portal = get_portal() if portal: root = getNavigationRootObject(context, portal) if root: try: return root.absolute_url() except AttributeError: return portal.absolute_url() else: return portal.absolute_url() return ''
def get_footer(self): root = getNavigationRootObject(self.context, self.portal) #lang = self.context.Language() lang = getToolByName(self.context, 'portal_languages').getPreferredLanguage() #print "Langage : %s" % lang doc_ids = ['footer-%s' % lang, 'footer'] for doc_id in doc_ids: if doc_id in root.contentIds(): return get_document(root, doc_id) return self.get_site_map()
def __init__(self, context, request): super(SiteRootView, self).__init__(context, request) self.portal_state = getMultiAdapter( (aq_inner(self.context), self.request), name='plone_portal_state' ) self.nav_root = getNavigationRootObject( context, self.portal_state.portal() ) self.is_simple_site = ISimpleSite.providedBy(self.nav_root)
def add(self): request = self.request mtool = getToolByName(self.context, 'portal_membership') user = mtool.getAuthenticatedMember() view = request.get('view', '') portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) IFavoriteStorage(site).add_favorite(user.getId(), id=IUUID(self.context), type='uid', view=view, date=datetime.now())
def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return # Retrieve list_id either from a hidden field in the form or fetch # the first list from mailchimp. list_id = data.get('list_id') or self.mailchimp.default_list_id() # list_id has to be updated for merge_fields=data to work if None if "list_id" in data and not data.get('list_id'): data['list_id'] = list_id # interest groups interests = {} interest_groups = data.pop('interest_groups', []) if self.available_interest_groups and interest_groups: # Create dictionary with as keys the interest groups, and as # values always True. interests = dict.fromkeys(interest_groups, True) # Use email_type if one is provided by the form, if not choose the # default email type from the control panel settings. email_type = data.get( 'email_type') or self.mailchimp_settings.email_type # Subscribe to MailChimp list try: self.mailchimp.subscribe( list_id=list_id, email_address=data['email'], email_type=email_type, interests=interests, merge_fields=data, ) except MailChimpException as error: return self.handle_error(error, data) if self.mailchimp_settings.double_optin: message = _( u"We have to confirm your email address. In order to " + u"finish the newsletter subscription, click on the link " + u"inside the email we just send you.") else: message = _( u"You have been subscribed to our newsletter succesfully.") IStatusMessage(self.context.REQUEST).addStatusMessage(message, type="info") portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) self.request.response.redirect(site.absolute_url())
def getRowForm(self, row, action='save'): """ Delegate each row to a separate form. """ # Assemble a form submission from the row request = self.request.clone() for idx, header_cell in enumerate(self.header): key = header_cell.internal_value request.form[key] = row[idx].internal_value # Process the path before processing the form container_path = request.form.pop('path', '').strip() nav = self.context if container_path.startswith('/'): # Start at the portal root container_path = container_path[1:] portal = getToolByName(self.context, 'portal_url').getPortalObject() nav = root.getNavigationRootObject(self.context, portal) container = nav.restrictedTraverse(str(container_path)) portal_type = request.form.pop('portal_type') if portal_type not in self.types: raise ValueError('TODO Validation error on type') info = self.types[portal_type] # Lookup a form for the individual row id_ = request.form.pop('get', '').strip() if id_ and id_ in container: # Lookup the form based on existing content context = container[id_] if context.getPortalTypeName() != portal_type: # Replace existing content of a different type # TODO make configurable to raise a validation error container.manage_delObjects([id_]) row_form = component.getMultiAdapter( (container, request, info), interfaces.IRowAddForm) else: # Update existing content # TODO make configurable to raise a validation error row_form = component.getMultiAdapter((context, request), interfaces.IRowEditForm) else: # Lookup the form based on the content type row_form = component.getMultiAdapter((container, request, info), interfaces.IRowAddForm) row_form.update() action = row_form.actions[action] row_form.request.form[action.name] = True return row_form
def update(self): mtool = getToolByName(self.context, 'portal_membership') self.anonymous = mtool.isAnonymousUser() if self.anonymous: return user_id = mtool.getAuthenticatedMember().getId() super(SwitchFavorite, self).update() portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) self.template = self.request.steps[-1] self.isfavorite = IFavoriteStorage(site).is_favorite(user_id, IUUID(self.context))
def handle_unsubscribe(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return list_id = data.get('list_id') or self.mailchimp.default_list_id() email = data['email'] update_data = {} if data.get('unsubscribe'): update_data['status'] = 'unsubscribed' else: interest_groups = {} if data.get('interest_groups'): for group in data.get('interest_groups', []): interest_groups[group] = False update_data['interests'] = interest_groups try: self.mailchimp.update_subscriber(list_id, email_address=email, **update_data) except MailChimpException as error: if error.code != 404: # If a subscriber did not exist we don't want to announce # it. Treat only != 404 as an error. IStatusMessage(self.request).addStatusMessage( _( u'mailchimp_unsubscribe_error_msg', default=u'We could not unsubscribe you from ' u'the newsletter. ' u"Please contact the site administrator: " u"'${error}'", mapping={u"error": error}, ), type="info", ) IStatusMessage(self.request).addStatusMessage( _( u'mailchimp_unsubscribed_msg', default=(u'Thank you. You have been unsubscribed from ' u'the Newsletter.'), ), type="info", ) portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) self.request.response.redirect(site.absolute_url())
def _root(self): # This is only called if the instance doesn't have a root_uid # attribute, which is probably because it has an old 'root' # attribute that needs to be converted. root = self.root if not root: return None portal = getToolByName(self, 'portal_url').getPortalObject() navroot = getNavigationRootObject(self, portal) try: root = navroot.unrestrictedTraverse(root.lstrip('/')) except (AttributeError, KeyError, TypeError, NotFound): return return root.UID()
def update(self): context = self.context portal = getToolByName(context, 'portal_url').getPortalObject() common.ViewletBase.update(self) # Get portal_state and portal_url super(DropdownMenuViewlet, self).update() portal_props = getToolByName(context, 'portal_properties') self.properties = portal_props.navtree_properties self.dropdown_properties = portal_props.dropdown_properties self.enable_caching = self.dropdown_properties.getProperty( 'enable_caching', False) self.enable_parent_clickable = self.dropdown_properties.getProperty( 'enable_parent_clickable', True) self.data = Assignment(root=getNavigationRoot(context)) self.root_url=getNavigationRootObject(context, portal).absolute_url()
def get_navigation_root(context=None): """Get the navigation root object for the context. This traverses the path up and returns the nearest navigation root. Useful for multi-lingual installations and sites with subsites. :param context: [required] Context on which to get the navigation root. :type context: context object :returns: Navigation Root :rtype: Portal object :Example: :ref:`portal_get_navigation_root_example` """ context = aq_inner(context) return getNavigationRootObject(context, get())
def get_relateditems_options(context, value, separator, vocabulary_name, vocabulary_view, field_name=None): if IForm.providedBy(context): context = context.context request = getRequest() site = get_top_site_from_url(context, request) options = get_ajaxselect_options(site, value, separator, vocabulary_name, vocabulary_view, field_name) nav_root = getNavigationRootObject(context, site) # basePath - start to search/browse in here. base_path_context = context if not IFolder.providedBy(base_path_context): base_path_context = aq_parent(base_path_context) if not base_path_context: base_path_context = nav_root options['basePath'] = '/'.join(base_path_context.getPhysicalPath()) # rootPath - Only display breadcrumb elements deeper than this path. options['rootPath'] = '/'.join(site.getPhysicalPath()) if site else '/' # rootUrl: Visible URL up to the rootPath. This is prepended to the # currentPath to generate submission URLs. options['rootUrl'] = site.absolute_url() if site else '' # contextPath - current edited object. Will not be available to select. options['contextPath'] = '/'.join(context.getPhysicalPath()) if base_path_context != nav_root: options['favorites'] = [ { # 'title': _(u'Current Content'), 'title': u'Aktueller Inhalt', 'path': '/'.join(base_path_context.getPhysicalPath()) }, { 'title': _(u'Start Page'), 'path': '/'.join(nav_root.getPhysicalPath()) } ] return options