예제 #1
0
 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
예제 #5
0
    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
예제 #6
0
    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
예제 #7
0
파일: Install.py 프로젝트: kroman0/products
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')
예제 #8
0
 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')
예제 #9
0
 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')
예제 #10
0
 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)
예제 #11
0
 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))
예제 #12
0
파일: Widget.py 프로젝트: dtgit/dtedu
 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
예제 #13
0
    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 )
예제 #14
0
파일: icons.py 프로젝트: CGTIC/Plone_SP
    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
예제 #15
0
파일: record.py 프로젝트: a25kk/stv2
 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
예제 #16
0
 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
예제 #17
0
    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)
예제 #19
0
 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')
예제 #20
0
    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'] )
예제 #21
0
    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 )
예제 #22
0
 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')
예제 #23
0
    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))
예제 #24
0
    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'])
예제 #25
0
    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 )
예제 #26
0
 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
예제 #27
0
    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')
예제 #29
0
    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()
예제 #30
0
 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
예제 #31
0
    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'] )
예제 #32
0
 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
예제 #33
0
 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
예제 #34
0
    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)
예제 #35
0
 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
예제 #36
0
 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')
예제 #37
0
 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')
예제 #38
0
 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
예제 #39
0
 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
예제 #40
0
    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
예제 #41
0
 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)
예제 #42
0
 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')
예제 #43
0
 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')
예제 #44
0
 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)
예제 #45
0
    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