コード例 #1
0
ファイル: DCWorkflow.py プロジェクト: bendavis78/zope
    def getCatalogVariablesFor(self, ob):
        '''
        Allows this workflow to make workflow-specific variables
        available to the catalog, making it possible to implement
        worklists in a simple way.
        Returns a mapping containing the catalog variables
        that apply to ob.
        '''
        res = {}
        status = self._getStatusOf(ob)
        for id, vdef in self.variables.items():
            if vdef.for_catalog:
                if status.has_key(id):
                    value = status[id]

                # Not set yet.  Use a default.
                elif vdef.default_expr is not None:
                    ec = createExprContext(StateChangeInfo(ob, self, status))
                    value = vdef.default_expr(ec)
                else:
                    value = vdef.default_value

                res[id] = value
        # Always provide the state variable.
        state_var = self.state_var
        res[state_var] = status.get(state_var, self.initial_state)
        return res
コード例 #2
0
 def check(self, sm, wf_def, ob):
     '''
     Checks conditions in this guard.
     '''
     pp = self.permissions
     if pp:
         found = 0
         for p in pp:
             if sm.checkPermission(p, ob):
                 found = 1
                 break
         if not found:
             return 0
     roles = self.roles
     if roles:
         # Require at least one of the given roles.
         found = 0
         u_roles = sm.getUser().getRolesInContext(ob)
         for role in roles:
             if role in u_roles:
                 found = 1
                 break
         if not found:
             return 0
     expr = self.expr
     if expr is not None:
         econtext = createExprContext(StateChangeInfo(ob, wf_def))
         res = expr(econtext)
         if not res:
             return 0
     return 1
コード例 #3
0
ファイル: Guard.py プロジェクト: bendavis78/zope
 def check(self, sm, wf_def, ob, **kw):
     """Checks conditions in this guard.
     """
     u_roles = None
     if wf_def.manager_bypass:
         # Possibly bypass.
         u_roles = sm.getUser().getRolesInContext(ob)
         if 'Manager' in u_roles:
             return 1
     if self.permissions:
         for p in self.permissions:
             if _checkPermission(p, ob):
                 break
         else:
             return 0
     if self.roles:
         # Require at least one of the given roles.
         if u_roles is None:
             u_roles = sm.getUser().getRolesInContext(ob)
         for role in self.roles:
             if role in u_roles:
                 break
         else:
             return 0
     if self.groups:
         # Require at least one of the specified groups.
         u = sm.getUser()
         b = aq_base( u )
         if hasattr( b, 'getGroupsInContext' ):
             u_groups = u.getGroupsInContext( ob )
         elif hasattr( b, 'getGroups' ):
             u_groups = u.getGroups()
         else:
             u_groups = ()
         for group in self.groups:
             if group in u_groups:
                 break
         else:
             return 0
     expr = self.expr
     if expr is not None:
         econtext = createExprContext(
             StateChangeInfo(ob, wf_def, kwargs=kw))
         res = expr(econtext)
         if not res:
             return 0
     return 1
コード例 #4
0
ファイル: DCWorkflow.py プロジェクト: bendavis78/zope
    def _executeTransition(self, ob, tdef=None, kwargs=None):
        '''
        Private method.
        Puts object in a new state.
        '''
        sci = None
        econtext = None
        moved_exc = None

        # Figure out the old and new states.
        old_sdef = self._getWorkflowStateOf(ob)
        old_state = old_sdef.getId()
        if tdef is None:
            new_state = self.initial_state
            former_status = {}
        else:
            new_state = tdef.new_state_id
            if not new_state:
                # Stay in same state.
                new_state = old_state
            former_status = self._getStatusOf(ob)
        new_sdef = self.states.get(new_state, None)
        if new_sdef is None:
            msg = _(u'Destination state undefined: ${state_id}',
                    mapping={'state_id': new_state})
            raise WorkflowException(msg)

        # Fire "before" event
        notify(
            BeforeTransitionEvent(ob, self, old_sdef, new_sdef, tdef,
                                  former_status, kwargs))

        # Execute the "before" script.
        if tdef is not None and tdef.script_name:
            script = self.scripts[tdef.script_name]
            # Pass lots of info to the script in a single parameter.
            sci = StateChangeInfo(ob, self, former_status, tdef, old_sdef,
                                  new_sdef, kwargs)
            try:
                script(sci)  # May throw an exception.
            except ObjectMoved, moved_exc:
                ob = moved_exc.getNewObject()
コード例 #5
0
ファイル: DCWorkflow.py プロジェクト: bendavis78/zope
    def getInfoFor(self, ob, name, default):
        '''
        Allows the user to request information provided by the
        workflow.  This method must perform its own security checks.
        '''
        if name == self.state_var:
            return self._getWorkflowStateOf(ob, 1)
        vdef = self.variables[name]
        if vdef.info_guard is not None and not vdef.info_guard.check(
            getSecurityManager(), self, ob):
            return default
        status = self._getStatusOf(ob)
        if status is not None and status.has_key(name):
            value = status[name]

        # Not set yet.  Use a default.
        elif vdef.default_expr is not None:
            ec = createExprContext(StateChangeInfo(ob, self, status))
            value = vdef.default_expr(ec)
        else:
            value = vdef.default_value

        return value
コード例 #6
0
ファイル: DCWorkflow.py プロジェクト: bendavis78/zope
                expr = tdef_exprs[id]
            elif not vdef.update_always and former_status.has_key(id):
                # Preserve former value
                value = former_status[id]
            else:
                if vdef.default_expr is not None:
                    expr = vdef.default_expr
                else:
                    value = vdef.default_value
            if expr is not None:
                # Evaluate an expression.
                if econtext is None:
                    # Lazily create the expression context.
                    if sci is None:
                        sci = StateChangeInfo(
                            ob, self, former_status, tdef,
                            old_sdef, new_sdef, kwargs)
                    econtext = createExprContext(sci)
                value = expr(econtext)
            status[id] = value

        # Update state.
        status[self.state_var] = new_state
        tool = aq_parent(aq_inner(self))
        tool.setStatusOf(self.id, ob, status)

        # Update role to permission assignments.
        self.updateRoleMappingsFor(ob)

        # Execute the "after" script.
        if tdef is not None and tdef.after_script_name: