From 446ad5fbfb0396f257419ba238c79c6c0fde7def Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Mon, 3 Dec 2007 17:11:32 +0000
Subject: [PATCH] two external methods to list document groups and documents
 for mass workflow dialog.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@17969 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../Folder_getWorkflowActionDocumentList.py   | 152 ++++++++++++++++++
 1 file changed, 152 insertions(+)
 create mode 100644 product/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py

diff --git a/product/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py b/product/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py
new file mode 100644
index 0000000000..1fdc2dc70a
--- /dev/null
+++ b/product/ERP5Form/Extensions/Folder_getWorkflowActionDocumentList.py
@@ -0,0 +1,152 @@
+#############################################################################
+#
+# Copyright (c) 2007 Nexedi SA and Contributors. All Rights Reserved.
+#                    Jerome Perrin <jerome@nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+from Products.PythonScripts.standard import Object
+
+
+def getDocumentGroupByWorkflowStateList(self, **kw):
+  """This returns the list of all "document groups", ie document of the same
+  portal type, in the same workflow state.
+  
+  Note that this is not in a Script Python, because this would need a Manager
+  proxy role, but if we use a script with proxy roles, those roles are used
+  when searching catalog.
+  """
+  def UrlGetter(doc, state_var):
+    """returns an url method."""
+    def get_url(*args, **kw):
+      return '%s/view?reset:int=1&%s=%s&portal_type=%s' % (
+            self.absolute_url(), state_var, doc.getProperty(state_var),
+            doc.getPortalType())
+    return get_url
+
+  request = self.REQUEST
+  portal = self.getPortalObject()
+  N_ = portal.Base_translateString
+  wf_tool = portal.portal_workflow
+  selection_tool = portal.portal_selections
+  
+  selection_name = request['selection_name']
+  # TODO this should be guessed somehow, but portal_catalog.schema() contains
+  # much more than what we need here.
+  possible_state_list = ['validation_state', 'simulation_state', 'payment_state',]
+  
+  # If there are checked uids, only use checked uids.
+  selection_uid_list = selection_tool.getSelectionCheckedUidsFor(selection_name)
+  # TODO invert mode: calculate in python
+  
+  document_list = []
+  
+  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'] = '%s is not NULL' % workflow_state
+      selection_params['group_by'] = ('portal_type', workflow_state)
+      selection_params['select_expression'] = (
+           'count(catalog.uid) as count, portal_type, %s' % workflow_state)
+      
+      for brain in self.searchFolder(**selection_params):
+        doc = brain.getObject()
+        for workflow in wf_tool.getWorkflowsFor(doc):
+          state_var = workflow.variables.getStateVar()
+          translated_workflow_state_title = doc.getProperty(
+                          'translated_%s_title' % state_var)
+          if state_var == workflow_state:
+            counter += 1
+            document_list.append(doc.asContext(
+                            uid='new_%s' % counter,
+                            getListItemUrl=UrlGetter(doc, state_var),
+                            workflow_title=N_(workflow.title_or_id()),
+                            translated_workflow_state_title=
+                                   translated_workflow_state_title,
+                            count=brain.count,
+                            
+                            workflow_id=workflow.getId(),
+                            portal_type=doc.getPortalType(),
+                            state_var=state_var,
+                            workflow_state=doc.getProperty(state_var),
+                            ))
+  
+  else:
+    getObject = portal.portal_catalog.getObject
+    workflow_state_dict = dict()
+    for document in [getObject(uid) for uid in selection_uid_list]:
+      state = document.getProperty(workflow_state)
+      ptype = document.getPortalTypeName()
+      workflow_state_dict[(ptype, state)] = \
+             workflow_state_dict.get((ptype, state), 0) + 1
+  
+      document_list = [Object(uid='new_',
+            translated_portal_type='TODO: count in python')]
+  
+  return document_list
+
+
+
+def getWorkflowActionDocumentList(self, **kw):
+  """This returns the list of all documents on which we will pass a workflow
+  transition.
+  """
+  listbox = kw['listbox']
+  selection_name = kw['module_selection_name']
+  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 = \
+    portal.portal_selections.getSelectionParamsFor(selection_name)
+  original_selection_params.setdefault('sort_on', kw.get('sort_on'))
+
+  # TODO: invert mode
+
+  for listbox_selection in listbox:
+    if listbox_selection.get('workflow_action'):
+      selection_params = original_selection_params.copy()
+      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):
+        doc = doc.getObject()
+        action_list = [ai for ai in
+                        workflow.listObjectActions(wtool._getOAI(doc))
+                        if ai['id'] == action]
+        if action_list:
+          document_list.append(doc.asContext(
+                             workflow_action_title=action_list[0]['name'],
+                             workflow_action=action,
+                             workflow_id=workflow_id))
+
+  return document_list
+
-- 
2.30.9