[Erp5-report] r31466 jp - in /erp5/trunk/products/ERP5Form: ./ Extensions/ Tool/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Dec 24 18:09:37 CET 2009


Author: jp
Date: Thu Dec 24 18:09:36 2009
New Revision: 31466

URL: http://svn.erp5.org?rev=31466&view=rev
Log:
Initial implementatoin of mass workflow state change was playing arround the API of SelectionTool and Selection, getting parameters and reimplementing part of Selection.__call__ API in order to be able to override certain parameters. As a result, some parameters were not taken into account in some cases and the result was not the same as the one from the selection. In this change, we extend the API of Selection so that, just like for methods, it is possible to override in a non persistent way the parameters which are passed to the selection method. This is similar to the existing possibility of overriding the calling context or the selection method.

Modified:
    erp5/trunk/products/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py
    erp5/trunk/products/ERP5Form/Selection.py
    erp5/trunk/products/ERP5Form/Tool/SelectionTool.py

Modified: erp5/trunk/products/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py?rev=31466&r1=31465&r2=31466&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py [utf8] Thu Dec 24 18:09:36 2009
@@ -53,11 +53,8 @@
   
   selection_name = request['selection_name']
 
-  list_method_name = 'searchFolder'
   form = getattr(portal, form_id)
   listbox = getattr(form, 'listbox', None)
-  if listbox is not None:
-    list_method_name = listbox.get_value('list_method').method_name
 
   # guess all column name from catalog schema
   possible_state_list = [column_name for column_name in
@@ -72,17 +69,17 @@
   counter = 0
   if not selection_uid_list:
     for workflow_state in possible_state_list:
-      selection_params = \
-              selection_tool.getSelectionParamsFor(selection_name).copy()
-      selection_params['where_expression'] = \
-                        'catalog.%s is not NULL' % workflow_state
-      selection_params['group_by'] = ('catalog.portal_type',
+      params = \
+          selection_tool.getSelectionParamsFor(selection_name).copy() 
+      params['where_expression'] = \
+                       'catalog.%s is not NULL' % workflow_state
+      params['group_by'] = ('catalog.portal_type',
                                       'catalog.%s' % workflow_state)
-      selection_params['select_expression'] = (
+      params['select_expression'] = (
           'catalog.path, count(catalog.uid) as count, catalog.portal_type, catalog.%s'
             % workflow_state)
       
-      for brain in getattr(self, list_method_name)(**selection_params):
+      for brain in selection_tool.callSelectionFor(selection_name, params=params):
         doc = brain.getObject()
         for workflow in wf_tool.getWorkflowsFor(doc):
           state_var = workflow.variables.getStateVar()
@@ -161,13 +158,10 @@
   document_list = []
   portal = self.getPortalObject()
   getObject = portal.portal_catalog.getObject
-  searchResults = portal.portal_catalog.searchResults
   wtool = portal.portal_workflow
-  stool = portal.portal_selections
-  original_selection_params = stool.getSelectionParamsFor(selection_name)
-  original_selection_params.setdefault('sort_on', kw.get('sort_on'))
+  selection_tool = portal.portal_selections
 
-  selection_uid_list = stool.getSelectionCheckedUidsFor(selection_name)
+  selection_uid_list = selection_tool.getSelectionCheckedUidsFor(selection_name)
 
   if selection_uid_list:
     original_selection_params['uid'] = selection_uid_list
@@ -175,14 +169,15 @@
   translate = self.Base_translateString
   for listbox_selection in listbox:
     if listbox_selection.get('workflow_action'):
-      selection_params = original_selection_params.copy()
+      selection_params = selection_tool.getSelectionParamsFor(selection_name).copy() 
+      selection_params.setdefault('sort_on', kw.get('sort_on'))
       selection_params[listbox_selection['state_var']] = \
                                 listbox_selection['workflow_state']
       selection_params['portal_type'] = listbox_selection['portal_type']
 
       workflow_id, action = listbox_selection['workflow_action'].split('/')
       workflow = wtool.getWorkflowById(workflow_id)
-      for doc in searchResults(**selection_params):
+      for doc in selection_tool.callSelectionFor(selection_name, params=selection_params):
         doc = doc.getObject()
         action_list = [ai for ai in
                         workflow.listObjectActions(wtool._getOAI(doc))

Modified: erp5/trunk/products/ERP5Form/Selection.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Selection.py?rev=31466&r1=31465&r2=31466&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Selection.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/Selection.py [utf8] Thu Dec 24 18:09:36 2009
@@ -185,11 +185,30 @@
          restarted."""
       return newState
 
-    def __call__(self, method = None, context=None, REQUEST=None):
+    def __call__(self, method=None, context=None, REQUEST=None, params=None):
+        """
+        Calls the selection and return the list of selected documents
+        or objects. Seledction method, context and parameters may be 
+        overriden in a non persistent way.
+
+        method -- optional method (callable) or method path (string)
+                  to use instead of the persistent selection method
+
+        context -- optional context to call the selection method on
+
+        REQUEST -- optional REQUEST parameters (not used, only to 
+                   provide API compatibility)
+
+        params -- optional parameters which can be used to override
+                  default params
+        """
         #LOG("Selection", 0, str((self.__dict__)))
         #LOG("Selection", 0, str(method))
         #LOG('Selection', 0, "self.invert_mode = %s" % repr(self.invert_mode))
-        kw = self.params.copy()
+        if not params:
+          kw = self.params.copy()
+        else:
+          kw = params.copy()
         # Always remove '-C'-named parameter.
         kw.pop('-C', None)
         if self.invert_mode is not 0:

Modified: erp5/trunk/products/ERP5Form/Tool/SelectionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Tool/SelectionTool.py?rev=31466&r1=31465&r2=31466&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Tool/SelectionTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/Tool/SelectionTool.py [utf8] Thu Dec 24 18:09:36 2009
@@ -220,12 +220,34 @@
       return self.getSelectionNameList(context, REQUEST)
 
     security.declareProtected(ERP5Permissions.View, 'callSelectionFor')
-    def callSelectionFor(self, selection_name, context=None, REQUEST=None):
+    def callSelectionFor(self, selection_name, method=None, context=None, 
+                                               REQUEST=None, params=None):
+      """
+      Calls the selection and return the list of selected documents
+      or objects. Seledction method, context and parameters may be 
+      overriden in a non persistent way.
+
+      selection_name -- the name of the selectoin (string)
+
+      method -- optional method (callable) or method path (string)
+                to use instead of the persistent selection method
+
+      context -- optional context to call the selection method on
+
+      REQUEST -- optional REQUEST parameters (not used, only to 
+                 provide API compatibility)
+
+      params -- optional parameters which can be used to override
+                default params
+
+      TODO: is it acceptable to keep method in the API at this level
+            for security reasons (XXX-JPS)
+      """
       if context is None: context = self
       selection = self.getSelectionFor(selection_name, REQUEST=REQUEST)
       if selection is None:
         return None
-      return selection(context=context)
+      return selection(method=method, context=context, REQUEST=REQUEST, params=params)
 
     security.declareProtected(ERP5Permissions.View, 'getSelectionFor')
     def getSelectionFor(self, selection_name, REQUEST=None):




More information about the Erp5-report mailing list