diff --git a/product/ERP5Type/patches/WorkflowTool.py b/product/ERP5Type/patches/WorkflowTool.py index b7de5a1861d8ac5da2b1c19e7402fdaa72760ac4..547ceb64adfcedfe29218d93012eb941d7468a4d 100644 --- a/product/ERP5Type/patches/WorkflowTool.py +++ b/product/ERP5Type/patches/WorkflowTool.py @@ -27,7 +27,7 @@ from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition from Products.DCWorkflow.Transitions import TRIGGER_WORKFLOW_METHOD from Products.CMFCore.utils import getToolByName -from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery, NegatedQuery +from Products.ZSQLCatalog.SQLCatalog import SimpleQuery, AutoQuery, ComplexQuery, NegatedQuery from Products.CMFCore.utils import _getAuthenticatedUser from Products.ERP5Type.Cache import CachingMethod from sets import ImmutableSet @@ -242,7 +242,7 @@ def groupWorklistListByCondition(worklist_dict, sql_catalog, valid_criterion_dict=valid_criterion_dict) return worklist_set_dict.values(), metadata_dict -def generateNestedQuery(priority_list, criterion_dict, +def generateNestedQuery(getQuery, priority_list, criterion_dict, possible_worklist_id_dict=None): """ """ @@ -266,16 +266,17 @@ def generateNestedQuery(priority_list, criterion_dict, criterion_worklist_id_dict = worklist_id_dict if len(criterion_worklist_id_dict): subcriterion_query = generateNestedQuery( + getQuery=getQuery, priority_list=my_priority_list, criterion_dict=criterion_dict, possible_worklist_id_dict=criterion_worklist_id_dict) if subcriterion_query is not None: - query = Query(operator='IN', + query = getQuery(comparison_operator='IN', **{my_criterion_id: criterion_value}) if isinstance(criterion_value, ExclusionTuple): query = NegatedQuery(query) query = ComplexQuery(operator='OR', - *(query, Query(**{my_criterion_id: None}))) + *(query, getQuery(**{my_criterion_id: None}))) append(ComplexQuery(query, subcriterion_query, operator='AND')) else: possible_value_list = tuple() @@ -296,20 +297,26 @@ def generateNestedQuery(priority_list, criterion_dict, possible_value_list += criterion_value value_query_list = [] if len(possible_value_list): - query = Query(operator='IN', **{my_criterion_id: possible_value_list}) + query = getQuery( + comparison_operator='IN', + **{my_criterion_id: possible_value_list} + ) value_query_list.append(query) if len(impossible_value_list): - query = Query(operator='IN', **{my_criterion_id: impossible_value_list}) + query = getQuery( + comparison_operator='IN', + **{my_criterion_id: impossible_value_list} + ) query = NegatedQuery(query) query = ComplexQuery(operator='OR', - *(query, Query(**{my_criterion_id: None}))) + *(query, getQuery(**{my_criterion_id: None}))) value_query_list.append(query) append(ComplexQuery(operator='AND', *value_query_list)) if len(query_list): return ComplexQuery(operator='OR', *query_list) return None -def getWorklistListQuery(grouped_worklist_dict): +def getWorklistListQuery(getQuery, grouped_worklist_dict): """ Return a tuple of 3 value: - a select_expression with a count(*) and all columns used in @@ -335,8 +342,11 @@ def getWorklistListQuery(grouped_worklist_dict): criterion_value_to_worklist_dict[worklist_id] = None total_criterion_id_list = sorted(total_criterion_id_dict, key=lambda y: max( len(x) for x in total_criterion_id_dict[y].itervalues())) - query = generateNestedQuery(priority_list=total_criterion_id_list, - criterion_dict=total_criterion_id_dict) + query = generateNestedQuery( + getQuery=getQuery, + priority_list=total_criterion_id_list, + criterion_dict=total_criterion_id_dict, + ) assert query is not None assert COUNT_COLUMN_TITLE not in total_criterion_id_dict return (total_criterion_id_list, query) @@ -499,9 +509,16 @@ def WorkflowTool_listActions(self, info=None, object=None, src__=False): security_uid_dict.pop(ignored_security_uid_parameter) return security_uid_dict, role_column_dict, local_role_column_dict select_expression_prefix = 'sum(`%s`) as %s' % (COUNT_COLUMN_TITLE, COUNT_COLUMN_TITLE) + # Prevent catalog from trying to join + getQuery = SimpleQuery else: search_result = portal_catalog.unrestrictedSearchResults select_expression_prefix = 'count(*) as %s' % (COUNT_COLUMN_TITLE, ) + # Let catalog join as needed + getQuery = lambda comparison_operator=None, **kw: AutoQuery( + operator=comparison_operator, + **kw + ) worklist_result_dict = {} # Get a list of dict of WorklistVariableMatchDict grouped by compatible # conditions @@ -519,7 +536,10 @@ def WorkflowTool_listActions(self, info=None, object=None, src__=False): for grouped_worklist_dict in worklist_list_grouped_by_condition: # Generate the query for this worklist_list (total_criterion_id_list, query) = \ - getWorklistListQuery(grouped_worklist_dict=grouped_worklist_dict) + getWorklistListQuery( + getQuery=getQuery, + grouped_worklist_dict=grouped_worklist_dict, + ) group_by_expression = ', '.join(total_criterion_id_list) assert COUNT_COLUMN_TITLE not in total_criterion_id_list # If required mapping method is not present on the query, assume it @@ -651,7 +671,10 @@ def WorkflowTool_refreshWorklistCache(self): for grouped_worklist_dict in worklist_list_grouped_by_condition: # Generate the query for this worklist_list (total_criterion_id_list, query) = \ - getWorklistListQuery(grouped_worklist_dict=grouped_worklist_dict) + getWorklistListQuery( + getQuery=SimpleQuery, + grouped_worklist_dict=grouped_worklist_dict, + ) for criterion_id in total_criterion_id_list: assert criterion_id in table_column_id_set for security_column_id in security_column_id_set: