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
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
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
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()
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
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: