[hal_json] Add new Portal Action "Mass Workflow Change"
Showing
"""Base_getFormIdForWorkflowAction returns form_id of a form (dialog) used by `workflow_action` | ||
This is not an UI script - it should be used in TALES expressions or called internally. | ||
Developer Notes: | ||
Format of Action returned by getFilteredActions['workflow'] = [{ | ||
'available': True, | ||
'visible': True, | ||
'allowed': True, | ||
'link_target': None, | ||
'id': 'invalidate_action', | ||
'category': 'workflow', | ||
'name': 'Invalidate Action', | ||
'title': 'Invalidate Action', | ||
'url': 'https://softinst81338.host.vifib.net/erp5/web_site_module/renderjs_runner/foo_module/27/Base_viewWorkflowActionDialog?workflow_action=invalidate_action', | ||
|
||
'transition': <TransitionDefinition at /erp5/portal_workflow/foo_workflow/id_form_dict/invalidate_action>, | ||
'icon': ''}, ... ] | ||
""" | ||
action_tool = context.getPortalObject().portal_actions | ||
id_form_dict = dict() | ||
context.log("called with form_id {}, query {}, workflow_action {}".format(form_id, query, workflow_action)) | ||
for result in context.Base_searchUsingFormIdAndQuery(form_id, query): | ||
for action in action_tool.listFilteredActionsFor(result.getObject()).get('workflow', []): | ||
id_form_dict[action['id']] = action['url'].rsplit('/', 1)[1].split('?')[0] | ||
if not workflow_action and len(id_form_dict) == 1: | ||
# if we have only one possible workflow transition we suppose it is the default one | ||
return id_form_dict.items()[0][1] | ||
if workflow_action in id_form_dict: | ||
# if the workflow_action is done and we found it then return related form dialog | ||
return id_form_dict[workflow_action] | ||
# if we have no idea what workflow form we should use - just use ~~the default one~~ nothing | ||
return "" |
"""Return items (ready to be used in listbox of listfield) of common workflows on documents defined by `form_id` and `query`. | ||
:param form_id: {str} Form.ID of a form containing listbox to execute the query | ||
:param query: {str} fulltext query | ||
:param add_empty: {bool} First choice is empty | ||
Developer Notes: | ||
Format of Action returned by getFilteredActions['workflow'] = [{ | ||
'available': True, | ||
'visible': True, | ||
'allowed': True, | ||
'link_target': None, | ||
'id': 'invalidate_action', | ||
'category': 'workflow', | ||
'name': 'Invalidate Action', | ||
'title': 'Invalidate Action', | ||
'url': 'https://softinst81338.host.vifib.net/erp5/web_site_module/renderjs_runner/foo_module/27/Base_viewWorkflowActionDialog?workflow_action=invalidate_action', | ||
|
||
'transition': <TransitionDefinition at /erp5/portal_workflow/foo_workflow/transition_dict/invalidate_action>, | ||
'icon': ''}, ... ] | ||
""" | ||
def formatDict(d, padding=0): | ||
if not isinstance(d, dict): | ||
return " " * padding + str(d) | ||
return "\n".join(" " * padding + key + ":" + formatDict(d[key], padding+4) for key in d) | ||
action_tool = context.getPortalObject().portal_actions | ||
translate = context.getPortalObject().Base_translateString | ||
workflow_list = [] | ||
if add_empty: | ||
workflow_list.append((translate('Choose desired action.'), '')) | ||
transition_dict = {} | ||
for result in context.Base_searchUsingFormIdAndQuery(form_id, query): | ||
for action in action_tool.listFilteredActionsFor(result.getObject()).get('workflow', []): | ||
transition_dict[action['id']] = action['title'] | ||
if not transition_dict: | ||
workflow_list.append((translate("No state change possible"), "")) | ||
if len(transition_dict) == 1: | ||
workflow_list = [] # if there is only one workflow possible - do not bother with an empty option | ||
# transition_dict.items() is in form (id, title) but ERP5 requires (title, id) so we reverse | ||
if transition_dict: | ||
workflow_list.extend((title, id) for id, title in sorted(transition_dict.items(), key=lambda x: x[1])) | ||
return workflow_list |