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 _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): ''' 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 index_object(self, documentId, obj, threshold=None): index_object = self.getProxyAttribute('index_object') try: ctx = createExprContext(obj) value = self._expr(ctx) wrapper = prepareObject(obj, value) except Exception, e: # gulp... the expression could raise many different types of errors. if DEBUG_LOG_ERRORS: LOG('ProxyIndex',PROBLEM,'%s tales error while indexing'%self.id) return 0
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 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
# 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: script = self.scripts[tdef.after_script_name] # Pass lots of info to the script in a single parameter.
def listFilteredActionsFor(self, object=None): '''Gets all actions available to the user and returns a mapping containing user actions, object actions, and global actions. ''' 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) ai_objs = [] actions = [] info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) a = provider.listActions(info) if a and type(a[0]) is not type({}): ai_objs.extend(list(a)) else: for i in a: actions.append(i) if ai_objs: for ai in ai_objs: if ai.testCondition(ec): actions.append(ai.getAction(ec)) # Include actions from object. if object is not None: base = aq_base(object) types_tool = getToolByName(self, 'portal_types') ti = types_tool.getTypeInfo(object) if ti is not None: defs = ti.getActions() if defs: c_url = object.absolute_url() for d in defs: a = d['action'] if a: url = c_url + '/' + a else: url = c_url actions.append({ 'id': d.get('id', None), 'name': d['name'], 'url': url, 'permissions': d['permissions'], 'category': d.get('category', 'object'), 'visible': d.get('visible', 1), }) if hasattr(base, 'listActions'): a = object.listActions(info) if a: actions.extend(list(a)) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions = { 'user': [], 'folder': [], 'object': [], 'global': [], 'workflow': [], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: if category in ('object', 'workflow') and object is not None: context = object elif category == 'folder' and folder is not None: context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # If a bug occurs where actions appear more than once, # a little code right here can fix it. catlist.append(action) return filtered_actions
def listFilteredActionsFor(self, object=None): '''Gets all actions available to the user and returns a mapping containing user actions, object actions, and global actions. ''' 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) actions = [] append = actions.append info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) self._listActions(append, provider, info, ec) # Include actions from object. if object is not None: base = aq_base(object) types_tool = getToolByName(self, 'portal_types') # we might get None back from getTypeInfo. We construct # a dummy TypeInformation object here in that case (the 'or' # case). This prevents us from needing to check the condition. ti = types_tool.getTypeInfo(object) or TypeInformation('Dummy') defs = ti.getActions() url = object_url = object.absolute_url() for d in defs: # we can't modify or expose the original actionsd... this # stems from the fact that getActions returns a ref to the # actual dictionary used to store actions instead of a # copy. We copy it here to prevent it from being modified. d = d.copy() d['id'] = d.get('id', None) if d['action']: url = '%s/%s' % (object_url, d['action']) d['url'] = url d['category'] = d.get('category', 'object') d['visible'] = d.get('visible', 1) actions.append(d) if hasattr(base, 'listActions'): self._listActions(append, object, info, ec) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions = { 'user': [], 'folder': [], 'object': [], 'global': [], 'workflow': [], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: if (object is not None and (category.startswith('object') or category.startswith('workflow'))): context = object elif (folder is not None and category.startswith('folder')): context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # Filter out duplicate actions by identity... if not action in catlist: catlist.append(action) # ...should you need it, here's some code that filters # by equality (use instead of the two lines above) #if not [a for a in catlist if a==action]: # catlist.append(action) return filtered_actions
def listFilteredActionsFor(self, object=None): '''Gets all actions available to the user and returns a mapping containing user actions, object actions, and global actions. ''' 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) actions = [] append = actions.append info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) self._listActions(append,provider,info,ec) # Include actions from object. if object is not None: base = aq_base(object) types_tool = getToolByName( self, 'portal_types' ) # we might get None back from getTypeInfo. We construct # a dummy TypeInformation object here in that case (the 'or' # case). This prevents us from needing to check the condition. ti = types_tool.getTypeInfo( object ) or TypeInformation('Dummy') defs = ti.getActions() url = object_url = object.absolute_url() for d in defs: # we can't modify or expose the original actionsd... this # stems from the fact that getActions returns a ref to the # actual dictionary used to store actions instead of a # copy. We copy it here to prevent it from being modified. d = d.copy() d['id'] = d.get('id', None) if d['action']: url = '%s/%s' % (object_url, d['action']) d['url'] = url d['category'] = d.get('category', 'object') d['visible'] = d.get('visible', 1) actions.append(d) if hasattr(base, 'listActions'): self._listActions(append,object,info,ec) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions={'user':[], 'folder':[], 'object':[], 'global':[], 'workflow':[], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: if (object is not None and (category.startswith('object') or category.startswith('workflow'))): context = object elif (folder is not None and category.startswith('folder')): context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # Filter out duplicate actions by identity... if not action in catlist: catlist.append(action) # ...should you need it, here's some code that filters # by equality (use instead of the two lines above) #if not [a for a in catlist if a==action]: # catlist.append(action) return filtered_actions
def listFilteredActionsFor(self, object=None): """ Return a mapping containing of all actions available to the user against object, bucketing into categories. """ 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) actions = [] append = actions.append info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) self._listActions(append,provider,info,ec) # Include actions from object. if object is not None: base = aq_base(object) if hasattr(base, 'listActions'): self._listActions(append,object,info,ec) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions={'user':[], 'folder':[], 'object':[], 'global':[], 'workflow':[], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: # startswith() is used so that we can have several # different categories that are checked in the object or # folder context. if (object is not None and (category.startswith('object') or category.startswith('workflow'))): context = object elif (folder is not None and category.startswith('folder')): context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # Filter out duplicate actions by identity... if not action in catlist: catlist.append(action) # ...should you need it, here's some code that filters # by equality (use instead of the two lines above) #if not [a for a in catlist if a==action]: # catlist.append(action) return filtered_actions
def listFilteredActionsFor(self, object=None): '''Gets all actions available to the user and returns a mapping containing user actions, object actions, and global actions. ''' 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) actions = [] append = actions.append info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) self._listActions(append,provider,info,ec) # Include actions from object. if object is not None: base = aq_base(object) types_tool = getToolByName( self, 'portal_types' ) ti = types_tool.getTypeInfo( object ) if ti is not None: defs = ti.getActions() if defs: c_url = object.absolute_url() for d in defs: a = d['action'] if a: url = c_url + '/' + a else: url = c_url actions.append({ 'id': d.get('id', None), 'name': d['name'], 'action': d['action'], 'url': url, 'permissions': d['permissions'], 'category': d.get('category', 'object'), 'visible': d.get('visible', 1), }) if hasattr(base, 'listActions'): self._listActions(append,object,info,ec) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions={'user':[], 'folder':[], 'object':[], 'global':[], 'workflow':[], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: if category in ('object', 'workflow') and object is not None: context = object elif category == 'folder' and folder is not None: context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # Filter out duplicate actions by identity... if not action in catlist: catlist.append(action) # ...should you need it, here's some code that filters # by equality (use instead of the two lines above) #if not [a for a in catlist if a==action]: # catlist.append(action) return filtered_actions
def listFilteredActionsFor(self, object=None): '''Gets all actions available to the user and returns a mapping containing user actions, object actions, and global actions. ''' 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) ai_objs = [] actions = [] info = oai(self, folder, object) # Include actions from specific tools. for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) a = provider.listActions(info) if a and type(a[0]) is not type({}): ai_objs.extend(list(a)) else: for i in a: actions.append(i) if ai_objs: for ai in ai_objs: if ai.testCondition(ec): actions.append(ai.getAction(ec)) # Include actions from object. if object is not None: base = aq_base(object) types_tool = getToolByName( self, 'portal_types' ) ti = types_tool.getTypeInfo( object ) if ti is not None: defs = ti.getActions() if defs: c_url = object.absolute_url() for d in defs: a = d['action'] if a: url = c_url + '/' + a else: url = c_url actions.append({ 'id': d.get('id', None), 'name': d['name'], 'url': url, 'permissions': d['permissions'], 'category': d.get('category', 'object'), 'visible': d.get('visible', 1), }) if hasattr(base, 'listActions'): a = object.listActions(info) if a: actions.extend(list(a)) # Reorganize the actions by category, # filtering out disallowed actions. filtered_actions={'user':[], 'folder':[], 'object':[], 'global':[], 'workflow':[], } for action in actions: category = action['category'] permissions = action.get('permissions', None) visible = action.get('visible', 1) if not visible: continue verified = 0 if not permissions: # This action requires no extra permissions. verified = 1 else: if category in ('object', 'workflow') and object is not None: context = object elif category == 'folder' and folder is not None: context = folder else: context = portal for permission in permissions: # The user must be able to match at least one of # the listed permissions. if _checkPermission(permission, context): verified = 1 break if verified: catlist = filtered_actions.get(category, None) if catlist is None: filtered_actions[category] = catlist = [] # If a bug occurs where actions appear more than once, # a little code right here can fix it. catlist.append(action) return filtered_actions