diff --git a/product/ERP5Type/patches/DCWorkflow.py b/product/ERP5Type/patches/DCWorkflow.py index 3c685e88c54c3e3553c4db508bb226d306a3a646..5d0c9ec7a976900b474d3b4cf571a7c2ee705409 100644 --- a/product/ERP5Type/patches/DCWorkflow.py +++ b/product/ERP5Type/patches/DCWorkflow.py @@ -56,6 +56,49 @@ def WorkflowUIMixin_setProperties( self, title WorkflowUIMixin_class.setProperties = WorkflowUIMixin_setProperties WorkflowUIMixin_class.manage_properties = DTMLFile('workflow_properties', _dtmldir) +def Guard_check(self, sm, wf_def, ob, **kw): + """Checks conditions in this guard. + This method was patched so that roles are not taken + into account here (but taken into account as local roles) + """ + 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.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 + + +Guard.check = Guard_check def DCWorkflowDefinition_listGlobalActions(self, info): ''' @@ -69,7 +112,7 @@ def DCWorkflowDefinition_listGlobalActions(self, info): workflow_tool = getToolByName(self, 'portal_workflow') workflow = getattr(workflow_tool, self.id) _getPortalTypeListForWorkflow = CachingMethod(workflow.getPortalTypeListForWorkflow, - id='_getPortalTypeListForWorkflow', + id=('_getPortalTypeListForWorkflow', self.id), cache_factory = 'erp5_ui_long') portal_type_list = _getPortalTypeListForWorkflow() if not portal_type_list: @@ -86,7 +129,11 @@ def DCWorkflowDefinition_listGlobalActions(self, info): info.now = DateTime() for id, qdef in self.worklists.items(): if qdef.actbox_name: - guard = qdef.guard + guard = qdef.guard + # Patch for ERP5 by JP Smets in order + # to take into account the expression of the guard + # and nothing else - ERP5Workflow definitely needed some day + if guard is None or guard.check(sm, self, portal): dict = {} # Patch for ERP5 by JP Smets in order # to implement worklists and search of local roles @@ -96,9 +143,9 @@ def DCWorkflowDefinition_listGlobalActions(self, info): # Check the catalog for items in the worklist. catalog = getToolByName(self, 'portal_catalog') for k in var_match_keys: - v = qdef.getVarMatch(k) - v_fmt = map(lambda x, info=info: x%info, v) - dict[k] = v_fmt + v = qdef.getVarMatch(k) + v_fmt = map(lambda x, info=info: x%info, v) + dict[k] = v_fmt # Patch to automatically filter workflists per portal type # so that the same state can be used for different # worklists and they are not merged @@ -106,13 +153,14 @@ def DCWorkflowDefinition_listGlobalActions(self, info): dict['portal_type'] = portal_type_list # Patch for ERP5 by JP Smets in order # to implement worklists and search of local roles - if not (guard is None or guard.check(sm, self, portal)): - dict['local_roles'] = guard.roles + # we do not take into account the guard here + if guard is not None and guard.roles: + dict['local_roles'] = guard.roles # Patch to use ZSQLCatalog and get high speed # LOG("PatchedDCWorkflowDefinition", 0, dict) searchres_len = int(apply(catalog.countResults, (), dict)[0][0]) if searchres_len == 0: - continue + continue if fmt_data is None: fmt_data = TemplateDict() fmt_data._push(info) @@ -120,11 +168,11 @@ def DCWorkflowDefinition_listGlobalActions(self, info): # Patch for ERP5 by JP Smets in order to # filter per portal type more easily (ie. without # hardcoding it all) - fmt_data._push({'portal_type': ' OR '.join(portal_type_list)}) + fmt_data._push({'portal_type': ' OR '.join(dict['portal_type'])}) # Patch for ERP5 by JP Smets in order # to implement worklists and search of local roles if dict.has_key('local_roles'): - fmt_data._push({'local_roles': join(guard.roles,';')}) + fmt_data._push({'local_roles': join(dict['local_roles'],';')}) else: fmt_data._push({'local_roles': ''}) res.append((id, {'name': qdef.actbox_name % fmt_data,