def test_anonymous_ec(self): sm = getSiteManager() self.portal.portal_membership = DummyMembershipTool() sm.registerUtility(self.portal.portal_membership, IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.failIf(member)
def evaluateExpression(self, expression, context): """Evaluate an object's TALES condition to see if it should be displayed. """ try: if expression.text and context is not None: portal = getToolByName(context, 'portal_url').getPortalObject() # Find folder (code courtesy of CMFCore.ActionsTool) if context is None or not hasattr(context, 'aq_base'): folder = portal else: folder = context # Search up the containment hierarchy until we find an # object that claims it's PrincipiaFolderish. while folder is not None: if getattr(aq_base(folder), 'isPrincipiaFolderish', 0): # found it. break else: folder = aq_parent(aq_inner(folder)) __traceback_info__ = (folder, portal, context, expression) ec = createExprContext(folder, portal, context) # add 'context' as an alias for 'object' ec.setGlobal('context', context) return expression(ec) else: return True except AttributeError: return True
def __call__(self): object = self.event.object folder = self.context portal = getToolByName(folder, 'portal_url').getPortalObject() expression = self.element.tales_expression ec = createExprContext(folder, portal, object) return bool(Expression(expression)(ec))
def _evaluateExpression(obj, expression, roles_bypassing_expression=[], extra_expr_ctx={}, empty_expr_is_true=True, error_pattern=WRONG_TAL_CONDITION, raise_on_error=False): """Evaluate given p_expression extending expression context with p_extra_expr_ctx.""" if not expression or not expression.strip(): return empty_expr_is_true res = True member = api.user.get_current() for role in roles_bypassing_expression or []: if member.has_role(str(role), obj): return res portal = api.portal.get() ctx = createExprContext(obj.aq_inner.aq_parent, portal, obj) ctx.setGlobal('member', member) ctx.setGlobal('context', obj) ctx.setGlobal('portal', portal) for extra_key, extra_value in extra_expr_ctx.items(): ctx.setGlobal(extra_key, extra_value) if raise_on_error: res = Expression(expression)(ctx) else: try: res = Expression(expression)(ctx) except Exception, e: logger.warn(error_pattern.format( expression, obj.absolute_url(), str(e))) res = False
def evaluate(self, expression, context, **kwargs): try: # Find folder (code courtesy of CMFCore.ActionsTool) if context is None or not hasattr(context, 'aq_base'): folder = self.site else: folder = context # Search up the containment hierarchy until we find an # object that claims it's PrincipiaFolderish. while folder is not None: if getattr(aq_base(folder), 'isPrincipiaFolderish', 0): # found it. break else: folder = aq_parent(aq_inner(folder)) __traceback_info__ = (folder, self.site, context, expression) ec = createExprContext(folder, self.site, context) # add 'context' as an alias for 'object' ec.setGlobal('context', context) ec.contexts.update({ 'context': context, }) ec.contexts.update(kwargs) for name, val in kwargs.items(): ec.setGlobal(name, val) return expression(ec) except AttributeError: pass
def enumConfiglets(self, group=None): portal = getToolByName(self, 'portal_url').getPortalObject() context = createExprContext(self, portal, self) res = [] for a in self.listActions(): verified = 0 for permission in a.permissions: if _checkPermission(permission, portal): verified = 1 if verified and a.category == group and a.testCondition(context) \ and a.visible: res.append(a.getAction(context)) # Translate the title for sorting if getattr(self, 'REQUEST', None) is not None: for a in res: title = a['title'] if not isinstance(title, Message): title = Message(title, domain='plone') a['title'] = translate(title, context=self.REQUEST) def _id(v): return v['id'] res.sort(key=_id) return res
def updateMenu(self): out = '' pu = getToolByName(self, 'plone_utils') if hasattr(pu, 'createTopLevelTabs'): pactions = getToolByName(self, 'portal_actions').listFilteredActionsFor(self) tl_tabs = pu.createTopLevelTabs(pactions) for act in tl_tabs: out += '<li id="portaltab-%s" class="plain"><a href="%s" accesskey="t">' % \ (act['id'], act['url']) + act['name'] + '</a></li>\n' else: portal = getToolByName(self, 'portal_url').getPortalObject() portal_act = getToolByName(self, 'portal_actions') actions=portal_act._cloneActions() for act in actions: if act.category == 'portal_tabs': out += '<li id="portaltab-%s" class="plain"><a href="%s" accesskey="t">%s</a></li>\n' % \ (act.id, \ Expression(act.getActionExpression())(createExprContext(portal, portal, portal)), \ act.title) portal_props = getToolByName(self, 'portal_properties') if not hasattr(portal_props, PROPERTY_SHEET): portal_props.addPropertySheet(PROPERTY_SHEET, 'DropDown Menu Properties') ap = getattr(portal_props, PROPERTY_SHEET) safeEditProperty(ap, 'menu', out, 'text')
def test_authenticatedUser_ec(self): sm = getSiteManager() self.portal.portal_membership = DummyMembershipTool(anon=0) sm.registerUtility(self.portal.portal_membership, IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.assertEqual(member.getId(), 'dummy')
def test_authenticatedUser_ec(self): self.portal.portal_membership = DummyMembershipTool(anon=0) ec = createExprContext(self.folder, self.portal, self.object) if hasattr(ec, 'contexts'): member = ec.contexts['member'] else: # BBB: for Zope 2.9 member = ec.global_vars['member'] self.assertEqual(member.getId(), 'dummy')
def test_anonymous_ec(self): self.portal.portal_membership = DummyMembershipTool() ec = createExprContext(self.folder, self.portal, self.object) if hasattr(ec, 'contexts'): member = ec.contexts['member'] else: # BBB: for Zope 2.9 member = ec.global_vars['member'] self.failIf(member)
def __call__(self): object = self.event.object folder = self.context portal = getToolByName(folder, 'portal_url').getPortalObject() expression = self.element.tales_expression ec = createExprContext(folder, portal, object) # Workaround CMFCore/PageTemplates issue with unicode missing context ec.contexts['context'] = ec.contexts['here'] return bool(Expression(expression)(ec))
def testCondition(self, folder, portal, object): """Test the widget condition.""" try: if self.condition: __traceback_info__ = (folder, portal, object, self.condition) ec = createExprContext(folder, portal, object) return Expression(self.condition)(ec) else: return True except AttributeError: return True
def test_copy(self): action = {'name': 'foo', 'url': '', 'permissions': ('View',)} ec = createExprContext(self.site, self.site, None) ai = self._makeOne(action, ec) ai2 = ai.copy() self.assertEqual( ai._lazy_keys, ['allowed'] ) self.assertEqual( ai2._lazy_keys, ['allowed'] ) self.failIf( ai2._lazy_keys is ai._lazy_keys ) self.assertEqual( ai['allowed'], True ) self.assertEqual( ai2['allowed'], True )
def url(self): context = self.context portal_url = getToolByName(context, 'portal_url') portal = portal_url.getPortalObject() ec = createExprContext(aq_parent(context), portal, context) icon = self.obj.getIconExprObject() path = '' if icon: path = icon(ec) return path
def testSubfieldCondition(self, subfield, folder, portal, object): """Test the subfield condition.""" try: condition = self.subfield_conditions.get(subfield, None) if condition is not None: __traceback_info__ = (folder, portal, object, condition) ec = createExprContext(folder, portal, object) return Expression(condition)(ec) else: return True except AttributeError: return True
def testCondition(self, folder, portal, object): """Test the widget condition.""" try: if self.condition: if folder is None and object is not None: folder = aq_parent(aq_inner(object)) __traceback_info__ = (folder, portal, object, self.condition) ec = createExprContext(folder, portal, object) return Expression(self.condition)(ec) else: return True except AttributeError: return True
def test_Condition(self): portal = self.portal folder = self.folder object = self.object ai = self._makeOne( id='view', title='View', action=Expression(text='view'), condition=Expression(text='member'), category='global', visible=True ) ec = createExprContext(folder, portal, object) self.failIf(ai.testCondition(ec))
def execute_expression(expr, folder, portal, context=None, **kwargs): """ Execute and expand a given TALES `expr`. Because the way in which portlets are rendered, the context needs to be corrected to be the surrounding folder. Also accepts arbitrary kwargs and applies them into the expression context for execution. """ ec = createExprContext(folder, portal, context) ec.contexts['context'] = ec.contexts['here'] ec.vars['context'] = ec.vars['here'] for key, value in kwargs.iteritems(): ec.setLocal(key, value) return Expression(expr)(ec)
def test_ec_context(self): self.portal.portal_membership = DummyMembershipTool() ec = createExprContext(self.folder, self.portal, self.object) object = ec.contexts['object'] portal = ec.contexts['portal'] folder = ec.contexts['folder'] self.assertTrue(object) self.assertEqual(object.id, 'bar') self.assertEqual(object.absolute_url(), 'url_bar') self.assertTrue(portal) self.assertEqual(portal.id, 'portal') self.assertEqual(portal.absolute_url(), 'url_portal') self.assertTrue(folder) self.assertEqual(folder.id, 'foo') self.assertEqual(folder.absolute_url(), 'url_foo')
def test_category_object(self): # Permissions for action category 'object*' should be # evaluated in object context. manage_addFolder(self.site, 'actions_dummy') self.object = self.site.actions_dummy self.object.manage_permission('View', [], acquire=0) WANTED = {'allowed': False, 'category': 'object'} action = {'name': 'foo', 'url': '', 'permissions': ('View',)} ec = createExprContext(self.site, self.site, self.object) ai = self._makeOne(action, ec) self.assertEqual( ai['category'], WANTED['category'] ) self.assertEqual( ai['allowed'], WANTED['allowed'] )
def test_create_from_dict(self): WANTED = {'allowed': True, 'available': True, 'category': 'object', 'id': 'foo', 'title': 'foo', 'url': '', 'visible': True} action = {'name': 'foo', 'url': '', 'permissions': ('View',)} ec = createExprContext(self.site, self.site, None) ai = self._makeOne(action, ec) self.assertEqual( ai['id'], WANTED['id'] ) self.assertEqual( ai['title'], WANTED['title'] ) self.assertEqual( ai['url'], WANTED['url'] ) self.assertEqual( ai['category'], WANTED['category'] ) self.assertEqual( ai['visible'], WANTED['visible'] ) self.assertEqual( ai['available'], WANTED['available'] ) self.assertEqual( ai['allowed'], WANTED['allowed'] ) self.assertEqual( ai, WANTED )
def test_ec_context(self): sm = getSiteManager() sm.registerUtility(DummyMembershipTool(), IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) object = ec.contexts['object'] portal = ec.contexts['portal'] folder = ec.contexts['folder'] self.failUnless(object) self.assertEqual(object.id, 'bar') self.assertEqual(object.absolute_url(), 'url_bar') self.failUnless(portal) self.assertEqual(portal.id, 'portal') self.assertEqual(portal.absolute_url(), 'url_portal') self.failUnless(folder) self.assertEqual(folder.id, 'foo') self.assertEqual(folder.absolute_url(), 'url_foo')
def test_Condition_PathExpression(self): portal = self.portal folder = self.folder object = self.object manage_addPythonScript(self.app, 'test_script') script = self.app.test_script script.ZPythonScript_edit('', 'return context.getId()') ai = self._makeOne(id='view', title='View', action=Expression(text='view'), condition=Expression(text='portal/test_script'), category='global', visible=True) ec = createExprContext(folder, portal, object) self.failUnless(ai.testCondition(ec))
def test_category_document(self): # Permissions for action category 'document*' should be # evaluated in object context (not in portal context). manage_addFolder(self.site, 'actions_dummy') self.object = self.site.actions_dummy self.object.manage_permission('View', [], acquire=0) WANTED = {'allowed': False, 'category': 'document'} action = {'name': 'foo', 'url': '', 'permissions': ('View', )} ec = createExprContext(self.site, self.site, self.object) ai = self._makeOne(action, ec) ai['category'] = 'document' # pfff self.assertEqual(ai['category'], WANTED['category']) self.assertEqual(ai['allowed'], WANTED['allowed'])
def _getExpressionContext(self, object): portal = aq_parent(aq_inner(self)) if object is None or not hasattr(object, 'aq_base'): folder = portal else: folder = object # Search up the containment hierarchy until we find an # object that claims it's a folder. while folder is not None: if getattr(aq_base(folder), 'isPrincipiaFolderish', 0): # found it. break else: folder = aq_parent(aq_inner(folder)) ec = createExprContext(folder, portal, object) return ec
def test_Condition_PathExpression(self): portal = self.portal folder = self.folder object = self.object manage_addPythonScript(self.root, 'test_script') script = self.root.test_script script.ZPythonScript_edit('', 'return context.getId()') ai = self._makeOne( id='view', title='View', action=Expression(text='view'), condition=Expression(text='portal/test_script'), category='global', visible=True ) ec = createExprContext(folder, portal, object) self.failUnless(ai.testCondition(ec))
def test_ec_context(self): sm = getSiteManager() sm.registerUtility(DummyMembershipTool(), IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) object = ec.contexts['object'] portal = ec.contexts['portal'] folder = ec.contexts['folder'] self.assertTrue(object) self.assertEqual(object.id, 'bar') self.assertEqual(object.absolute_url(), 'url_bar') self.assertTrue(portal) self.assertEqual(portal.id, 'portal') self.assertEqual(portal.absolute_url(), 'url_portal') self.assertTrue(folder) self.assertEqual(folder.id, 'foo') self.assertEqual(folder.absolute_url(), 'url_foo')
def portletVisibilityInContext(self, context): """Evaluates expressions.""" context = self.getCallingContext(context) try: if self.condition and context is not None: portal = getToolByName(self, 'portal_url').getPortalObject() object = self __traceback_info__ = (context, portal, object, self.condition) ec = createExprContext(context, portal, object) return Expression(self.condition)(ec) else: return 0 except AttributeError: return 0 return self.hasPortletData()
def test_category_folder(self): # Permissions for action category 'folder*' should be # evaluated in folder context. manage_addFolder(self.site, 'actions_dummy') self.folder = self.site.actions_dummy self.folder.manage_permission('View', [], acquire=0) WANTED = {'allowed': False, 'category': 'folder'} action = {'name': 'foo', 'url': '', 'permissions': ('View',)} ec = createExprContext(self.folder, self.site, None) ai = self._makeOne(action, ec) ai['category'] = 'folder' # pfff self.assertEqual( ai['category'], WANTED['category'] ) self.assertEqual( ai['allowed'], WANTED['allowed'] )
def content_types(self): context = aq_inner(self.context) request = self.request portal_state = getMultiAdapter((context, request), name='plone_portal_state') site = portal_state.portal() ttool = getToolByName(site, 'portal_types', None) idnormalizer = queryUtility(IIDNormalizer) expr_context = createExprContext(aq_parent(context), portal_state.portal(), context) if ttool is None: return [] results = [] for t in ttool.listContentTypes(): if t not in BAD_TYPES: fti = ttool[t] typeId = fti.getId() cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId # if cssClass in self.all_content_types.keys(): # del(self.all_content_types[cssClass]) try: icon = fti.getIconExprObject() if icon: icon = icon(expr_context) except AttributeError: # we are using plone 3 icon = "%s/%s" % (site.absolute_url(), fti.getIcon()) results.append({ 'id': typeId, 'title': fti.Title(), 'description': fti.Description(), 'action': None, 'selected': False, 'icon': icon, 'extra': { 'id': cssId, 'separator': None, 'class': cssClass }, 'submenu': None, }) results = [(translate(ctype['title'], context=request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results
def content_types(self): context = aq_inner(self.context) request = self.request portal_state = getMultiAdapter((context, request), name='plone_portal_state') site = portal_state.portal() ttool = getToolByName(site, 'portal_types', None) idnormalizer = queryUtility(IIDNormalizer) expr_context = createExprContext( aq_parent(context), portal_state.portal(), context) if ttool is None: return [] results = [] for t in ttool.listContentTypes(): if t not in BAD_TYPES: fti = ttool[t] typeId = fti.getId() cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId # if cssClass in self.all_content_types.keys(): # del(self.all_content_types[cssClass]) try: icon = fti.getIconExprObject() if icon: icon = icon(expr_context) except AttributeError: icon = "%s/%s" % (site.absolute_url(), fti.getIcon()) results.append({'id': typeId, 'title': fti.Title(), 'description': fti.Description(), 'action': None, 'selected': False, 'icon': icon, 'extra': {'id': cssId, 'separator': None, 'class': cssClass}, 'submenu': None, }) results = [(translate(ctype['title'], context=request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results
def getSuitableProcesses(self): """Returns a list of suitable processes.""" # acquire expression text; if none can be found return all processes expr_text = getattr(self, 'alf_suitable_processes', None) if expr_text is None: pm = getToolByName(self, "workflow_manager") user = getSecurityManager().getUser() user_roles = set(user.getRolesInContext(self)) processes = [p.current() for p in pm.processes.objectValues()] return [process.aq_parent for process in processes if not process.roles or user_roles.intersection(process.roles)] folder = self.getParentNode() portal = getToolByName(self, 'portal_url').getPortalObject() context = createExprContext(folder, portal, self) expr = Expression(expr_text) return expr(context)
def renderTALExpression(self, context, portal, expression, vars={}): """ Renders given TAL expression in p_expression. p_vars contains extra variables that will be done available in the TAL expression to render """ res = '' if expression: expression = expression.strip() ctx = createExprContext(context.aq_inner.aq_parent, portal, context) vars['context'] = context ctx.vars.update(vars) for k, v in vars.items(): ctx.setContext(k, v) res = Expression(expression)(ctx) # make sure we do not return None because it breaks SOAP call if res is None: return u'' else: return res
def test_ec_context(self): self.portal.portal_membership = DummyMembershipTool() ec = createExprContext(self.folder, self.portal, self.object) if hasattr(ec, 'contexts'): contexts = ec.contexts else: # BBB: for Zope 2.9 contexts = ec.global_vars object = contexts['object'] portal = contexts['portal'] folder = contexts['folder'] self.failUnless(object) self.assertEqual(object.id, 'bar') self.assertEqual(object.absolute_url(), 'url_bar') self.failUnless(portal) self.assertEqual(portal.id, 'portal') self.assertEqual(portal.absolute_url(), 'url_portal') self.failUnless(folder) self.assertEqual(folder.id, 'foo') self.assertEqual(folder.absolute_url(), 'url_foo')
def isApplicable(self, obj): '''May the current user use this template for generating documents ?''' user = self.portal_membership.getAuthenticatedMember() res = False # Check permissions isAllowed = True for podPermission in self.getPodPermission(): if not user.has_permission(podPermission, obj): isAllowed = False break if isAllowed: res = True # At least for now # Check condition if self.getPodCondition().strip(): portal = getToolByName(self, 'portal_url').getPortalObject() ctx = createExprContext(obj.getParentNode(), portal, obj) try: res = Expression(self.getPodCondition())(ctx) except Exception, e: logger.warn(self.BAD_CONDITION % (self.getPodCondition(), str(e))) res = False
def enumConfiglets(self, group=None): portal=getToolByName(self, 'portal_url').getPortalObject() mtool = getToolByName(self, 'portal_membership') context=createExprContext(self, portal, self) res = [] for a in self.listActions(): verified = 0 for permission in a.permissions: if _checkPermission(permission, portal): verified = 1 if verified and a.category==group and a.testCondition(context): res.append(a.getAction(context)) # Translate the title for sorting if getattr(self, 'REQUEST', None) is not None: for a in res: a['title'] = translate(a['title'], domain='plone', context=self.REQUEST) def _title(v): return v['title'] res.sort(key=_title) return res
def addable_types(self, include=None): """Return menu item entries in a TAL-friendly form. Pass a list of type ids to 'include' to explicitly allow a list of types. """ context = aq_inner(self.context) request = self.request results = [] idnormalizer = queryUtility(IIDNormalizer) portal_state = getMultiAdapter((context, request), name='plone_portal_state') portal_url = portal_state.portal_url() addContext = self.add_context() baseUrl = addContext.absolute_url() allowedTypes = _allowedTypes(request, addContext) types_tool = getToolByName(context, 'portal_types') # Note: we don't check 'allowed' or 'available' here, because these are # slow. We assume the 'allowedTypes' list has already performed the # necessary calculations actions = types_tool.listActionInfos( object=addContext, check_permissions=False, check_condition=False, category='folder/add', ) addActionsById = dict([(a['id'], a) for a in actions]) expr_context = createExprContext( aq_parent(addContext), portal_state.portal(), addContext) for t in allowedTypes: typeId = t.getId() if include is None or typeId in include: cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId url = None addAction = addActionsById.get(typeId, None) if addAction is not None: url = addAction['url'] if not url: url = '%s/createObject?type_name=%s' % (baseUrl, quote_plus(typeId),) icon = t.getIconExprObject() if icon: icon = icon(expr_context) results.append({ 'id' : typeId, 'title' : t.Title(), 'description' : t.Description(), 'action' : url, 'selected' : False, 'icon' : icon, 'extra' : {'id' : cssId, 'separator' : None, 'class' : cssClass}, 'submenu' : None, }) # Sort the addable content types based on their translated title results = [(translate(ctype['title'], context=request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results
def test_anonymous_ec(self): self.portal.portal_membership = DummyMembershipTool() ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.failIf(member)
def test_authenticatedUser_ec(self): self.portal.portal_membership = DummyMembershipTool(anon=0) ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.assertEqual(member.getId(), 'dummy')
def test_authenticatedUser_ec(self): sm = getSiteManager() sm.registerUtility(DummyMembershipTool(anon=0), IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.assertEqual(member.getId(), 'dummy')
def test_anonymous_ec(self): sm = getSiteManager() sm.registerUtility(DummyMembershipTool(), IMembershipTool) ec = createExprContext(self.folder, self.portal, self.object) member = ec.contexts['member'] self.assertFalse(member)
def addable_types(self, include=None): """Return menu item entries in a TAL-friendly form. Pass a list of type ids to 'include' to explicitly allow a list of types. """ context = aq_inner(self.context) request = self.request results = [] idnormalizer = queryUtility(IIDNormalizer) portal_state = getMultiAdapter((context, request), name='plone_portal_state') addContext = self.add_context() baseUrl = addContext.absolute_url() token = createToken() allowedTypes = _allowedTypes(request, addContext) types_tool = getToolByName(context, 'portal_types') # Note: we don't check 'allowed' or 'available' here, because these are # slow. We assume the 'allowedTypes' list has already performed the # necessary calculations actions = types_tool.listActionInfos( object=addContext, check_permissions=False, check_condition=False, category='folder/add', ) addActionsById = dict([(a['id'], a) for a in actions]) expr_context = createExprContext( aq_parent(addContext), portal_state.portal(), addContext) for t in allowedTypes: typeId = t.getId() if include is None or typeId in include: cssId = idnormalizer.normalize(typeId) cssClass = 'contenttype-%s' % cssId url = None addAction = addActionsById.get(typeId, None) if addAction is not None: url = addAction['url'] if not url: url = '%s/createObject?type_name=%s&_authenticator=%s' % ( baseUrl, quote_plus(typeId), token) icon = t.getIconExprObject() if icon: icon = icon(expr_context) results.append({ 'id': typeId, 'title': t.Title(), 'description': t.Description(), 'action': url, 'selected': False, 'icon': icon, 'extra': { 'id': cssId, 'separator': None, 'class': cssClass}, 'submenu': None, }) # Sort the addable content types based on their translated title results = [(translate(ctype['title'], context=request), ctype) for ctype in results] results.sort() results = [ctype[-1] for ctype in results] return results