diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.py index d149bad2ae831cb3657033fe1efc668d3e099f1a..fee8fd31d3bb61c87c04ca1d785c7dc1752a766e 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/accounting_workflow/scripts/validateTransactionLines.py @@ -13,7 +13,8 @@ section_portal_type_list = ['Person', 'Organisation'] invalid_state_list = ['invalidated', 'deleted'] # first of all, validate the transaction itself -container.validateTransaction(state_change) +script_id = container.getScriptIdByReference('validateTransaction') +container.getScriptValueById(script_id)(state_change) # Check that all lines uses open accounts, and doesn't use invalid third diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/guessGroupingReference.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/guessGroupingReference.py index 736576299dc687c3792c0678629d26ac7f3f72d1..9c6bfa855d4fe91ac63e20591d8a1261fc6eff91 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/guessGroupingReference.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/guessGroupingReference.py @@ -1 +1 @@ -return sci.getPortal().portal_workflow.accounting_workflow.scripts[script.getId()](sci) +return sci.getPortal().portal_workflow.accounting_workflow.getScriptValueById(script.getId())(sci) diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/resetGroupingReference.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/resetGroupingReference.py index 736576299dc687c3792c0678629d26ac7f3f72d1..9c6bfa855d4fe91ac63e20591d8a1261fc6eff91 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/resetGroupingReference.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/resetGroupingReference.py @@ -1 +1 @@ -return sci.getPortal().portal_workflow.accounting_workflow.scripts[script.getId()](sci) +return sci.getPortal().portal_workflow.accounting_workflow.getScriptValueById(script.getId())(sci) diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/setReferences.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/setReferences.py index 4893ad359d4f730c110b8622e5d39ae0fa568e3b..bb14fca7492d0d26ab40b01b9361ecb07a1f0717 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/setReferences.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/setReferences.py @@ -1 +1 @@ -return state_change.getPortal().portal_workflow.accounting_workflow.scripts[script.getId()](state_change) +return state_change.getPortal().portal_workflow.accounting_workflow.getScriptValueById(script.getId())(state_change) diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransaction.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransaction.py index 4893ad359d4f730c110b8622e5d39ae0fa568e3b..bb14fca7492d0d26ab40b01b9361ecb07a1f0717 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransaction.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransaction.py @@ -1 +1 @@ -return state_change.getPortal().portal_workflow.accounting_workflow.scripts[script.getId()](state_change) +return state_change.getPortal().portal_workflow.accounting_workflow.getScriptValueById(script.getId())(state_change) diff --git a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransactionLines.py b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransactionLines.py index 7a409eb6e6c494ec74357831b8ba1753695f4240..289500fbdff6754b6161f7cec2fa9c80601f443d 100644 --- a/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransactionLines.py +++ b/bt5/erp5_accounting/WorkflowTemplateItem/portal_workflow/internal_invoice_transaction_simulation_workflow/scripts/validateTransactionLines.py @@ -7,4 +7,5 @@ if old_state.getId() == 'draft': if internal_invoice.InternalInvoice_getAuthenticatedUserSection() == internal_invoice.getDestinationSection(): raise ValidationFailed(translateString("Your entity should not be destination.")) -return state_change.getPortal().portal_workflow.accounting_workflow.scripts[script.getId()](state_change) +script = state_change.getPortal().portal_workflow.accounting_workflow.getScriptValueById(script.getId()) +return script(state_change) diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace_editor_support.zpt b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace_editor_support.zpt index 388b326ed85eb73b0cbab3d5f6ec6a89ca60299e..ef27d2f30579e423bc68cdf021a22e47da85d730 100644 --- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace_editor_support.zpt +++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace_editor_support.zpt @@ -399,9 +399,17 @@ timer = 0; } timer = window.setTimeout(function() { + var data = {code: ace_editor.getSession().getValue()} + // workflow script: try to get parameters + $.ajax({type: 'GET', + async: false, + url: 'getScriptParameterList', + success: function(text){ + data['bound_names'] = text.split(','); + data['params'] = [] + }}); $.post('${portal_url}/ERP5Site_checkPythonSourceCodeAsJSON', - {'data': JSON.stringify( - { code: ace_editor.getSession().getValue() })}, + {'data': JSON.stringify(data)}, function(data){ ace_editor.getSession().setAnnotations(data.annotations); } diff --git a/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py b/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py index b3082c4360caf48eefeb1c5cb3b5080cb10603ae..a9207d8ac6f06731f654ea9b77d2b2dd461ebf5b 100644 --- a/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py +++ b/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py @@ -186,8 +186,10 @@ def checkPythonSourceCodeAsJSON(self, data): def indent(text): return ''.join((" " + line) for line in text.splitlines(True)) - is_python_script = 'bound_names' in data - if is_python_script: + # don't show 'undefined-variable' errors for Python Script or Workflow Script + # parameters + is_script = 'bound_names' in data + if is_script: signature_parts = data['bound_names'] if data['params']: signature_parts += [data['params']] @@ -202,7 +204,7 @@ def checkPythonSourceCodeAsJSON(self, data): message_list = checkPythonSourceCode(body.encode('utf8')) for message_dict in message_list: - if is_python_script: + if is_script: message_dict['row'] = message_dict['row'] - 2 else: message_dict['row'] = message_dict['row'] - 1 diff --git a/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view.xml b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view.xml index 8ef74df1ab0fd558b153b0b17cbab7b1d9d9c7c0..010bfd946e948611d963791f57da82289b446caa 100644 --- a/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view.xml +++ b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view.xml @@ -103,6 +103,7 @@ my_type_property_sheet_list my_type_base_category_list my_type_icon + my_type_workflow_list diff --git a/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view/my_type_workflow_list.xml b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view/my_type_workflow_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ca200ccb27af1460fa90981066e186d458ec963 --- /dev/null +++ b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/SolverType_view/my_type_workflow_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_type_workflow_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Workflow + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getId()) for x in here.getPortalObject().portal_workflow.objectValues()] + + + + + diff --git a/bt5/erp5_configurator/ActionTemplateItem/portal_types/Workflow/configurator_settings.xml b/bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/configurator_settings.xml similarity index 94% rename from bt5/erp5_configurator/ActionTemplateItem/portal_types/Workflow/configurator_settings.xml rename to bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/configurator_settings.xml index 820a94352245aebe7e866db4ddd1975a1140577f..30d348b30cd20da4ff10b149cca62c8417b43015 100644 --- a/bt5/erp5_configurator/ActionTemplateItem/portal_types/Workflow/configurator_settings.xml +++ b/bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/configurator_settings.xml @@ -50,6 +50,10 @@ + + portal_type + Action Information + priority 10.0 diff --git a/bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml b/bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml new file mode 100644 index 0000000000000000000000000000000000000000..d7fe5e4778e0599e4624949357a5c6a11781a3b0 --- /dev/null +++ b/bt5/erp5_configurator/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + + + description + + + + + + icon + + + + id + launch_configuration + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 10.0 + + + title + Launch Configuration + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_launchConfiguration + + + + + diff --git a/bt5/erp5_configurator/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml b/bt5/erp5_configurator/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml index 4912ae9da6450a905755a9c402a845bd91b50a65..87973f988aeee05ee19ccd187dd5adcbd3afd879 100644 --- a/bt5/erp5_configurator/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml +++ b/bt5/erp5_configurator/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml @@ -46,6 +46,9 @@ System Preference Configurator Item Workflow Security Configurator Item + + Embedded File + Address Email @@ -60,7 +63,4 @@ Embedded File - - Embedded File - \ No newline at end of file diff --git a/bt5/erp5_configurator/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml b/bt5/erp5_configurator/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml index 755831934ea4b2af13c4fbb26c6c348a8ca1cd7a..f8319942e7d504327c29f4e6e068398f418f7f79 100644 --- a/bt5/erp5_configurator/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml +++ b/bt5/erp5_configurator/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml @@ -4,6 +4,9 @@ File Link + + Embedded File + Address Email @@ -15,7 +18,4 @@ Email Telephone - - Embedded File - \ No newline at end of file diff --git a/bt5/erp5_configurator/PortalTypePropertySheetTemplateItem/property_sheet_list.xml b/bt5/erp5_configurator/PortalTypePropertySheetTemplateItem/property_sheet_list.xml index cdb7bb7854ae2049f7c111cbab695fabd6cf37b0..7ed5ab27d0806a10144fbbe8f857dfc14019b095 100644 --- a/bt5/erp5_configurator/PortalTypePropertySheetTemplateItem/property_sheet_list.xml +++ b/bt5/erp5_configurator/PortalTypePropertySheetTemplateItem/property_sheet_list.xml @@ -1,5 +1,5 @@ - + DefaultImage WorkflowConfigurator diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Account%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Account%20Configurator%20Item.xml index 8d6d0742f972ecde5e3c574883ba613c57c4e007..c4cbf2284b33fa20e5902678bee45e4f95a365bf 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Account%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Account%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup an Accounting Account. + + erp5workflow_list + + + + factory addAccountConfiguratorItem @@ -30,6 +36,12 @@ type_class AccountConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Accounting%20Period%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Accounting%20Period%20Configurator%20Item.xml index 051ef3c7dbdc76d5dd76a4d931d6a8b6bc91df66..86e1f64cdb58208c2ab268ae45dcf1f094b011ea 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Accounting%20Period%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Accounting%20Period%20Configurator%20Item.xml @@ -41,6 +41,12 @@ description Setup an Accounting Period. + + erp5workflow_list + + + + factory addAccountingPeriodConfiguratorItem @@ -75,6 +81,12 @@ type_class AccountingPeriodConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Purchase%20Trade%20Condition%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Purchase%20Trade%20Condition%20Configurator%20Item.xml index 7a1649236027eaf248799aedb073fa792568d6e0..8333bd21445f093fe658879e0e2089b1b4324a81 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Purchase%20Trade%20Condition%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Purchase%20Trade%20Condition%20Configurator%20Item.xml @@ -43,6 +43,12 @@ \n BankAccount inherits from Base and from the mix-in Coordinate. + + erp5workflow_list + + + + factory addBankAccount @@ -96,6 +102,12 @@ BankAccount inherits from Base and from the mix-in Coordinate. + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Sale%20Trade%20Condition%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Sale%20Trade%20Condition%20Configurator%20Item.xml index cbef4c17ef9230344afbafd6645bf272503f8b1d..f43aebf8461ae897b9b667afd07ac3151dc81e8f 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Sale%20Trade%20Condition%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Advanced%20Sale%20Trade%20Condition%20Configurator%20Item.xml @@ -43,6 +43,12 @@ \n BankAccount inherits from Base and from the mix-in Coordinate. + + erp5workflow_list + + + + factory addBankAccount @@ -96,6 +102,12 @@ BankAccount inherits from Base and from the mix-in Coordinate. + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Alarm%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Alarm%20Configurator%20Item.xml index 8eacd820afcb14e79a09340f80175ca87e8c31ea..8c916baf5bfb645bf8f28ff44fd9b255eb24728c 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Alarm%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Alarm%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup an Alarm + + erp5workflow_list + + + + factory addAccountConfiguratorItem @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Bank%20Account%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Bank%20Account%20Configurator%20Item.xml index 9cf01de97e5bd10467d003530bc3cecfd3b947df..b2faf4f88270ad211ba9205b7f94e636b1085f59 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Bank%20Account%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Bank%20Account%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup a Bank Account + + erp5workflow_list + + + + factory addAccountConfiguratorItem @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration%20Module.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration%20Module.xml index e31d749371110ed8c6f8ec9c96dd2e0e15ea1838..ab2ae18a608bcfe7de71a9b404153c47fe3be005 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration%20Module.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration%20Module.xml @@ -42,6 +42,12 @@ Folders allow to store a large number of documents (1,000,000 should not\n be a problem). + + erp5workflow_list + + + + factory addFolder @@ -78,6 +84,12 @@ be a problem). type_class Folder + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration.xml index 8cd29c70ffdbbce07cd74a12001590f52b267998..6885c76c7ebf556d27de45236bf47225294ec9c1 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Configuration.xml @@ -41,6 +41,12 @@ description Business Configuration is used to represent the highest level of configuration of "something" - like ERP5 Site. Additional documents (deliveries) are used to "glue" all information together. + + erp5workflow_list + + + + factory addBusinessConfiguration @@ -93,6 +99,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Process%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Process%20Configurator%20Item.xml index 9ab7982313f0a59c041e399e378e5a49b71bbe8e..3af0f714b8ccfbeaa951d5286667309659c7b67a 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Process%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Business%20Process%20Configurator%20Item.xml @@ -18,6 +18,12 @@ + + erp5workflow_list + + + + id Business Process Configurator Item @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Catalog%20Keyword%20Key%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Catalog%20Keyword%20Key%20Configurator%20Item.xml index 0252f30d9b2dd54fd57e1a75094a62d7b02911da..af91f2fb5425a9a7f8b57f605452f52e5aa606ea 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Catalog%20Keyword%20Key%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Catalog%20Keyword%20Key%20Configurator%20Item.xml @@ -37,6 +37,12 @@ description Set up catalog keyword keys. + + erp5workflow_list + + + + factory addCatalogKeywordKeyConfiguratorItem @@ -49,6 +55,12 @@ type_class CatalogKeywordKeyConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Categories%20Spreadsheet%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Categories%20Spreadsheet%20Configurator%20Item.xml index 648602982536a5013a0d9026d99d7b001c687a7f..e9117f36fd0c570610aadfce95881f15277b6656 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Categories%20Spreadsheet%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Categories%20Spreadsheet%20Configurator%20Item.xml @@ -41,6 +41,12 @@ description Setup Categories Spreadsheet + + erp5workflow_list + + + + factory addCategoriesSpreadsheetConfiguratorItem @@ -91,6 +97,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Category%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Category%20Configurator%20Item.xml index 0213709fd355744e6d3e94bbd638289869eecfa1..ce91b14eaccc7f069cda321f7048ededb2a1afd9 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Category%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Category%20Configurator%20Item.xml @@ -37,6 +37,12 @@ description This class is meta build step for customization of ERP5 site. + + erp5workflow_list + + + + factory addCategoryConfiguratorItem @@ -49,6 +55,12 @@ type_class CategoryConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configuration%20Save.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configuration%20Save.xml index e58b1b117612b2f170b2758611b61cc582a9ac5f..bccdde5c59f75f19bbe164aff400f5e6381d9f94 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configuration%20Save.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configuration%20Save.xml @@ -41,6 +41,12 @@ description Save parameters entered by the user during the configurator process. + + erp5workflow_list + + + + factory addConfigurationSave @@ -91,6 +97,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configurator%20Tool.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configurator%20Tool.xml index ee290beb78153922c34339f6e0b43e88baffa01f..b06bc0d19c0a58c61129529042966ba53caef54c 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configurator%20Tool.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Configurator%20Tool.xml @@ -41,6 +41,12 @@ + + erp5workflow_list + + + + factory addFolder @@ -81,6 +87,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Currency%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Currency%20Configurator%20Item.xml index bae8f933a9b46ac049ea01440f0deaa9d22d0e0c..90108d8acf5c18a271d23756cd498a9cd8da5cc8 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Currency%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Currency%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup currency. + + erp5workflow_list + + + + factory addCurrencyConfiguratorItem @@ -30,6 +36,12 @@ type_class CurrencyConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Customer%20BT5%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Customer%20BT5%20Configurator%20Item.xml index c16214fe597bbfa5ec8582b7365ad1f1be79b829..c2f569f0e27339a8c4cdf71ad7a86bc68e08dc58 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Customer%20BT5%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Customer%20BT5%20Configurator%20Item.xml @@ -37,6 +37,12 @@ description Create a new bt5 for customer configuration. + + erp5workflow_list + + + + factory addCustomerBT5ConfiguratorItem @@ -49,6 +55,12 @@ type_class CustomerBT5ConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Organisation%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Organisation%20Configurator%20Item.xml index 919e33d8d7d3a0a4e09b5729ff09fb82a7d13d4d..11b8d93c17a4719ba49f5776cd8cf4a2c8e04dd0 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Organisation%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Organisation%20Configurator%20Item.xml @@ -41,6 +41,12 @@ description This class install a Organisation. + + erp5workflow_list + + + + factory addOrganisationConfiguratorItem @@ -75,6 +81,12 @@ type_class OrganisationConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Permission%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Permission%20Configurator%20Item.xml index 62438f148c29536f894be685d04e5d39d00df53d..1af5943b186d4c6d05b8b92b7768aed73d11e9c8 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Permission%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Permission%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Set permission matrix on module. + + erp5workflow_list + + + + factory addPermissionConfiguratorItem @@ -30,6 +36,12 @@ type_class PermissionConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Person%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Person%20Configurator%20Item.xml index 06732924e84d6c008a57e49c8c2b76225ee942f5..be07d16312268a113529b3cef400848e4329ab41 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Person%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Person%20Configurator%20Item.xml @@ -22,6 +22,12 @@ description Setup user. + + erp5workflow_list + + + + factory addPersonConfiguratorItem @@ -56,6 +62,12 @@ type_class PersonConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Configurator%20Item.xml index 445d249cfe2ca4bc5f60aa0882efeea9cea26e1a..7dd645d4c9819e547bb2a913d1812310761ba2b5 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Configurator%20Item.xml @@ -22,6 +22,12 @@ description Configure Portal Type. + + erp5workflow_list + + + + factory addPortalTypeConfiguratorItem @@ -56,6 +62,12 @@ type_class PortalTypeConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Roles%20Spreadsheet%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Roles%20Spreadsheet%20Configurator%20Item.xml index 81d698fb11d398abb849fa44764418280496ccde..e850a3069efec207b416024890f711a7f133be05 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Roles%20Spreadsheet%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Portal%20Type%20Roles%20Spreadsheet%20Configurator%20Item.xml @@ -23,6 +23,12 @@ Import a portal type roles spreadsheet.\n + + erp5workflow_list + + + + factory addPortalTypeRolesSpreadsheetConfiguratorItem @@ -73,6 +79,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Preference%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Preference%20Configurator%20Item.xml index b237df6b4e122eb4b3e33a79eee628ebbfce0cc0..9bee12e0983e1e9909f1d8a191723d3380e5cfe5 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Preference%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Preference%20Configurator%20Item.xml @@ -38,6 +38,12 @@ Setup preference. \n XXX: also configure oood + + erp5workflow_list + + + + factory addPreferenceConfiguratorItem @@ -50,6 +56,12 @@ type_class PreferenceConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Purchase%20Trade%20Condition%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Purchase%20Trade%20Condition%20Configurator%20Item.xml index 90c68018a32ad2fbe775f927fbfc5fac651a2f2c..adddaad1c8a3786e57bdcbeb4976c1ce2fe3bfda 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Purchase%20Trade%20Condition%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Purchase%20Trade%20Condition%20Configurator%20Item.xml @@ -18,6 +18,12 @@ + + erp5workflow_list + + + + id Purchase Trade Condition Configurator Item @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Role%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Role%20Configurator%20Item.xml index 4c7a04ac347b2aca9791ca9642c99185a211df20..015b5b79c5aa58373ff6651ad432d7be55cf9294 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Role%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Role%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup role per module basis. + + erp5workflow_list + + + + factory addRoleConfiguratorItem @@ -30,6 +36,12 @@ type_class RoleConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Rule%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Rule%20Configurator%20Item.xml index 90b387d62c6383304b8b05d7880f05635b4aed9f..16bb96763ffa200a09fbb15ab0175b355777080a 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Rule%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Rule%20Configurator%20Item.xml @@ -18,6 +18,12 @@ + + erp5workflow_list + + + + id Rule Configurator Item @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Sale%20Trade%20Condition%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Sale%20Trade%20Condition%20Configurator%20Item.xml index d158afb3b15724d644c6c10638055a3d57867da7..b5ec5d272cbb529c6043686abcdb3c259eab658f 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Sale%20Trade%20Condition%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Sale%20Trade%20Condition%20Configurator%20Item.xml @@ -18,6 +18,12 @@ + + erp5workflow_list + + + + id Sale Trade Condition Configurator Item @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Security%20Category%20Mapping%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Security%20Category%20Mapping%20Configurator%20Item.xml index b02225f841a712868ac4b360296212692aa3acee..f89c73630bb22ed2a6fd3aadce63332e7361abab 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Security%20Category%20Mapping%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Security%20Category%20Mapping%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup an Alarm + + erp5workflow_list + + + + factory addAccountConfiguratorItem @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Service%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Service%20Configurator%20Item.xml index 4bb9fb8503fb51fb658e3e544b22b2d7db669b1a..338d19848fb669a2e3139578c3e81e0dbb5f032e 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Service%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Service%20Configurator%20Item.xml @@ -41,6 +41,12 @@ description Set up default service documents. + + erp5workflow_list + + + + factory addServiceConfiguratorItem @@ -75,6 +81,12 @@ type_class ServiceConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Site%20Property%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Site%20Property%20Configurator%20Item.xml index cca1688f031c8443a32e50b38d9258a07b4b2fa7..939fdf71da26dec43abae448096cc1a36c64d256 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Site%20Property%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Site%20Property%20Configurator%20Item.xml @@ -41,6 +41,12 @@ description Set up site properties. + + erp5workflow_list + + + + factory addSitePropertyConfiguratorItem @@ -75,6 +81,12 @@ type_class SitePropertyConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Solver%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Solver%20Configurator%20Item.xml index 09c80bcc17eee6eec6a3df8fa9e5faa9193d1113..e3ccdad115dfd0e0f87086a7d84b350f2f89e1f7 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Solver%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Solver%20Configurator%20Item.xml @@ -18,6 +18,12 @@ + + erp5workflow_list + + + + id Solver Configurator Item @@ -54,6 +60,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Standard%20BT5%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Standard%20BT5%20Configurator%20Item.xml index 27c9444516c2725e482432cc384e60ec3e394c2d..550d7dbebaeb0e6aad5fb075913a1485ac12b113 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Standard%20BT5%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Standard%20BT5%20Configurator%20Item.xml @@ -38,6 +38,12 @@ This class will install standard ERP5 template from a repository to\n fake site. + + erp5workflow_list + + + + factory addStandardBT5ConfiguratorItem @@ -50,6 +56,12 @@ type_class StandardBT5ConfiguratorItem + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/System%20Preference%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/System%20Preference%20Configurator%20Item.xml index 7de72e41789a0d1f91b3229713d52e9062a67e49..01e4be62f3824ef22681c3e7bb27e081e6f62e61 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/System%20Preference%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/System%20Preference%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup an Accounting Account. + + erp5workflow_list + + + + factory addAccountConfiguratorItem @@ -48,6 +54,12 @@ + + workflow_list + + + + diff --git a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Workflow%20Security%20Configurator%20Item.xml b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Workflow%20Security%20Configurator%20Item.xml index a383af1fd903f20adb2782b8d2e5f26ddb6017f5..d5cfbf972324f9d217cadbfbcb3a6e9cefc62ce5 100644 --- a/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Workflow%20Security%20Configurator%20Item.xml +++ b/bt5/erp5_configurator/PortalTypeTemplateItem/portal_types/Workflow%20Security%20Configurator%20Item.xml @@ -18,6 +18,12 @@ description Setup workflow for different roles. Use passed OO file. + + erp5workflow_list + + + + factory addWorkflowSecurityConfiguratorItem @@ -26,6 +32,16 @@ id Workflow Security Configurator Item + + type_class + WorkflowSecurityConfiguratorItem + + + workflow_list + + + + diff --git a/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfigurationModule_viewBusinessConfigurationList/listbox.xml b/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfigurationModule_viewBusinessConfigurationList/listbox.xml index ad44a12424d29528f77f0b911d2bc2cb08262af1..193d9e900312e21496ce8caac578693aef6e988a 100644 --- a/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfigurationModule_viewBusinessConfigurationList/listbox.xml +++ b/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfigurationModule_viewBusinessConfigurationList/listbox.xml @@ -9,7 +9,9 @@ delegated_list - + + columns + @@ -69,6 +71,37 @@ values + + columns + + + + id + Reference + + + title + Title + + + resource_title + Resource + + + creation_date + Creation Date + + + translated_validation_state_title + State + + + translated_simulation_state_title + Installation State + + + + field_id my_view_mode_listbox_business_configuration diff --git a/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfiguration_view/my_resource_title.xml b/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfiguration_view/my_resource_title.xml index c050dea0c7f0c0e2a85fde720742d910072a599b..b034a48149ba4e0d4802bf720713976c5fd1b1b8 100644 --- a/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfiguration_view/my_resource_title.xml +++ b/bt5/erp5_configurator/SkinTemplateItem/portal_skins/erp5_configurator/BusinessConfiguration_view/my_resource_title.xml @@ -104,8 +104,8 @@ - Workflow - Workflow + Configuration Workflow + Configuration Workflow diff --git a/bt5/erp5_configurator/bt/template_action_path_list b/bt5/erp5_configurator/bt/template_action_path_list index d65cf7778a6061c733ac3e55d4c0ec196f8271dd..281546ae48a9878216b60c64a3f32318a1f54bfc 100644 --- a/bt5/erp5_configurator/bt/template_action_path_list +++ b/bt5/erp5_configurator/bt/template_action_path_list @@ -8,6 +8,8 @@ Catalog Keyword Key Configurator Item | view Categories Spreadsheet Configurator Item | view Category Configurator Item | view Configuration Save | view +Configuration Workflow | configurator_settings +Configuration Workflow | launch_configuration Configurator Tool | view Currency Configurator Item | view Customer BT5 Configurator Item | view @@ -28,6 +30,4 @@ Solver Configurator Item | view Standard BT5 Configurator Item | view System Preference Configurator Item | view Workflow Security Configurator Item | view -Workflow | configurator_settings -Workflow | launch_configuration portal_actions | use_configurator \ No newline at end of file diff --git a/bt5/erp5_configurator/bt/template_portal_type_allowed_content_type_list b/bt5/erp5_configurator/bt/template_portal_type_allowed_content_type_list index 137299721572a1895662605f419dc9afb127b1ff..4efe4ca802b34b8e196eb6ab0eb1f45aa41a5df4 100644 --- a/bt5/erp5_configurator/bt/template_portal_type_allowed_content_type_list +++ b/bt5/erp5_configurator/bt/template_portal_type_allowed_content_type_list @@ -35,6 +35,7 @@ Configuration Save | Solver Configurator Item Configuration Save | Standard BT5 Configurator Item Configuration Save | System Preference Configurator Item Configuration Save | Workflow Security Configurator Item +Configuration Workflow | Embedded File Organisation Configurator Item | Address Organisation Configurator Item | Email Organisation Configurator Item | Telephone @@ -42,5 +43,4 @@ Person Configurator Item | Address Person Configurator Item | Career Person Configurator Item | Email Person Configurator Item | Telephone -Portal Type Roles Spreadsheet Configurator Item | Embedded File -Workflow | Embedded File \ No newline at end of file +Portal Type Roles Spreadsheet Configurator Item | Embedded File \ No newline at end of file diff --git a/bt5/erp5_configurator/bt/template_portal_type_hidden_content_type_list b/bt5/erp5_configurator/bt/template_portal_type_hidden_content_type_list index fc19d69a976ea34d83db961a78aa544117c4d5b7..48aabc624bfdda8af5a542545e55e60bfd2fb17d 100644 --- a/bt5/erp5_configurator/bt/template_portal_type_hidden_content_type_list +++ b/bt5/erp5_configurator/bt/template_portal_type_hidden_content_type_list @@ -1,11 +1,11 @@ Business Configuration | Configuration Save Business Configuration | File Business Configuration | Link +Configuration Workflow | Embedded File Organisation Configurator Item | Address Organisation Configurator Item | Email Organisation Configurator Item | Telephone Person Configurator Item | Address Person Configurator Item | Career Person Configurator Item | Email -Person Configurator Item | Telephone -Workflow | Embedded File \ No newline at end of file +Person Configurator Item | Telephone \ No newline at end of file diff --git a/bt5/erp5_configurator/bt/template_portal_type_property_sheet_list b/bt5/erp5_configurator/bt/template_portal_type_property_sheet_list index 6bf4925f6540332df9382164e23ac3e30dcea8eb..a7e8a192842cf8f6e82fe98578ac687d874c32a2 100644 --- a/bt5/erp5_configurator/bt/template_portal_type_property_sheet_list +++ b/bt5/erp5_configurator/bt/template_portal_type_property_sheet_list @@ -1,2 +1,2 @@ -Workflow | DefaultImage -Workflow | WorkflowConfigurator \ No newline at end of file +Configuration Workflow | DefaultImage +Configuration Workflow | WorkflowConfigurator \ No newline at end of file diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/business_configuration_module/ebusiness_lotse_configuration.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/business_configuration_module/ebusiness_lotse_configuration.xml index 1419f696a8995363deb90d021441f8cd151eebfe..54a5a5638dc6e5b0048555b94544aaccd2c90b05 100644 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/business_configuration_module/ebusiness_lotse_configuration.xml +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/business_configuration_module/ebusiness_lotse_configuration.xml @@ -88,8 +88,8 @@ categories - resource/workflow_module/ebusiness_lotse_configuration_workflow current_state/workflow_module/ebusiness_lotse_configuration_workflow/63 + resource/workflow_module/ebusiness_lotse_configuration_workflow diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow.xml index 0e364cb517946f80a302ee5bcd17ea18c6d83b8a..7605583b7342dda3276d9f2cfd5c2caaba0f29ef 100644 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow.xml +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow.xml @@ -2,7 +2,7 @@ - + @@ -12,23 +12,6 @@ AAAAAAAAAAI= - - _local_properties - - - - - id - state_variable_name - - - type - string - - - - - _mt_index @@ -63,16 +46,12 @@ portal_type - Workflow + Configuration Workflow state_base_category current_state - - state_variable_name - current_state - title eBusiness Lotse Configuration Workflow diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/1.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/1.xml index 5c5091fc9753b591b48f54dfe7d6bbf8469f7a5a..e8f52b287b89ece830cd624eeeed4c6d3bb782db 100644 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/1.xml +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/1.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/ebusiness_lotse_configuration_workflow/56 + destination/workflow_module/ebusiness_lotse_configuration_workflow/8 @@ -44,7 +26,7 @@ portal_type - State + Configuration State title @@ -53,26 +35,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/11.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/11.xml deleted file mode 100644 index 91041df486f717ed85123b1d54a371f54e32e1d3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/11.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/64 - - - - - description - All information that you need to you use your demo. - - - id - 11 - - - portal_type - State - - - title - Download - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/14.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/14.xml deleted file mode 100644 index 16e598049da56a7bb8aff86807ea6bc5fd677f98..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/14.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_displayEBusinessLotseDownload - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/11 - - - - - description - - - - - - guard_expression - python: True - - - id - 14 - - - portal_type - Transition - - - title - Install - - - transition_form_id - BusinessConfiguration_displayEBusinessLotseDownloadForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/2.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..f103ebb7c2d9b06a7ccf35f768ac450aea9835f5 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/9 + + + + + description + All information that you need to you use your demo. + + + id + 2 + + + portal_type + Configuration State + + + title + Download + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/guard_expression_property.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/3.xml similarity index 62% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/guard_expression_property.xml rename to bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/3.xml index ff87ea14a8ee574eb97495aa587117f774c4bd7b..7f026e32d83e4dff7588941fa36246c898c17c49 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/guard_expression_property.xml +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/3.xml @@ -2,7 +2,7 @@ - + @@ -13,7 +13,7 @@ id - mode + comment type @@ -27,25 +27,31 @@ categories - elementary_type/tales + destination/workflow_module/ebusiness_lotse_configuration_workflow/6 + + comment + Set Customer Business Template + description - Tales expression use to disable transition + + + id - guard_expression_property + 3 - mode - w + portal_type + Configuration State - portal_type - Standard Property + title + Customer BT diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/30.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/30.xml deleted file mode 100644 index 0acffdd5b15205ec88b7411597bb876a9d9fda1d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/30.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupCustomerBT5 - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/29 - - - - - description - - - - - - guard_expression - python: True - - - id - 30 - - - portal_type - Transition - - - title - Setup customer BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/4.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/4.xml new file mode 100644 index 0000000000000000000000000000000000000000..268aa3c272826b6ec668f8df2d1b6487c27f9dda --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/4.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/7 + + + + + description + + + + + + id + 4 + + + portal_type + Configuration State + + + title + Standard BT5 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/42.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/42.xml deleted file mode 100644 index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/42.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 42 - - - initial_value - python: member.getId() - - - portal_type - Variable - - - title - actor - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/43.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/43.xml deleted file mode 100644 index 5ef05cd9210c709cf10437ce703a9ddf4d180660..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/43.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 43 - - - initial_value - python: object.getDateTime() - - - portal_type - Variable - - - title - time - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/44.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/44.xml deleted file mode 100644 index c0e928799450f6872652c21aa76cde277e774d13..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/44.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 44 - - - initial_value - python: None - - - portal_type - Variable - - - title - comment - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/45.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/45.xml deleted file mode 100644 index b65378a36b63ab54aa1f2911ed7e41d31dea290d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/45.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 45 - - - initial_value - python: None - - - portal_type - Variable - - - title - error_message - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/46.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/46.xml deleted file mode 100644 index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/46.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 46 - - - initial_value - python: request.get(\'configuration_save_url\', None) - - - portal_type - Variable - - - title - configuration_save_url - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/47.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/47.xml deleted file mode 100644 index e87f1234c360ef545aeef5d1e70fda7a3448ab69..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/47.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - comment - - - - - - description - python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None]) - - - id - 47 - - - initial_value - - - - - - portal_type - Variable - - - title - displayed - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/5.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/5.xml new file mode 100644 index 0000000000000000000000000000000000000000..500605f29ecdf34191f613e24ecc9204f04785c4 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/5.xml @@ -0,0 +1,30 @@ + + + + + + + + + + description + + + + + + id + 5 + + + portal_type + Configuration State + + + title + End + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/52.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/52.xml deleted file mode 100644 index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/52.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - Id of client - - - id - 52 - - - initial_value - python: request.get(\'client_id\', None) - - - portal_type - Variable - - - title - client_id - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/55.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/55.xml deleted file mode 100644 index fbeb954c35081e817aa2444ece403ab1cb4fde31..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/55.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/30 - - - - - description - - - - - - id - 55 - - - portal_type - State - - - title - Standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/56.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/56.xml deleted file mode 100644 index 716d80f658453f26e1d6494a099bb50985623a36..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/56.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupStandardBT5 - - - before_script_id - - - - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/55 - - - - - comment - Setup all standard bt for ERP5 - - - description - - - - - - guard_expression - python: True - - - id - 56 - - - portal_type - Transition - - - title - Setup standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/59.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/59.xml deleted file mode 100644 index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/59.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 59 - - - initial_value - python: request.get(\'transition\', None) - - - portal_type - Variable - - - title - transition - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/6.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/6.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd550e22c27de1f1d13fa4a245ead0277a08be0c --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/6.xml @@ -0,0 +1,54 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_displayEBusinessLotseDownload + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/2 + + + + + description + + + + + + guard_expression + python: True + + + id + 6 + + + portal_type + Configuration Transition + + + title + Install + + + transition_form_id + BusinessConfiguration_displayEBusinessLotseDownloadForm + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/63.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/63.xml deleted file mode 100644 index 365a712f821e1af9d7ac3e122331d73629f4518a..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/63.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - description - - - - - - id - 63 - - - portal_type - State - - - title - End - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/64.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/64.xml deleted file mode 100644 index 14a4c0cbafefba08978afee6a2be6e34320cd0ce..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/64.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ebusiness_lotse_configuration_workflow/63 - - - - - guard_expression - python: True - - - id - 64 - - - portal_type - Transition - - - title - Finalize - - - transition_form_id - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/7.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/7.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f7cb4855fab844b014bb894f038973cddc76248 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/7.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupCustomerBT5 + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/3 + + + + + description + + + + + + guard_expression + python: True + + + id + 7 + + + portal_type + Configuration Transition + + + title + Setup customer BT5 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/8.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/8.xml new file mode 100644 index 0000000000000000000000000000000000000000..e32538b7a286b23c3fb6fa0cd747e1db72fb7e03 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/8.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupStandardBT5 + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/4 + + + + + description + + + + + + guard_expression + python: True + + + id + 8 + + + portal_type + Configuration Transition + + + title + Setup standard BT5 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/9.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/9.xml new file mode 100644 index 0000000000000000000000000000000000000000..39ba086a0911869ea6c8e1b07391d7ad475aad83 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/9.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + destination/workflow_module/ebusiness_lotse_configuration_workflow/5 + + + + + description + + + + + + guard_expression + python: True + + + id + 9 + + + portal_type + Configuration Transition + + + title + Finalize + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/default_image.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/default_image.xml index dcb0dfae3c63c850d5d6738e21c32823b43d9146..d52e434e7e8c5d1323ba691138bb962a9f8d6a3b 100644 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/default_image.xml +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/default_image.xml @@ -8,7 +8,7 @@ _EtagSupport__etag - ts10946893.64 + ts38071516.36 _count @@ -30,434 +30,164 @@ content_md5 - 9b57534c02d57fbd481d8ace1834e230 + 3cc45a3b9d983c934b88ace46b972b95 content_type image/png - - creators - - - zope - - - data - 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 -i5hMNdhxMo2mH2owmYxEmmU8FRMmE6Bokc2pdve7997Zf/uQfl4uxzL+jrbIDBqyPqvqU8p6n74D -6vDr9uvMnX0Cs6sH7TpUp2mog/CCTzH3pjeDwZApAvntu+9ct96ZGN9gyoZfAlkB2QpJybb2A50O -dFpQa0CjztZ2YGs3wGwCswXMZs47ehLboEWR2eOf+hEg3287xqLgIWcc0+T5/Ypv+wEJgqIoyHLu -df+yLNM82Mia6xcJL14iM5wsy6h1XjTQJrIvOopT6kDe0ZHrdfK69vyVF6jTtT79Q13Qqa30G70T -WZbROhenpOUcYQlxHDK70dNJQpZlfLQqwo1WiuskrKZkVFp95rVVEpisMhoJrObUHPdVZBklj2fK -+NtPq2Lg6OdxV0s5jmldPXjlZQ9eQeH6uStMX36IJuOeEV7xKebedH3ixAlmz57DsmVf4+joiMFg -oHfvPgwc+DF16/67XOeNZ1pSZvUFfKyp6Y7eYmtMNhpBrQa1CiRVRr2NbbNabZvZgsVo5GbV52yN -zkVYXfRP/AiQ77ftqZGIMlnx00pYTYl25xX03Ytv+x+0ISiKYnOY92wZjjSwiSd7Nt2kwnPOdvsV -WaZpQ2fWbT9LYOOgfK+R21bFR0OwnyMa2cihnRfw0EjcMFhQZJkXyzmw9vh53MuFZoZvW1zL9/ti -MFssnN93FtfAkMxjQVoVW66kYDWbOLLzLDoVeT5D9t/+WhWRRts92wZr+WZvNCaLlZtnwhi68Fxm -uK9m/8GGC0lYrAruHk4oipzne4ntyd7sMhnZtjq1a9Ondy969uzJ/n376NmzJ31696JO7doFXqsg -Ypu153DlulgNRjAYICUFUlLT/0+B5BRITrb9n/E7JQXS0lAsFvb6lODWK28VffvBP/Qj+X3bjd01 -/HAkDovFwpk9l1BJ3Pd3L77twm1ZJYQ8KuZkRUHvE4o5PIJ2PprMcBn/+9YqScy0U/yvnUO+18iN -Vq+FMnruLkx6J9q+XIu3GyYzdcqfLBzblOJNfbm08AbN33fOPL/ma1U5svwMA7Yb8Qr04a03/DOP -vdEykAUr97JV0vJMyxp4qOIwywoZGYJ7nyHjd/+XAhk3dTcLRj9LzW41OL3yNB9vS0Xn5krbV2pk -hnu5bQkW/3qYTfFm9G7OtM52TPCUlhByif/mLVogK9C5y6ssXbo0/feDSSfX+47m4Og3aWhMBLPZ -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 -RU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAH4AAABFCAYAAACMnlLmAAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA +CXBIWXMAAAsTAAALEwEAmpwYAAAb3ElEQVR42u2dd5TkV3XnP+/9UuWu7urqro4zPUETejSSRmGE +BJIsgUBICLBIxsCRWNaAF86ysGuz6z3GeM2xDUY2eMGwJixpRUYgJA1CEhIiKM5oojQ5dA6V469+ +4e0fVd2TFXp6ZlpivufUOfWr86vf7757X7j3vnvvE1/9+RalCcU5nBieL6h7R/JH4AsQM5cKBEfz +T0rwlYfyNYQAQxPocmHxWO+P1miLBZBitimzzRCAEKAUvBCyxTH/f2lBzbZANBvtK0W6UGO0ZFF1 +GndZTpVELU9ZmnhSw1IeOSuKp+mH+SBE83mKgC7oidokYtYJeXws384UD/XF3a0MDAxQrXsEDInj +egRMAwTYtku2UCMatgiHjOOpo9EpGo0F1/XxXB/DkEhNHnWvUgu5Owgq5RKWFUBqGtlshmg0hmka +7N9/gOzuDBXHQndt1k89y3ltBhUl8TUdK2CybWKSTW1L8Y8QfoNVgpDusbSnjcUDi6nYboPHjkcg +YMze5zgeQgh0XeJ6Pp6nsEzt6GfNM/900zDwfdi0dZxli+Ls2jPJypWdSCkpFm1GJ4qsXJJgOl3C +dhXxmIXn+RRLNqFwEMsQCKBUrmPXXcq5CsGIhWbqtMXDZLMlgpEg3e2hsy3dk4tdQN1xME2LbDbL +5s1b6OvrY/ny5Vim2ejdQhDJTtO/cxN6R4JYSwwMA+p1lk7meMZIUG5NIo4RkBAK09RxPZ9NW8dZ +2t/C6FiBzmQYB0ksoPHsgSwdbSGSiRDpbBXf89B1SSAUwKnaOEgWdceQYo4NPJHgPd/DcR3saoVd +Bz2K1Trbnxkn1R1HUz61Wp1q1WZ0PM9Eukw8FsRVgnBAYzJTxTIFmhDkSnViEZOS7VKoOaQLNot6 +4pRLVSItLh1x82zL9znh+z6u5wEwODiIUj6OU8fz3Nl76kJSeeppIibQ1gq6AZUKFTOKu+I6TiYX +z/NwHRe7WmH3QRe77uP5Hi6CSaUQymdsIk/dqZPJ1dClYGK6THsigi58HDRSiQCGLuetvbrrONTt +GrGIRtFzSLYFSBcqBCyBb3ss7Y8SCQpct040pCGlQzwaplasYYUsnJpN0fZoiVmEAwLpS5Tn43ga +kZDEtaFarWHXajCPPXa+4ToOjlOnVquy8amNDCwZIBqN4jj1xg1KUU10sn31euK/uANzH6DrlEIR +Nt90G3a05bjRfljwLna9RiysUfRd4hED33VQQsMyBNOFOvGQwdhEnlDAIBzQaYlohMMamqeYLNjU +ajV8Y/4ELzZvflr19vTg+QoBVG2XqZxNXyo8KycpBI7rN/4gQEqB5/pITaJ8ha9A08RhxUQpPF+h +aRLP85FSomsLWOpArVbFCgQRgG3bmKaJkJKx0TG2D1dJ2xZCCGStyspf/oCLn3iAWijMo9e8maFL +r22o8k1omsBTDr6n0x7yGOwx6Eql8PxGxxCA7yuUAE0IHM/H0CSO66NposFfz0cICcrHVwJzHoUO +IO578DcqFjKQRywgAoF6iermc4XyFWKWBw2tXCkoVBzGq2GK9WbHFgKcOsm927FDEfK9yxDH9GlN +goeL72lETEEqWCYe1pra/sKA+MY9W5Um/D84QZ+AFRxrRAkEnpLY7vHmlZISoQDlH/8kMaOFNzqL +qYO+wHistyc6j7XQzqGJWb68WOYcy1DFguOxbhoLpxeew5mD3tcZQQBSyqYzRiGEmHUYCCHwlTrK +myVm1sCzTf05zBm6JiXlapWd+/cTDgaxTJN0LkdbawLlueRLJXo6O8lMTxKMtbMolSCbyxMMhrBM +/dQpOIezAl0IQTqbY9/QEOsGB9l14AC6FIxOZXBcB0sXTKVz5DITnLf6Qvr9OHv37uW8VYMEeKn6 +5c+haRwqfN/H0HQ0IVHA4r4+LF2jLd7G+SvPY+V55zE+PkapmMdRGuGAeU7oL2HoSinCoRCxSISp +TIaeVIr+VAf5Sg1DLmJpXy8SxcjIQTo7OlBo9KQ60aRY4BsvCxgzzh7fP7XnnALErtGKAvCVAqWQ +8mQeooVmkLwEIQQIgbF7J7JUxL5g3VkjZVY7k02inoPqs0bkywJCoGXThDf8HPPZHZRuetPhYIez +gHNq+emGlOB5oBTRH38PbWKczMf+Cj8SQRby+NHY2SHrbPPl5Q5r22Zav3g7wd8/QuWKqwDQhw/S ++r8/S+jh+59nlj19OCf4+UZj+xKEwNz5DNHvfYvausuw116EveYCvGQHiU//LfaaCyhffxOibiNc +99Tf+yJxbqqfT2gaMp8jfN89OANL0SbHcfoXU7vwYsx9ezC3baZy1XXow4eor1yNtX0zoQfvo3jL +n+AsWXZGtfxZrf4cTg2iXif4+G+Jfu/b2GsvovjWdyJqNVq+/iWE6+FHIuB5+PFW3M4uwvfdjdu/ +mNJrb8IeXAuadupEvAicG/GngplpHQjffy/mrmdwu3pw+hbhtncgPI/sh/8bolbDS3Zg7thK9Ed3 +ULzlT3D7FmGvHESFww3l7wzjnODnCiHQpiYwd+/Ej7VQXX8FpdfehD41QfxLn6O27jK8zhR+rAWt +ViPy0x8SeOoxytffiJdox0skG1P7WRA6nBP83CAl1rbNRH/wHdzOFFouh5vqovDOW3F7+rAvuJjI +PT8lf9v7AdByGUS9Tv69H8RZvOSseuxmm3C2CXjJ4AizS9TrhO++k/Lrbib7nz5G5iMfRxYLBB/5 +FQoov+YGjKEDmM/uAKC+fCXFt70LZ2DpWXPYHItTGvEzwUqe7581v70QAl1qs9EBM7EEnj9fU6gA +5aOXSrjhCEpKZKUMtSrOkmUIpVDhMJVrX0vovrspXnUdXiRK7g23oFwH1/MQau4jXArZjJU43D7P +8+YcDaHJRuzfnAUvEFTqNYamRnEcByG0sxKe4SuPgBmgL9lFwLRIF3KMZSbxfB9xSm5mgdIkwq4j +Uaz86Y8YWnsRhRWrEJ7LSk2j/OtfIm9+K7FQBM/zSOem2X5wF0rq0BJtPGb/LoSYOyVCKJLxdjrj +CVzPY2h6jGKlBErM5Hm84CBOhULXJJ3x5NwFb7t19o0doqetndZQhEI2g+t5tCU6MC1zdqN+JnJV ++TM/NKN41dEjtHmBbF4/3wwiRCNV0fNcJvJp9o0dIhFrYzI3TX9HF+FA6KSCF1I04uBO9I4ZJtbr +hH/zK8I/+yGVa1+H/8prufCRB8lc8xqUFcB6+3sI/dvtHCjmiS8fxNxwF/5V1xGUASqlCnXHxdA1 +QkGTzlSKWDQ229YXOjsqoObUODQ5iud5lGoVLMNgefciRL1CKGBSLLkI0yQQDB7NzxPsAygUpWqZ +g5OjaB/+2F/9zYsVuhCC0fQEYctkoKOHzPQUHe0RIiGL6XSWWCze6OUCptNpitU60UgYTdPwPI9y +tUq4SWg6nyccDCKlpFarMDo5hZIakeZvUkq05ufI60yhgKHrWKZJSzhGvlxgx/Be1ixaTks41nz/ +CT5AOpOmbDuEQ0F0rTH1aZoGQuA6DqYQtH7pcxjf/Are5a/EGVxL7dLLCW98HM3z8JYux29rx+pI +0bpzB8Mbf491wxupX3ENtWqZjniIlkiA1kiAgGWAMDFMg5GJCVxPEQk12qZpGlIIRLNNovmbEGK2 +naZuEgtF2LL/WQxdY0XvUvAV0YBgoDeJIXXSE3mEoaMbOqVqDUPXset1LNM8/FypIaUkaAZojbTM +fcTX6jZ9iQ785npqBCx8z8f1fKCRFLBv305+uXErupTE21Is70pwaHwc4Xsk4i1UfJ3HNz7OtevX +s3r5Cu755X2MVx0uHVyLoWrURYC2oMZwJo+hm4QNQcCQTFdcntq2jVRbjFdeeiWLOxPEQhHK1Rrh +QPhwjOBMfsDs7CIZGx9i+4Fhkol2pPI4MDpGR7KLialx4qUy5d070FLdvPq73+TX519EcPEy1jz9 +JGzZyLN9i0n+6A72CI3+0WESY0OMveM9/Hr3Nm5c/0p0NDrDOVbH9qB0F2H/jqz7Sg5yIxPT0zy1 +bRtWIExvZydhU1CoVAkEI7SEdAquT0AJpjMZ2to7MXybbM1l9ZIBAqaF7ThYRmB2Wvc8cBwwa7vo +5jEKlUtwjOU8+OhjXDS4hrHxYdpbopQcSETDlJ0KQTNCazRKLBw6BeVONRQPgHhrgkOHJiiWSowO +H6QjmSQciXFwZIJYNEbEFPzkgQdZt2IR2/fsw9Kgv7+fKy95BTv37MbXA6xdNch5SwYY3bSFR5/e +zMGh3cRauzgv1cqjzzxLuVLnjX90NXv37+aKy19F3a6zd2gEw9jEkhuuRyJBiVnlp14tQ72KFowg +jUaKsm5IMvkSvT29rF7Ux6ZtW8kWi0xPZel+eAOrfvcQFQQPv+O9VJaex/r778X73SMQjRKfmmDk +T9/LrmCUxbf/PeULLqLwvg/ityYayRhKgWjwRKAhlAQ/hFQSIQWe72PbNkiTQ+MTtEUCVOwatfEJ +KrUy6UqVxal+KuUcJUcxMXqIqi8Y6O7GioRQSiCOMMJmZnLhTBKPHMKuL6HsQ8TSSGemmc7m2bl3 +L9IIkIgEODA9SXtritdccQWg5seODwSCpLr6SNHQsLdvfYqLLrmS1csG2PyL+9nvKV7/qssZnhij +tytFezSMGTAZz+S4cM0aWqIx8uUqoWCQZFsrdVejZdkyAi2d1ItpFncmmcyXWNLTBU6FoYkpku3t +RAIGrdHwcctQenqK8Y0bWBN3SZcUmZpGbOACus+/hO6OBE8+s5NCuUJrKISdznLJnmc4/1f38uyf +vpeR7m46o21sXf5h5MXrmQrFaOnrZ8XffZwUHiNvfDM7RtfDmkto618M1epR76/WFZPlIEr6CKeN +kh/AD3hYhkkwGCQSCRMLh+hujbJl7z76e/vJFKdIAom2LvKTPo7v09/VQcERmEYznVo0R9ssPKT0 +MJPrKKbbKdOGkJBIJOlqa6FUyBFJdUIgRlsYrJYoUrdoCQVQap4EP8NwgCXLVpDLJvE8j86uPt52 +/XVs3T/EVRdfPDsFa1Li+x4KgbZ+XSPyR9NoCy8hleolGAjiey6eUmhS4HsKT/kETJNVS5diO15z +bT7SvDlMRzgcpnXR+WS8CiKq0R1rJ9zZjxCCtvZOXnVpDHPHdtoeepjFb34HyW1PEvI9BlyHlXff +ibl3D8Ub30Tp1Tew8oENxL/7NfzB88ne9gHW9A/gui5SagilkLKhN0ghMA2NrOxieynZpGYdCJ/2 +qEFXLMZrrrgSwzDQNYmUgmRHJ4ZhIlg2K1u7pwtNN5BC4bg+lmk0dROBELIxc+k6xbLProNTjfb7 +KaQVwDJNLlixAk1KOpIpfN/HV2Doh/cBGqlyp2DOPRda2xIo1Qjg7Orqo7urrxmPf2SfPdGrJdGQ +jgI0aWAccevh/0pCxxUgaOQF2LbDwZGRBqMSfVRpTIk1IJfLQy5POJdlyQP3ot/9E4ZWX0CmUiV9 +/jq6oz/B/NbXmF61BrN3ET3f/SajiSSVrZsZveQVlK+/Ed8Kw/j4Ue2ouw7Vqs3Q+DgBw6RZ++QI +6jSmcjnI5Y6rdnF80tbRv818l0JQKpWZymQIamYjTO441CCbO35AcuJI6Dntzgkh2HVgP4s6U8Sj +0QURdOl6HhOZ9ElaKRDlEiBovedOltz+KcY/9c9MLFqCvmUjtRtuxlQKvVjArpRp/dZX6RgZYs8/ +fA67pbWxc+b7J/W6eb6PJk+vE9RXfnPUz0/gxikpdwsJuqbR19F5xC8CpEAJgXAcWr78OfA8Sv/h +g3g/+wHt3/0GSU2jfvF6iqkUSkhin/kq1u8fwRlYRvFTnyW5YlVzaX2exp6J2Ll5fsfcR/z+/SxK +LZwRfxyUQj+4H2wbd+UgoTv+Ly1//9dkvvwttJERWj/6AfL//ZOU/uxDmBufRAVD4HkIt44zuLZx +vQA2U04XXn67c82wJ+3APto+8G5keprSez9I9cY3UV+7jsgX/pncZ79I7aprCTywAW1sBHPTExT/ +/KNUb3pzwyzz/Je10OHltDvXFHjg/g2Efvj/8NuTuIuXIkpFrN8+TMvf/CXOqkHMjU9gPfIQpQ9+ +BH14CFG3yX72S9Re94ZG7JvnseDWsbngZJ7L5ue0jHjle/i+y+mPxVcgJAIwRsbwAkHk5icb4U9r +1pL7sz8n+fhvsS+9HCeZJPT97yAKOYJf/zem/8+3mfjmD3D7+sG0wK2fZlpPP6SmI4REKZ96pYj/ +HDuU8yx4gV0tMDG8G9mslvmCNlvmqiMIAZMTdP70LlI7djB95RXsv+oqVv/s+/CZT3Dwv3wUcd21 +xO/4Onv/4R/x//OH6P3Vg5Q6OpjOHoJgEIafeVkMcKUUVihGqnc5pdwEGjVCoRCimeqmjlm65lXw +QggK2UmSiRZCoSB1X9CV6kSKhu/e93yElLPaqQKKhQKhcBjDMF74i2ZMp0oFPvIVtGwa8U+fpqsr +RUdXN1ohT+rjHydZt5F/+0nkG27mwu1bUX/9CXjLW0gCAy/DNXz3rl04dgXXqbJ4aT/FYomtW7fS +3t7O6sFBpBD4vn96pnpf+WiaTiaTJRCJU8rnGB4do6u7l1xmAqEHcet1wpbEkRalfA6FYtmy84hG +XmARxIcegloNLr4YNm2C9ethyxbEv/wLuhDwkY/AJZeg33473HEHfP7zaK2tR1Wm4jTb3WcDhmGg +lGruLAuGhoYYHhkhmYjzxBOPYddspibGsFq6T4Nyp0DTdLq7u7CrZcbGJshms5QLeUrFIhNjwygB +jqsIh4IEggEi4TC1avl5nnt4l40HHoC/+AsoFOCd72xcf/vbkErBjh3w4x83hN/WBsUiXH01rF17 +tuVy+tHwxqKUwnHqjU/dbpRmfXYbO3YdYOfO3Ywc3Hv6zLl6vU4oHKG9tYVQJExboh1NF/ieRzja +gqULsuU6iUQCXZOYpnXyh3kefPnLEArBrbfCbbfBnXfCv/87fPKTcMstoOswOQlbtzY6wNVXwxVX +gGW9UJJf+lCH9aq6bROLxQgFQ0xOZVi2cgme1U5lMokKtM234BWBYIRcPkOqK0VYU1RrVSLhEHat +QiDQCL5QvketDkFD4rsOdbdRVLBYLBx+lNQQ9Tp4Lsq0sLZsIf7ww+QGB7EHFmO85RZav/o1ije8 +DsdXtH7xi9T27aV42WVw040wNblgAhvPBJTvU6rUSERNlBLk83la4y1cc83VqCPT31PJRsL7vHvu +lE+tksd1anNrgRDgeZhPPErwO99AZDOUP/qXyN5F9LzvVnIXryPzib/DyOXou+1dZG5+E6W3vIO2 +p56iOjBAsa8XpHbC+nMvbwisYAQzEMWuFsinR/C9M2bOAUISjLQxJxtegLBtop/7NMF7f0r1hjdi +PbiB6L33kfunL1D+jx8i8Zn/hf5Hr29koCAwVl9EcGAVlUUrAUX0hRbXfxlC0YjnMwNRkj0rnpMP +p8eBoxpF+udAOUrXoFRA1WrYg+dj/vp+rAd/QfhfP0Plbe/G2LaZ6D/+DX6yk/Kt76d2zatRjjv7 +vj9QmZ8A4jnH3sLZpBGimVLkoo2O0P6eP0Zm0pRufT/Ksoh++fNkvvRt6pdchrZ/L6oljtfV0/jv +H9BaPl9YGJs0QiCnpwj96A5kepr6pZdTftf7iP7rp6m/4iq0A3vxoy34oRAqGMJdtaZ58scf2jo+ +f5iz4H0aAQj+PGXRhH72Q3zDRLUlsH7yfQr/9X9ibbiL+IduwxlYSvZ/NIoJ4Dhnm2cvC8x5qt8/ +PEyuUDgcDHgqRPg+K776BRKOzWSqhwMrBlGxFlonxwlv38Kh19yI39P7st8qPZOYc2EEBc9pLryo +Z2kasbvvJLLhLgp//HbMjU9QX7WG8uvf2CjqrxTinNDnFaeQO0cj+2SeUL3+RgiGCOx+Fnv9ldiX +X8nM06UQL7hixNk6DGBBRiE9BxZWKZTZjRMBc8x2rdZqFCuVM0q2rmm0xmIL6gSK56X5bBNwFE5x +OpdCcGB0FN/3CQeDZ8ymn0inuXDFCgIvoX2BuWv1TSHNZH8ahoHnebMJiDP7vrO53UrhuC663njl +i80cfSGYia/vTaWIRyINn3Qz1GiG3plROfNe2cy6Vb4/mymrlGocOzabxCuQmobnuUdl/ep6I+Kl +Wqsd1w7HcdENDSkkruui6TqqaQFpmjbLF6UUruuh69oZXS7mlC2raRq//u2jTE5P88jvHmNyaopw +0OKuDQ+gS6jadQLBEKVCnieffAJfKXLlGndv+AW6pmMaBqPj40jdbGSTzhOEEEznckSadfc93+ex +J55i0+atpDrbEUgODo0wPDJKe3sCfJ+nNm6kZtdpbY3Pdo5yMUe9MIEhHHArlPLT1OouxelhNL+K +Xy9RzE7ieGAFw0xmMrTGYhjNjpCZPMhnv/IV2ruW4NeK/Oiue2mLhbn/4d8C4Dt1tm3biuf7TGWL +/Pyee4m3thGNRI46hvR0Yk4jXgjB5MQkQyOjjIyOYRo6W5/eRKZcYWj3M+R9yeuuv4nFXXF+fu8v +GVy5jO0HJrCrFYbHJwlrBlOFHK9//c1csW4V6jQ5YnRNw3EcRkZGmRg+xEOPP810tkq1NMXFl13F +Ta++kk3bdrGor8TSJQOzgvc9j85kfDY1O2DpjGVs4rEQ1XIB3/OJt7RQOoFVI6Xg4P6D7HlmP48/ ++iTlzBAj45OkR4bI2jZ9XSnK5TIbfnE/vf097DqUxnerjE7nePfb30p/V/tJMmXmF3MMxFAYlsnS +pQMk2hMNZvkKw7KQUiMaiRKLBIlGwliWxf7hMdxKjrrnIKQg1ZnEMiTj45OntaKnEIKAFSAYCDA8 +PMquXbvYs2sHRjDI/r37kFIQtIzGYX5H6BczZwLv2LGDffv2zRZY0HWdbCbLgYMHMc2TnJypfMYm +Jll3yUWk09M4rsIKBFCAYZpITSfR2oLjeYxOTGGX0o3Tqc+wYjhnB04mm0OTknKl0jzkQFKo2CTi +YfLFKh0dHQQMjdHRUVzfR5caFdsmEAjQEo2SyWZpa08Sj4bmzdUuhODZ/fvpam+nJdooRTI2PsF0 +OoOlwdDYBMVSGcPQ6Vu8nBUDvTz0m99hmSZXXn4Zut4oSlDMTdMZ04jFIkghmZxOM55zCIoqlqkh +ZWMmqagQrclutu3ezZKeHoKBAADp6TR6wKRWruH7LrW6RyRkkC/VSHUksQyd0dHRRswBCrvuEApH +SHV2oM3nAbLzLfgZJs/00pnEvBmF7Uhl6rj690odvtf351XzFkLwzL59s4KfoUWIxsnOgsNHhCsU +vn84QGF2xAuBXS1TLWbQNa1ZbsXHCrdQzqfRdQkIXNclFEsQjsTYvmcPS3p7ZwV/7OidzWU/os0n +4suZmOJnMPcaOPU6Nds+Y4S+EAghqB5DU0NzhpOVZfKPNSGVwgqEsAJhjs1bDYajx/zUsFZczyNf +KlF33ZfMTuGclbtKrcb49PSCO74gaJoELWseTCN1/PejIo1mmUF7ayuZfB5ZLL5kBD/3qb7Z6IWG +Gd/+GX3nAuTD82HOU31j9lx4vftsUPRS89MD/H8pbI8fwsj3RgAAACV0RVh0ZGF0ZTpjcmVhdGUA +MjAxNS0wNy0yOFQwODoxODoxMyswMDowMKn5epYAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDct +MjhUMDg6MTg6MTMrMDA6MDDYpMIqAAAAAElFTkSuQmCC height - 212 + 69 id default_image - - modification_date - - - - - - - - - - - 1410937534.34 - UTC - - - - - portal_type Embedded File size - 21211 + 7386 width - 388 + 126 diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_actor.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3902fd5361715a7003ade8ae593337138f10cb2 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_actor.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + actor + + + default_value + python: member.getUserName() + + + description + + + + + + id + variable_actor + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_client_id.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_client_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b91d98c56b69dbe0e8b09b426bbab1b4d6c3873 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_client_id.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + client_id + + + default_value + python: request.get(\'client_id\', None) + + + description + + + + + + id + variable_client_id + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_comment.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3442b68c63f786c0842783866c6759ec6fc9e61 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_comment.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + comment + + + default_value + python: None + + + description + + + + + + id + variable_comment + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_configuration_save_url.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_configuration_save_url.xml new file mode 100644 index 0000000000000000000000000000000000000000..10842b0d70b1c3105492a49f29930f9e329e222f --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_configuration_save_url.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + configuration_save_url + + + default_value + python: request.get(\'configuration_save_url\', None) + + + description + + + + + + id + variable_configuration_save_url + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_displayed.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_displayed.xml new file mode 100644 index 0000000000000000000000000000000000000000..0134feb90f0fa3a2c3cbb9863b08cb5abd92482d --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_displayed.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_reference + displayed + + + default_value + + + + + + description + + + + + + id + variable_displayed + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_error_message.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..f64c6c5515244615c298f796df332af0b605a486 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_error_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + error_message + + + default_value + python: None + + + description + + + + + + id + variable_error_message + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_time.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_time.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec0c70738e23d752027ccb16c42344f93ebc4e06 --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_time.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + time + + + default_value + python: object.getDateTime() + + + description + + + + + + id + variable_time + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_transition.xml b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d93269f0b716c0bb19ea60ed2459f60c1bb503e --- /dev/null +++ b/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/variable_transition.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + transition + + + default_value + python: request.get(\'transition\', None) + + + description + + + + + + id + variable_transition + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/42.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/42.xml index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..45f98ea1a62c80a6870199e2fd0c8497111e936d 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/42.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/42.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 42 - initial_value + variable_value python: member.getId() portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/43.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/43.xml index 5ef05cd9210c709cf10437ce703a9ddf4d180660..d3ae91c1191afe2ed78d0547dcc841143158abd4 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/43.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/43.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 43 - initial_value + variable_value python: object.getDateTime() portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/44.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/44.xml index c0e928799450f6872652c21aa76cde277e774d13..d611fd6a2df8ddb60f219f1c8aae398147b2a69a 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/44.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/44.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 44 - initial_value + variable_value python: None portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/45.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/45.xml index b65378a36b63ab54aa1f2911ed7e41d31dea290d..f7a976e2986a010db35f1d400d932172bb41f334 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/45.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/45.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 45 - initial_value + variable_value python: None portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/46.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/46.xml index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..b1c998416a12f193f5dcef303f1d6a3fbc768757 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/46.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/46.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 46 - initial_value + variable_value python: request.get(\'configuration_save_url\', None) portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/47.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/47.xml index e87f1234c360ef545aeef5d1e70fda7a3448ab69..c40e10d0e8ca105ab1ef9f0393a419b80b359e77 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/47.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/47.xml @@ -2,7 +2,7 @@ - + @@ -60,14 +60,14 @@ 47 - initial_value + variable_value portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/52.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/52.xml index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..2154c6059c73f490a79ec1ceffafc54824d25ae1 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/52.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/52.xml @@ -2,7 +2,7 @@ - + @@ -37,12 +37,12 @@ 52 - initial_value + variable_value python: request.get(\'client_id\', None) portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/59.xml b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/59.xml index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..794760eec20968621fb62cfee35ebd92290272c8 100644 --- a/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/59.xml +++ b/bt5/erp5_configurator_maxma_demo/PathTemplateItem/workflow_module/maxma_demo_configuration_workflow/59.xml @@ -2,7 +2,7 @@ - + @@ -39,12 +39,12 @@ 59 - initial_value + variable_value python: request.get(\'transition\', None) portal_type - Variable + Workflow Variable title diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow.xml index 0f332df3d968e17febf6e9ab46a410e26c2b45be..a9b8e0b8867b5a82854e1b796c5134a618271b24 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow.xml @@ -2,7 +2,7 @@ - + @@ -19,7 +19,7 @@ id - state_variable_name + comment type @@ -29,11 +29,11 @@ id - comment + state_base_category type - string + lines @@ -75,27 +75,17 @@ id run_my_doc_configuration_workflow - - language - - - - portal_type - Workflow + Configuration Workflow state_base_category current_state - - state_variable_name - current_state - title - RunMyDoc Configuration Workflow + Run My Doc Configuration Workflow diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/1.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/1.xml index 8eb69b5445aba0f4f7a79c8acadfec806287a540..269518f8aa1ad307b20dc25fab374fb2b826ea25 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/1.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/1.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/run_my_doc_configuration_workflow/56 + destination/workflow_module/run_my_doc_configuration_workflow/15 @@ -44,7 +26,7 @@ portal_type - State + Configuration State title @@ -53,26 +35,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/62.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10.xml similarity index 78% rename from bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/62.xml rename to bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10.xml index 433b5ad677045848057da648a9a2ce09a7260552..5c7907cae8dad2159dac5300adfed190d88f81b1 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/62.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10.xml @@ -2,7 +2,7 @@ - + @@ -26,13 +26,23 @@ after_script_id - BusinessConfiguration_setupRunMyDocUserNumber + + + BusinessConfiguration_setupRunMyDocList + + + + + before_script_id + + + categories - destination/workflow_module/run_my_doc_configuration_workflow/61 + destination/workflow_module/run_my_doc_configuration_workflow/9 @@ -42,25 +52,21 @@ - - guard_expression - python: True - id - 62 + 10 portal_type - Transition + Configuration Transition title - Configure user accounts number + Configure user accounts transition_form_id - BusinessConfiguration_setupRunMyDocUserNumberForm + BusinessConfiguration_setupRunMyDocUserListForm diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10/1.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10/1.xml new file mode 100644 index 0000000000000000000000000000000000000000..3fa7b1254ef463a64ff2031ee16c6781c1c31d77 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/10/1.xml @@ -0,0 +1,32 @@ + + + + + + + + + + categories + + + causality/workflow_module/run_my_doc_configuration_workflow/variable_client_id + + + + + default_value + Default Value = python: object.document.getCurrentStateValue().getVariableValue(object.document, \'user_number\') + 1 + + + id + 1 + + + portal_type + Transition Variable + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/11.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/11.xml index 978fae3aefe824b1a6673dc142be815f46684187..c1413acfb24c3a1257d4cc17e9e70abb9d3d05c3 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/11.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/11.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/run_my_doc_configuration_workflow/64 + destination/workflow_module/run_my_doc_configuration_workflow/2 @@ -44,35 +26,17 @@ portal_type - State + Configuration Transition title - Download + Install + + + transition_form_id + BusinessConfiguration_displayRunMyDocDownloadForm - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12.xml index bce47f562a46f87322addce22621e719ee1b7d54..d6c98716b957655dc60a776f4ba4d3ec125c24dd 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12.xml @@ -2,112 +2,45 @@ - + - _count - - AAAAAAAAAAI= - - - - _local_properties + after_script_id - - - id - comment - - - type - string - - + BusinessConfiguration_setupCustomerBT5 - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupRunMyDocList - categories - destination/workflow_module/run_my_doc_configuration_workflow/9 + destination/workflow_module/run_my_doc_configuration_workflow/3 - - comment - - - - description - - guard_expression - python: True - id 12 portal_type - Transition + Configuration Transition title - Configure user accounts - - - transition_form_id - BusinessConfiguration_setupRunMyDocUserListForm + Setup customer BT5 - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12/1.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12/1.xml deleted file mode 100644 index f6732eb821740e628f7a41048c055eba0e23dbb1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/12/1.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - causality/workflow_module/run_my_doc_configuration_workflow/16 - - - - - description - Default Value =\n -python: object.document.getCurrentStateValue().getVariableValue(object.document, \'user_number\') + 1 - - - id - 1 - - - initial_value - - - - - - portal_type - Transition Variable - - - title - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/13.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/13.xml new file mode 100644 index 0000000000000000000000000000000000000000..e54534afaa07f08a1e313f465fd19558284135a4 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/13.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupRunMyDocPreferences + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/4 + + + + + description + + + + + + id + 13 + + + portal_type + Configuration Transition + + + title + Configure ERP5 Preferences + + + transition_form_id + BusinessConfiguration_setupRunMyDocPreferencesForm + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/14.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/14.xml index 9d513dd2cd3974cd796554dfd7a30ffc9bc2aa83..6cc655fdfff2a835026bfc056fcd4a569f665a25 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/14.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/14.xml @@ -2,39 +2,23 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - after_script_id - + + BusinessConfiguration_setupRunMyDocOrganisation + categories - destination/workflow_module/run_my_doc_configuration_workflow/11 + destination/workflow_module/run_my_doc_configuration_workflow/8 @@ -44,49 +28,23 @@ - - guard_expression - python: True - id 14 portal_type - Transition + Configuration Transition title - Install + Configure Organisation transition_form_id - BusinessConfiguration_displayRunMyDocDownloadForm + BusinessConfiguration_setupRunMyDocOrganisationForm - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/15.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/15.xml new file mode 100644 index 0000000000000000000000000000000000000000..d8c03ab9250d9b09466f442003f2453fd44f854e --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/15.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupRunMyDocStandardBT5 + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/5 + + + + + description + + + + + + id + 15 + + + portal_type + Configuration Transition + + + title + Setup standard BT5 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/16.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/16.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9809572f96e1025aa245913804e7006feb3af6c --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupRunMyDocUserNumber + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/6 + + + + + description + + + + + + id + 16 + + + portal_type + Configuration Transition + + + title + Configure user accounts number + + + transition_form_id + BusinessConfiguration_setupRunMyDocUserNumberForm + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/17.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/17.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0447a2287b5b000e3a77f53c3cb075481cd1ca6 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/17.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/7 + + + + + description + + + + + + id + 17 + + + portal_type + Configuration Transition + + + title + Finalize + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/2.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ec44926b4dced5b1119e0840c58c0b77daa030a --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/2.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/17 + + + + + description + + + + + + id + 2 + + + portal_type + Configuration State + + + title + Download + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/29.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/29.xml deleted file mode 100644 index 3d6b48263e8d8b76fe2034305c80b8744a21f366..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/29.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/4 - - - - - comment - Configure Preference - - - description - - - - - - id - 29 - - - portal_type - State - - - title - Customer BT - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/3.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/3.xml new file mode 100644 index 0000000000000000000000000000000000000000..279190f19b05faf569b5a10960d7c556e0cd6d68 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/3.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/14 + + + + + description + + + + + + id + 3 + + + portal_type + Configuration State + + + title + Customer BT + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/30.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/30.xml deleted file mode 100644 index 72092e894244e5f9f47d33ee0dc9e741d0f13ec6..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/30.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupCustomerBT5 - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/29 - - - - - description - - - - - - guard_expression - python: True - - - id - 30 - - - portal_type - Transition - - - title - Setup customer BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/31.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/31.xml deleted file mode 100644 index 02e4b780e7a135b95232c1544c890ca326fa6e78..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/31.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/14 - - - - - description - Define some global preferences for RunMyDoc.\n - - - - id - 31 - - - portal_type - State - - - title - RunMyDoc Preferences - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/32.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/32.xml deleted file mode 100644 index 55d63fc38e024b3a4825defdb093e817f8f7a675..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/32.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupRunMyDocPreferences - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/31 - - - - - comment - - - - - - description - - - - - - guard_expression - python: True - - - id - 32 - - - portal_type - Transition - - - title - Configure ERP5 Preferences - - - transition_form_id - BusinessConfiguration_setupRunMyDocPreferencesForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/4.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/4.xml index 26405b68d3ffdb5fec51e982a3aa9ab27d0481f1..0cab4ea0a52f7c2c7d038111ed9cac98de8004fa 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/4.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/4.xml @@ -2,49 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupRunMyDocOrganisation - categories - destination/workflow_module/run_my_doc_configuration_workflow/8 + destination/workflow_module/run_my_doc_configuration_workflow/11 description - - - - - - guard_expression - python: True + Define some global preferences for RunMyDoc. id @@ -52,39 +24,13 @@ portal_type - Transition + Configuration State title - Configure Organisation - - - transition_form_id - BusinessConfiguration_setupRunMyDocOrganisationForm + RunMyDoc Preferences - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/42.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/42.xml deleted file mode 100644 index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/42.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 42 - - - initial_value - python: member.getId() - - - portal_type - Variable - - - title - actor - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/43.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/43.xml deleted file mode 100644 index 5ef05cd9210c709cf10437ce703a9ddf4d180660..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/43.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 43 - - - initial_value - python: object.getDateTime() - - - portal_type - Variable - - - title - time - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/44.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/44.xml deleted file mode 100644 index c0e928799450f6872652c21aa76cde277e774d13..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/44.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 44 - - - initial_value - python: None - - - portal_type - Variable - - - title - comment - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/45.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/45.xml deleted file mode 100644 index b65378a36b63ab54aa1f2911ed7e41d31dea290d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/45.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 45 - - - initial_value - python: None - - - portal_type - Variable - - - title - error_message - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/46.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/46.xml deleted file mode 100644 index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/46.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 46 - - - initial_value - python: request.get(\'configuration_save_url\', None) - - - portal_type - Variable - - - title - configuration_save_url - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/47.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/47.xml deleted file mode 100644 index e87f1234c360ef545aeef5d1e70fda7a3448ab69..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/47.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - comment - - - - - - description - python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None]) - - - id - 47 - - - initial_value - - - - - - portal_type - Variable - - - title - displayed - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/5.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/5.xml new file mode 100644 index 0000000000000000000000000000000000000000..c848c64488e6b2266241f8f9e7171030bc584efb --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/5.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/12 + + + + + description + + + + + + id + 5 + + + portal_type + Configuration State + + + title + Standard BT5 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/52.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/52.xml deleted file mode 100644 index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/52.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - Id of client - - - id - 52 - - - initial_value - python: request.get(\'client_id\', None) - - - portal_type - Variable - - - title - client_id - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/55.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/55.xml deleted file mode 100644 index 56cdbbcf29296161028f73d747edc88c859d081b..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/55.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/30 - - - - - description - - - - - - id - 55 - - - portal_type - State - - - title - Standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/56.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/56.xml deleted file mode 100644 index 03955a1562d86c294398ff93f31e9e2d2a1d4576..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/56.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupRunMyDocStandardBT5 - - - before_script_id - - - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/55 - - - - - comment - Setup all standard bt for ERP5 - - - description - - - - - - guard_expression - python: True - - - id - 56 - - - portal_type - Transition - - - title - Setup standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/59.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/59.xml deleted file mode 100644 index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/59.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 59 - - - initial_value - python: request.get(\'transition\', None) - - - portal_type - Variable - - - title - transition - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/6.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/6.xml new file mode 100644 index 0000000000000000000000000000000000000000..18970b7056fec729b2fc9a48837bc49ec9c51585 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/6.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/run_my_doc_configuration_workflow/10 + + + + + description + Enter the number of user accounts you want to create. + + + id + 6 + + + portal_type + Configuration State + + + title + Number of user accounts + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/61.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/61.xml deleted file mode 100644 index 879c02bbd97e3ae9a6774d64269babf1694f1bb8..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/61.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/12 - - - - - description - Enter the number of user accounts you want to create. - - - id - 61 - - - portal_type - State - - - title - Number of user accounts - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/64.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/64.xml deleted file mode 100644 index d938a5c4acc7a174bdfad79936ca9a14b00d0198..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/64.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/run_my_doc_configuration_workflow/63 - - - - - guard_expression - python: True - - - id - 64 - - - portal_type - Transition - - - title - Finalize - - - transition_form_id - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/7.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/7.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7be0dbabaa75b1d2a2a35e58547d59208a7f3b9 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/7.xml @@ -0,0 +1,30 @@ + + + + + + + + + + description + + + + + + id + 7 + + + portal_type + Configuration State + + + title + End + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/8.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/8.xml index 4943d89319d47e1efa3431e706050d32298d11bb..b77d38249382bdfb0e0c9147b7d263443735269b 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/8.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/8.xml @@ -2,58 +2,18 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/run_my_doc_configuration_workflow/62 + destination/workflow_module/run_my_doc_configuration_workflow/16 - - comment - Omit entering number of users.\n -BEFORE for possible transitions was: Enter Number of User - description Configure your organisation. @@ -64,7 +24,7 @@ BEFORE for possible transitions was: Enter Number of User portal_type - State + Configuration State title @@ -73,26 +33,4 @@ BEFORE for possible transitions was: Enter Number of User - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/9.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/9.xml index 4b896921f777e777a96a46e5770e6ae4de48deaa..b53585694c382e66c8a93dc15c94ee8c04aa8f1f 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/9.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/9.xml @@ -2,59 +2,18 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/run_my_doc_configuration_workflow/32 + destination/workflow_module/run_my_doc_configuration_workflow/13 - - comment - - - - description Enter the data of each user. @@ -65,7 +24,7 @@ portal_type - State + Configuration State title @@ -74,26 +33,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/default_image.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/default_image.xml index b7b248fd6784529d94af9310d3b09b61f5a9832c..21fb70c2ad37582076856a57c858f5529a1cdfab 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/default_image.xml +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/default_image.xml @@ -8,7 +8,7 @@ _EtagSupport__etag - ts21288336.08 + ts37560896.69 _count @@ -30,284 +30,290 @@ content_md5 - 528e253b87f52ff38821c9c46a008249 + 04fd515eae7000f9d78ef9e82a7787c7 content_type image/png - - creators - - - zope - - - data - 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 -yQqQSrAKA6JyjiYsi8LLrmtB9IIo81yzAczsx+jm26CsY+h93PdzGf4LjqnqrdDL63JKPgsnbzhn -WaZvpL6p+r4qpaIo0pfSkknM1+r3+0KIOI71B2OoQnPMLwvzGGIdMyLmea6/uBBCfx0ppRAi4NiB -UirP8yiKhBBKqfCLhz/M5GalLdoEPqWAyLFqDPaC2m9pVwRhB9vhpOycgOVzWeSLPZQaJDZYLrHL -nPSDOZfjL1QZf+AAbw5ZDKVsaxRWwMxZlj399NOf+9zn0jT96U9/2m638zzXN3t+fv5nP/vZvXv3 -kiSp1+vM3Ov10jRNkuTMmTNSyqWlpV6vl+e5vtPajUkpi6IAACFEv99vNBpRFPX7/W63W6/Xn332 -2SRJ7t69e//+/evXry8sLCil7t69qz8xz3Ol1JkzZxYWFt54441Op1MUhRCCiPI8JyJmrtfr+o1J -QFTjxVkBewyPFSOB7Yu5PpkK8QiHxzuujQf79L3CMCCCcWKDEqxDCTdUH0zngkq9iEpfBgYA9rGv -oih6vd4LL7xw6dKlq1evPvPMM/V6/fTp0+++++6JEyeuXbu2sLCwsbGxtrZWFMWpU6eklO12+8// -/M9//vOf//Vf//XMzMyRI0e0JdXr9X6/3+l0pqenlVKdTufkyZPLy8vLy8tzc3PT09NZlv3ar/3a -0aNHL1y4cO7cOSnln/3Zn7344ouvvPLK/Pz8nTt35ufn0zQ9e/bsV7/6VUR85ZVXnnjiiTzP+/1+ -q9Vqt9utVuvOnTudTmfyQMnMrCodKgXKYwShMTitmHFv4BJ8R5b3tmYcgcPvK90UGxaDxLicA+37 -+aBgtZIrBT2ySlTlrXVdEFEIceXKlStXrrz55ptKqc985jOrq6tnz55dX19XSn3961//rd/6rR/+ -8Id/8Rd/cfTo0T/6oz96/vnn/+Ef/uHkyZMXL168f//+M88888d//McbGxtpmp44caLT6bz++uuf -/OQn8zz/6U9/+gd/8Ad/+qd/evHixd/5nd/53d/93e9973t5nrdarccee6xerz/99NNf+9rXXn75 -5W9961unTp36p3/6py9/+cu3b9/+yU9+cvbs2W9961t/9Vd/9Sd/8idvvvnm8vLyF7/4xaWlpamp -qb/8y7/8+c9/PjMzMwlwWhRFr9slqQgUIQARA7HBTtE0rQktwIoIIAXFSY2RjIoAQ1jVdBFD1g1j -he9mb2VA+jVHzIyHR7A6eXFta8EKJI0lbKKaBrnkXac1RLSysnLhwoUrV66cOXPmqaeempubO3ny -JDMvLCzU6/WFhYUjR45cunTpF7/4hVLq1q1bs7OzJ06cuHTpUpIks7Oz6+vrCwsLzHzjxo233nrr -pZdeajQanU4HEeM4zrJMR73HH39cCHH+/PkkST7xiU+kaTo/P9/v95MkYeYrV658/OMff/LJJxcW -FhqNxvT09OLi4jPPPPOjH/1ofX1dFxmVaFjJAjWQVavVTpw4ESW1VIHCSBY5CpYaizeWhaZeNkC9 -yHK1fn+VixyJAlyinJKjQymcQpbRNuZKdubUGR4K4nJdcGCC1a02N7iEPXDpq6D3/xg6rW63WxRF -mqarq6s3btw4fvz4kSNH1tbWVldXjx079t577wkhVldX19fXb9y4cenSpRMnTrTb7VqtduPGjVu3 -brVarRdffPH3f//3r1y5srS09LGPfezatWurq6tKqV6vNzs7u7y8/P777y8uLmo/1+12r1279uij -jyZJsra29vrrr9fr9aWlJSnlmTNnZmZmrl27NjU1dfPmzevXr/d6vZdeemlubu4LX/jCj3/845WV -lSRJRsXBsAJIs/z0ycX/8XvfaB2Ze/utG9dvr4nF+TPzreNHYhSy0WhKKVE3fQhJ0L31lJEuvnvl -29/+v/20nyQ110HDAYogIihH9ILBZpC1M2tQ6OYh6Afg8AhWt4vlbOL6hBCI+N3vfvfevXt5nrfb -7Rs3bty+fbsoiuXl5W63u7S09N5770VRdPv27e9+97uvvvrqa6+9dvv27ffff79Wq83Nzd24cePq -1av//u//niTJjRs37t69u7Kycv369du3b9fr9bm5OSJaWlp68cUXr169urGx0Ww28zy/ffv2o48+ -ev78+ddee+2dd945derUa6+9try8/Prrr7/77rvHjh37wQ9+cP78+Xa73ev13njjjVu3bv3Lv/zL -+fPnlVJxHE+IbQgZ16fmW7OLi7OpyAt+ZHFhbvZIS5KIWq2WlJKQ3CuZSgFxY31DIBRF4UVjhuKN -ngqBgc6slIHZYMkQ8MsD3d6gW91HwSq+8Jt/CGU41HNEPTzHjnfFFiNgZgBl/5GVUkiU9dr3l9/J -ehs0Gnnv9XrawrIsk1I69AER0zSVUtZqNV0V5nler9ezLNNxc3p6WjukbrebpikRSSnTNBVCaLCg -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 -LUMAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAAMgAAACWCAIAAAAUvlBOAAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA +CXBIWXMAAAsTAAALEwEAmpwYAAA8NklEQVR42u29W4wlx3EmHBGZVXVu3T3dPTM9Qw1HS4kXUVqS +EuyVZWphWjbWWsP7Y43fwhowsL/hl/WDX/4H2/CTAL/4yVgD62fvLvyqfbFhi4bWhiHDoklRS9GU +TM7wMpwZznDYc+uZvpxLXTL2ITMys+pc+sK+zYipUbNOnjpVlZlfRUR+EZGJL/zH/8IAwAwAiAjA +DIgAAPBJ/Sf1e67XAIAAck796JP6T+r3Wq+ZGT4pn5T9LhoD1j4pn5R9K/QJrD4pB1E075cuRISf +TK36E9vwmUU7U96aYLsqjd60H5nBThN+AoozWsdR9Yl1YWeFAIKF8Q7x9TK7ZGaU3rTCDgHZnofh +Cg89ttC1kd1LaafbwAwIwBZzrq8gmptv288PS73231hoSNdEv0BEZkC0UHLgstdyvIWAjMMPH/p3 +lhsfEER2MTAEeDEzou3DgL2J/QzwMNVr9865b9mdZNUjg+sRRAcpByp0EJMfOlHlronMzA89stzL +41UhghdfCAAsYtx1P8eia7yfwXXuQ1OvfUeAO3KCCBgsnthKrAAp6TNmBLTvp/2xIJgBvZZ8CEuw +Dmy3ygvn2oteoCMgIGPoCkT3imLUz4A8sf8f8PqajcUovQRBVsWoYmQQQe/w5SwHf+hK0AIPo7mF +XptJcWoO5H0DK7iR0b2g4FWh6ACIu2a8/x/wegFW4EnlIBLaMarkD4MzuhjFePU+o1AeRl4fGy11 +doWzohBFB/r+Q9fraPsD0XZ2TZxPcpU80PVeYrlOcYByfxgjVCEwOMHulJ2DlHSx/IfjGz2U2jA0 +VCRy3TYHxljiMzst4SaJ7MTZcXQe71e9rvVUTYWJPR6hyp7BLNMeIa3chDCSjGJXPHwCyxbPNjhb +S4SVdDBbG9W+nMjI3qqPRqTZO55NfAjqdfw9ypzRyyG2LJWgimXC5/l6Bi/4HXCjecLDiirfNMcp +OBKvTg7HEsvNcpytz55ZdQKs0f/BWnuA67Wb17jXz2uzSAkCIDvJFdVHkPKce7hNpB3xoRVcwiMA +GPngBH3QdfFfMVtdx1hjAxDG+l9ezwe5XgOgp829LPPYkPfRCamAKuYALWZ3tolfWek/fuhQFdHA +jIAmAIwjZLkzIlQ5DenoHUZEP+mO+wzqEAz14PmMB6Beu69rxDsGRwQwBk7U+wO5LrYY6jIMvNUl +JthDU2JT0k6OA18lb6UFUuCYpR+QhVMNLyxyNLvyss51vmc0Gu7ceLyOa32gG9iTeE7peWkUiStn +XHmxxQFbQYG6bg84ngIs3Ob7Y1fqvoYw2RFpJZLG8wq1H8ubLczW+Hy5NgTRdNvRYrHJHAiLY1qv +g86S9sdvEFpiLxJXwUznWFBFTun4IPQZR09RpyeCzRf38DEs/jlZOsrNBq02CAwCi1RCrx+9tTHW +0sg1Fox6cFSq67rgl8PaeDWF3TGq14IzTy6400QMWRkk4srjIiIagJmDxT42WYz6cBKqwheNDj9W +xc9AOOorBxbLxgQxYw9JtB8Hsx7E1pUZkXt3AbwWCa4hEK+RJ/TdK99kV2vM9rGpHydILZDsm8OO +pWeoSSt7BntUeSDVudJ4eigzhsn2XzOKa6KWOLISdcAE/ilitEhgJNpOhBUGxYFOukXTJAdIQROK +TwMFWxxPAmL8HQMidFp9jSCdNZAxZpgdScpyCFIDgEj2ffV9XFcEDl/j2JkZiIlwdCUyE+rPg/4/ +/pvYwrTCRuABkdLj6JJ2Xoie6nFHbh4JEafvbbgHoUwDltgIXh36Ho7sJ3ZaLMYZGygc+Lz2qEVq +1eiHprqsj86xLB5N8UdEAERCoghM3tdvAkPoDXS5BMeyy1IQTgCiKE6W6zxI2NpeYsVzk4hlD6AS +CcaIVOWDzTvXyryPSDx2qYe4MHPWnu8un1M6YzZeNsUHIFNHZ2DZN7dm2TMDgiNNHdkDlqfwtsqD +gCqI6Abb7PrkQ6yDyGiHiPRkb2z5PjGmygfr+WAdSR110w6zMBuDSB2u3HxZgtximxIZkIQuBQgB +NvYEawSzzAkdq2qvhcgcsOWdHPGE35ZjU1+Lx3JvU507jq9QY4kjLjSmd5AISf2kActZS4bZGGDD +RABRZ4r1zuKw9n0Y60Q3DfSmO4N3YEM8LmGeGLodojn3cahvxmP5UyNiVRj56KvQn2JGsZjx7moP +iMTel2IliUyOmIHBGEDC6D0WG4IipQCOsxIZFQSWQNUFR7jocLSTa5YsBNfX8hhY/3S09UFieYZm +gk3E3kj3YKrrwQk0wuRijDHGAAARgfSdPNFkONrzcZdgZWHX/G85TIlrF2dmItqXN4GBjecz2QBS +jVZhQDRe0MTTorjb7VzQMu9Wa9r3mh1hJudY51ujx0W4HXm9jr+JVf54nzkyEMTk8tWhh3bkcC6K +wg6kHVQ7rsaYJElsV0owibvWaDRSSqVpak/238aneZrHBdYxI2JZlvbiSil7Ha21UiqKsQNjTFmW +SZIopYwx8cXjh9k5rCyineIzBogEOo6+ArRyy4oiUREYaRP2gTX2Udy5YZZZmxCwFxJ+il2PST+a ++mmzQtdR4QOKnG++YRwfcsxGNK7GXBTF5z//+a985St5nv/whz/c3Nwsy9IO9vLy8j//8z/fu3cv +y7J2u83Mw+Ewz/Msy5544gmt9dWrV4fDYVmWdqStGNNaV1UFAEqp0WjU6XSSJBmNRoPBoN1uP/vs +s1mW3blz5/79+x9++OHKyoox5s6dO/aHZVkaY5544omVlZXXX3+93+9XVaWUIqKyLImImdvttj3Y +FlQyxsxsgAOHx4aRQPxi4N5OibPB6K20zKiPgQBfB8AYK0RwQmw8Bes4FQ+s5ovpRVDNF9Hwywiy +dsg8VVU1HA5feOGFS5cuXbt27Zlnnmm32+fPn3/vvffOnj17/fr1lZWVra2t9fX1qqoeffRRrfXm +5uYf/MEf/OhHP/qTP/mThYWFEydOWCS12+3RaNTv9+fn540x/X7/3Llzq6urq6urS0tL8/PzRVH8 +7M/+7MmTJy9evPjmm29qrX//93//xRdffOWVV5aXl2/fvr28vJzn+dNPP/31r38dEV955ZXHH3+8 +LMvRaNTr9TY3N3u93u3bt/v9/s4VJTOzaXioDJjAEcRg8LliTryBN/B9sHzAmhMEnr+PBs25Ltwj +TrGBDr1+PGE1gksA2AQmc9zPPLvTEVEpdeXKlStXrrzxxhvGmC9/+ctra2tPP/30xsaGMeZXfuVX +fu3Xfu0f/uEf/vAP//DkyZO//du//fzzz//5n//5uXPn3n777fv37z/zzDO/8zu/s7W1lef52bNn ++/3+a6+99qUvfaksyx/+8Ie/9Vu/9Xu/93tvv/32r//6r//Gb/zGd77znbIse73eZz7zmXa7/fnP +f/6Xf/mXX3755W9+85uPPvroX/3VX/3CL/zCrVu3fvCDHzz99NPf/OY3//iP//h3f/d333jjjdXV +1Z//+Z+/evXq3NzcH/3RH/3oRz9aWFjYAaiwqqrhYEDaEBhCACIGYsedonNaEwrBigigFaVZi5Gs +HPIR4RZFGDksHPdV1xRhKKOgX1fFzLWXgceAfbD1uqHxdlS82KqBC8VG89xE0wwCMd6tWUNEd+/e +vXjx4pUrV5544omnnnpqaWnp3LlzzLyystJut1dWVk6cOHHp0qUf//jHxpibN28uLi6ePXv20qVL +WZYtLi5ubGysrKww840bN956662XXnqp0+n0+31ETNO0KAoA0Fp/9rOfVUpduHAhy7IvfvGLeZ4v +Ly+PRqMsy5j5ypUrX/jCF5588smVlZVOpzM/P3/mzJlnnnnme9/73sbGhp1kNLRhwwoEAGbTarXO +nj2bZK3cgMFEVyUq1paLd8hCN192RL0qSrNxf42rEokiXqJukqNnKZxocGksPuDLD6zPzghUEMdW +i4zXESSs7qqERRvc5bh2FQzyPxwopQaDQVVVeZ6vra3duHHj9OnTJ06cWF9fX1tbO3Xq1Pvvv6+U +Wltb29jYuHHjxqVLl86ePbu5udlqtW7cuHHz5s1er/fiiy/+5m/+5pUrV65evfq5z33u+vXra2tr +xpjhcLi4uLi6uvrBBx+cOXPGyrnBYHD9+vXHHnssy7L19fXXXnut3W5fvXpVa/3EE08sLCxcv359 +bm7uo48++vDDD4fD4UsvvbS0tPRzP/dz//RP/3T37t0sy6bpwXgGkBfl+XNn/r///Ku9E0vvvHXj +w1vr6szyE8u90ydSVLrT6Wqt0Tp9CEnRvY2ckd5+78q3vvW/Rvkoy1regxYQE7H1xgd6gXRxcAYJ +zgRQ6NdDsC9AGN/Y6D6KhNU9lJBAN70opRDx29/+9r1798qy3NzcvHHjxq1bt6qqWl1dHQwGV69e +ff/995MkuXXr1re//e3vf//7r7766q1btz744INWq7W0tHTjxo1r1679/d//fZZlN27cuHPnzt27 +dz/88MNbt2612+2lpSUiunr16osvvnjt2rWtra1ut1uW5a1btx577LELFy68+uqr77777qOPPvrq +q6+urq6+9tpr77333qlTp7773e9euHBhc3NzOBy+/vrrN2/e/Ju/+ZsLFy4YY9I03UnjmVnptD23 +3Fs8c2YxV2XFj5xZWVo80dOkkl6vp7UmJF+yuRwQtza2FEJVVSFpjAEcisBZVWJvQdMCE2Vpx9TP +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 height @@ -317,32 +323,13 @@ LUMAAAAASUVORK5CYII= id default_image - - modification_date - - - - - - - - - - - 1324670339.19 - GMT-2 - - - - - portal_type Embedded File size - 14891 + 15705 width diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_actor.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3902fd5361715a7003ade8ae593337138f10cb2 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_actor.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + actor + + + default_value + python: member.getUserName() + + + description + + + + + + id + variable_actor + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_client_id.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_client_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b91d98c56b69dbe0e8b09b426bbab1b4d6c3873 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_client_id.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + client_id + + + default_value + python: request.get(\'client_id\', None) + + + description + + + + + + id + variable_client_id + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_comment.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3442b68c63f786c0842783866c6759ec6fc9e61 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_comment.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + comment + + + default_value + python: None + + + description + + + + + + id + variable_comment + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_configuration_save_url.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_configuration_save_url.xml new file mode 100644 index 0000000000000000000000000000000000000000..10842b0d70b1c3105492a49f29930f9e329e222f --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_configuration_save_url.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + configuration_save_url + + + default_value + python: request.get(\'configuration_save_url\', None) + + + description + + + + + + id + variable_configuration_save_url + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_displayed.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_displayed.xml new file mode 100644 index 0000000000000000000000000000000000000000..0134feb90f0fa3a2c3cbb9863b08cb5abd92482d --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_displayed.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_reference + displayed + + + default_value + + + + + + description + + + + + + id + variable_displayed + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_error_message.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..f64c6c5515244615c298f796df332af0b605a486 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_error_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + error_message + + + default_value + python: None + + + description + + + + + + id + variable_error_message + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_time.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_time.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec0c70738e23d752027ccb16c42344f93ebc4e06 --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_time.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + time + + + default_value + python: object.getDateTime() + + + description + + + + + + id + variable_time + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_transition.xml b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d93269f0b716c0bb19ea60ed2459f60c1bb503e --- /dev/null +++ b/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/variable_transition.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + transition + + + default_value + python: request.get(\'transition\', None) + + + description + + + + + + id + variable_transition + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDocConfigurationWorkflow.xml b/bt5/erp5_configurator_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDocConfigurationWorkflow.xml index e369de62d38b6d8ea07bc6d69e1801c505189c95..3d7eb4f3958ca14aeceb50867d0b8c8c97cbc9eb 100644 --- a/bt5/erp5_configurator_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDocConfigurationWorkflow.xml +++ b/bt5/erp5_configurator_run_my_doc/TestTemplateItem/portal_components/test.erp5.testRunMyDocConfigurationWorkflow.xml @@ -6,10 +6,22 @@ + + _recorded_property_dict + + AAAAAAAAAAI= + + default_reference testRunMyDocConfigurationWorkflow + + description + + + + id test.erp5.testRunMyDocConfigurationWorkflow @@ -24,6 +36,37 @@ + + text_content_error_message + + + + + + text_content_warning_message + + + W:165, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:166, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:167, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:168, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:169, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:170, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:171, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:172, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:173, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:176, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:177, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:178, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:179, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:180, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:181, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:182, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:183, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + W:184, 0: Bad indentation. Found 5 spaces, expected 4 (bad-indentation) + + + version erp5 @@ -31,13 +74,28 @@ workflow_history - AAAAAAAAAAI= + AAAAAAAAAAM= + + + + + + + data + + + + + + + + @@ -50,7 +108,7 @@ component_validation_workflow - AAAAAAAAAAM= + AAAAAAAAAAQ= @@ -59,7 +117,7 @@ - + diff --git a/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/account_type.xml b/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/account_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3be64aa2fca7e08408ee1ded0268da92f29459d --- /dev/null +++ b/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/account_type.xml @@ -0,0 +1,185 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + acquisition_append_value + 0 + + + acquisition_base_category + + + + + + acquisition_copy_value + 0 + + + acquisition_mask_value + 1 + + + acquisition_object_id + + + + + + acquisition_portal_type + python: [] + + + acquisition_sync_value + 0 + + + categories + + + + + + category_type + + + + + + criterion_property + + + + + + description + WARNING: do not modify Ids for this base category. Id is used in many places in accounting. This base category should be read-only.\n +You can still safely change Title or (better) translate it using Localizer + + + fallback_base_category + + + + + + id + account_type + + + id_generator + + + + + + id_group + None + + + membership_criterion_base_category + + + + + + membership_criterion_category + + + + + + multimembership_criterion_base_category + + + + + + portal_type + Base Category + + + read_permission + None + + + rid + + + + + + short_title + + + + + + sid + + + + + + test_method_id + + + + + + title + Account Type + + + write_permission + None + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/financial_section.xml b/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/financial_section.xml new file mode 100644 index 0000000000000000000000000000000000000000..62f901868f2e401ac70fa0d477905939ee98dafa --- /dev/null +++ b/bt5/erp5_configurator_standard/CategoryTemplateItem/portal_categories/financial_section.xml @@ -0,0 +1,184 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + acquisition_append_value + 0 + + + acquisition_base_category + + + + + + acquisition_copy_value + 0 + + + acquisition_mask_value + 1 + + + acquisition_object_id + + + + + + acquisition_portal_type + python: [] + + + acquisition_sync_value + 0 + + + categories + + + + + + category_type + + + + + + criterion_property + + + + + + description + + + + fallback_base_category + + + + + + id + financial_section + + + id_generator + + + + + + id_group + None + + + membership_criterion_base_category + + + + + + membership_criterion_category + + + + + + multimembership_criterion_base_category + + + + + + portal_type + Base Category + + + read_permission + None + + + rid + + + + + + short_title + + + + + + sid + + + + + + test_method_id + + + + + + title + Financial Section + + + write_permission + None + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/business_configuration_module/default_standard_configuration.xml b/bt5/erp5_configurator_standard/PathTemplateItem/business_configuration_module/default_standard_configuration.xml index cd41da01a5a2590d9865a92b034276850624b87f..d9d68c24d5e2f52b0a75ae76d45def05c518f90f 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/business_configuration_module/default_standard_configuration.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/business_configuration_module/default_standard_configuration.xml @@ -184,10 +184,6 @@ - - last_id - 3 - modification_date diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow.xml index fd8178836a03e01c6b582812924f838d4474aa3c..bd60c4062e768e3fd4b420ae17002920174bdb1c 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow.xml @@ -2,7 +2,7 @@ - + @@ -19,7 +19,7 @@ id - state_variable_name + comment type @@ -29,11 +29,11 @@ id - comment + state_base_category type - string + lines @@ -77,16 +77,12 @@ portal_type - Workflow + Configuration Workflow state_base_category current_state - - state_variable_name - current_state - title ERP5 Standard Consulting Configuration diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/1.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/1.xml index eb09bbb59f983fe8cdef016373db4d5c1cc52ce9..e3e2aa889e65c814ea0f34eefa3d7bf2e46ef283 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/1.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/1.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_consulting_workflow/56 + destination/workflow_module/erp5_consulting_workflow/18 @@ -44,7 +26,7 @@ portal_type - State + Configuration State title @@ -53,26 +35,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/71.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/10.xml similarity index 81% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/71.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/10.xml index 1eaa3d8fbe1dbba53a39e0bd6f5ce82cb46fa6a0..c5808c4e4311b59713c6428a37864837f3c6381d 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/71.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/10.xml @@ -2,7 +2,7 @@ - + @@ -10,7 +10,7 @@ categories - destination/workflow_module/erp5_consulting_workflow/4 + destination/workflow_module/erp5_consulting_workflow/17 @@ -20,11 +20,11 @@ id - 71 + 10 portal_type - State + Configuration State title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/11.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/11.xml index d1bc539f2a10f0de478be13174a81cf690da61a7..d763dd82099a6bd37ab202508edec0d0c486383f 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/11.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/11.xml @@ -2,39 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_consulting_workflow/64 + destination/workflow_module/erp5_consulting_workflow/19 description - Installation procedure may begin. + Configure your organisation. id @@ -42,35 +24,13 @@ portal_type - State + Configuration State title - Download + Your organisation - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12.xml index 45d4c3d30c97f43e698b5efa2603eb06c85e893b..be709a92bbac677ab4da69e0081d6227f4db0b4b 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12.xml @@ -2,78 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupEmployeeList - - - before_script_id - - - - categories - destination/workflow_module/erp5_consulting_workflow/9 + destination/workflow_module/erp5_consulting_workflow/21 - - comment - - - - description - - - - - - guard_expression - python: True + Fill in detailled information for each ERP5 user. id @@ -81,39 +24,13 @@ portal_type - Transition + Configuration State title - Configure user accounts - - - transition_form_id - BusinessConfiguration_setupEmployeeListForm + User accounts configuration - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12/1.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12/1.xml deleted file mode 100644 index 37e49cb3e5e30badc632ba77048b7ce51de84feb..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/12/1.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - causality/workflow_module/erp5_consulting_workflow/16 - - - - - description - Default Value =\n -python: object.document.getCurrentStateValue().getVariableValue(object.document, \'user_number\') + 1 - - - id - 1 - - - initial_value - - - - - - portal_type - Transition Variable - - - title - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/13.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/13.xml new file mode 100644 index 0000000000000000000000000000000000000000..21cdd65f0c55292e834ff1b33c45b962ba73c6d4 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/13.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupEmployeeList + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/12 + + + + + description + + + + + + id + 13 + + + portal_type + Configuration Transition + + + title + Configure user accounts + + + transition_form_id + BusinessConfiguration_setupEmployeeListForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/14.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/14.xml index 504d41083aa3bd4ad65e565f70a9981d70cab0bf..b4b80f8786e9d0464cf26dc84cddeba167b7e30c 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/14.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/14.xml @@ -2,37 +2,23 @@ - + - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree + after_script_id - AAAAAAAAAAQ= + + BusinessConfiguration_displayDownload + - - after_script_id - BusinessConfiguration_displayDownload - categories - destination/workflow_module/erp5_consulting_workflow/11 + destination/workflow_module/erp5_consulting_workflow/2 @@ -51,7 +37,7 @@ We don\'t use ExpressConfiguration_displayDownload script, because it would crea portal_type - Transition + Configuration Transition title @@ -64,26 +50,4 @@ We don\'t use ExpressConfiguration_displayDownload script, because it would crea - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/15.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/15.xml new file mode 100644 index 0000000000000000000000000000000000000000..30d03d5ea2fb39339d5fe3c04c3ecb1512107f1d --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/15.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupCustomerBT5 + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/3 + + + + + description + + + + + + id + 15 + + + portal_type + Configuration Transition + + + title + Setup customer BT5 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/16.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/16.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b53ef7b7e4931a04f3a89218d94b9a64c559a91 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/16.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupPreferences + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/4 + + + + + description + + + + + + id + 16 + + + portal_type + Configuration Transition + + + title + Configure ERP5 Preferences + + + transition_form_id + BusinessConfiguration_setupPreferencesForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/17.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/17.xml new file mode 100644 index 0000000000000000000000000000000000000000..eba6cfb7e60717890a984364ceacb0564372351d --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/17.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_configureConsultingOrganisation + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/11 + + + + + description + + + + + + id + 17 + + + portal_type + Configuration Transition + + + title + Configure Organisation + + + transition_form_id + BusinessConfiguration_viewConsultingConfigureOrganisationDialog + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/18.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/18.xml new file mode 100644 index 0000000000000000000000000000000000000000..f8a41e2fa4a1a3b53cc8ae58ef65eee32af7519c --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/18.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupStandardBT5 + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/5 + + + + + description + + + + + + id + 18 + + + portal_type + Configuration Transition + + + title + Setup standard BT5 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/19.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/19.xml new file mode 100644 index 0000000000000000000000000000000000000000..de15c972f4564636261d3d9c62ade6eda24a54c3 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/19.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupEmployeesNumber + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/6 + + + + + description + + + + + + id + 19 + + + portal_type + Configuration Transition + + + title + Configure user accounts number + + + transition_form_id + BusinessConfiguration_setupEmployeesNumberForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/2.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..d73343e6a1fc28c37492dc796911427a44a2cc4d --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/20 + + + + + description + Installation procedure may begin. + + + id + 2 + + + portal_type + Configuration State + + + title + Download + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/20.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/20.xml new file mode 100644 index 0000000000000000000000000000000000000000..2910a502022bb1ba4a576d61c7d4512f4c80c6c5 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/20.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/7 + + + + + description + + + + + + id + 20 + + + portal_type + Configuration Transition + + + title + Finalize + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/65.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/21.xml similarity index 72% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/65.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/21.xml index c3a8aa0c2fc92806f16f6ecc8ee5c9767937d58e..d1af2175b6e7b87a0785166ad6596daba394215d 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/65.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/21.xml @@ -2,19 +2,23 @@ - + after_script_id - BusinessConfiguration_setupAccounting + + + BusinessConfiguration_setupAccounting + + categories - destination/workflow_module/erp5_consulting_workflow/66 + destination/workflow_module/erp5_consulting_workflow/8 @@ -24,17 +28,13 @@ - - guard_expression - python: True - id - 65 + 21 portal_type - Transition + Configuration Transition title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/69.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/22.xml similarity index 72% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/69.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/22.xml index 2dc69b354f7c92ee9de76791df0c865699328e85..6a59e6dbcf3434ec2d8162ba52cd1b92a63d37f7 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/69.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/22.xml @@ -2,19 +2,23 @@ - + after_script_id - BusinessConfiguration_configureCategories + + + BusinessConfiguration_configureCategories + + categories - destination/workflow_module/erp5_consulting_workflow/68 + destination/workflow_module/erp5_consulting_workflow/9 @@ -24,17 +28,13 @@ - - guard_expression - python: True - id - 69 + 22 portal_type - Transition + Configuration Transition title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/70.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/23.xml similarity index 72% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/70.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/23.xml index 378aac02ca590d4f93af928532510ed50d9edd30..377567b4561ced4190c44320d798936c17ce9674 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/70.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/23.xml @@ -2,19 +2,23 @@ - + after_script_id - BusinessConfiguration_configurePortalTypeRoles + + + BusinessConfiguration_configurePortalTypeRoles + + categories - destination/workflow_module/erp5_consulting_workflow/71 + destination/workflow_module/erp5_consulting_workflow/10 @@ -24,17 +28,13 @@ - - guard_expression - python: True - id - 70 + 23 portal_type - Transition + Configuration Transition title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/29.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/29.xml deleted file mode 100644 index bd3684bd5c34fb234d5d02a2aa372e46a85825d4..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/29.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/69 - - - - - comment - - - - - - description - - - - - - id - 29 - - - portal_type - State - - - title - Customer BT - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/66.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/3.xml similarity index 69% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/66.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/3.xml index 70a67f72a6eaf4e7aad8ac4eb8a13c195a624218..2133b99e5c4c8ff98a2a08be77761284b5f136bf 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/66.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/3.xml @@ -2,7 +2,7 @@ - + @@ -10,25 +10,27 @@ categories - destination/workflow_module/erp5_consulting_workflow/32 + destination/workflow_module/erp5_consulting_workflow/22 description - Configure your accounting. + + + id - 66 + 3 portal_type - State + Configuration State title - Accounting + Customer BT diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/30.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/30.xml deleted file mode 100644 index c5b0743e4b1b3997fc138d92f35c2cde0af46ac1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/30.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupCustomerBT5 - - - categories - - - destination/workflow_module/erp5_consulting_workflow/29 - - - - - description - - - - - - guard_expression - python: True - - - id - 30 - - - portal_type - Transition - - - title - Setup customer BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/31.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/31.xml deleted file mode 100644 index 9539ed21afd41ca7720dbdf28a113a89748fedac..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/31.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/14 - - - - - description - Define some global preferences for your ERP5 application. - - - id - 31 - - - portal_type - State - - - title - Application preferences - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/32.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/32.xml deleted file mode 100644 index bbf9f64723aafa38a0cf4cd08ba78873118bee1f..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/32.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupPreferences - - - categories - - - destination/workflow_module/erp5_consulting_workflow/31 - - - - - comment - - - - - - description - - - - - - guard_expression - python: True - - - id - 32 - - - portal_type - Transition - - - title - Configure ERP5 Preferences - - - transition_form_id - BusinessConfiguration_setupPreferencesForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/4.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/4.xml index 87f0c6fe5b79135d765b402d3997bfd31385e10e..60aaa4527a3574a2ad0a79250e5c3ec38887ebd9 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/4.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/4.xml @@ -2,49 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_configureConsultingOrganisation - categories - destination/workflow_module/erp5_consulting_workflow/8 + destination/workflow_module/erp5_consulting_workflow/14 description - - - - - - guard_expression - python: True + Define some global preferences for your ERP5 application. id @@ -52,39 +24,13 @@ portal_type - Transition + Configuration State title - Configure Organisation - - - transition_form_id - BusinessConfiguration_viewConsultingConfigureOrganisationDialog + Application preferences - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/42.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/42.xml deleted file mode 100644 index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/42.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 42 - - - initial_value - python: member.getId() - - - portal_type - Variable - - - title - actor - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/43.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/43.xml deleted file mode 100644 index 5ef05cd9210c709cf10437ce703a9ddf4d180660..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/43.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 43 - - - initial_value - python: object.getDateTime() - - - portal_type - Variable - - - title - time - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/44.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/44.xml deleted file mode 100644 index c0e928799450f6872652c21aa76cde277e774d13..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/44.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 44 - - - initial_value - python: None - - - portal_type - Variable - - - title - comment - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/45.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/45.xml deleted file mode 100644 index b65378a36b63ab54aa1f2911ed7e41d31dea290d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/45.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 45 - - - initial_value - python: None - - - portal_type - Variable - - - title - error_message - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/46.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/46.xml deleted file mode 100644 index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/46.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 46 - - - initial_value - python: request.get(\'configuration_save_url\', None) - - - portal_type - Variable - - - title - configuration_save_url - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/47.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/47.xml deleted file mode 100644 index e87f1234c360ef545aeef5d1e70fda7a3448ab69..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/47.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - comment - - - - - - description - python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None]) - - - id - 47 - - - initial_value - - - - - - portal_type - Variable - - - title - displayed - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/68.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/5.xml similarity index 69% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/68.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/5.xml index 098e4249d9bff3c566b7a928ccfc67c5fd853788..dfd0a9965bf0d82ef0b6ddb54def85a6c3b2a365 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/68.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/5.xml @@ -2,7 +2,7 @@ - + @@ -10,25 +10,27 @@ categories - destination/workflow_module/erp5_consulting_workflow/70 + destination/workflow_module/erp5_consulting_workflow/15 description - Upload your categories spreadsheet. + + + id - 68 + 5 portal_type - State + Configuration State title - Your Categories + Standard BT5 diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/52.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/52.xml deleted file mode 100644 index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/52.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - Id of client - - - id - 52 - - - initial_value - python: request.get(\'client_id\', None) - - - portal_type - Variable - - - title - client_id - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/55.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/55.xml deleted file mode 100644 index a0ed479ea3a350f6464115215549787db1007e25..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/55.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/30 - - - - - description - - - - - - id - 55 - - - portal_type - State - - - title - Standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/56.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/56.xml deleted file mode 100644 index 11fc057612287b1174aff38825f8fc3d25ff94d4..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/56.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupStandardBT5 - - - before_script_id - - - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/55 - - - - - comment - Setup all standard bt for ERP5 - - - description - - - - - - guard_expression - python: True - - - id - 56 - - - portal_type - Transition - - - title - Setup standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/59.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/59.xml deleted file mode 100644 index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/59.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 59 - - - initial_value - python: request.get(\'transition\', None) - - - portal_type - Variable - - - title - transition - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/6.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/6.xml new file mode 100644 index 0000000000000000000000000000000000000000..63479c2266f2f38ee6ffb6e6805b9b2c3c39b0eb --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/6.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/erp5_consulting_workflow/13 + + + + + description + Enter the number of user accounts you want to create. In your company, each person using ERP5 should have his own user account. + + + id + 6 + + + portal_type + Configuration State + + + title + Number of user accounts + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/61.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/61.xml deleted file mode 100644 index f7ee416b2e130d8a182b02d3361a846847315eb2..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/61.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/12 - - - - - description - Enter the number of user accounts you want to create. In your company, each person using ERP5 should have his own user account. - - - id - 61 - - - portal_type - State - - - title - Number of user accounts - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/62.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/62.xml deleted file mode 100644 index 79eb86a85b4db17cabf5e442af160c6f6a58c6aa..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/62.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupEmployeesNumber - - - categories - - - destination/workflow_module/erp5_consulting_workflow/61 - - - - - description - - - - - - guard_expression - python: True - - - id - 62 - - - portal_type - Transition - - - title - Configure user accounts number - - - transition_form_id - BusinessConfiguration_setupEmployeesNumberForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/63.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/63.xml deleted file mode 100644 index 365a712f821e1af9d7ac3e122331d73629f4518a..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/63.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - description - - - - - - id - 63 - - - portal_type - State - - - title - End - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/64.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/64.xml deleted file mode 100644 index 701c4c4dcab5d0495c027460515f77469971cf15..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/64.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_consulting_workflow/63 - - - - - guard_expression - python: True - - - id - 64 - - - portal_type - Transition - - - title - Finalize - - - transition_form_id - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/7.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/7.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7be0dbabaa75b1d2a2a35e58547d59208a7f3b9 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/7.xml @@ -0,0 +1,30 @@ + + + + + + + + + + description + + + + + + id + 7 + + + portal_type + Configuration State + + + title + End + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/8.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/8.xml index 3d90531ca098caa4d459f770e33c1dd6bee71856..36b0e8a4d0cfedf289ce9042e8bd5b39684e6723 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/8.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/8.xml @@ -2,62 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_consulting_workflow/62 + destination/workflow_module/erp5_consulting_workflow/16 - - comment - - - - description - Configure your organisation. + Configure your accounting. id @@ -65,35 +24,13 @@ portal_type - State + Configuration State title - Your organisation + Accounting - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/9.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/9.xml index 3ee0af2bdaf8e8518f432f1c58f2f6f0aa1dd34c..76d69e112d78a52aef2abe31283a696f1ad080af 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/9.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/9.xml @@ -2,62 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_consulting_workflow/65 + destination/workflow_module/erp5_consulting_workflow/23 - - comment - - - - description - Fill in detailled information for each ERP5 user. + Upload your categories spreadsheet. id @@ -65,35 +24,13 @@ portal_type - State + Configuration State title - User accounts configuration + Your Categories - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/default_image.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/default_image.xml index f6e83fd9c541ac394da3cefc1ed26ecea920c91d..6a946e15fe88284c18491b625d9c85e1d99b509d 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/default_image.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/default_image.xml @@ -8,7 +8,7 @@ _EtagSupport__etag - ts02571556.08 + ts37563448.51 _count @@ -30,7 +30,7 @@ content_md5 - e1c88d43f707d588f8d245f4a210baa0 + 35389082dbe71ad21d9f466f5644b977 content_type @@ -56,7 +56,7 @@ size - 74186 + 76626 width @@ -95,1308 +95,1351 @@ data - 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 -RERERESM4f8DE28VS4C2PnsAAAAASUVORK5CYII= + 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 +MDCQJ2hCAAAAAElFTkSuQmCC diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_actor.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3902fd5361715a7003ade8ae593337138f10cb2 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_actor.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + actor + + + default_value + python: member.getUserName() + + + description + + + + + + id + variable_actor + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_client_id.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_client_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b91d98c56b69dbe0e8b09b426bbab1b4d6c3873 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_client_id.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + client_id + + + default_value + python: request.get(\'client_id\', None) + + + description + + + + + + id + variable_client_id + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_comment.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3442b68c63f786c0842783866c6759ec6fc9e61 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_comment.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + comment + + + default_value + python: None + + + description + + + + + + id + variable_comment + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_configuration_save_url.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_configuration_save_url.xml new file mode 100644 index 0000000000000000000000000000000000000000..10842b0d70b1c3105492a49f29930f9e329e222f --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_configuration_save_url.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + configuration_save_url + + + default_value + python: request.get(\'configuration_save_url\', None) + + + description + + + + + + id + variable_configuration_save_url + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_displayed.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_displayed.xml new file mode 100644 index 0000000000000000000000000000000000000000..0134feb90f0fa3a2c3cbb9863b08cb5abd92482d --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_displayed.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_reference + displayed + + + default_value + + + + + + description + + + + + + id + variable_displayed + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_error_message.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..f64c6c5515244615c298f796df332af0b605a486 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_error_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + error_message + + + default_value + python: None + + + description + + + + + + id + variable_error_message + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_time.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_time.xml new file mode 100644 index 0000000000000000000000000000000000000000..02ad9d5bd6a7f6de1423fcd3dd9e4b93d6d65766 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_time.xml @@ -0,0 +1,40 @@ + + + + + + + + + + default_reference + time + + + default_value + python: object.getDateTime() + + + description + + + + + + id + variable_time + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_transition.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d93269f0b716c0bb19ea60ed2459f60c1bb503e --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_consulting_workflow/variable_transition.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + transition + + + default_value + python: request.get(\'transition\', None) + + + description + + + + + + id + variable_transition + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow.xml index ce3fa21917d3377e047c8d75638264ab16df2aa6..81b1330582ac5b70b8d553d4d02d2bc70b6c9265 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow.xml @@ -2,7 +2,7 @@ - + @@ -19,11 +19,11 @@ id - state_variable_name + state_base_category type - string + lines @@ -63,16 +63,12 @@ portal_type - Workflow + Configuration Workflow state_base_category current_state - - state_variable_name - current_state - title ERP5 Standard Configuration Workflow diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/1.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/1.xml index 99cbc8683796ea35ab998ceff4ab3b797c5c4d31..7dcb1ec5f679e2536a6ea4499a2a2f42c1d9a96b 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/1.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/1.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_standard_workflow/56 + destination/workflow_module/erp5_standard_workflow/19 @@ -44,7 +26,7 @@ portal_type - State + Configuration State title @@ -53,26 +35,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/66.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/10.xml similarity index 80% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/66.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/10.xml index 7a9bd3bf2fe06ed5e7a622c7fab94f30509f503f..d8f3871ba881d852541f931b49495e09248694f7 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/66.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/10.xml @@ -2,7 +2,7 @@ - + @@ -10,7 +10,7 @@ categories - destination/workflow_module/erp5_standard_workflow/32 + destination/workflow_module/erp5_standard_workflow/17 @@ -20,11 +20,11 @@ id - 66 + 10 portal_type - State + Configuration State title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/11.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/11.xml index 35e23db23762b839b5b74012632ed9756f9f3c5b..a59923f69dbf95802d497190d7b2ec4fbea7f9d2 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/11.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/11.xml @@ -2,39 +2,44 @@ - + - _count + _local_properties - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= + + + + id + comment + + + type + text + + + categories - destination/workflow_module/erp5_standard_workflow/64 + destination/workflow_module/erp5_standard_workflow/21 + + comment + Omit enetring number of users.\n +BEFORE for possible transitions was: E\n +nter Number of User + description - Installation procedure may begin. + Configure your organisation. id @@ -42,35 +47,13 @@ portal_type - State + Configuration State title - Download + Your organisation - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12.xml index 9979d93a689bef133ea4a4be2a546a3d282a2021..d7966da9686e97e731bb8d2123a2f62f8d40b72b 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12.xml @@ -2,72 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupEmployeeList - categories - destination/workflow_module/erp5_standard_workflow/9 + destination/workflow_module/erp5_standard_workflow/23 - - comment - - - - description - - - - - - guard_expression - python: True + Fill in detailled information for each ERP5 user. At end of configuration process each TioLive user will receive an email containing his username and password. id @@ -75,39 +24,13 @@ portal_type - Transition + Configuration State title - Configure user accounts - - - transition_form_id - BusinessConfiguration_setupEmployeeListForm + User accounts configuration - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12/1.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12/1.xml deleted file mode 100644 index e1d83e605389c3eba0cfe0c507cb1cdac7996291..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/12/1.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - causality/workflow_module/erp5_standard_workflow/16 - - - - - description - Default Value =\n -python: object.document.getCurrentStateValue().getVariableValue(object.document, \'user_number\') + 1 - - - id - 1 - - - initial_value - - - - - - portal_type - Transition Variable - - - title - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/13.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/13.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c4d044376d98b863d15391c8e53478494943562 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/13.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupEmployeeList + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/12 + + + + + description + + + + + + id + 13 + + + portal_type + Configuration Transition + + + title + Configure user accounts + + + transition_form_id + BusinessConfiguration_setupEmployeeListForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/14.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/14.xml index 70db10202d01cfef5ff8bfa5e924c02df7aef088..0e24cb765d44f2e70a0f9c1e96941f922aa5b111 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/14.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/14.xml @@ -2,37 +2,23 @@ - + - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree + after_script_id - AAAAAAAAAAQ= + + BusinessConfiguration_displayDownload + - - after_script_id - BusinessConfiguration_displayDownload - categories - destination/workflow_module/erp5_standard_workflow/11 + destination/workflow_module/erp5_standard_workflow/2 @@ -42,17 +28,13 @@ - - guard_expression - python: True - id 14 portal_type - Transition + Configuration Transition title @@ -65,26 +47,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/15.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/15.xml new file mode 100644 index 0000000000000000000000000000000000000000..da5532ade783f4c02df85fdc3f908171166c001b --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/15.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupPortalTypeRole + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/3 + + + + + description + + + + + + id + 15 + + + portal_type + Configuration Transition + + + title + Setup Portal Type Role + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/16.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/16.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac2e8c4b58b3f2ccf35d8bfece2c134a780a1968 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/16.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupCustomerBT5 + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/4 + + + + + description + + + + + + id + 16 + + + portal_type + Configuration Transition + + + title + Setup customer BT5 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/17.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/17.xml new file mode 100644 index 0000000000000000000000000000000000000000..673bb7b12d160f73ff04bba8e3f664e242251991 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/17.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupPreferences + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/5 + + + + + description + + + + + + id + 17 + + + portal_type + Configuration Transition + + + title + Configure ERP5 Preferences + + + transition_form_id + BusinessConfiguration_setupPreferencesForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/18.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/18.xml new file mode 100644 index 0000000000000000000000000000000000000000..cfe1fe5475c98458cddbb5966942f99fc75ca877 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/18.xml @@ -0,0 +1,54 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupOrganisation + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/11 + + + + + description + + + + + + guard_expression + python: True + + + id + 18 + + + portal_type + Configuration Transition + + + title + Configure Organisation + + + transition_form_id + BusinessConfiguration_setupOrganisationForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/19.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/19.xml new file mode 100644 index 0000000000000000000000000000000000000000..345a8596ecba1e0346e254eb0547ff3c900c0a71 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/19.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupStandardBT5 + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/7 + + + + + description + + + + + + id + 19 + + + portal_type + Configuration Transition + + + title + Setup standard BT5 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/2.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/2.xml index ffb9fb3b9f787c026991a0f271698dbb29868915..9e28f19ab19d7024956c0536d06bbfef35082cbb 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/2.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/2.xml @@ -2,62 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_standard_workflow/4 + destination/workflow_module/erp5_standard_workflow/22 - - comment - Configure Roles - description - - - + Installation procedure may begin. id @@ -65,35 +24,13 @@ portal_type - State + Configuration State title - Role + Download - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/20.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/20.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3a1b771f9b4eff0052bf09a7f15f14f74d592e4 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/20.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupStandardCategory + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/6 + + + + + description + + + + + + id + 20 + + + portal_type + Configuration Transition + + + title + Setup Category + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/21.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/21.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3d8c44ab58f5f045feb1caa4dc754353b3ad0e5 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/21.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupEmployeesNumber + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/8 + + + + + description + + + + + + id + 21 + + + portal_type + Configuration Transition + + + title + Configure user accounts number + + + transition_form_id + BusinessConfiguration_setupEmployeesNumberForm + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/22.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/22.xml new file mode 100644 index 0000000000000000000000000000000000000000..99570d7c7f22809ffc76385efb46620e8135ae71 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/22.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/9 + + + + + description + + + + + + id + 22 + + + portal_type + Configuration Transition + + + title + Finalize + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/65.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/23.xml similarity index 73% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/65.xml rename to bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/23.xml index 0b78d0b6ee570a65e6e34d75016bf1dab32bda00..d70d968dcbf32f070e0ac64e6167dec74ea28b3d 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/65.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/23.xml @@ -2,19 +2,23 @@ - + after_script_id - BusinessConfiguration_setupAccounting + + + BusinessConfiguration_setupAccounting + + categories - destination/workflow_module/erp5_standard_workflow/66 + destination/workflow_module/erp5_standard_workflow/10 @@ -24,17 +28,13 @@ - - guard_expression - python: True - id - 65 + 23 portal_type - Transition + Configuration Transition title diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/29.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/29.xml deleted file mode 100644 index 6de4cdaac3f1993207e8cfad1158ac34cdc29b7b..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/29.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/6 - - - - - comment - Configure Preference - - - description - - - - - - id - 29 - - - portal_type - State - - - title - Customer BT - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/3.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/3.xml index dd411ac5d728eeafa3880866bf8f3975548897f1..c992428c7625222ebe504906ad9a33bbc10140be 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/3.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/3.xml @@ -2,85 +2,58 @@ - + - _count + _local_properties - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= + + + + id + comment + + + type + string + + + - - after_script_id - BusinessConfiguration_setupPortalTypeRole - categories - destination/workflow_module/erp5_standard_workflow/2 + destination/workflow_module/erp5_standard_workflow/18 + + comment + Configure Roles + description - - guard_expression - python: True - id 3 portal_type - Transition + Configuration State title - Setup Portal Type Role + Role - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/30.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/30.xml deleted file mode 100644 index e7a6e32c97c64d00874dd3f032d325b57168e47b..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/30.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupCustomerBT5 - - - categories - - - destination/workflow_module/erp5_standard_workflow/29 - - - - - description - - - - - - guard_expression - python: True - - - id - 30 - - - portal_type - Transition - - - title - Setup customer BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/31.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/31.xml deleted file mode 100644 index 1a4983fd5af3ff9266bd38c4ecf05273c93b62ff..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/31.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/14 - - - - - description - Define some global preferences for your ERP5 application. - - - id - 31 - - - portal_type - State - - - title - Application preferences - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/32.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/32.xml deleted file mode 100644 index 9fa03eb00b52e3108acc7ccb70a1458f5ec60ac6..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/32.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupPreferences - - - categories - - - destination/workflow_module/erp5_standard_workflow/31 - - - - - comment - - - - - - description - - - - - - guard_expression - python: True - - - id - 32 - - - portal_type - Transition - - - title - Configure ERP5 Preferences - - - transition_form_id - BusinessConfiguration_setupPreferencesForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/4.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/4.xml index d52c484185ffb41814566a6c2531dcee8816aad2..0ff6c7ac13904b45dc1b065836563bf12f4c3899 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/4.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/4.xml @@ -2,89 +2,58 @@ - + - _count + _local_properties - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= + + + + id + comment + + + type + string + + + - - after_script_id - BusinessConfiguration_setupOrganisation - categories - destination/workflow_module/erp5_standard_workflow/8 + destination/workflow_module/erp5_standard_workflow/20 + + comment + Configure Preference + description - - guard_expression - python: True - id 4 portal_type - Transition + Configuration State title - Configure Organisation - - - transition_form_id - BusinessConfiguration_setupOrganisationForm + Customer BT - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/42.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/42.xml deleted file mode 100644 index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/42.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 42 - - - initial_value - python: member.getId() - - - portal_type - Variable - - - title - actor - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/43.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/43.xml deleted file mode 100644 index 5ef05cd9210c709cf10437ce703a9ddf4d180660..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/43.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 43 - - - initial_value - python: object.getDateTime() - - - portal_type - Variable - - - title - time - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/44.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/44.xml deleted file mode 100644 index c0e928799450f6872652c21aa76cde277e774d13..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/44.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 44 - - - initial_value - python: None - - - portal_type - Variable - - - title - comment - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/45.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/45.xml deleted file mode 100644 index b65378a36b63ab54aa1f2911ed7e41d31dea290d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/45.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 45 - - - initial_value - python: None - - - portal_type - Variable - - - title - error_message - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/46.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/46.xml deleted file mode 100644 index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/46.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 46 - - - initial_value - python: request.get(\'configuration_save_url\', None) - - - portal_type - Variable - - - title - configuration_save_url - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/47.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/47.xml deleted file mode 100644 index e87f1234c360ef545aeef5d1e70fda7a3448ab69..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/47.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - comment - - - - - - description - python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None]) - - - id - 47 - - - initial_value - - - - - - portal_type - Variable - - - title - displayed - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/5.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/5.xml index 0ed95efb1bfb171ed9c78db0fbed95cf41463128..0e351660307144acc068ffbe9a53675a4f10800b 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/5.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/5.xml @@ -2,62 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_standard_workflow/3 + destination/workflow_module/erp5_standard_workflow/14 - - comment - Configure Preference - description - - - + Define some global preferences for your ERP5 application. id @@ -65,35 +24,13 @@ portal_type - State + Configuration State title - Category + Application preferences - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/52.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/52.xml deleted file mode 100644 index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/52.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - Id of client - - - id - 52 - - - initial_value - python: request.get(\'client_id\', None) - - - portal_type - Variable - - - title - client_id - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/55.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/55.xml deleted file mode 100644 index fc2316a395545f4c6b7648506368a914465b58a0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/55.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/30 - - - - - description - - - - - - id - 55 - - - portal_type - State - - - title - Standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/56.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/56.xml deleted file mode 100644 index f234d6b6bb8d65c1004d0458a6b5afd3f42f7004..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/56.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupStandardBT5 - - - before_script_id - - - - - - categories - - - destination/workflow_module/erp5_standard_workflow/55 - - - - - comment - Setup all standard bt for ERP5 - - - description - - - - - - guard_expression - python: True - - - id - 56 - - - portal_type - Transition - - - title - Setup standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/59.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/59.xml deleted file mode 100644 index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/59.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 59 - - - initial_value - python: request.get(\'transition\', None) - - - portal_type - Variable - - - title - transition - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/6.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/6.xml index bf88848219ed38c954c6f059f24a478904eb5ba2..28a5e4b5ba277c5e5dbf8b9f3466f2dbb11921a5 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/6.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/6.xml @@ -2,85 +2,58 @@ - + - _count + _local_properties - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= + + + + id + comment + + + type + string + + + - - after_script_id - BusinessConfiguration_setupStandardCategory - categories - destination/workflow_module/erp5_standard_workflow/5 + destination/workflow_module/erp5_standard_workflow/15 + + comment + Configure Preference + description - - guard_expression - python: True - id 6 portal_type - Transition + Configuration State title - Setup Category + Category - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/61.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/61.xml deleted file mode 100644 index 14fc238a3c93c393eb41882ce4ca9825145957bf..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/61.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/12 - - - - - description - Enter the number of user accounts you want to create. In your company, each person using ERP5 should have his own user account. - - - id - 61 - - - portal_type - State - - - title - Number of user accounts - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/64.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/64.xml deleted file mode 100644 index 1f8df6f9ae3e97a13c79f7b6383735919ccf2e85..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/64.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/63 - - - - - guard_expression - python: True - - - id - 64 - - - portal_type - Transition - - - title - Finalize - - - transition_form_id - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/7.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/7.xml new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3d6a4e90263e3e3b8fb6dd7ff8ba9d2cb692 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/7.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/erp5_standard_workflow/16 + + + + + description + + + + + + id + 7 + + + portal_type + Configuration State + + + title + Standard BT5 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/8.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/8.xml index 13b10077d58c6463eb5c0d14f9538b5a51fcac03..d8938db8e90254ad8fafeb35244fff59c08feb63 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/8.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/8.xml @@ -2,62 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/erp5_standard_workflow/62 + destination/workflow_module/erp5_standard_workflow/13 - - comment - Omit enetring number of users.\n -BEFORE for possible transitions was: E\n -nter Number of User - description - Configure your organisation. + Enter the number of user accounts you want to create. In your company, each person using ERP5 should have his own user account. id @@ -65,35 +24,13 @@ nter Number of User portal_type - State + Configuration State title - Your organisation + Number of user accounts - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/9.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/9.xml index c042ee7547c6aaa092c95d4e5e817f5e77bbc2da..2930f03ff2fef2ebd5ec4e41d5071408356f4414 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/9.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/9.xml @@ -2,98 +2,29 @@ - + - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/erp5_standard_workflow/65 - - - - - comment + description - - description - Fill in detailled information for each ERP5 user. At end of configuration process each TioLive user will receive an email containing his username and password. - id 9 portal_type - State + Configuration State title - User accounts configuration + End - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/default_image.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/default_image.xml index c0fe3c244b9898f944cfc219a34c455df8a84a7f..cff6a3d23073fa1b2dfbcb134149c133454446b4 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/default_image.xml +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/default_image.xml @@ -8,7 +8,7 @@ _EtagSupport__etag - ts02569287.58 + ts37563406.78 _count @@ -30,7 +30,7 @@ content_md5 - 7f019c0f6cf5ec2f98b5ccefe04a017d + bdd23ebe2f7dd4e5b9c83b9a1d28f016 content_type @@ -38,223 +38,225 @@ data - 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 +ZW5zaG907wO/PgAAAABJRU5ErkJggg== height @@ -270,7 +272,7 @@ SBQwGSGERAGTEUJIFDAZIYREAZMRQkgU/g9LP/h2oPMeDwAAAABJRU5ErkJggg== size - 12358 + 12448 width diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_actor.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3902fd5361715a7003ade8ae593337138f10cb2 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_actor.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + actor + + + default_value + python: member.getUserName() + + + description + + + + + + id + variable_actor + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_client_id.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_client_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b91d98c56b69dbe0e8b09b426bbab1b4d6c3873 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_client_id.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + client_id + + + default_value + python: request.get(\'client_id\', None) + + + description + + + + + + id + variable_client_id + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_comment.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..d3442b68c63f786c0842783866c6759ec6fc9e61 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_comment.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + comment + + + default_value + python: None + + + description + + + + + + id + variable_comment + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_configuration_save_url.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_configuration_save_url.xml new file mode 100644 index 0000000000000000000000000000000000000000..10842b0d70b1c3105492a49f29930f9e329e222f --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_configuration_save_url.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + configuration_save_url + + + default_value + python: request.get(\'configuration_save_url\', None) + + + description + + + + + + id + variable_configuration_save_url + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_displayed.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_displayed.xml new file mode 100644 index 0000000000000000000000000000000000000000..0134feb90f0fa3a2c3cbb9863b08cb5abd92482d --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_displayed.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_reference + displayed + + + default_value + + + + + + description + + + + + + id + variable_displayed + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_error_message.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..f64c6c5515244615c298f796df332af0b605a486 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_error_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + error_message + + + default_value + python: None + + + description + + + + + + id + variable_error_message + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_time.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_time.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec0c70738e23d752027ccb16c42344f93ebc4e06 --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_time.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + time + + + default_value + python: object.getDateTime() + + + description + + + + + + id + variable_time + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_transition.xml b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d93269f0b716c0bb19ea60ed2459f60c1bb503e --- /dev/null +++ b/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/variable_transition.xml @@ -0,0 +1,44 @@ + + + + + + + + + + default_reference + transition + + + default_value + python: request.get(\'transition\', None) + + + description + + + + + + id + variable_transition + + + portal_type + Workflow Variable + + + role + + + + + + automatic_update + 1 + + + + + diff --git a/bt5/erp5_configurator_standard/TestTemplateItem/portal_components/test.erp5.testStandardConfigurationWorkflow.xml b/bt5/erp5_configurator_standard/TestTemplateItem/portal_components/test.erp5.testStandardConfigurationWorkflow.xml index bc7a1bb2c0981cfd8765d5c8d37520271cab9444..664ee5a9fc26d4ab00bfe89f5f3be7864ea363a9 100644 --- a/bt5/erp5_configurator_standard/TestTemplateItem/portal_components/test.erp5.testStandardConfigurationWorkflow.xml +++ b/bt5/erp5_configurator_standard/TestTemplateItem/portal_components/test.erp5.testStandardConfigurationWorkflow.xml @@ -6,10 +6,22 @@ + + _recorded_property_dict + + AAAAAAAAAAI= + + default_reference testStandardConfigurationWorkflow + + description + + + + id test.erp5.testStandardConfigurationWorkflow @@ -24,6 +36,22 @@ + + text_content_error_message + + + + + + text_content_warning_message + + + W:562, 4: Unreachable code (unreachable) + W:923, 4: Unused variable \'sale_packing_list\' (unused-variable) + W:963, 4: Unused variable \'business_process\' (unused-variable) + + + version erp5 @@ -31,13 +59,28 @@ workflow_history - AAAAAAAAAAI= + AAAAAAAAAAM= + + + + + + + data + + + + + + + + @@ -50,7 +93,7 @@ component_validation_workflow - AAAAAAAAAAM= + AAAAAAAAAAQ= @@ -59,7 +102,7 @@ - + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/business_configuration_module/ung_configuration.xml b/bt5/erp5_configurator_ung/PathTemplateItem/business_configuration_module/ung_configuration.xml index 5a24c5e90d7711d64a7eba9bf1071cc2bffb1f58..b1c58301832bc0488fdbd0585642bd4be927f1b1 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/business_configuration_module/ung_configuration.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/business_configuration_module/ung_configuration.xml @@ -66,6 +66,12 @@ AAAAAAAAAAI= + + _global_configuration_attributes + + AAAAAAAAAAM= + + _local_properties @@ -96,7 +102,13 @@ _mt_index - AAAAAAAAAAM= + AAAAAAAAAAQ= + + + + _multi_entry_transitions + + AAAAAAAAAAU= @@ -108,7 +120,7 @@ _tree - AAAAAAAAAAQ= + AAAAAAAAAAY= @@ -116,6 +128,7 @@ resource/workflow_module/ung_configuration_workflow + current_state/workflow_module/ung_configuration_workflow/7 @@ -207,6 +220,40 @@ 0 + + + + + + + data + + + + company_email + + + + + + default_available_language + en + + + organisation_configurator_item + business_configuration_module/ung_configuration/3/1 + + + user_number + 1 + + + + + + + + @@ -214,7 +261,27 @@ - + + + + + + + + data + + + + portal_workflow/ung_configuration_workflow/10 + 0 + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow.xml index 08ab2ea918938a763a4fc8885ef5aeda6a242475..4735cd0093fb533c1b1662b314d358c34d9e772b 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow.xml @@ -2,7 +2,7 @@ - + @@ -19,7 +19,7 @@ id - state_variable_name + comment type @@ -29,11 +29,11 @@ id - comment + state_base_category type - string + lines @@ -77,16 +77,12 @@ portal_type - Workflow + Configuration Workflow state_base_category current_state - - state_variable_name - current_state - title UNG Configuration Workflow diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/1.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/1.xml index f1b1d46a30b22559d985bd79433ec3506046c54f..ec9bf886f50b98d0a27bf7014c7a31e6558b72a9 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/1.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/1.xml @@ -2,33 +2,15 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/ung_configuration_workflow/56 + destination/workflow_module/ung_configuration_workflow/16 @@ -44,7 +26,7 @@ portal_type - State + Configuration State title @@ -53,26 +35,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/10.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/10.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2373be610fa604d5d18bce51e96ace1aa46e438 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/10.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupUNGList + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/9 + + + + + description + + + + + + id + 10 + + + portal_type + Configuration Transition + + + title + Configure user accounts + + + transition_form_id + BusinessConfiguration_setupUNGUserListForm + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/11.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/11.xml index 031e396ec9b5fc6815a5300acba5bebda2222495..de1a6dc6e71d57439c1217b7513fa7d4d1e2f7a2 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/11.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/11.xml @@ -2,39 +2,23 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/ung_configuration_workflow/64 + destination/workflow_module/ung_configuration_workflow/2 description - Enter the data of each user + + + id @@ -42,35 +26,17 @@ portal_type - State + Configuration Transition title - Download + Install + + + transition_form_id + BusinessConfiguration_displayUNGDownloadForm - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12.xml index 6c293fe2962d2bf1a07008023e4707474ccf5461..593890a3efb117dbef734d57bf37eed88ce841ac 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12.xml @@ -2,112 +2,45 @@ - + - _count - - AAAAAAAAAAI= - - - - _local_properties + after_script_id - - - id - comment - - - type - string - - + BusinessConfiguration_setupCustomerBT5 - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupUNGList - categories - destination/workflow_module/ung_configuration_workflow/9 + destination/workflow_module/ung_configuration_workflow/3 - - comment - - - - description - - guard_expression - python: True - id 12 portal_type - Transition + Configuration Transition title - Configure user accounts - - - transition_form_id - BusinessConfiguration_setupUNGUserListForm + Setup customer BT5 - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12/1.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12/1.xml deleted file mode 100644 index 09ef18838bd8d6a507e3bedcbe7ad9047301c12f..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/12/1.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - causality/workflow_module/ung_configuration_workflow/16 - - - - - description - Default Value =\n -python: object.document.getCurrentStateValue().getVariableValue(object.document, \'user_number\') + 1 - - - id - 1 - - - initial_value - - - - - - portal_type - Transition Variable - - - title - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/14.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/14.xml index c09abf6acd70050947757dd10520a7f6281a825b..0ada936199c57ac2e240fb1afd75fe9f0c2dd059 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/14.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/14.xml @@ -2,39 +2,23 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - after_script_id - + + BusinessConfiguration_setupUNGPreferences + categories - destination/workflow_module/ung_configuration_workflow/11 + destination/workflow_module/ung_configuration_workflow/4 @@ -44,49 +28,23 @@ - - guard_expression - python: True - id 14 portal_type - Transition + Configuration Transition title - Install + Configure ERP5 Preferences transition_form_id - BusinessConfiguration_displayUNGDownloadForm + BusinessConfiguration_setupUNGPreferencesForm - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/15.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/15.xml new file mode 100644 index 0000000000000000000000000000000000000000..5197b0766f21008e8ed66ccc3dd089d674b53145 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/15.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupUNGOrganisation + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/8 + + + + + description + + + + + + id + 15 + + + portal_type + Configuration Transition + + + title + Configure Organisation + + + transition_form_id + BusinessConfiguration_setupUNGOrganisationForm + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/16.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/16.xml new file mode 100644 index 0000000000000000000000000000000000000000..155d9d1d0359fb93e98c097bad18fc7c3882edb8 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/16.xml @@ -0,0 +1,46 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupUNGStandardBT5 + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/5 + + + + + description + + + + + + id + 16 + + + portal_type + Configuration Transition + + + title + Setup standard BT5 + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/17.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/17.xml new file mode 100644 index 0000000000000000000000000000000000000000..b26fa246126ba1b418bcadfb7b691061da346e2b --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/17.xml @@ -0,0 +1,50 @@ + + + + + + + + + + after_script_id + + + BusinessConfiguration_setupUNGUserNumber + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/6 + + + + + description + + + + + + id + 17 + + + portal_type + Configuration Transition + + + title + Configure user accounts number + + + transition_form_id + BusinessConfiguration_setupUNGUserNumberForm + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/18.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/18.xml new file mode 100644 index 0000000000000000000000000000000000000000..471bd3a142ddde422fd420a4bbc0aa694ddceeaa --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/18.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/7 + + + + + description + + + + + + id + 18 + + + portal_type + Configuration Transition + + + title + Finalize + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/2.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..139567db35d239d7d45f7ef0240f6fbf41500524 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/18 + + + + + description + Enter the data of each user + + + id + 2 + + + portal_type + Configuration State + + + title + Download + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/29.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/29.xml deleted file mode 100644 index 76d5aae27316a0bae1529eb8a09f77e5f5136d12..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/29.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ung_configuration_workflow/4 - - - - - comment - Configure Preference - - - description - - - - - - id - 29 - - - portal_type - State - - - title - Customer BT - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/3.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/3.xml new file mode 100644 index 0000000000000000000000000000000000000000..c2cd1063bb08b4ad9bcb34b80f42b7fa46695ba5 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/3.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/15 + + + + + description + + + + + + id + 3 + + + portal_type + Configuration State + + + title + Customer BT + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/30.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/30.xml deleted file mode 100644 index fd32c5b05b79572f8ef5021d06306f6eb339a8e6..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/30.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupCustomerBT5 - - - categories - - - destination/workflow_module/ung_configuration_workflow/29 - - - - - description - - - - - - guard_expression - python: True - - - id - 30 - - - portal_type - Transition - - - title - Setup customer BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/31.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/31.xml deleted file mode 100644 index 67d69f2e2a1585f9b33e23e6580ce65ed58ec950..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/31.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ung_configuration_workflow/14 - - - - - description - Define some global preferences for your UNG Site. - - - id - 31 - - - portal_type - State - - - title - UNG Preferences - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/32.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/32.xml deleted file mode 100644 index 02c7831a25a70cb2dec36974bd0452b038867d43..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/32.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupUNGPreferences - - - categories - - - destination/workflow_module/ung_configuration_workflow/31 - - - - - comment - - - - - - description - - - - - - guard_expression - python: True - - - id - 32 - - - portal_type - Transition - - - title - Configure ERP5 Preferences - - - transition_form_id - BusinessConfiguration_setupUNGPreferencesForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/4.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/4.xml index 641976a3832416a46639a94223db1633109141cd..f0e6f5f30d767b7a661aac9f31010acf6f7b4e8f 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/4.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/4.xml @@ -2,49 +2,21 @@ - + - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupUNGOrganisation - categories - destination/workflow_module/ung_configuration_workflow/8 + destination/workflow_module/ung_configuration_workflow/11 description - - - - - - guard_expression - python: True + Define some global preferences for your UNG Site. id @@ -52,39 +24,13 @@ portal_type - Transition + Configuration State title - Configure Organisation - - - transition_form_id - BusinessConfiguration_setupUNGOrganisationForm + UNG Preferences - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/42.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/42.xml deleted file mode 100644 index 3465e3ceac9eddeda298550317b9d8e4b531d3e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/42.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 42 - - - initial_value - python: member.getId() - - - portal_type - Variable - - - title - actor - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/43.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/43.xml deleted file mode 100644 index 5ef05cd9210c709cf10437ce703a9ddf4d180660..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/43.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 43 - - - initial_value - python: object.getDateTime() - - - portal_type - Variable - - - title - time - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/44.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/44.xml deleted file mode 100644 index c0e928799450f6872652c21aa76cde277e774d13..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/44.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 44 - - - initial_value - python: None - - - portal_type - Variable - - - title - comment - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/45.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/45.xml deleted file mode 100644 index b65378a36b63ab54aa1f2911ed7e41d31dea290d..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/45.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 45 - - - initial_value - python: None - - - portal_type - Variable - - - title - error_message - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/46.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/46.xml deleted file mode 100644 index d96e5cd9b8061dcc1a77f71704c7bcb8527543e0..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/46.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 46 - - - initial_value - python: request.get(\'configuration_save_url\', None) - - - portal_type - Variable - - - title - configuration_save_url - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/47.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/47.xml deleted file mode 100644 index e87f1234c360ef545aeef5d1e70fda7a3448ab69..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/47.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - comment - - - - - - description - python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None]) - - - id - 47 - - - initial_value - - - - - - portal_type - Variable - - - title - displayed - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/5.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/5.xml new file mode 100644 index 0000000000000000000000000000000000000000..47df85dfdbf86eec7d78608a9238b40fa86e56d7 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/5.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/12 + + + + + description + + + + + + id + 5 + + + portal_type + Configuration State + + + title + Standard BT5 + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/52.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/52.xml deleted file mode 100644 index a240fb0d5e31c6d0077d1146a6ea6d05adeacded..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/52.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - Id of client - - - id - 52 - - - initial_value - python: request.get(\'client_id\', None) - - - portal_type - Variable - - - title - client_id - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/55.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/55.xml deleted file mode 100644 index a19f17849b82c74a2fece973ee643591278bf811..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/55.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ung_configuration_workflow/30 - - - - - description - - - - - - id - 55 - - - portal_type - State - - - title - Standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/56.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/56.xml deleted file mode 100644 index 81d8f7de230941199851351c245c764376f9e46a..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/56.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupUNGStandardBT5 - - - before_script_id - - - - - - categories - - - destination/workflow_module/ung_configuration_workflow/55 - - - - - comment - Setup all standard bt for ERP5 - - - description - - - - - - guard_expression - python: True - - - id - 56 - - - portal_type - Transition - - - title - Setup standard BT5 - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/59.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/59.xml deleted file mode 100644 index 04db47598cf44fdc377ffbaf4b3b9bd77e282bf3..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/59.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - automatic_update - 1 - - - description - - - - - - id - 59 - - - initial_value - python: request.get(\'transition\', None) - - - portal_type - Variable - - - title - transition - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/6.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/6.xml new file mode 100644 index 0000000000000000000000000000000000000000..40e42108d118cd3488703069aa0d2a6c7c618865 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/6.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + destination/workflow_module/ung_configuration_workflow/10 + + + + + description + Enter the number of user accounts you want to create. + + + id + 6 + + + portal_type + Configuration State + + + title + Number of user accounts + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/61.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/61.xml deleted file mode 100644 index a23a8780810b023bb4d924138b0d1313bff836e2..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/61.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ung_configuration_workflow/12 - - - - - description - Enter the number of user accounts you want to create. - - - id - 61 - - - portal_type - State - - - title - Number of user accounts - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/62.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/62.xml deleted file mode 100644 index 3c2dd39c8a24548ca587b83bc6edac4207a595f8..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/62.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - after_script_id - BusinessConfiguration_setupUNGUserNumber - - - categories - - - destination/workflow_module/ung_configuration_workflow/61 - - - - - description - - - - - - guard_expression - python: True - - - id - 62 - - - portal_type - Transition - - - title - Configure user accounts number - - - transition_form_id - BusinessConfiguration_setupUNGUserNumberForm - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/63.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/63.xml deleted file mode 100644 index 365a712f821e1af9d7ac3e122331d73629f4518a..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/63.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - description - - - - - - id - 63 - - - portal_type - State - - - title - End - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/64.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/64.xml deleted file mode 100644 index d488b0538c74c79527cb790f73cc145b0e81f966..0000000000000000000000000000000000000000 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/64.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - _count - - AAAAAAAAAAI= - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - - - categories - - - destination/workflow_module/ung_configuration_workflow/63 - - - - - guard_expression - python: True - - - id - 64 - - - portal_type - Transition - - - title - Finalize - - - transition_form_id - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/7.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/7.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7be0dbabaa75b1d2a2a35e58547d59208a7f3b9 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/7.xml @@ -0,0 +1,30 @@ + + + + + + + + + + description + + + + + + id + 7 + + + portal_type + Configuration State + + + title + End + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/8.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/8.xml index acd269d5222a8e934a9de8a8f74dd492c44556fd..f4e8d459ffb3382f022583adc8d469eebfa4ec6f 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/8.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/8.xml @@ -2,59 +2,18 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/ung_configuration_workflow/62 + destination/workflow_module/ung_configuration_workflow/17 - - comment - Omit enetring number of users.\n -BEFORE for possible transitions was: E\n -nter Number of User - description Configure your organisation. @@ -65,7 +24,7 @@ nter Number of User portal_type - State + Configuration State title @@ -74,26 +33,4 @@ nter Number of User - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/9.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/9.xml index 65b6ef5f0c46ca1f2337b894c9d20904a424fade..4f05fe0f567578e06c2e2367edccc5f4fd45564e 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/9.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/9.xml @@ -2,59 +2,18 @@ - + - - _count - - AAAAAAAAAAI= - - - - _local_properties - - - - - id - comment - - - type - string - - - - - - - _mt_index - - AAAAAAAAAAM= - - - - _tree - - AAAAAAAAAAQ= - - categories - destination/workflow_module/ung_configuration_workflow/32 + destination/workflow_module/ung_configuration_workflow/14 - - comment - - - - description Enter the data of each user @@ -65,7 +24,7 @@ portal_type - State + Configuration State title @@ -74,26 +33,4 @@ - - - - - 0 - - - - - - - - - - - - - - - - - diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/default_image.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/default_image.xml index bfc55ccc8fa300fe0eda439e8be40827ecb6cd40..455810860e7e5afc436023c2aef513eb9d488682 100644 --- a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/default_image.xml +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/default_image.xml @@ -8,7 +8,7 @@ _EtagSupport__etag - ts02569257.51 + ts37563287.82 _count @@ -30,7 +30,7 @@ content_md5 - f0a81b58921525aaba3c9149496cac96 + fe8fa8d9656d16b613fadf164725c4fe content_type @@ -38,556 +38,571 @@ data - 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 -GGKREPGjBiO/vL5LsuhgI71mG2dLajE+wh9ikRDRwV5YljjWrLEz9bzTxdV4cEwAfimuvuE4xtbD -2LGCnCUkJoRERNQnPxwtQpBPf6x5YRL8BzpjT06xoWzjD7mYGDUEH/4tAZPuGYJNe053ST7MacNU -WWffHMjDKzPHYcXseFyobMTPJy/grfn3X7P/3xzIQ5j/AKxdPBkhvm7YkvHHcY7p+87gf8xo49/7 -zyJokCvWLp6MKTGB+L/sArPGztTzThdVI3yoR5cEuK9xjK1H5xNIOh48oYTuFAK9Xq/nMNCdJPO8 -efUUgRwrsu52qAg8ztuMkVWkLvNE5vlIfo6RxXCGkIiIiIgJIRERERExISQiIqtIXebJQSBuU3TL -42VniIj4BU5EdznOEBIRERExISQiIiIiJoRERERExISQiIiIiJgQEhERERETQiIiIiJiQkhERERE -TAiJiIiIiAkhERERETEhJCIiIiImhERERETEhJCIiIiImBASERERERNCIiIiImJCSERERERMCImI -iIiICSERERERMSEkIiIiIiaERERERMSEkIiIiIiYEBIRERERE0IiIiIiYkJIREREREwIiYiIiOj2 -JdDr9XoOA91JMs9zDIiIiK6HmENAd6sAt1YOAllNQa2c2xhxG6PbBncZExERETEhJCIiIqK7GXcZ -ExH1gV6vx8a0FBzI+An29g6YPX8hIiLv4cCQxTyV+FCPZV+k7+DAkMVcKCrAJylrcbGiggkhEVFf -/Lx3N2QyOT765Auczz+Ln3/czYSQLKpz8pd9+CCOHc3ioJBFpax7D1MfmY4xMbFMCImI+uJw5n48 -M3cB5HI5RoRHYER4BAeFrEKlasW3W77E//vvtzgYZFFVlZUYExMLkUjMYwiJiPqioqwU1VWVSJo7 -E39fuhDlZSUcFLKKH3Z9B0XcfXByduFgkEUFhwxH5oF90GrbmBASEfWFUtmC8rISfJD6GRRx92FT -WioHhSxOo1Fj/769eGDSQxwMsrin5zyHf23agGdmPMKEkIioLyQSCRRx90MikWJiwlQUFuRzUMji -juccQUjoCMhtbDgYZHGfrf8IT82aj42btzIhJCLqiwHuHlAqlQAAvU4PkUjEQSErJITZGBkRxYEg -qzifn4dxcfE8hpCIqK8io8bg0IGfoVarsWf3DgSHhnFQyOIKC/Ix2H8IB4Kswt3DE4cz9/MYQiKi -vpr6yHRUV1ViwZwnkHMkC0/Pfo6DQhbX2FAPR0cnDgRZxbML/4ad27/B3Kceg0Cv1+s5JHQnyTxv -Xj3eA5SsifeZJW5jdDvhDCERERERE0IiIiIiYkJIRERERHct3rqO7lruznIOAllNQS23MeI2RrcP -zhASERERMSEkIiIiIiaERERERMSEkIiIiIiYEBIRERERE0IiIiIiYkJIREREREwIiYiIiIgJIRER -ERExISQiIiIiJoRERERExISQiIiIiJgQEhERERETQiIiIiJiQkhERERETAiJiIiIiAkhERERETEh -JCIiIiImhERERETEhJCIiIiImBASERERERNCIiIiImJCSERERERMCImIiIiICSERERERMSEkIiIi -IiaERERERMSEkIiIiIhuL/8faSNHa9fxAz8AAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAAoQAAAE6CAYAAACPn0PXAAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA +CXBIWXMAAAsTAAALEwEAmpwYAAB8lklEQVR42u3dd3hU1dbA4d+09B5CaCHUAIHQOyGEohQRwYKK +DbCA5SLFwicqqFevcrFcpCsoWFBQqQJKC71L7ySB0BLSSZ92vj9ChoQkk0kZAmS9zzNPZmbvs9fe +Z84kK/s0laIoCkIIIYQQospSV3YHhBBCCCFE5ZKEUAghhBCiipOEUAghhBCiipOEUAghhBCiipOE +UAghhBCiitOWdoH27dsXW7Z///4K7Vz79u0tbeZ/Xtb+enp60rZtW1566SUaN25coX2tDK+88gqz +Zs2yS9s7d+5k1qxZREVF4erqSrdu3Xj99dfx9vYucdmyfla3u00hhBBC5Cp1QggVn/jZO87+/ftR +FIXExETWrl3LqFGj+Oabb2jYsOFtGYe9xMTE2KXdgwcP8v777/P+++/TuXNnrl+/zqJFi5gxYwbv +vfdeZQ9bCCGEEBWswncZ6/V6evbsyZo1a+jduze9e/dm7dq1/PHHH/Tq1Yvw8HBWrFhhqb9r1y4e +fvhhOnXqxKBBg9i6daulzNpsZGmpVCqqVavGM888w8iRI5k3b56l7MqVKwwfPpzOnTvzzDPPFEi0 +kpKSeO211+jSpQuPPvooR44cKbZ/ea9Luw6uXbvGCy+8QJcuXXjxxRdJSkqytNO7d29WrVpFr169 +6Nmzp2W54cOHExsbS/v27S2zhGvXrmXgwIF07tyZoUOHsnfv3jKtq++//57XXnuNsLAwHBwcqFat +GuPHjy+QDFr73PIry9gAzp49y5AhQ+jTpw8REREF2iwutl6vp1evXsybN48uXbpU2LYjhBBC3POU +UmrXrl2JdTp27KjMnDlTyc7OViIiIpSePXsq06dPt7zu16+fpe4jjzyi7N69WzEajcqaNWuU/v37 +FxnLlri29jc+Pl7p3bu35fWbb76pzJkzR8nJyVG+/fZbZfz48Zayd99911K2adMm5Yknnii27fyv +S7MOJk6cqHz99ddKZmamMmPGDOWDDz6wlHXq1EmZMWNGkcvdGr9Hjx7K8ePHFaPRqGzYsKFAX0uj +V69eSmJiotU6tn5uZR3bv/71L+W7775TcnJylO+++65Am8XFNpvNSufOnZX58+crBoOhTGMXQggh +qqIyJYRFPW6tc/36dUVRFMVoNCrt2rVT0tLSLK/bt29fZNsmk6nYJLAiE0Kj0ah06tTJ8rpnz55K +SkqKoiiKkpSUpPTq1ctS1qtXL0tZSW3f2l9b10H+GCkpKYWSq/zt5F/u1viDBw9WZs2apVy5cqVM +6ypPhw4dFJPJZHN9a59bWccWHh6upKamWj6T4j7/omInJSWVa/xCCCFEVWO3Ywjd3d0B0Gg0ALi5 +uVleK/nulrd7926mT59OTEwMer3+tsyKxsXF4ePjY3mdnp5u6a+npydpaWmWsrS0NEtZadm6DtLS +0ujdu7fltVqtLrYdxcqdBr/++msWLFjAc889h6+vLxMmTCjTbncvLy8SEhKoXr16sXVs/dzKOraM +jIwCn0lpYtty4osQQgghbipTQliRJk+ezFtvvUWXLl1Qq9WEhobaPebq1avp1KmT5bWHhwepqal4 +e3uTmpqKh4eHpczT05Pk5GR8fX2LbMtsNqNWq7l+/XqZ++Pp6cnKlStxdnYu17jq1KnD+++/j6Io +bNiwgUmTJvHXX3+Vup3WrVuzYcMGhg0bVmwdWz+3so7N2dmZtLQ0PDw8LMcdlja2EEIIIWxT6dch +rFevHvXq1cNsNvPTTz/h5uZGfHy8XWJdv36dn3/+mV9++YWRI0da3u/YsSO//fYber2eJUuWFJhV +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 height @@ -603,7 +618,7 @@ IiaERERERMSEkIiIiIhuL/8faSNHa9fxAz8AAAAASUVORK5CYII= size - 31331 + 32185 width diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_actor.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..39bc0dda6ff3765c3f5a67ba69058a9ceef3ef5f --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_actor.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_expr + user/getIdOrUserName + + + default_reference + actor + + + default_value + + + + + + description + + + + + + id + variable_actor + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_client_id.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_client_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d38696375653684397cc63bf29d410b6e16be0c --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_client_id.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_expr + python: request.get(\'client_id\', None) + + + default_reference + client_id + + + default_value + + + + + + description + + + + + + id + variable_client_id + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_comment.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..3845a7ab3a6c253c016d2ec3787e021c252bb0f3 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_comment.xml @@ -0,0 +1,40 @@ + + + + + + + + + + default_reference + comment + + + default_value + python: None + + + description + + + + + + id + variable_comment + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_configuration_save_url.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_configuration_save_url.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a6f628355c2d17c80e28aea0d618e5a14d3cd2f --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_configuration_save_url.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_expr + python: request.get(\'configuration_save_url\', None) + + + default_reference + configuration_save_url + + + default_value + + + + + + description + + + + + + id + variable_configuration_save_url + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_displayed.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_displayed.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa90f3aeae33b0b2d82e0e246c285ec5bce91a13 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_displayed.xml @@ -0,0 +1,42 @@ + + + + + + + + + + default_reference + displayed + + + default_value + + + + + + description + + + + + + id + variable_displayed + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_error_message.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..20faba604e3a868235d97f5205fe1e923c80a020 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_error_message.xml @@ -0,0 +1,40 @@ + + + + + + + + + + default_reference + error_message + + + default_value + python: None + + + description + + + + + + id + variable_error_message + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_time.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_time.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fe83cc898881a10fd74eafc3e5fcd5910bf31f6 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_time.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_expr + object/getDateTime + + + default_reference + time + + + default_value + + + + + + description + + + + + + id + variable_time + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_transition.xml b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..abae2118a5ae37cff71777fc1e7ca7eaec7ac484 --- /dev/null +++ b/bt5/erp5_configurator_ung/PathTemplateItem/workflow_module/ung_configuration_workflow/variable_transition.xml @@ -0,0 +1,46 @@ + + + + + + + + + + default_expr + python: request.get(\'transition\', None) + + + default_reference + transition + + + default_value + + + + + + description + + + + + + id + variable_transition + + + portal_type + Workflow Variable + + + role + + + + + + + + diff --git a/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.py b/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.py index 86f9a46d67cd10fffa22d1bb73bb0e39c82048c4..eef30be67803c402ed8d42c1cf3972d6af40ca55 100644 --- a/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.py +++ b/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.py @@ -183,26 +183,26 @@ class TestUNGConfiguratorWorkflowMixin(TestLiveConfiguratorWorkflowMixin): sequence.edit(next_dict=next_dict) def stepCheckMultipleUserAccountThreeBrazil(self, sequence=None, sequence_list=None, **kw): - """ Check if the users were created correctly """ - business_configuration = sequence.get("business_configuration") - person_config_save = business_configuration["5"] - person_config_item = person_config_save["1"] - self.assertEqual(person_config_item.getReference(), "person_creator") - person_config_item = person_config_save["2"] - self.assertEqual(person_config_item.getReference(), "person_assignee") - person_config_item = person_config_save["3"] - self.assertEqual(person_config_item.getReference(), "person_assignor") + """ Check if the users were created correctly """ + business_configuration = sequence.get("business_configuration") + person_config_save = business_configuration["5"] + person_config_item = person_config_save["1"] + self.assertEqual(person_config_item.getReference(), "person_creator") + person_config_item = person_config_save["2"] + self.assertEqual(person_config_item.getReference(), "person_assignee") + person_config_item = person_config_save["3"] + self.assertEqual(person_config_item.getReference(), "person_assignor") def stepCheckMultipleUserAccountThreeFrance(self, sequence=None, sequence_list=None, **kw): - """ Check if the users were created correctly """ - business_configuration = sequence.get("business_configuration") - person_config_save = business_configuration["5"] - person_config_item = person_config_save["1"] - self.assertEqual(person_config_item.getReference(), "french_creator") - person_config_item = person_config_save["2"] - self.assertEqual(person_config_item.getReference(), "french_assignee") - person_config_item = person_config_save["3"] - self.assertEqual(person_config_item.getReference(), "french_assignor") + """ Check if the users were created correctly """ + business_configuration = sequence.get("business_configuration") + person_config_save = business_configuration["5"] + person_config_item = person_config_save["1"] + self.assertEqual(person_config_item.getReference(), "french_creator") + person_config_item = person_config_save["2"] + self.assertEqual(person_config_item.getReference(), "french_assignee") + person_config_item = person_config_save["3"] + self.assertEqual(person_config_item.getReference(), "french_assignor") def stepCheckConfigureInstallationForm(self, sequence=None, sequence_list=None, **kw): """ Check the installation form """ diff --git a/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.xml b/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.xml index c52172991f35c2561edde697dca5d4a9fe317d6f..5c8a29f11096544744ff6967b8fc2da5df888aa6 100644 --- a/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.xml +++ b/bt5/erp5_configurator_ung/TestTemplateItem/portal_components/test.erp5.testUNGConfigurationWorkflow.xml @@ -6,10 +6,22 @@ + + _recorded_property_dict + + AAAAAAAAAAI= + + default_reference testUNGConfigurationWorkflow + + description + + + + id test.erp5.testUNGConfigurationWorkflow @@ -24,6 +36,18 @@ + + text_content_error_message + + + + + + text_content_warning_message + + + + version erp5 @@ -31,13 +55,28 @@ workflow_history - AAAAAAAAAAI= + AAAAAAAAAAM= + + + + + + + data + + + + + + + + @@ -50,7 +89,7 @@ component_validation_workflow - AAAAAAAAAAM= + AAAAAAAAAAQ= @@ -59,7 +98,7 @@ - + diff --git a/bt5/erp5_core_test/ModuleTemplateItem/organisation_module.xml b/bt5/erp5_core_test/ModuleTemplateItem/organisation_module.xml new file mode 100644 index 0000000000000000000000000000000000000000..1ded15ff669686a57c2af794d503c0af2155efe2 --- /dev/null +++ b/bt5/erp5_core_test/ModuleTemplateItem/organisation_module.xml @@ -0,0 +1,78 @@ + + organisation_module + + + Access contents information + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Add portal content + Assignor + Author + Manager + + + Add portal folders + Assignor + Author + Manager + + + Change local roles + Assignor + Manager + + + Copy or Move + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Delete objects + Assignor + Manager + + + List folder contents + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Modify portal content + Assignor + Manager + + + View + Assignee + Assignor + Associate + Auditor + Manager + + + View History + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Organisation Module + Organisations + \ No newline at end of file diff --git a/product/ERP5/tests/testSQLCachedWorklist.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.py similarity index 97% rename from product/ERP5/tests/testSQLCachedWorklist.py rename to bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.py index 92df627f09522efe22b8379437c3111a6cca58da..0db3c38ac5f0cd99e34c7900a7129048c9c66e50 100644 --- a/product/ERP5/tests/testSQLCachedWorklist.py +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.py @@ -28,7 +28,7 @@ ############################################################################## import unittest -from Products.ERP5.tests.testWorklist import TestWorklist +from erp5.component.test.testWorklist import TestWorklist from Products.ERP5Type.tests.utils import todo_erp5 class TestSQLCachedWorklist(TestWorklist): diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..7aec0e4c3c9906d489089cf9c854769fe7d77e78 --- /dev/null +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testSQLCachedWorklist.xml @@ -0,0 +1,102 @@ + + + + + + + + + + default_reference + testSQLCachedWorklist + + + description + + + + + + id + test.erp5.testSQLCachedWorklist + + + portal_type + Test Component + + + sid + + + + + + text_content_error_message + + + + + + text_content_warning_message + + + + + + version + erp5 + + + workflow_history + + AAAAAAAAAAI= + + + + + + + + + + + + + data + + + + component_validation_workflow + + AAAAAAAAAAM= + + + + + + + + + + + + + + + + + + + action + validate + + + validation_state + validated + + + + + + + diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.py new file mode 100644 index 0000000000000000000000000000000000000000..ef69b40d8939244c06d2a6bb45e8b5b38711ff3d --- /dev/null +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.py @@ -0,0 +1,42 @@ +from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase + +class testWorkflowMixin(ERP5TypeTestCase): + def countFromActionName(self, action_name): + # action_name look like: "Documents to validate (3)" + self.assertEqual(action_name[-1], ')') + left_parenthesis_offset = action_name.rfind('(') + self.assertNotEquals(left_parenthesis_offset, -1) + return int(action_name[left_parenthesis_offset + 1:-1]) + + def checkWorklist(self, action_list, name, count, url_parameter_dict=None, workflow_id=None, + selection_name=None): + entry_list = [ + x for x in action_list if x['name'].startswith(name) + and ( + workflow_id is None + or 'workflow_id' in x + and x['workflow_id'] == workflow_id + ) + ] + + # ensure there is a single entry in action list + self.assertEqual(len(entry_list), count and 1) + if count: + self.assertEqual(count, + self.countFromActionName(entry_list[0]['name'])) + if entry_list and url_parameter_dict: + url = entry_list[0].get('url') + self.assertTrue(url, 'Can not check url parameters without url') + url = '%s%s' % (self.portal.getId(), url[len(self.portal.absolute_url()):]) + # Touch URL to save worklist parameters in listbox selection + publish_response = self.publish(url, 'manager:') # XXX: troubles running live test, returns HTTP error 500 + self.assertEqual(publish_response.status, 200) + self.commit() + selection_parameter_dict = self.portal.portal_selections.getSelectionParamsFor( + selection_name) + for parameter, value in url_parameter_dict.iteritems(): + self.assertIn(parameter, selection_parameter_dict) + self.assertEqual(value, selection_parameter_dict[parameter]) + + def clearCache(self): + self.portal.portal_caches.clearAllCache() \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.xml similarity index 92% rename from product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.xml rename to bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.xml index 5b03104714004dbabd327759a043e18bd975ac2f..638b95074f9f0902cb523d55628b81ec12d4e0b6 100644 --- a/product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.xml +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorkflowMixin.xml @@ -2,7 +2,7 @@ - + @@ -14,7 +14,7 @@ default_reference - ScriptConstraint + testWorkflowMixin description @@ -24,11 +24,11 @@ id - document.erp5.ScriptConstraint + test.erp5.testWorkflowMixin portal_type - Document Component + Test Component sid diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.py new file mode 100644 index 0000000000000000000000000000000000000000..5c2812270f48c5bcc8f48e0ce1e81b314b61f012 --- /dev/null +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.py @@ -0,0 +1,507 @@ +import unittest +from erp5.component.test.testWorkflowMixin import testWorkflowMixin + +class TestWorklist(testWorkflowMixin): + + run_all_test = 1 + quiet = 1 + + user_dict = { + 'foo': [None, None], + 'bar': [None, None], + } + + test_worklist_dict = { + 'assignor_worklist': + {'action_name': 'assignor_todo', 'role': 'Assignor', 'expr': None, 'state': 'draft', 'int_variable': None}, + 'owner_worklist': + {'action_name': 'owner_todo', 'role': 'Owner', 'expr': None, 'state': 'draft', 'int_variable': None}, + 'owner_worklist_desactivated': + {'action_name':'owner_todo_desactivated', 'role': 'Owner', 'expr': 'python: 0', 'state': 'draft', 'int_variable': None}, + 'owner_worklist_wrong_state': + {'action_name':'owner_todo_wrong_state', 'role': 'Owner', 'expr': None, 'state': 'not_draft', 'int_variable': None}, + 'assignor_owner_worklist': + {'action_name':'assignor_owner_todo', 'role': 'Assignor ; Owner','expr': None, 'state': 'draft', 'int_variable': None}, + 'int_value_worklist': + {'action_name':'int_value_todo', 'role': None, 'expr': None, 'state': None, 'int_variable': str(1)} + } + + + def getTitle(self): + return "Worklist" + + def cleanUp(self): + # delete all objects of some modules + for module in [self.portal.organisation_module, self.portal.portal_categories.region, + self.portal.portal_categories.role]: + module.manage_delObjects(list(module.objectIds())) + + # delete "person" objects created by this test suite + person_module = self.portal.person_module + test_user_id_list = self.user_dict.keys() + to_remove_list = [person.getId() for person in person_module.objectValues() + if person.getReference() in test_user_id_list] + if to_remove_list: + person_module.manage_delObjects(to_remove_list) + self.tic() + + def afterSetUp(self): + self.cleanUp() + self.logMessage("Create users") + self.createERP5Users() + self.clearCache() + self.tic() + worklist_to_remove_list = [ key for key in self.test_worklist_dict.keys() + if getattr(self.getPortalObject().portal_workflow.validation_workflow, + key, + False) + ] + self.removeWorklist('validation_workflow', worklist_to_remove_list) + self.tic() + + def beforeTearDown(self): + self.cleanUp() + + def createManagerAndLogin(self): + """ + Create a simple user in user_folder with manager rights. + This user will be used to initialize data in the method afterSetup + """ + + acl_user_folder = getattr(self.getPortal(), 'acl_users', None) + acl_user_folder._doAddUser('manager', '', ['Manager'], []) + self.loginByUserName('manager') + + def createERP5Users(self): + """ + Create all ERP5 users needed for the test. + ERP5 user = Person object + Assignment object in erp5 person_module. + """ + + module = self.portal.getDefaultModule("Person") + # Create the Person. + for user_login, user_data in self.user_dict.items(): + # Create the Person. + self.logMessage("Create user: %s" % user_login) + person = module.newContent( + portal_type='Person', + user_id=user_login, + password='hackme', + ) + # Create the Assignment. + assignment = person.newContent( + portal_type = 'Assignment', + group = "%s" % user_data[0], + function = "%s" % user_data[1], + start_date = '01/01/1900', + ) + assignment.open() + person.newContent(portal_type='ERP5 Login', reference=user_login).validate() + # Reindexing is required for the security to work + self.tic() + + def createDocument(self, **kw): + module = self.getPortal().getDefaultModule('Organisation') + result = module.newContent(portal_type='Organisation', **kw) + result.setProperty('int_index', 1) + assert result.getValidationState() == 'draft' + return result + + def associatePropertySheet(self): + self._addPropertySheet('Organisation', 'SortIndex') + + def addWorkflowCataloguedVariable(self, workflow_id, variable_id): + # Add new workflow compatibility + # Will otherwise add dynamic variable in worklist. + workflow_value = self.getWorkflowTool()[workflow_id] + if workflow_value.getPortalType() != 'Workflow': + variables = workflow_value.variables + if not getattr(variables, variable_id, None): + variables.addVariable(variable_id) + variable_value = variables[variable_id] + assert variable_value.for_catalog == 1 + + def createWorklist(self, workflow_id, *args, **kw): + workflow_value = self.getWorkflowTool()[workflow_id] + if workflow_value.getPortalType() == 'Workflow': + self.createERP5Worklist(workflow_value,*args, **kw) + else: + self.createDCWorklist(workflow_value, *args, **kw) + + def createERP5Worklist(self, workflow_value, worklist_id, action_name, + action=None, portal_type=None, validation_state=None, + guard_roles='', guard_expr=None, **kw): + action_name='%s (%%(count)s)' % action_name + if workflow_value.getPortalType() == 'Workflow': + if getattr(workflow_value, worklist_id, None): + workflow_value.manage_delObjects([worklist_id]) + worklist_value = getattr(workflow_value, 'worklist_%s' % worklist_id, None) + if worklist_value is None: + worklist_value = workflow_value.newContent(portal_type='Worklist') + guard_roles = [] if not guard_roles else [role.strip() for role in guard_roles.split(';')] + validation_state = None if not validation_state else 'state_' + validation_state + + worklist_value.edit( + reference=worklist_id, + action_name=action_name, + action=action, + action_type='global', + matched_validation_state=validation_state, + matched_portal_type_list=portal_type, + guard_role_list=guard_roles, + guard_expression=guard_expr + ) + + for worklist_variable_key, worklist_variable_value in kw.iteritems(): + worklist_variable = worklist_value.newContent(portal_type='Worklist Variable', + variable_value=worklist_variable_value, + reference=worklist_variable_key) + if isinstance(worklist_variable_value, str) and worklist_variable_value.startswith('python'): + worklist_variable.setVariableExpression(worklist_variable_value) + + def createDCWorklist(self, workflow_value, worklist_id, action_name, + action=None, **kw): + action_name='%s (%%(count)s)' % action_name + + worklists = workflow_value.worklists + if worklists._getOb(worklist_id, None): + worklists.deleteWorklists([worklist_id]) + worklists.addWorklist(worklist_id) + worklist_value = worklists._getOb(worklist_id) + worklist_value.setProperties('', actbox_name=action_name, actbox_url=action, + props={k if k.startswith('guard_') + else 'var_match_' + k: v + for k, v in kw.iteritems()}) + + def removeWorklist(self, workflow_id, worklist_id_list): + # add new workflow compatibility + workflow_value = self.getWorkflowTool()[workflow_id] + if workflow_value.getPortalType() == 'Workflow': + for worklist_id in worklist_id_list: + try: + workflow_value._delObject('worklist_'+worklist_id) + except KeyError: + pass + else: + worklists = self.getWorkflowTool()[workflow_id].worklists + worklists.deleteWorklists(worklist_id_list) + + def createCategories(self): + category_tool = self.getCategoryTool() + for base_category, category_list in ( + ('region', ('somewhere', 'elsewhere')), + ('role', ('client', 'supplier'))): + newContent = category_tool[base_category].newContent + for category in category_list: + if not getattr(category_tool[base_category], category, None): + newContent(portal_type='Category', id=category) + + def test_01_permission(self, quiet=0, run=run_all_test): + """ + Test the permission of the building module. + """ + if not run: + return + + workflow_tool = self.portal.portal_workflow + + self.createManagerAndLogin() + + self.logMessage("Create worklists") + self.associatePropertySheet() + self.addWorkflowCataloguedVariable('validation_workflow', + 'int_index') + for worklist_id in self.test_worklist_dict.keys(): + worklist = self.test_worklist_dict[worklist_id] + self.createWorklist('validation_workflow', + worklist_id, + worklist['action_name'], + guard_roles=worklist['role'], + guard_expr=worklist['expr'], + portal_type='Organisation', + validation_state=worklist['state'], + int_index=worklist['int_variable']) + self.tic() + try: + self.logMessage("Create document as Manager") + document = self.createDocument() + self.tic() + self.clearCache() + + # Users can not see worklist as they are not Assignor + for user_id in ('manager', ): + self.loginByUserName(user_id) + result = workflow_tool.listActions(object=document) + + self.logMessage("Check Assignor worklist as %s" % user_id) + self.checkWorklist(result, 'assignor_todo', 0) + self.logMessage("Check Owner worklist as %s" % user_id) + self.checkWorklist(result, 'owner_todo', 1) + for user_id in ('foo', 'bar'): + self.logMessage("Check %s worklist" % user_id) + self.loginByUserName(user_id) + result = workflow_tool.listActions(object=document) + self.assertEqual(result, []) + + for role, user_id_list in (('Assignor', ('foo', 'manager')), + ('Assignee', ('foo', 'bar'))): + self.loginByUserName('manager') + for user_id in user_id_list: + self.logMessage("Give %s %s role" % (user_id, role)) + document.manage_addLocalRoles(user_id, [role]) + document.reindexObject() + self.tic() + self.clearCache() + + for user_id, assignor, owner, both in (('manager', 1, 1, 1), + ('bar' , 0, 0, 0), + ('foo' , 1, 0, 1)): + self.loginByUserName(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage(" Check Assignor worklist as %s" % user_id) + self.checkWorklist(result, 'assignor_todo', assignor) + self.logMessage(" Check Owner worklist as %s" % user_id) + self.checkWorklist(result, 'owner_todo', owner) + self.logMessage(" Check Owner and Assignor worklist as %s" % user_id) + self.checkWorklist(result, 'assignor_owner_todo', both) + + # Check if int variable are managed by the worklist + user_id = 'manager' + self.loginByUserName(user_id) + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist with int value as %s" % \ + (user_id, 1)) + self.checkWorklist(result, 'int_value_todo', 1) + + # Change int value on document + document.setProperty('int_index', 2) + self.tic() + self.clearCache() + + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist with int value as %s" % \ + (user_id, 2)) + + self.checkWorklist(result, 'int_value_todo', 0) + + # + # Check monovalued security role + # + self.loginByUserName('manager') + module = self.getPortal().getDefaultModule('Organisation') + module.manage_setLocalRoles('bar', ['Author']) + + self.loginByUserName('bar') + + bar_document = self.createDocument() + bar_document.manage_permission('View', ['Owner', 'Assignee'], 0) + + bar_assignee_document = self.createDocument() + bar_assignee_document.manage_setLocalRoles('manager', ['Assignee']) + bar_assignee_document.manage_permission('View', ['Owner', 'Assignee'], 0) + + user_id = 'manager' + self.loginByUserName(user_id) + + module.manage_delLocalRoles('bar') + + def test(*count_list): + local_role_list = 'Assignee', 'Owner' + document.manage_setLocalRoles('manager', local_role_list) + + for i, count in enumerate(count_list): + document.manage_permission('View', local_role_list[:i], 0) + document.reindexObject() + self.tic() + self.clearCache() + + result = workflow_tool.listActions(object=document) + self.logMessage("Check %s worklist as Owner (%s)" % (user_id, count)) + self.checkWorklist(result, 'owner_todo', count) + + test(0, 0, 1) + + # Define a local role key + sql_catalog = self.portal.portal_catalog.getSQLCatalog() + current_sql_catalog_local_role_keys = \ + sql_catalog.sql_catalog_local_role_keys + sql_catalog.sql_catalog_local_role_keys = ('Owner | owner', ) + self.commit() + self.portal.portal_caches.clearAllCache() + + try: + test(0, 1, 1) + finally: + sql_catalog.sql_catalog_local_role_keys = \ + current_sql_catalog_local_role_keys + self.commit() + finally: + self.commit() + + def test_02_related_key(self, quiet=0, run=run_all_test): + """ + Test related keys + """ + if not run: + return + + workflow_tool = self.getWorkflowTool() + self.createManagerAndLogin() + + self.logMessage("Create categories") + self.createCategories() + + self.logMessage("Create worklists using 'base_category_id' related key") + + self.addWorkflowCataloguedVariable('validation_workflow', + 'base_category_id') + self.createWorklist('validation_workflow', 'region_worklist', 'has_region', + portal_type='Organisation', + base_category_id='region') + self.createWorklist('validation_workflow', 'role_worklist', 'has_role', + portal_type='Organisation', + base_category_id='role') + + try: + document = self.createDocument() + self.tic() + self.clearCache() + self.logMessage(" Check no document has region/role categories defined") + result = workflow_tool.listActions(object=document) + self.checkWorklist(result, 'has_region', 0) + self.checkWorklist(result, 'has_role', 0) + + self.logMessage(" Creates documents with region/role categories defined") + self.createDocument(role='client') + self.createDocument(region='somewhere') + self.createDocument(region='elsewhere') + + self.tic() + self.clearCache() + self.logMessage( + " Check there are documents with region/role categories defined") + result = workflow_tool.listActions(object=document) + self.checkWorklist(result, 'has_region', 2) + self.checkWorklist(result, 'has_role', 1) + finally: + self.removeWorklist('validation_workflow', + ['region_worklist', 'role_worklist']) + self.commit() + + + def test_03_worklist_guard(self, quiet=0, run=run_all_test): + """ + Test worklist guard + """ + if not run: + return + + workflow_tool = self.getWorkflowTool() + self.createManagerAndLogin() + + self.logMessage("Create worklists with guard expression") + self.createWorklist('validation_workflow', 'guard_expression_worklist', + 'valid_guard_expression', + portal_type='Organisation', + validation_state='validated', + guard_roles='Associate', + guard_expr='python: user.getId() == "bar"') + + try: + document = self.createDocument() + document.manage_addLocalRoles("bar", ["Associate"]) + document.manage_addLocalRoles("foo", ["Associate"]) + document.validate() + document.reindexObject() + self.tic() + self.clearCache() + + self.logMessage(" Check that manager can not access worklist") + result = workflow_tool.listActions(object=document) + self.checkWorklist(result, 'valid_guard_expression', 0) + + self.logMessage(" Check that user bar can access worklist") + self.loginByUserName('bar') + result = workflow_tool.listActions(object=document) + self.checkWorklist(result, 'valid_guard_expression', 1) + + self.logMessage(" Check that user foo can not access worklist") + self.loginByUserName('foo') + result = workflow_tool.listActions(object=document) + self.checkWorklist(result, 'valid_guard_expression', 0) + finally: + self.removeWorklist('validation_workflow', + ['guard_expression_worklist']) + self.commit() + + + def test_04_dynamic_variables(self): + """ + Test related keys and TALES Expression + """ + + workflow_tool = self.getWorkflowTool() + self.createManagerAndLogin() + + self.logMessage("Create categories") + self.createCategories() + + self.logMessage("Create worklists using 'region_uid' related key"\ + " and TALES Expression") + self.addWorkflowCataloguedVariable('validation_workflow', + 'region_uid') + self.createWorklist('validation_workflow', 'region_worklist', + 'has_semewhere_region', + portal_type='Organisation', + action='organisation_module?'\ + 'region_uid:list=%(region_uid)s&'\ + 'portal_type:list=%(portal_type)s&reset:int=1', + region_uid='python:[str(object.getPortalObject().'\ + 'portal_categories.region.somewhere.getUid())]') + + try: + document = self.createDocument() + self.tic() + self.clearCache() + self.logMessage(" Check no document has region categories defined") + action_list = workflow_tool.listActions(object=document) + self.checkWorklist(action_list, 'has_semewhere_region', 0) + + self.logMessage(" Creates documents with region categories defined") + + self.createDocument(region='somewhere') + self.createDocument(region='somewhere') + self.createDocument(region='elsewhere') + + self.tic() + self.clearCache() + self.logMessage(" Check there are documents with region categories defined") + action_list = workflow_tool.listActions(object=document) + url_parameter_dict = {'region_uid': [str(self.portal.portal_categories.\ + region.somewhere.getUid())], + 'portal_type': ['Organisation']} + self.checkWorklist(action_list, 'has_semewhere_region', 2, + url_parameter_dict=url_parameter_dict, selection_name='organisation_module_selection') + + finally: + self.removeWorklist('validation_workflow', ['region_worklist']) + self.commit() + + def test_05_guard_expression_setters(self): + worklist_id = 'guarded_worklist' + workflow_id = 'validation_workflow' + workflow_value = self.getWorkflowTool()[workflow_id] + self.logMessage(" Check ERP5 Workflow 'guard expression' setter") + if workflow_value.getPortalType() == 'Workflow': + self.createWorklist(workflow_id, worklist_id, + action_name='guarded_test') + worklist_value = getattr(workflow_value, 'worklist_%s' % worklist_id) + + # expression + worklist_value.setGuardExpression('python: "Hello, world"') + self.assertEqual(worklist_value.guard_expression.text, 'python: "Hello, world"') + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestWorklist)) + return suite diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.xml b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..2605dc64f4aa556ac62e610174a93c498a98240d --- /dev/null +++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testWorklist.xml @@ -0,0 +1,123 @@ + + + + + + + + + + _recorded_property_dict + + AAAAAAAAAAI= + + + + default_reference + testWorklist + + + description + + + + + + id + test.erp5.testWorklist + + + portal_type + Test Component + + + sid + + + + + + text_content_error_message + + + + + + text_content_warning_message + + + + + + version + erp5 + + + workflow_history + + AAAAAAAAAAM= + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + component_validation_workflow + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + + + + action + validate + + + validation_state + validated + + + + + + + diff --git a/bt5/erp5_core_test/bt/dependency_list b/bt5/erp5_core_test/bt/dependency_list new file mode 100644 index 0000000000000000000000000000000000000000..8149202de5a0fdbfef09dbb29ca4eb3ed702ac94 --- /dev/null +++ b/bt5/erp5_core_test/bt/dependency_list @@ -0,0 +1,2 @@ +erp5_full_text_mroonga_catalog +erp5_base \ No newline at end of file diff --git a/bt5/erp5_core_test/bt/license b/bt5/erp5_core_test/bt/license new file mode 100644 index 0000000000000000000000000000000000000000..3a3e12bcad97e4b3bdd6a8bb499fd23a4bcb0819 --- /dev/null +++ b/bt5/erp5_core_test/bt/license @@ -0,0 +1 @@ +GPL \ No newline at end of file diff --git a/bt5/erp5_core_test/bt/template_format_version b/bt5/erp5_core_test/bt/template_format_version new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/bt5/erp5_core_test/bt/template_format_version @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/bt5/erp5_core_test/bt/template_module_id_list b/bt5/erp5_core_test/bt/template_module_id_list new file mode 100644 index 0000000000000000000000000000000000000000..8033344d25d3c616fa717811014e2060c0b3862e --- /dev/null +++ b/bt5/erp5_core_test/bt/template_module_id_list @@ -0,0 +1 @@ +organisation_module \ No newline at end of file diff --git a/bt5/erp5_core_test/bt/template_test_id_list b/bt5/erp5_core_test/bt/template_test_id_list new file mode 100644 index 0000000000000000000000000000000000000000..af8e7da16066c07e47ba7849ae6e8720ddef25da --- /dev/null +++ b/bt5/erp5_core_test/bt/template_test_id_list @@ -0,0 +1,3 @@ +test.erp5.testWorkflowMixin +test.erp5.testWorklist +test.erp5.testSQLCachedWorklist \ No newline at end of file diff --git a/bt5/erp5_core_test/bt/title b/bt5/erp5_core_test/bt/title new file mode 100644 index 0000000000000000000000000000000000000000..fa2409bb328c7901f0ffbca5cd3687589af35737 --- /dev/null +++ b/bt5/erp5_core_test/bt/title @@ -0,0 +1 @@ +erp5_core_test \ No newline at end of file diff --git a/bt5/erp5_crm/WorkflowTemplateItem/portal_workflow/event_simulation_workflow/transitions/create_ticket_action.xml b/bt5/erp5_crm/WorkflowTemplateItem/portal_workflow/event_simulation_workflow/transitions/create_ticket_action.xml index 687d076b2b87db3974df954ff31b70160ee1f901..2dfbcbf3075b4a6fcc2a207e9f257b13f341c5d3 100644 --- a/bt5/erp5_crm/WorkflowTemplateItem/portal_workflow/event_simulation_workflow/transitions/create_ticket_action.xml +++ b/bt5/erp5_crm/WorkflowTemplateItem/portal_workflow/event_simulation_workflow/transitions/create_ticket_action.xml @@ -22,10 +22,6 @@ actbox_url %(content_url)s/Event_viewCreateTicketWorkflowActionDialog?workflow_action=create_ticket_action - - after_script_name - create_ticket - description Disabled action. diff --git a/bt5/erp5_egov/ExtensionTemplateItem/portal_components/extension.erp5.ERP5EGov_Extensions.py b/bt5/erp5_egov/ExtensionTemplateItem/portal_components/extension.erp5.ERP5EGov_Extensions.py index 6468c8d85c6c69163c25d1d90b723bb6aa190651..a923acf35f94d62c43500a7e80ed217a6fa6894d 100644 --- a/bt5/erp5_egov/ExtensionTemplateItem/portal_components/extension.erp5.ERP5EGov_Extensions.py +++ b/bt5/erp5_egov/ExtensionTemplateItem/portal_components/extension.erp5.ERP5EGov_Extensions.py @@ -1,22 +1,6 @@ from zLOG import LOG from Products.CMFCore.utils import getToolByName -def getPoralTypeListForWorkflow(self, workflow): - ''' - return a list of portal_types that use workflow - ''' - pw = self.portal_workflow - cbt = pw._chains_by_type - ti = pw._listTypeInfo() - - portal_type_list = [] - for t in ti: - id = t.getId() - if cbt is not None and cbt.has_key(id) and workflow in cbt[id]: - portal_type_list.append(id) - - return portal_type_list - def getPortalTypeWorklistDictForWorkflow(self, workflow_list): """ return a dict containing portal_type and all informations about work_list @@ -38,14 +22,18 @@ def getPortalTypeWorklistDictForWorkflow(self, workflow_list): """ portal_type_worklist_dict = {} portal_workflow = self.getPortalObject().portal_workflow + types_tool = self.getPortalObject().portal_types if not isinstance(workflow_list, list): workflow = [workflow_list] for workflow in workflow_list: - portal_type_list = self.getPoralTypeListForWorkflow(self, - workflow=workflow) + portal_type_list = [ + type_object.id for type_object in types_tool.listTypeInfo() + if workflow in type_object.getTypeWorkflowList() + ] + workflow = getattr(portal_workflow, workflow, None) if workflow is not None: @@ -97,6 +85,7 @@ def gessPortalType(self, attachment): return portal_contributions._guessPortalType(filename, mime_type, data) def setWorkflowList(self, portal_type_name, workflow_list=()): - portal_workflow = self.portal_workflow - portal_workflow._chains_by_type[portal_type_name] = workflow_list + types_tool = self.getPortalObject().portal_types + type_object = types_tool.getTypeInfo(portal_type_name) + type_object.setTypeWorkflowList(list(workflow_list)) diff --git a/bt5/erp5_egov/SkinTemplateItem/portal_skins/erp5_egov/getPoralTypeListForWorkflow.xml b/bt5/erp5_egov/SkinTemplateItem/portal_skins/erp5_egov/getPoralTypeListForWorkflow.xml deleted file mode 100644 index 33b5d968fe7a9e23d94bbdc16f21dbb5fc749011..0000000000000000000000000000000000000000 --- a/bt5/erp5_egov/SkinTemplateItem/portal_skins/erp5_egov/getPoralTypeListForWorkflow.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - _function - getPoralTypeListForWorkflow - - - _module - ERP5EGov_Extensions - - - id - getPoralTypeListForWorkflow - - - title - - - - - - diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py index 4da9e563324c7e1f741b2dc9fe21ee79dd0571d8..16a6c839608fc48ebdcb47435f3be0ddec2ddc36 100644 --- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py @@ -26,12 +26,12 @@ def get_obj_and_reference_list(business_field): wf = getattr(portal_workflow, wf_id) if getattr(wf, "interactions", marker) is marker: # only way to make sure it is not an interaction workflow ? result.append((wf, wf_id, 'workflow')) - for state_id, state in wf.states.items(): - result.append((state, state_id, 'state')) - for trans_id, trans in wf.transitions.items(): - result.append((trans, trans_id, 'transition')) - if trans.trigger_type == 1 and trans.actbox_name: # 1 == TRIGGER_USER_ACTION - result.append((trans, "%s_actbox_name" % trans_id, 'action')) + for state in wf.getStateValueList(): + result.append((state, state.getReference(), 'state')) + for transition in wf.getTransitionValueList(): + result.append((transition, transaction.getReference(), 'transition')) + if transition.trigger_type == 1 and transaction.actbox_name: # 1 == TRIGGER_USER_ACTION + result.append((transition, "%s_actbox_name" % transaction.getReference(), 'action')) return result business_field_list = [i for i in business_field_list if i] diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py index b6a1b293891a0dad8f85b2150e71dc7b1e36132a..38adac01049479bf2498b0e8cda19db7e95118f2 100644 --- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py @@ -1,34 +1,90 @@ +from Products.ERP5Type.Document import newTempBase marker = [] -prefix = 'erp5_' -language = 'en' -term_dict = {} result = [] -for bt_id in template_list: - # XXX this might be too simple: some business template include more than one skin folder - bt = context.portal_templates.getInstalledBusinessTemplate(bt_id) - if bt is None: continue - if bt_id.startswith(prefix): - bt_id = bt_id[len(prefix):] +portal_catalog = context.portal_catalog +portal_workflow = context.portal_workflow +portal_templates = context.portal_templates + +def get_term_list(business_field, reference): + reference = reference.rsplit('_action', 1)[0] + term_list = portal_catalog(portal_type='Glossary Term', + validation_state='validated', + language_id='en', + business_field_title=('core', business_field), + reference=reference) + return [i.getObject() for i in term_list] +def get_obj_and_reference_list(business_field): + business_field = business_field.split('/')[0] + result = [] + # XXX this might be too simple: some business template include more than one skin folder + bt = portal_templates.getInstalledBusinessTemplate("erp5_%s" % business_field) + if bt is None: return result for wf_id in bt.getTemplateWorkflowIdList(): - wf = getattr(context.portal_workflow, wf_id) + wf = getattr(portal_workflow, wf_id) if getattr(wf, "interactions", marker) is marker: # only way to make sure it is not an interaction workflow ? - term_dict[(wf_id, bt_id, wf.title, wf.description)] = wf_id - for state_id, state in wf.states.items(): - term_dict[(state_id, bt_id, state.title, state.description)] = wf_id - for trans_id, trans in wf.transitions.items(): - term_dict[(trans_id, bt_id, trans.title, trans.description)] = wf_id - if trans.trigger_type == 1 and trans.actbox_name: # 1 == TRIGGER_USER_ACTION - term_dict[('%s_actbox_name' % trans_id, bt_id, trans.actbox_name, '')] = wf_id - -for (reference, business_field, title, description), workflow_id in term_dict.items(): - result.append({'reference': reference, - 'language': language, - 'business_field': business_field, - 'title': title, - 'description': description, - 'workflow_id':workflow_id}) - -return result + result.append((wf, wf_id, 'workflow')) + for state in wf.getStateValueList(): + result.append((state, state.getReference(), 'state')) + for transition in wf.getTransitionValueList(): + result.append((transition, transition.getReference(), 'transition')) + if transition.trigger_type == 1 and transition.actbox_name: # 1 == TRIGGER_USER_ACTION + result.append((transition, "%s_actbox_name" % transition.getReference(), 'action')) + return result + +business_field_list = [i for i in business_field_list if i] + +line_list = [] +c = 0 +item_dict = {} +for business_field in business_field_list: + for wf_item, reference, type in get_obj_and_reference_list(business_field): + term_list = get_term_list(business_field, reference) + #if not term_list: + # continue + if item_dict.has_key(wf_item): + continue + item_dict[wf_item] = True + + c += 1 + if type == 'workflow': + wf_item_path = wf_item.id + wf_item_title = wf_item.title + elif type == 'state': + wf_item_path = '%s/states/%s' % (wf_item.aq_parent.aq_parent.id, wf_item.id) + wf_item_title = wf_item.title + elif type == 'transition': + wf_item_path = '%s/transitions/%s' % (wf_item.aq_parent.aq_parent.id, wf_item.id) + wf_item_title = wf_item.title + else: # type == 'action' + wf_item_path = '%s/transitions/%s_actbox_name' % (wf_item.aq_parent.aq_parent.id, wf_item.id) + wf_item_title = wf_item.actbox_name + wf_item_description = wf_item.description + + if type == 'transition' and wf_item_path.endswith('_action'): + if len(term_list) == 1 and \ + term_list[0].getTitle() + ' Action' == wf_item_title and \ + term_list[0].getDescription() == wf_item_description: + continue + else: + if len(term_list) == 1 and \ + term_list[0].getTitle() == wf_item_title and \ + term_list[0].getDescription() == wf_item_description: + continue + + line = newTempBase(context, 'tmp_glossary_wf_item_%s' % c) + line.edit(wf_item_path=wf_item_path, + wf_item_type=type, + wf_item_title=wf_item_title, + wf_item_edit_url = "%s/manage_properties" % wf_item.absolute_url(), + wf_item_description = wf_item_description, + reference=reference, + term_list=term_list + ) + line.setUid(wf_item_path) + line_list.append(line) + +line_list.sort(key=lambda x:x.wf_item_path) +return line_list diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_updateWorkflowByTerm.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_updateWorkflowByTerm.py index ecf6c30d7301edf819f4ce96d71f0f1c33cabf4d..cd0257fb55347118190a5fba7a35a49f63d4825b 100644 --- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_updateWorkflowByTerm.py +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_updateWorkflowByTerm.py @@ -23,7 +23,7 @@ for i in kw.keys(): wf_item.setProperties(term.getTitle(), description=term.getDescription(), manager_bypass=wf_item.manager_bypass) elif wf_item.meta_type == "Workflow State": wf_item.setProperties(term.getTitle(), description=term.getDescription(), - transitions=wf_item.transitions, type_list=wf_item.type_list) + transitions=wf_item.getDestinationReferenceList(), type_list=wf_item.type_list) else: # wf_item.meta_type == "Workflow Transition" guard = getattr(wf_item, 'guard', None) if not is_action: diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.py index aba33987a2bfbe6b4eb0b179e896d4f1eac2440e..91b9ed69f754f59d6189be9cf81a9d57532f1b7f 100644 --- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.py +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.py @@ -2,7 +2,7 @@ from Products.ERP5Type.Utils import getMessageIdWithContext message_dict = {} def add_message(message, comment): - + if not message: return message = message.decode('utf-8') @@ -40,7 +40,7 @@ iterate(context.portal_skins) # Collect python script from workflow objects. for workflow in context.portal_workflow.objectValues(): - for i in workflow.scripts.objectValues(): + for i in workflow.getScriptValueDict().values(): if i.meta_type=='Script (Python)': python_script_list.append(i) @@ -107,21 +107,21 @@ for i in page_template_list: s_title_list = [] for i in context.portal_workflow.objectValues(): add_message(i.title_or_id(), portal_url.getRelativeContentURL(i)) - - if not i.states: + state_value_list = i.getStateValueList() + if not state_value_list: continue - for s in i.states.values(): - s_title = s.title - if s_title: - # adding a context in msg_id for more precise translation - msg_id = getMessageIdWithContext(s_title,'state',i.id) - add_message(msg_id, portal_url.getRelativeContentURL(s)) - # also use state title as msg_id for compatibility - add_message(s_title, portal_url.getRelativeContentURL(s)) - - if not i.transitions: + for s in state_value_list: + if s.title: + # adding a context in msg_id for more precise translation + msg_id = getMessageIdWithContext(s.title,'state',i.id) + add_message(msg_id, portal_url.getRelativeContentURL(s)) + # also use state title as msg_id for compatibility + add_message(s.title, portal_url.getRelativeContentURL(s)) + + transition_value_list = i.getTransitionValueList() + if not transition_value_list: continue - for t in i.transitions.values(): + for t in transition_value_list: if t.actbox_name: #adding a context in msg_id for more precise translation msg_id = getMessageIdWithContext(t.actbox_name,'transition',i.id) @@ -134,7 +134,7 @@ for i in context.portal_workflow.objectValues(): add_message(msg_id, portal_url.getRelativeContentURL(t)) # also use transition title as msg_id for compatibility add_message(t.title, portal_url.getRelativeContentURL(t)) - for worklist in i.worklists.objectValues(): + for worklist in i.getWorklistValueList(): add_message(worklist.actbox_name, portal_url.getRelativeContentURL(worklist)) diff --git a/bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/reset_graph.xml b/bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/reset_graph.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c5f784152c389c212d247d4e5815f7cfb633820 --- /dev/null +++ b/bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/reset_graph.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + + + description + + + + + + icon + + + + id + reset_graph + + + permissions + + + Modify portal content + + + + + portal_type + Action Information + + + priority + 8.0 + + + title + Reset graph positions + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_resetGraph + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/view_graph.xml b/bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/view_graph.xml similarity index 97% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/view_graph.xml rename to bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/view_graph.xml index 94b1945da63beadf628c79de4a13650918cef3ad..172117340351a4f5c167b42aa540b97463abff66 100644 --- a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/view_graph.xml +++ b/bt5/erp5_graph_editor/ActionTemplateItem/portal_types/Workflow/view_graph.xml @@ -50,7 +50,7 @@ priority - 6.0 + 8.0 title diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.py b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.py new file mode 100644 index 0000000000000000000000000000000000000000..e3766340617998023940eaa79ead8b2634a253d7 --- /dev/null +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.py @@ -0,0 +1,59 @@ +from Products.ERP5Type.Message import translateString +import json +portal = context.getPortalObject() + +# if a graph has been saved, we use this info for node coordinates. +position_graph = context.getProperty('jsplumb_graph') +if position_graph: + position_graph = json.loads(position_graph)['graph'] + +# TODO: +# select after script in edge properties +# checked box for validation ? or at least select before script + +def getWorkflowGraph(workflow): + graph = {'node': {}, 'edge': {}} + for state in workflow.getStateValueList(): + is_initial_state = state.getId() == workflow.getSourceId() + transition_list = [] + graph['node'][state.getId()] = { + '_class':'workflow.state', + 'name': state.getTitleOrId(), + 'is_initial_state': is_initial_state, + 'path': state.getPath() + } + + for transition in state.getDestinationValueList(): + transition_id = transition.getReference() + if transition_id in workflow.getTransitionIdList(): + if transition.getDestinationId(): + graph['edge']["%s_%s" % (state.getId(), transition.getId())] = ({ + '_class': 'workflow.transition', + 'source': state.getId(), + 'destination': transition.getDestinationId(), + 'name': transition.getActionName() or transition.getTitleOrId(), + 'description': transition.getDescription(), + 'actbox_url': transition.getAction(), + 'transition_id': transition.getId(), # used for edition. + 'path': transition.getPath() + }) + else: + # user action + transition_list.append(transition) + + if transition_list != []: + graph['edge']['transition_to_%s' % (state.getId())] = { + '_class':'workflow.transition', + 'source':state.getId(), + 'destination': state.getId(), + 'name_path_dict': {transition.getTitleOrId(): transition.getPath() for transition in transition_list} + } + + + if position_graph: + for state_id in graph['node'].keys(): + if state_id in position_graph['node']: + graph['node'][state_id]['coordinate'] = position_graph['node'][state_id]['coordinate'] + return graph + +return json.dumps(dict(graph=getWorkflowGraph(context), class_definition={}), indent=2) diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.xml b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.xml similarity index 96% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.xml rename to bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.xml index 6d72bc343861301e10d5d5912d307aa8b648901c..a6c767752b71fa4791c5e6e0f018902a716176f3 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.xml +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_getGraph.xml @@ -54,7 +54,7 @@ id - Variable_getNonEvaluatedInitialValue + Workflow_getGraph diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.py b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.py new file mode 100644 index 0000000000000000000000000000000000000000..45578b67444536fc0efaac9d0141b074acc51cf3 --- /dev/null +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.py @@ -0,0 +1,4 @@ +# after calling this script, positions of the states will be chosen by jsplumb +# and manually changed positions which were saved by a user will be erased +context.setProperty('jsplumb_graph', None) +context.Base_redirect(form_id='Workflow_viewGraph') diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/checkConsistency.xml b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.xml similarity index 94% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/checkConsistency.xml rename to bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.xml index 01fb8e3581d72aed1427b607b8b9d0facb341432..8edb23dda1a1e46b4a0ddd86ceb243550f83b153 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/checkConsistency.xml +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/Workflow_resetGraph.xml @@ -50,11 +50,11 @@ _params - state_change + id - checkConsistency + Workflow_resetGraph diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/index.html.html b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/index.html.html index 800f617be2a4c49feca00f73fee02e547d98b0ba..5163cdf823b78b381b98ca1268c77adf5aeb5e4c 100644 --- a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/index.html.html +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/index.html.html @@ -15,6 +15,7 @@ + @@ -22,7 +23,7 @@
- {{name}} + {{name}}
diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.css b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.css index 3a803adc7b37ed10a4c0444baba6fdeebbce858f..e1fbe327a38bd6c478f458805c1511d2ffb3465a 100644 --- a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.css +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.css @@ -4,13 +4,17 @@ border: 1px solid #999; min-width: 400px; - min-height: 400px; + min-height: 1200px; overflow: hidden; background-color: #eaedef; text-align: center; } +.selected { + color: #bd0b0b!important +} + .window, .label { background-color: #fff; @@ -109,4 +113,4 @@ path, } path { cursor: pointer -} \ No newline at end of file +} diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.xml b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.xml index af482d2b2ae2929df6643b2374f2de3efff63d68..feca5be83beeff0aa806ffdfb515e081d787dc55 100644 --- a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.xml +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.css.xml @@ -10,6 +10,10 @@ _Cacheable__manager_id http_cache + + _EtagSupport__etag + ts48641303.03 + __name__ jsplumb.css @@ -22,6 +26,10 @@ precondition + + size + 2380 + title diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.js.js b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.js.js index 32a1e07793a0f09771a48c5f2f934e068e0b10a2..9d3943b1b3077edec3aa297a44974211486245be 100644 --- a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.js.js +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/jsplumb.js.js @@ -335,12 +335,26 @@ function addEdge(gadget, edge_id, edge_data) { var overlays = [], - connection; + connection, + label = ''; if (edge_data.name) { + label = edge_data.name; + if (edge_data.path) { + label = label.link(edge_data.path) + } + } + if (edge_data.name_path_dict) { + var linked_name_list = [] + for (var name in edge_data.name_path_dict) { + linked_name_list.push(name.link(edge_data.name_path_dict[name])); + } + label = linked_name_list.join(', '); + } + if (label) { overlays = [ ["Label", { cssClass: "l1 component label", - label: edge_data.name + label: label }] ]; } @@ -460,153 +474,6 @@ return clone(expanded_class_definition); } - function openEdgeEditionDialog(gadget, connection) { - var edge_id = connection.id, - edge_data = gadget.props.data.graph.edge[edge_id], - edit_popup = $(gadget.props.element).find("#popup-edit-template"), - schema, - fieldset_element, - delete_promise; - schema = expandSchema(gadget.props.data.class_definition[edge_data._class], gadget.props.data); - // We do not edit source & destination on edge this way. - delete schema.properties.source; - delete schema.properties.destination; - gadget.props.element.insertAdjacentHTML("beforeend", popup_edit_template); - edit_popup = $(gadget.props.element).find("#edit-popup"); - edit_popup.find(".node_class").text(connection.name || connection._class); - fieldset_element = edit_popup.find("fieldset")[0]; - edit_popup.dialog(); - edit_popup.show(); - - function save_promise(fieldset_gadget, edge_id) { - return RSVP.Queue().push(function() { - return promiseEventListener(edit_popup.find(".graph_editor_validate_button")[0], "click", false); - }).push(function(evt) { - var data = { - id: $(evt.target[1]).val(), - data: {} - }; - return fieldset_gadget.getContent().then(function(r) { - $.extend(data.data, gadget.props.data.graph.edge[connection.id]); - $.extend(data.data, r); - // to redraw, we remove the edge and add again. - // but we want to disable events on connection, since event - // handling promise are executed asynchronously in undefined order, - // we cannot just remove and /then/ add, because the new edge is - // added before the old is removed. - connection.ignoreEvent = true; - gadget.props.jsplumb_instance.detach(connection); - addEdge(gadget, r.id, data.data); - }); - }); - } - delete_promise = new RSVP.Queue().push(function() { - return promiseEventListener(edit_popup.find(".graph_editor_delete_button")[0], "click", false); - }).push(function() { - // connectionDetached event will remove the edge from data - gadget.props.jsplumb_instance.detach(connection); - }); - return gadget.declareGadget("../fieldset/index.html", { - element: fieldset_element, - scope: "fieldset" - }).push(function(fieldset_gadget) { - return RSVP.all([fieldset_gadget, fieldset_gadget.render({ - value: edge_data, - property_definition: schema - }, edge_id)]); - }).push(function(fieldset_gadget) { - edit_popup.dialog("open"); - return fieldset_gadget[0]; - }).push(function(fieldset_gadget) { - fieldset_gadget.startService(); // XXX - return fieldset_gadget; - }).push(function(fieldset_gadget) { - // Expose the dialog handling promise so that we can wait for it in - // test. - gadget.props.dialog_promise = RSVP.any([save_promise(fieldset_gadget, edge_id), delete_promise]); - return gadget.props.dialog_promise; - }).push(function() { - edit_popup.dialog("close"); - edit_popup.remove(); - delete gadget.props.dialog_promise; - }); - } - - function openNodeEditionDialog(gadget, element) { - var node_id = getNodeId(gadget, element.id), - node_data = gadget.props.data.graph.node[node_id], - node_edit_popup = $(gadget.props.element).find("#popup-edit-template"), - schema, - fieldset_element, - delete_promise; - // If we have no definition for this, we do not allow edition. - // XXX incorrect, we need to display this dialog to be able - // to delete a node - if (gadget.props.data.class_definition[node_data._class] === undefined) { - return; - } - schema = expandSchema(gadget.props.data.class_definition[node_data._class], gadget.props.data); - if (node_edit_popup.length !== 0) { - node_edit_popup.remove(); - } - gadget.props.element.insertAdjacentHTML("beforeend", popup_edit_template); - node_edit_popup = $(gadget.props.element).find("#edit-popup"); - // Set the name of the popup to the node class - node_edit_popup.find(".node_class").text(node_data.name || node_data._class); - fieldset_element = node_edit_popup.find("fieldset")[0]; - node_edit_popup.dialog(); - node_data.id = node_id; - - function save_promise(fieldset_gadget, node_id) { - return RSVP.Queue().push(function() { - return promiseEventListener(node_edit_popup.find(".graph_editor_validate_button")[0], "click", false); - }).push(function(evt) { - var data = { - // XXX id should not be handled differently ... - id: $(evt.target[1]).val(), - data: {} - }; - return fieldset_gadget.getContent().then(function(r) { - $.extend(data.data, r); - updateElementData(gadget, node_id, data); - }); - }); - } - delete_promise = new RSVP.Queue().push(function() { - return promiseEventListener(node_edit_popup.find(".graph_editor_delete_button")[0], "click", false); - }).push(function() { - return removeElement(gadget, node_id); - }); - return gadget.declareGadget("../fieldset/index.html", { - element: fieldset_element, - scope: "fieldset" - }).push(function(fieldset_gadget) { - return RSVP.all([fieldset_gadget, fieldset_gadget.render({ - value: node_data, - property_definition: schema - }, node_id)]); - }).push(function(fieldset_gadget) { - node_edit_popup.dialog("open"); - return fieldset_gadget[0]; - }).push(function(fieldset_gadget) { - fieldset_gadget.startService(); // XXX this should not be needed anymore. - return fieldset_gadget; - }).push(function(fieldset_gadget) { - // Expose the dialog handling promise so that we can wait for it in - // test. - gadget.props.dialog_promise = RSVP.any([save_promise(fieldset_gadget, node_id), delete_promise]); - return gadget.props.dialog_promise; - }).push(function() { - node_edit_popup.dialog("close"); - node_edit_popup.remove(); - delete gadget.props.dialog_promise; - }); - } - - function waitForNodeClick(gadget, node) { - gadget.props.nodes_click_monitor.monitor(loopEventListener(node, "dblclick", false, openNodeEditionDialog.bind(null, gadget, node))); - } - function waitForConnection(gadget) { return loopJsplumbBind(gadget, "connection", function(info, originalEvent) { updateConnectionData(gadget, info.connection, false); @@ -619,12 +486,6 @@ }); } - function waitForConnectionClick(gadget) { - return loopJsplumbBind(gadget, "click", function(connection) { - return openEdgeEditionDialog(gadget, connection); - }); - } - function addNode(gadget, node_id, node_data) { var render_element = $(gadget.props.main), class_definition = gadget.props.data.class_definition[node_data._class], @@ -650,10 +511,10 @@ "class": node_data._class.replace(".", "-"), element_id: dom_element_id, title: node_data.name || node_data.id, - name: node_data.name || node_data.id + name: node_data.name || node_data.id, + name_href: node_data.path }), "text/html").querySelector(".window"); render_element.append(domElement); - waitForNodeClick(gadget, domElement); box = $(gadget.props.element).find("#" + dom_element_id); absolute_position = convertToAbsolutePosition(gadget, coordinate.left, coordinate.top); if (class_definition && class_definition.css) { @@ -661,6 +522,11 @@ } box.css("top", absolute_position[1]); box.css("left", absolute_position[0]); + if (node_data.is_initial_state) { + box.css("border", "double #000000"); + box.css("font-weight", "bold"); + + } updateNodeStyle(gadget, dom_element_id); draggable(gadget); // XXX make only this element draggable. @@ -761,13 +627,7 @@ } this.props.main = this.props.element.querySelector(".graph_container"); -/* - $(this.props.main).resizable({ - resize : function(event, ui) { - jsplumb_instance.repaint(ui.helper); - } - }); -*/ + if (data) { this.props.data = JSON.parse(data); @@ -826,12 +686,11 @@ Container: this.props.main }); draggable(gadget); - - this.props.nodes_click_monitor = RSVP.Monitor(); + + this.props.nodes_click_monitor = this.__monitor; return RSVP.all([waitForDrop(gadget), waitForConnection(gadget), waitForConnectionDetached(gadget), - waitForConnectionClick(gadget), gadget.props.nodes_click_monitor ]); }); diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.js b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.js new file mode 100644 index 0000000000000000000000000000000000000000..9b7548f2197bf4ec031f42623c8c09587902d599 --- /dev/null +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.js @@ -0,0 +1,402 @@ +/** + +seedrandom.js +============= + +Seeded random number generator for Javascript. + +version 2.3.10 +Author: David Bau +Date: 2014 Sep 20 + +Can be used as a plain script, a node.js module or an AMD module. + +Script tag usage +---------------- + + + +// Sets Math.random to a PRNG initialized using the given explicit seed. +Math.seedrandom('hello.'); +console.log(Math.random()); // Always 0.9282578795792454 +console.log(Math.random()); // Always 0.3752569768646784 + +// Sets Math.random to an ARC4-based PRNG that is autoseeded using the +// current time, dom state, and other accumulated local entropy. +// The generated seed string is returned. +Math.seedrandom(); +console.log(Math.random()); // Reasonably unpredictable. + +// Seeds using the given explicit seed mixed with accumulated entropy. +Math.seedrandom('added entropy.', { entropy: true }); +console.log(Math.random()); // As unpredictable as added entropy. + +// Use "new" to create a local prng without altering Math.random. +var myrng = new Math.seedrandom('hello.'); +console.log(myrng()); // Always 0.9282578795792454 + + +Node.js usage +------------- + +npm install seedrandom + +// Local PRNG: does not affect Math.random. +var seedrandom = require('seedrandom'); +var rng = seedrandom('hello.'); +console.log(rng()); // Always 0.9282578795792454 + +// Autoseeded ARC4-based PRNG. +rng = seedrandom(); +console.log(rng()); // Reasonably unpredictable. + +// Global PRNG: set Math.random. +seedrandom('hello.', { global: true }); +console.log(Math.random()); // Always 0.9282578795792454 + +// Mixing accumulated entropy. +rng = seedrandom('added entropy.', { entropy: true }); +console.log(rng()); // As unpredictable as added entropy. + + +Require.js usage +---------------- + +Similar to node.js usage: + +bower install seedrandom + +require(['seedrandom'], function(seedrandom) { + var rng = seedrandom('hello.'); + console.log(rng()); // Always 0.9282578795792454 +}); + + +Network seeding +--------------- + + + + + + + + + +Reseeding using user input +-------------------------- + +var seed = Math.seedrandom(); // Use prng with an automatic seed. +document.write(Math.random()); // Pretty much unpredictable x. + +var rng = new Math.seedrandom(seed); // A new prng with the same seed. +document.write(rng()); // Repeat the 'unpredictable' x. + +function reseed(event, count) { // Define a custom entropy collector. + var t = []; + function w(e) { + t.push([e.pageX, e.pageY, +new Date]); + if (t.length < count) { return; } + document.removeEventListener(event, w); + Math.seedrandom(t, { entropy: true }); + } + document.addEventListener(event, w); +} +reseed('mousemove', 100); // Reseed after 100 mouse moves. + +The "pass" option can be used to get both the prng and the seed. +The following returns both an autoseeded prng and the seed as an object, +without mutating Math.random: + +var obj = Math.seedrandom(null, { pass: function(prng, seed) { + return { random: prng, seed: seed }; +}}); + + +Version notes +------------- + +The random number sequence is the same as version 1.0 for string seeds. +* Version 2.0 changed the sequence for non-string seeds. +* Version 2.1 speeds seeding and uses window.crypto to autoseed if present. +* Version 2.2 alters non-crypto autoseeding to sweep up entropy from plugins. +* Version 2.3 adds support for "new", module loading, and a null seed arg. +* Version 2.3.1 adds a build environment, module packaging, and tests. +* Version 2.3.4 fixes bugs on IE8, and switches to MIT license. +* Version 2.3.6 adds a readable options object argument. +* Version 2.3.10 adds support for node.js crypto (contributed by ctd1500). + +The standard ARC4 key scheduler cycles short keys, which means that +seedrandom('ab') is equivalent to seedrandom('abab') and 'ababab'. +Therefore it is a good idea to add a terminator to avoid trivial +equivalences on short string seeds, e.g., Math.seedrandom(str + '\0'). +Starting with version 2.0, a terminator is added automatically for +non-string seeds, so seeding with the number 111 is the same as seeding +with '111\0'. + +When seedrandom() is called with zero args or a null seed, it uses a +seed drawn from the browser crypto object if present. If there is no +crypto support, seedrandom() uses the current time, the native rng, +and a walk of several DOM objects to collect a few bits of entropy. + +Each time the one- or two-argument forms of seedrandom are called, +entropy from the passed seed is accumulated in a pool to help generate +future seeds for the zero- and two-argument forms of seedrandom. + +On speed - This javascript implementation of Math.random() is several +times slower than the built-in Math.random() because it is not native +code, but that is typically fast enough. Some details (timings on +Chrome 25 on a 2010 vintage macbook): + +* seeded Math.random() - avg less than 0.0002 milliseconds per call +* seedrandom('explicit.') - avg less than 0.2 milliseconds per call +* seedrandom('explicit.', true) - avg less than 0.2 milliseconds per call +* seedrandom() with crypto - avg less than 0.2 milliseconds per call + +Autoseeding without crypto is somewhat slower, about 20-30 milliseconds on +a 2012 windows 7 1.5ghz i5 laptop, as seen on Firefox 19, IE 10, and Opera. +Seeded rng calls themselves are fast across these browsers, with slowest +numbers on Opera at about 0.0005 ms per seeded Math.random(). + + +LICENSE (MIT) +------------- + +Copyright 2014 David Bau. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * All code is in an anonymous closure to keep the global namespace clean. + */ +(function ( + global, pool, math, width, chunks, digits, module, define, rngname) { + +// +// The following constants are related to IEEE 754 limits. +// +var startdenom = math.pow(width, chunks), + significance = math.pow(2, digits), + overflow = significance * 2, + mask = width - 1, + nodecrypto; + +// +// seedrandom() +// This is the seedrandom function described above. +// +var impl = math['seed' + rngname] = function(seed, options, callback) { + var key = []; + options = (options == true) ? { entropy: true } : (options || {}); + + // Flatten the seed string or build one from local entropy if needed. + var shortseed = mixkey(flatten( + options.entropy ? [seed, tostring(pool)] : + (seed == null) ? autoseed() : seed, 3), key); + + // Use the seed to initialize an ARC4 generator. + var arc4 = new ARC4(key); + + // Mix the randomness into accumulated entropy. + mixkey(tostring(arc4.S), pool); + + // Calling convention: what to return as a function of prng, seed, is_math. + return (options.pass || callback || + // If called as a method of Math (Math.seedrandom()), mutate Math.random + // because that is how seedrandom.js has worked since v1.0. Otherwise, + // it is a newer calling convention, so return the prng directly. + function(prng, seed, is_math_call) { + if (is_math_call) { math[rngname] = prng; return seed; } + else return prng; + })( + + // This function returns a random double in [0, 1) that contains + // randomness in every bit of the mantissa of the IEEE 754 value. + function() { + var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48 + d = startdenom, // and denominator d = 2 ^ 48. + x = 0; // and no 'extra last byte'. + while (n < significance) { // Fill up all significant digits by + n = (n + x) * width; // shifting numerator and + d *= width; // denominator and generating a + x = arc4.g(1); // new least-significant-byte. + } + while (n >= overflow) { // To avoid rounding up, before adding + n /= 2; // last byte, shift everything + d /= 2; // right using integer math until + x >>>= 1; // we have exactly the desired bits. + } + return (n + x) / d; // Form the number within [0, 1). + }, shortseed, 'global' in options ? options.global : (this == math)); +}; + +// +// ARC4 +// +// An ARC4 implementation. The constructor takes a key in the form of +// an array of at most (width) integers that should be 0 <= x < (width). +// +// The g(count) method returns a pseudorandom integer that concatenates +// the next (count) outputs from ARC4. Its return value is a number x +// that is in the range 0 <= x < (width ^ count). +// +/** @constructor */ +function ARC4(key) { + var t, keylen = key.length, + me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + + // The empty key [] is treated as [0]. + if (!keylen) { key = [keylen++]; } + + // Set up S using the standard key scheduling algorithm. + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))]; + s[j] = t; + } + + // The "g" method returns the next (count) outputs as one number. + (me.g = function(count) { + // Using instance members instead of closure state nearly doubles speed. + var t, r = 0, + i = me.i, j = me.j, s = me.S; + while (count--) { + t = s[i = mask & (i + 1)]; + r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))]; + } + me.i = i; me.j = j; + return r; + // For robust unpredictability, the function call below automatically + // discards an initial batch of values. This is called RC4-drop[256]. + // See http://google.com/search?q=rsa+fluhrer+response&btnI + })(width); +} + +// +// flatten() +// Converts an object tree to nested arrays of strings. +// +function flatten(obj, depth) { + var result = [], typ = (typeof obj), prop; + if (depth && typ == 'object') { + for (prop in obj) { + try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {} + } + } + return (result.length ? result : typ == 'string' ? obj : obj + '\0'); +} + +// +// mixkey() +// Mixes a string seed into a key that is an array of integers, and +// returns a shortened string seed that is equivalent to the result key. +// +function mixkey(seed, key) { + var stringseed = seed + '', smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = + mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++)); + } + return tostring(key); +} + +// +// autoseed() +// Returns an object for autoseeding, using window.crypto if available. +// +/** @param {Uint8Array|Navigator=} seed */ +function autoseed(seed) { + try { + if (nodecrypto) return tostring(nodecrypto.randomBytes(width)); + global.crypto.getRandomValues(seed = new Uint8Array(width)); + return tostring(seed); + } catch (e) { + return [+new Date, global, (seed = global.navigator) && seed.plugins, + global.screen, tostring(pool)]; + } +} + +// +// tostring() +// Converts an array of charcodes to a string +// +function tostring(a) { + return String.fromCharCode.apply(0, a); +} + +// +// When seedrandom.js is loaded, we immediately mix a few bits +// from the built-in RNG into the entropy pool. Because we do +// not want to interfere with deterministic PRNG state later, +// seedrandom will not call math.random on its own again after +// initialization. +// +mixkey(math[rngname](), pool); + +// +// Nodejs and AMD support: export the implementation as a module using +// either convention. +// +if (module && module.exports) { + module.exports = impl; + try { + // When in node.js, try using crypto package for autoseeding. + nodecrypto = require('crypto'); + } catch (ex) {} +} else if (define && define.amd) { + define(function() { return impl; }); +} + +// +// Node.js native crypto support. +// + +// End anonymous scope, and pass initial values. +})( + this, // global window object + [], // pool: entropy pool starts empty + Math, // math: package containing random, pow, and seedrandom + 256, // width: each RC4 output is 0 <= x < 256 + 6, // chunks: at least six RC4 outputs for each double + 52, // digits: there are 52 significant digits in a double + (typeof module) == 'object' && module, // present in node.js + (typeof define) == 'function' && define, // present with an AMD loader + 'random'// rngname: name for Math.random and Math.seedrandom +); \ No newline at end of file diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.xml b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb07cd29fcb19f71ee6dcb7127886ed126fb43ef --- /dev/null +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/seedrandom.js.xml @@ -0,0 +1,32 @@ + + + + + + + + + + _Cacheable__manager_id + http_cache + + + __name__ + seedrandom.js + + + content_type + application/javascript + + + precondition + + + + title + + + + + + diff --git a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/springy.js.js b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/springy.js.js index 392f94b17ea5049049e4cce5ee05ce9c739ca765..df353d4c44507b6694731bf0f89532e9c7d4da16 100644 --- a/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/springy.js.js +++ b/bt5/erp5_graph_editor/SkinTemplateItem/portal_skins/erp5_graph_editor/dream_graph_editor/jsplumb/springy.js.js @@ -24,6 +24,13 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ + +// Nexedi patch: use seedrandom instead of Math.random to always get the same +// graph representation this will in order to be able to use seed and thus +// get the same set of random number, used to set the place of the graph nodes +var seeded_random = new Math.seedrandom('Using seedrandom for getting same set' + + 'of pseudorandom numbers.'); + (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. @@ -343,8 +350,7 @@ var mass = (node.data.mass !== undefined) ? node.data.mass : 1.0; this.nodePoints[node.id] = new Layout.ForceDirected.Point(Vector.random(), mass); } - - return this.nodePoints[node.id]; + return this.nodePoints[node.id]; }; Layout.ForceDirected.prototype.spring = function(edge) { @@ -576,8 +582,8 @@ this.y = y; }; - Vector.random = function() { - return new Vector(10.0 * (Math.random() - 0.5), 10.0 * (Math.random() - 0.5)); + Vector.random = function(){ + return new Vector(10.0 * (seeded_random() - 0.5), 10.0 * (seeded_random() - 0.5)); }; Vector.prototype.add = function(v2) { diff --git a/bt5/erp5_graph_editor/bt/template_action_path_list b/bt5/erp5_graph_editor/bt/template_action_path_list index 78005715da9f1fced5d09838316d053ea5595e6b..ea47f55dd91053da10ebde033facec8540c0871d 100644 --- a/bt5/erp5_graph_editor/bt/template_action_path_list +++ b/bt5/erp5_graph_editor/bt/template_action_path_list @@ -1 +1,3 @@ -Business Process | view_graph_editor \ No newline at end of file +Business Process | view_graph_editor +Workflow | reset_graph +Workflow | view_graph \ No newline at end of file diff --git a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/Base_getWorkflowWorklistInfo.py b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/Base_getWorkflowWorklistInfo.py index fc1ff9486eb082603f35dffe6420a4e4867a1b8c..435a7381bf107ae90071cf27fcef9c9150c641a0 100644 --- a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/Base_getWorkflowWorklistInfo.py +++ b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/Base_getWorkflowWorklistInfo.py @@ -5,6 +5,6 @@ portal_workflow = context.getPortalObject().portal_workflow workflow = getattr(portal_workflow, workflow_id) -worklist = getattr(workflow.worklists, worklist_id) -roles = worklist.getGuard().getRolesText().split(';') -return roles +worklist = workflow.getWorklistValueById(worklist_id) +role_list = worklist.getGuardRoleList() +return role_list diff --git a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py index e18797234df8eaca9affa0a1473883d6f29fadb9..a760e6b3ced9ed5c286d026d9ca00d5425db4fd7 100644 --- a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py +++ b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py @@ -14,7 +14,7 @@ except: return {} # If this is a worklist action, read the worklist definition -worklist = getattr(workflow.worklists, action['worklist_id']) +worklist = workflow.getWorklistValueById(action['worklist_id']) for varkey in worklist.getVarMatchKeys(): kw[varkey] = worklist.getVarMatch(varkey) diff --git a/bt5/erp5_system_event/CategoryTemplateItem/portal_categories/http_exchange_resource.xml b/bt5/erp5_system_event/CategoryTemplateItem/portal_categories/http_exchange_resource.xml index 2b231e2595942a4ab356fa2ed78f40e69be7c483..7f4f29d97b1b16d0b4fadccacc186b2d720f1448 100644 --- a/bt5/erp5_system_event/CategoryTemplateItem/portal_categories/http_exchange_resource.xml +++ b/bt5/erp5_system_event/CategoryTemplateItem/portal_categories/http_exchange_resource.xml @@ -6,53 +6,6 @@ - - _Add_portal_content_Permission - - - Assignor - Manager - - - - - _Add_portal_folders_Permission - - - Assignor - Manager - - - - - _Copy_or_Move_Permission - - - Assignor - Manager - - - - - _Delete_objects_Permission - - - Assignor - Manager - - - - - _Modify_portal_content_Permission - - - Assignee - Assignor - Manager - Owner - - - _count diff --git a/bt5/erp5_upgrader/PortalTypePropertySheetTemplateItem/property_sheet_list.xml b/bt5/erp5_upgrader/PortalTypePropertySheetTemplateItem/property_sheet_list.xml index ef5cfc42b172fe58d524f20b3a684ea543d5d052..6f5c7a361f660183900dd1cb5e89c059c2515d95 100644 --- a/bt5/erp5_upgrader/PortalTypePropertySheetTemplateItem/property_sheet_list.xml +++ b/bt5/erp5_upgrader/PortalTypePropertySheetTemplateItem/property_sheet_list.xml @@ -3,6 +3,5 @@ TemplateToolBusinessTemplateInstallationConstraint TemplateToolCategoryNameConstraint TemplateToolTableConsistencyConstraint - TemplateToolWorkflowChainConsistencyConstraint - \ No newline at end of file + diff --git a/bt5/erp5_upgrader/SkinTemplateItem/portal_skins/erp5_upgrader/TemplateTool_checkWorkflowChainConsistency.py b/bt5/erp5_upgrader/SkinTemplateItem/portal_skins/erp5_upgrader/TemplateTool_checkWorkflowChainConsistency.py index cd1be796fffd66c85e30662ca065332195aa3be4..6396ec481016c6cef66d2435e9fde6918619f26e 100644 --- a/bt5/erp5_upgrader/SkinTemplateItem/portal_skins/erp5_upgrader/TemplateTool_checkWorkflowChainConsistency.py +++ b/bt5/erp5_upgrader/SkinTemplateItem/portal_skins/erp5_upgrader/TemplateTool_checkWorkflowChainConsistency.py @@ -1,5 +1,6 @@ import re template_tool = context +portal = context.getPortalObject() bt5_per_title_dict = {} bt5_list = [i.getTitle() for i in \ @@ -39,19 +40,15 @@ for _, bt5_id in resolved_list: error_list = [] workflow_chain_by_portal_type_dict = context.ERP5Site_dumpWorkflowChainByPortalType() -new_workflow_chain_dict = {'chain_%s' % portal_type : ','.join(chain) \ - for portal_type, chain in workflow_chain_by_portal_type_dict.iteritems()} for portal_type, workflow_chain in portal_type_dict.iteritems(): workflow_chain_list = list(workflow_chain_by_portal_type_dict.get(portal_type, [])) + portal_type_document = portal.portal_types.getTypeInfo(portal_type) + workflow_chain_list = portal_type_document.getTypeWorkflowList() expected_workflow_chain = sorted(workflow_chain) if sorted(workflow_chain_list) != expected_workflow_chain: - error_list.append("%s - Expected: %s <> Found: %s" % (portal_type, ', '.join(workflow_chain), ', '.join(workflow_chain_list))) + error_list.append("%r - Expected: %s <> Found: %r" % (portal_type, workflow_chain, workflow_chain_list)) if fixit: - new_workflow_chain_dict["chain_%s" % portal_type] = ','.join(expected_workflow_chain) - -if fixit and new_workflow_chain_dict: - portal_workflow = context.getPortalObject().portal_workflow - portal_workflow.manage_changeWorkflows(default_chain="", props=new_workflow_chain_dict) + portal_type_document.setTypeWorkflowList(expected_workflow_chain) return error_list diff --git a/bt5/erp5_upgrader/TestTemplateItem/portal_components/test.erp5.testUpgrader.py b/bt5/erp5_upgrader/TestTemplateItem/portal_components/test.erp5.testUpgrader.py index 099cf71af035e66a3cf49e3dc68af1abb81eca2b..9cc437368215b3146a5f208b4d0e355565929ab1 100644 --- a/bt5/erp5_upgrader/TestTemplateItem/portal_components/test.erp5.testUpgrader.py +++ b/bt5/erp5_upgrader/TestTemplateItem/portal_components/test.erp5.testUpgrader.py @@ -222,14 +222,6 @@ class TestUpgrader(ERP5TypeTestCase): def stepCheckPostUpgradeEmptyConstraintList(self, sequence=None): self._checkEmptyConstraintList('upgrader_check_post_upgrade') - def stepCheckPosUpgradeWorkflowChainConsistency(self, sequence=None): - alarm = getattr(self.portal.portal_alarms, 'upgrader_check_post_upgrade') - active_process = alarm.getLastActiveProcess() - detail_list = active_process.getResultList()[0].detail - message = 'Preference - Expected: edit_workflow, preference_workflow <> Found: (Default)' - self.assertTrue(message in detail_list, detail_list) - self.assertTrue(detail_list.count(message), 1) - def stepSetConstraintInPersonModulePortalType(self, sequence=None): types_tool = self.portal.portal_types portal_type = types_tool['Person Module'] @@ -248,14 +240,6 @@ class TestUpgrader(ERP5TypeTestCase): portal_type.setTypePropertySheetList( portal_type.getTypePropertySheetList() + ['TemplateToolPostUpgradeConstraint',]) - def stepSetDefaultWorkflowChainToPreference(self, sequence=None): - workflow_chain_per_type_dict = {} - for portal_type, workflow_chain_list in self.portal.ERP5Site_dumpWorkflowChainByPortalType().iteritems(): - workflow_chain_per_type_dict['chain_%s' % portal_type] = ",".join(workflow_chain_list) - workflow_chain_per_type_dict['chain_Preference'] = '(Default)' - self.portal.portal_workflow.manage_changeWorkflows(default_chain="", - props=workflow_chain_per_type_dict) - def _stepSolveAlarm(self, alarm_id): getattr(self.portal.portal_alarms, alarm_id).solve() @@ -502,34 +486,6 @@ class TestUpgrader(ERP5TypeTestCase): self.assertTrue(message in detail_list, detail_list) self.assertTrue(detail_list.count(message), 1) - def test_workflow_chain_constraint(self): - """ Check if Workflow chains is broken, it can be detected and fixed after - upgrade""" - sequence_list = SequenceList() - sequence_string = """ - stepActiveSensePreUpgradeAlarm - stepTic - stepRunUpgrader - stepTic - stepCheckUpgradeNotRequired - stepTic - stepSetConstraintInTemplateToolPortalType - stepActiveSensePostUpgradeAlarm - stepTic - stepCheckPostUpgradeEmptyConstraintList - stepSetDefaultWorkflowChainToPreference - stepActiveSensePostUpgradeAlarm - stepTic - stepCheckPosUpgradeWorkflowChainConsistency - stepRunPostUpgrade - stepTic - stepActiveSensePostUpgradeAlarm - stepTic - stepCheckPostUpgradeEmptyConstraintList - """ - sequence_list.addSequenceString(sequence_string) - sequence_list.play(self) - def test_not_post_many_active_result_when_upgrade(self): """ Check that is possible fix consistency before the upgrade""" sequence_list = SequenceList() diff --git a/bt5/erp5_upgrader/bt/template_portal_type_property_sheet_list b/bt5/erp5_upgrader/bt/template_portal_type_property_sheet_list index f34929eb7e158aeddb150d396d438cccd37b7a72..5f1ba6b9f1ed112d1951bef8378dd33626f6561b 100644 --- a/bt5/erp5_upgrader/bt/template_portal_type_property_sheet_list +++ b/bt5/erp5_upgrader/bt/template_portal_type_property_sheet_list @@ -1,4 +1,3 @@ Template Tool | TemplateToolBusinessTemplateInstallationConstraint Template Tool | TemplateToolCategoryNameConstraint Template Tool | TemplateToolTableConsistencyConstraint -Template Tool | TemplateToolWorkflowChainConsistencyConstraint \ No newline at end of file diff --git a/bt5/erp5_upgrader/bt/template_property_sheet_id_list b/bt5/erp5_upgrader/bt/template_property_sheet_id_list index 6f5d350c65c50029f6058269fa45f9b6d145d22e..0de37b78e424ce845b444fd3fe4f66ecd3bc3fe5 100644 --- a/bt5/erp5_upgrader/bt/template_property_sheet_id_list +++ b/bt5/erp5_upgrader/bt/template_property_sheet_id_list @@ -1,4 +1,3 @@ TemplateToolBusinessTemplateInstallationConstraint TemplateToolCategoryNameConstraint TemplateToolTableConsistencyConstraint -TemplateToolWorkflowChainConsistencyConstraint \ No newline at end of file diff --git a/bt5/erp5_upgrader/bt/test_dependency_list b/bt5/erp5_upgrader/bt/test_dependency_list index eb1f0199f15d2088ef30cac84eb08a88b53c57c1..908dfcaf3094801addd79630e0b1a35e14b9a066 100644 --- a/bt5/erp5_upgrader/bt/test_dependency_list +++ b/bt5/erp5_upgrader/bt/test_dependency_list @@ -1,3 +1,4 @@ erp5_full_text_mroonga_catalog erp5_base -erp5_upgrader_test \ No newline at end of file +erp5_upgrader_test +erp5_workflow diff --git a/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebPageModule_viewWebPageList/listbox.xml b/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebPageModule_viewWebPageList/listbox.xml index a7e68dfa595f8c93d100edae5a4b6382d95e88fa..706c1b3a5bdef1b85a37ba682056c50b2e56789a 100644 --- a/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebPageModule_viewWebPageList/listbox.xml +++ b/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebPageModule_viewWebPageList/listbox.xml @@ -169,6 +169,10 @@ modification_date Modification Date + + portal_type + Type + @@ -204,6 +208,10 @@ int_index Index + + portal_type + Type + translated_validation_state_title State diff --git a/bt5/erp5_web/ToolTemplateItem/caching_policy_manager.xml b/bt5/erp5_web/ToolTemplateItem/caching_policy_manager.xml index 2eb740aec98336cf3fe9ef706a433a7ed7e6e5cd..5aa3dbc4ebd586e08d3b7a8a8d03ac09e97d0949 100644 --- a/bt5/erp5_web/ToolTemplateItem/caching_policy_manager.xml +++ b/bt5/erp5_web/ToolTemplateItem/caching_policy_manager.xml @@ -1649,4 +1649,4 @@
-
+
\ No newline at end of file diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20State/view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20State/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb5b1349f8397fff4be591dd3fedf79f457a19bd --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20State/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/ConfigurationState_view + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Transition/view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Transition/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..c248c06319068240dfa0ea4b15c8e8fe23cd667e --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Transition/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/ConfigurationTransition_view + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml new file mode 100644 index 0000000000000000000000000000000000000000..d7fe5e4778e0599e4624949357a5c6a11781a3b0 --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/launch_configuration.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + + + description + + + + + + icon + + + + id + launch_configuration + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 10.0 + + + title + Launch Configuration + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_launchConfiguration + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/state_view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/state_view.xml similarity index 87% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/state_view.xml rename to bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/state_view.xml index 89e95a5bcfbd68d88e26d88a850d746c6d4d55f7..4f5b5bc6f8373703e307293ae7f5f09e074c0cb7 100644 --- a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/state_view.xml +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/state_view.xml @@ -30,7 +30,9 @@ description - + + + icon @@ -48,6 +50,10 @@ + + portal_type + Action Information + priority 2.0 @@ -71,7 +77,7 @@ text - string:${object_url}/Workflow_viewStateList + string:${object_url}/ConfigurationWorkflow_viewStateList diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/transition_view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/transition_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..8266baaa933747d533d594e989f88305f710d98c --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/transition_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + transition_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 3.0 + + + title + Transitions + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/ConfigurationWorkflow_viewTransitionList + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/variable_view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/variable_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d28ad11728451f4d9428d4e55153566381a5925 --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/variable_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + variable_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 4.0 + + + title + Variables + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/ConfigurationWorkflow_viewVariableList + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..3290c37fb63aab2d3097560c8c545f3c5e565f18 --- /dev/null +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Configuration%20Workflow/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/ConfigurationWorkflow_view + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/view.xml b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/contents.xml similarity index 92% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/view.xml rename to bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/contents.xml index c7fb074e903e3a7b89da4618f05960220edfd13c..fc5af8cff2f96e4817d305b9ba7cd3ff859f1560 100644 --- a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/view.xml +++ b/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow%20Module/contents.xml @@ -30,7 +30,9 @@ description - + + + icon @@ -38,7 +40,7 @@ id - view + contents permissions @@ -54,7 +56,7 @@ title - View + Contents visible diff --git a/bt5/erp5_workflow/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml b/bt5/erp5_workflow/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml index 45b73ccd71c0bf47648110d7745e65e90cefc7d7..eed939461d971bd464192c241abb3bf7c29f1e38 100644 --- a/bt5/erp5_workflow/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml +++ b/bt5/erp5_workflow/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml @@ -1,14 +1,15 @@ - + Transition Variable - - State - Transition - Variable + + Configuration State + Configuration Transition + Embedded File + Workflow Variable Worklist - Workflow + Configuration Workflow \ No newline at end of file diff --git a/bt5/erp5_workflow/PortalTypeBaseCategoryTemplateItem/base_category_list.xml b/bt5/erp5_workflow/PortalTypeBaseCategoryTemplateItem/base_category_list.xml deleted file mode 100644 index 1720f54e4e12a9f2ead5695bc62992d42ea5e828..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/PortalTypeBaseCategoryTemplateItem/base_category_list.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - causality - - \ No newline at end of file diff --git a/bt5/erp5_workflow/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml b/bt5/erp5_workflow/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..be69db8e9e96a26ab9f22d259985f3ed49552b46 --- /dev/null +++ b/bt5/erp5_workflow/PortalTypeHiddenContentTypeTemplateItem/hidden_content_type_list.xml @@ -0,0 +1,5 @@ + + + Embedded File + + \ No newline at end of file diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20State.xml b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20State.xml new file mode 100644 index 0000000000000000000000000000000000000000..83d779a28b94bd4ce8210cbdcb37c95812a739d2 --- /dev/null +++ b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20State.xml @@ -0,0 +1,56 @@ + + + + + + + + + + content_icon + document.gif + + + description + A busniess configuration state. + + + id + Configuration State + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + ConfigurationState + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Transition.xml b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..33cff219d1fa0fc44c29681af9b52ef87f85cd14 --- /dev/null +++ b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Transition.xml @@ -0,0 +1,60 @@ + + + + + + + + + + acquire_local_roles + 1 + + + content_icon + document.gif + + + description + A business configuration transition. + + + id + Configuration Transition + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + ConfigurationTransition + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Workflow.xml b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Workflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d193203e902a41ee09b3eba4e34f27ce98616ab --- /dev/null +++ b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Configuration%20Workflow.xml @@ -0,0 +1,58 @@ + + + + + + + + + + content_icon + + + + + + description + A business configuration workflow. + + + id + Configuration Workflow + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + ConfigurationWorkflow + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow%20Module.xml b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow%20Module.xml index 4ce74a11be72b7fd81d4b856dec9451056eb58bb..4f0756a9d10c447d679ef82cef72e1d366c99687 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow%20Module.xml +++ b/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow%20Module.xml @@ -42,6 +42,12 @@ Folders allow to store a large number of documents (1,000,000 should not\n be a problem). + + erp5workflow_list + + + + factory addFolder @@ -64,7 +70,15 @@ be a problem). init_script - + + + + + + permission + + + title @@ -74,6 +88,18 @@ be a problem). type_class Folder + + type_interface + + + + + + type_mixin + + + +
diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view.xml index 202e6159bdec2703cf6227800d3985124854b81f..2fc5fad91008b6c6ce304f9a1f37eeb5f9f4e60f 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view.xml @@ -103,7 +103,7 @@ id - State_view + ConfigurationState_view method diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_comment.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_comment.xml similarity index 90% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_comment.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_comment.xml index 1dc23699fa9fe850200b2976de8b7d52fe6730e1..f4f6441ba9329d3b048cbb0cf46590f7c54a88e7 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_comment.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_comment.xml @@ -9,7 +9,9 @@ delegated_list - + + title + @@ -81,7 +83,11 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary + + + title + Comment diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_description.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_description.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_description.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_description.xml index 4804fbd9924d6a7ad3c58a2425d0cb4a6630056c..6eb56cfa47e9924cccf129ed030c9b5f3a8bb3dd 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_description.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_description.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_destination_title_list.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_destination_title_list.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_destination_title_list.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_destination_title_list.xml index 9927720c38c6fc6aecdcb808e40898ffa770d1b1..6d53dd2259b811358d47f73668f39f847095c756 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_destination_title_list.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_destination_title_list.xml @@ -403,6 +403,10 @@ container_getter_id + + context_getter_id + + css_class @@ -494,12 +498,22 @@ - Transition - Transition + Configuration Transition + Configuration Transition + + proxy_listbox_ids + + + + + + relation_form_id + + relation_setter_id diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_title.xml index c82e61b034c5c05f4d40d23ae067d94dd9b204fb..aba1fb5f2ec26901ea85208a74ec16ec9cbb82e8 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationState_view/my_title.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view.xml similarity index 95% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view.xml index 724ef0ea183b009fc884cf64158202b87bc44b0a..c23448c9eb4f9b38421d0ea0a4b197dab0efd0fd 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view.xml @@ -98,8 +98,8 @@ my_transition_form_id - my_before_script_id - my_after_script_id + my_before_script_list + my_after_script_list @@ -108,7 +108,7 @@ id - Transition_view + ConfigurationTransition_view method diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/listbox.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..231f9aea4ccc000c4d1b517ba4d6bbcd30416623 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/listbox.xml @@ -0,0 +1,133 @@ + + + + + + + + + + delegated_list + + + columns + portal_types + selection_name + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + id + ID + + + causality_title + Causality + + + Variable_getNonEvaluatedVariableValue + Value + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Transition Variable + Transition Variable + + + + + + selection_name + configuration_transition_variable_selection + + + target + Click to edit the target + + + title + Transition Variables + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_after_script_id.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_after_script_list.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_after_script_id.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_after_script_list.xml index a903ef87ddadaeec37e58a5876d1103471caebf2..92a7842fd1fb53c8dea7dd90efd0007d26d5cdaa 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_after_script_id.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_after_script_list.xml @@ -8,7 +8,7 @@ id - my_after_script_id + my_after_script_list message_values @@ -205,7 +205,7 @@ display_width - 30 + 40 editable diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_before_script_id.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_before_script_list.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_before_script_id.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_before_script_list.xml index 317bc9b5b3e0b3c7a4ba8527230537a96b947271..956d8888b128f33d230325e8cbbd36441f6c94b5 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_before_script_id.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_before_script_list.xml @@ -8,7 +8,7 @@ id - my_before_script_id + my_before_script_list message_values @@ -205,7 +205,7 @@ display_width - 30 + 40 editable diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_description.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_description.xml similarity index 100% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_description.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_description.xml diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_destination_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_destination_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_destination_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_destination_title.xml index a12837d478cc05e3391f5fc6186bb9603056d595..7014024ef5bf63b511fabcc429a546c87ee510a2 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_destination_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_destination_title.xml @@ -387,15 +387,17 @@ container_getter_id + + context_getter_id + + css_class default - - - + description @@ -474,12 +476,22 @@ - State - State + Configuration State + Configuration State + + proxy_listbox_ids + + + + + + relation_form_id + + relation_setter_id diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_guard_expression.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_guard_expression.xml similarity index 94% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_guard_expression.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_guard_expression.xml index ed605fd5f59f5261592311aa80256cae727583ad..9b5e002a5457d2df5a2bca4ab75bf4d70139aaa7 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_guard_expression.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_guard_expression.xml @@ -77,6 +77,10 @@ hidden + + input_type + + max_length @@ -154,6 +158,10 @@ hidden + + input_type + + max_length @@ -207,7 +215,7 @@ display_width - 60 + 50 editable @@ -229,6 +237,10 @@ hidden 0 + + input_type + text + max_length @@ -261,13 +273,7 @@
- - - Products.Formulator.TALESField - TALESMethod - - - + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_title.xml index c82e61b034c5c05f4d40d23ae067d94dd9b204fb..aba1fb5f2ec26901ea85208a74ec16ec9cbb82e8 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_title.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_transition_form_id.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_transition_form_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8674c1993e65cf732a43618bf3abc4174dc1d74 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationTransition_view/my_transition_form_id.xml @@ -0,0 +1,272 @@ + + + + + + + + + + id + my_transition_form_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + input_type + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + input_type + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 40 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Form + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view.xml index 95a615e335d17f3835f05f885e31e23e4a959163..016f64711de1cb1ef1c3e4e9b17de2158bcfda7d 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view.xml @@ -85,6 +85,7 @@ left + my_id my_title @@ -102,7 +103,7 @@ id - Workflow_view + ConfigurationWorkflow_view method diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_comment.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_comment.xml similarity index 90% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_comment.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_comment.xml index 1dc23699fa9fe850200b2976de8b7d52fe6730e1..f4f6441ba9329d3b048cbb0cf46590f7c54a88e7 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_comment.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_comment.xml @@ -9,7 +9,9 @@ delegated_list - + + title + @@ -81,7 +83,11 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary + + + title + Comment diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_description.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_description.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_description.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_description.xml index 4804fbd9924d6a7ad3c58a2425d0cb4a6630056c..6eb56cfa47e9924cccf129ed030c9b5f3a8bb3dd 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_description.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_description.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_transition_form_id.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_id.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_transition_form_id.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_id.xml index 4a30c2c106b102074564d21f4bc08b9a31eac9ca..af11b6f69859ac0e10458633da1072f981cde4ac 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_transition_form_id.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_id.xml @@ -8,7 +8,7 @@ id - my_transition_form_id + my_id message_values @@ -205,7 +205,7 @@ display_width - 30 + 20 editable @@ -237,7 +237,7 @@ title - Form + ID truncate diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_title.xml index c82e61b034c5c05f4d40d23ae067d94dd9b204fb..aba1fb5f2ec26901ea85208a74ec16ec9cbb82e8 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/State_view/my_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_view/my_title.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList.xml similarity index 94% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList.xml index 7207b35b391d000245d4e915f3a556e6518ab3e5..7ca66a72749a74be215c8e7ccbef130c8777725d 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList.xml @@ -78,9 +78,7 @@ hidden - - listbox_title - + @@ -103,7 +101,7 @@ id - Workflow_viewStateList + ConfigurationWorkflow_viewStateList method @@ -111,7 +109,7 @@ name - Workflow_viewStateList + ConfigurationWorkflow_viewStateList pt diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/listbox.xml similarity index 95% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/listbox.xml index efecbd2c76a73225a120d3ac0a41310e4246c9d5..f3d0b090c95fd73f0059f2f8bd4b588c60115f2a 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/listbox.xml @@ -82,7 +82,7 @@ id - ID + Reference title @@ -129,15 +129,15 @@ - State - State + Configuration State + Configuration State selection_name - workflow_state_selection + configuration_state_selection target diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_source_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_source_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..612e37a262349c44619fd2e5ec7dcb7d5d2e36a4 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_source_title.xml @@ -0,0 +1,147 @@ + + + + + + + + + + delegated_list + + + base_category + catalog_index + parameter_list + portal_type + title + + + + + id + my_source_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + parameter_list + + AAAAAAAAAAI= + + + + target + + + + + + + values + + + + base_category + source + + + catalog_index + title + + + field_id + my_relation_field + + + form_id + Base_viewFieldLibrary + + + parameter_list + + + + + + portal_type + + + + Configuration State + Configuration State + + + + + + target + Click to edit the target + + + title + Initial State + + + + + + + + + + + + + + + + + + _text + python: [(\'parent_uid\', here.getUid())] + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_title.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_title.xml index a0a914a8b59e77f59c2ca04be6fe9ca967aebe5d..4665b8b1481d2e72319f73342c2bab3d22f9f43b 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/my_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewStateList/my_title.xml @@ -87,7 +87,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList.xml new file mode 100644 index 0000000000000000000000000000000000000000..1231ba919f03d0609e17699ab43fe836dfcc3f32 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList.xml @@ -0,0 +1,138 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + + + + hidden + + + + + + left + + + + + + right + + + + + + + + + id + ConfigurationWorkflow_viewTransitionList + + + method + POST + + + name + Workflow_viewTransitionList + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Transitions + + + unicode_mode + 0 + + + update_action + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList/listbox.xml similarity index 88% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList/listbox.xml index 8011adf40e1250e2163a5e9fc955b52682cb5652..4456231283c327cd2abc2d121605cba45ec61fd2 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewTransitionList/listbox.xml @@ -10,11 +10,11 @@ delegated_list - title columns - selection_name - portal_types editable_columns + portal_types + selection_name + title @@ -81,7 +81,7 @@ id - ID + Reference title @@ -91,6 +91,14 @@ destination_title Destination State + + before_script_id + Before Script + + + after_script_id + After Script + @@ -118,15 +126,15 @@ - Transition - Transition + Configuration Transition + Configuration Transition selection_name - workflow_transition_selection + configuration_transition_selection target diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList.xml similarity index 92% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList.xml index 38a17044703c82c801eac2429bc4603d8a00ff18..ff6ca1bcaf5c01c918c43837057ac4ca543eb5d8 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList.xml @@ -64,15 +64,15 @@ bottom - + + listbox + center - - my_comment - + @@ -86,7 +86,7 @@ my_title - my_description + my_state_base_category @@ -101,7 +101,7 @@ id - Worklist_view + ConfigurationWorkflow_viewVariableList method @@ -109,7 +109,7 @@ name - Worklist_view + Workflow_viewVariableList pt @@ -125,7 +125,7 @@ title - Worklist + Variables unicode_mode diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/listbox.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..57124256d2cc81d5dab3d0564badb13a7cdaec16 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/listbox.xml @@ -0,0 +1,176 @@ + + + + + + + + + + delegated_list + + + columns + default_params + editable_columns + portal_types + selection_name + sort + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + title + Title + + + Variable_getNonEvaluatedVariableValue + Initial Value + + + automatic_update + Update on every Transition + + + for_catalog + Available for Catalog + + + variable_expression + Expression + + + + + + default_params + + + + + + editable_columns + + + + title + Title + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Workflow Variable + Workflow Variable + + + + + + selection_name + configuration_workflow_variable_selection + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + Variables + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_state_base_category.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_state_base_category.xml similarity index 84% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_state_base_category.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_state_base_category.xml index 999698166a64dca11949dbb96dde1d3e339a0db9..009cd0e58aa8154c4cc168773238092f3c0daa4f 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_state_base_category.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_state_base_category.xml @@ -10,8 +10,8 @@ delegated_list - title items + title @@ -71,6 +71,10 @@ target + + title + + @@ -80,19 +84,25 @@ field_id - my_category + my_list_field form_id Base_viewFieldLibrary + + items + + + + target Click to edit the target title - State Variable Name + State Variable @@ -102,16 +112,13 @@ - - - - + _text - python: [(x.getTitleOrId(), x.getId()) for x in here.portal_categories.contentValues()] + python: [(x.getTitleOrId(), x.getId()) for x in here.getPortalObject().portal_categories.objectValues()] diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_title.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_title.xml index a0a914a8b59e77f59c2ca04be6fe9ca967aebe5d..4665b8b1481d2e72319f73342c2bab3d22f9f43b 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_title.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/ConfigurationWorkflow_viewVariableList/my_title.xml @@ -87,7 +87,7 @@ form_id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.py b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.py deleted file mode 100644 index 95895ab553d1d71715b2a880ecc8857a0fef508d..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_getNonEvaluatedInitialValue.py +++ /dev/null @@ -1 +0,0 @@ -return context.getInitialValue(evaluate=0) diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary.xml index ad35439b882093b45e7168bc00b231f730f01ced..feec2fd7309201f6ac93fb6fc740cad9a732049e 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary.xml @@ -101,7 +101,7 @@ id - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary method @@ -109,7 +109,7 @@ name - BaseWorkflow_FieldLibrary + Workflow_viewFieldLibrary pt diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_comment.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..4a7d6d68916dd68e9a61ca0fea962952ae3e0f46 --- /dev/null +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_comment.xml @@ -0,0 +1,96 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_text_area_field + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Comment + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_description.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_description.xml similarity index 100% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/my_description.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_description.xml diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_id.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_id.xml similarity index 100% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_id.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_id.xml index c092d0c5484b1d38a82706dc674ff9fb96c1c2a1..9430a0809d230a59fd87a4f29812fc6dcee6aaac 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_id.xml +++ b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_id.xml @@ -10,8 +10,8 @@ delegated_list - title editable + title diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_title.xml similarity index 100% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_title.xml rename to bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewFieldLibrary/my_title.xml diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox_title.xml deleted file mode 100644 index e0e63bee67c8caac046dc47322f111e04ed2485e..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox_title.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - delegated_list - - - - - - id - listbox_title - - - message_values - - - - external_validator_failed - The input failed the external validator. - - - - - - overrides - - - - field_id - - - - form_id - - - - target - - - - - - - tales - - - - field_id - - - - form_id - - - - target - - - - - - - values - - - - field_id - my_title - - - form_id - Base_viewFieldLibrary - - - target - Click to edit the target - - - - - - - - diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/my_title.xml deleted file mode 100644 index a0a914a8b59e77f59c2ca04be6fe9ca967aebe5d..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/my_title.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - delegated_list - - - editable - - - - - id - my_title - - - message_values - - - - external_validator_failed - The input failed the external validator. - - - - - - overrides - - - - extra_context - - - - field_id - - - - form_id - - - - - - - tales - - - - extra_context - - - - field_id - - - - form_id - - - - - - - values - - - - editable - 0 - - - extra_context - - - - - - field_id - my_title - - - form_id - BaseWorkflow_FieldLibrary - - - - - - - - diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_comment.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_comment.xml deleted file mode 100644 index 1dc23699fa9fe850200b2976de8b7d52fe6730e1..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_comment.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - delegated_list - - - - - - id - my_comment - - - message_values - - - - external_validator_failed - The input failed the external validator. - - - - - - overrides - - - - extra_context - - - - field_id - - - - form_id - - - - - - - tales - - - - extra_context - - - - field_id - - - - form_id - - - - - - - values - - - - extra_context - - - - - - field_id - my_comment - - - form_id - BaseWorkflow_FieldLibrary - - - - - - - - diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_description.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_description.xml deleted file mode 100644 index 4804fbd9924d6a7ad3c58a2425d0cb4a6630056c..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_description.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - delegated_list - - - - - - id - my_description - - - message_values - - - - external_validator_failed - The input failed the external validator. - - - - - - overrides - - - - extra_context - - - - field_id - - - - form_id - - - - - - - tales - - - - extra_context - - - - field_id - - - - form_id - - - - - - - values - - - - extra_context - - - - - - field_id - my_description - - - form_id - BaseWorkflow_FieldLibrary - - - - - - - - diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_title.xml b/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_title.xml deleted file mode 100644 index c82e61b034c5c05f4d40d23ae067d94dd9b204fb..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Worklist_view/my_title.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - delegated_list - - - - - - id - my_title - - - message_values - - - - external_validator_failed - The input failed the external validator. - - - - - - overrides - - - - extra_context - - - - field_id - - - - form_id - - - - - - - tales - - - - extra_context - - - - field_id - - - - form_id - - - - - - - values - - - - extra_context - - - - - - field_id - my_title - - - form_id - BaseWorkflow_FieldLibrary - - - - - - - - diff --git a/bt5/erp5_workflow/bt/description b/bt5/erp5_workflow/bt/description index d72f834785b6448643497888e66d6df383be8bf1..1ebc692d10e4a2d987430a5ffa08b52fed3c9146 100644 --- a/bt5/erp5_workflow/bt/description +++ b/bt5/erp5_workflow/bt/description @@ -1 +1 @@ -Using this template you can create a workflow in ERP5. \ No newline at end of file +Contains configurator workflow related files. \ No newline at end of file diff --git a/bt5/erp5_workflow/bt/template_action_path_list b/bt5/erp5_workflow/bt/template_action_path_list index 70abc89d3968f87abf2cba234b61df988b0cf367..133d45e48b0365dbf9d1b722e43ec4f282c59178 100644 --- a/bt5/erp5_workflow/bt/template_action_path_list +++ b/bt5/erp5_workflow/bt/template_action_path_list @@ -1,12 +1,8 @@ -State | view -Transition Variable | view -Transition | view -Variable | view -Workflow Module | view -Workflow | state_view -Workflow | transition_view -Workflow | variable_view -Workflow | view -Workflow | view_graph -Workflow | worklist_view -Worklist | view \ No newline at end of file +Configuration State | view +Configuration Transition | view +Configuration Workflow | launch_configuration +Configuration Workflow | state_view +Configuration Workflow | transition_view +Configuration Workflow | variable_view +Configuration Workflow | view +Workflow Module | contents \ No newline at end of file diff --git a/bt5/erp5_workflow/bt/template_portal_type_allowed_content_type_list b/bt5/erp5_workflow/bt/template_portal_type_allowed_content_type_list index 7ce0de933bf42eef899928ec635d846d323e531f..5e3ce2dedea4ed6b8e235cbaad320a1580354ce8 100644 --- a/bt5/erp5_workflow/bt/template_portal_type_allowed_content_type_list +++ b/bt5/erp5_workflow/bt/template_portal_type_allowed_content_type_list @@ -1,6 +1,7 @@ -Transition | Transition Variable -Workflow Module | Workflow -Workflow | State -Workflow | Transition -Workflow | Variable -Workflow | Worklist \ No newline at end of file +Configuration Transition | Transition Variable +Configuration Workflow | Configuration State +Configuration Workflow | Configuration Transition +Configuration Workflow | Embedded File +Configuration Workflow | Workflow Variable +Configuration Workflow | Worklist +Workflow Module | Configuration Workflow \ No newline at end of file diff --git a/bt5/erp5_workflow/bt/template_portal_type_base_category_list b/bt5/erp5_workflow/bt/template_portal_type_base_category_list deleted file mode 100644 index 442fd83e95354bca603c1253eab6675abb248be6..0000000000000000000000000000000000000000 --- a/bt5/erp5_workflow/bt/template_portal_type_base_category_list +++ /dev/null @@ -1 +0,0 @@ -Transition Variable | causality \ No newline at end of file diff --git a/bt5/erp5_workflow/bt/template_portal_type_hidden_content_type_list b/bt5/erp5_workflow/bt/template_portal_type_hidden_content_type_list new file mode 100644 index 0000000000000000000000000000000000000000..df67d7686ad3c69147cb2208ea7591f16b3d2459 --- /dev/null +++ b/bt5/erp5_workflow/bt/template_portal_type_hidden_content_type_list @@ -0,0 +1 @@ +Configuration Workflow | Embedded File \ No newline at end of file diff --git a/bt5/erp5_workflow/bt/template_portal_type_id_list b/bt5/erp5_workflow/bt/template_portal_type_id_list index d77d0e8eba3d8c298a2a32328d93d6f150125ae3..8f052dea05530737c27596318e230ecaf5a464b9 100644 --- a/bt5/erp5_workflow/bt/template_portal_type_id_list +++ b/bt5/erp5_workflow/bt/template_portal_type_id_list @@ -1,7 +1,4 @@ -State -Transition -Transition Variable -Variable -Workflow -Workflow Module -Worklist \ No newline at end of file +Configuration State +Configuration Transition +Configuration Workflow +Workflow Module \ No newline at end of file diff --git a/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Document/view.xml b/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Document/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..f306b7c72d32b448e2fbb3c913571fe92787a33d --- /dev/null +++ b/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Document/view.xml @@ -0,0 +1,83 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowTestDocument_view + + + + + diff --git a/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Module/view.xml b/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Module/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..81fa5e11e74e1669d8792a2d9a5c4b9509824dbb --- /dev/null +++ b/bt5/erp5_workflow_test/ActionTemplateItem/portal_types/Workflow%20Test%20Module/view.xml @@ -0,0 +1,83 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_list + + + + + category + object_list + + + condition + + + + description + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowTestModule_viewWorkflowTestDocumentList + + + + + diff --git a/bt5/erp5_workflow_test/ModuleTemplateItem/workflow_test_module.xml b/bt5/erp5_workflow_test/ModuleTemplateItem/workflow_test_module.xml new file mode 100644 index 0000000000000000000000000000000000000000..92de0beb9f5fe9755cccb809900121bcb8920bf7 --- /dev/null +++ b/bt5/erp5_workflow_test/ModuleTemplateItem/workflow_test_module.xml @@ -0,0 +1,96 @@ + + workflow_test_module + + + Access Transient Objects + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Access contents information + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Access session data + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Add portal content + Assignor + Author + Manager + + + Add portal folders + Assignor + Author + Manager + + + Change local roles + Assignor + Manager + + + Copy or Move + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Delete objects + Assignor + Manager + + + List folder contents + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Modify portal content + Assignor + Manager + + + View + Assignee + Assignor + Associate + Auditor + Manager + + + View History + Assignee + Assignor + Associate + Auditor + Author + Manager + + + Workflow Test Module + Workflow Tests + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper.xml b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper.xml new file mode 100644 index 0000000000000000000000000000000000000000..13a61f452995f438c9a32fe1048fb330224c31a2 --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper.xml @@ -0,0 +1,361 @@ + + + + + + + + + + _Access_contents_information_Permission + + + Assignee + Assignor + Associate + Auditor + Manager + + + + + _Add_portal_content_Permission + + + Assignee + Assignor + Associate + Manager + + + + + _Modify_portal_content_Permission + + + Assignee + Assignor + Associate + Manager + + + + + _View_Permission + + + Assignee + Assignor + Associate + Auditor + Manager + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + description + + + + + + first_name + workflow + + + id + test_workflow_developper + + + last_name + development + + + password + + AAAAAAAAAAU= + + + + portal_type + Person + + + default_reference + workflow_development + + + user_id + workflow_development + + + workflow_history + + AAAAAAAAAAY= + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + data + + + + default + {SSHA}ezO08GwlTrygumfPqQPflAqwuxKnG80qpCM5 + + + + + + + + + + + + + + + data + + + + edit_workflow + + AAAAAAAAAAc= + + + + user_account_workflow + + AAAAAAAAAAg= + + + + validation_workflow + + AAAAAAAAAAk= + + + + + + + + + + + + + + + + + + + action + edit + + + actor + zope + + + comment + + + + + + error_message + + + + serial + 942.10105.41541.21230 + + + state + current + + + time + + + + + + + + + + + 1437750445.1 + UTC + + + + + + + + + + + + + + + + + + + + + action + + + + + + actor + zope + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1428318888.26 + UTC + + + + + + + user_account_state + draft + + + + + + + + + + + + + + + + + action + validate + + + actor + zope + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1437734527.02 + UTC + + + + + + + validation_state + validated + + + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/1.xml b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/1.xml new file mode 100644 index 0000000000000000000000000000000000000000..13b31a1fcd6a304b8ab77af93800d4e7ea32e27b --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/1.xml @@ -0,0 +1,259 @@ + + + + + + + + + + _Access_contents_information_Permission + + + Assignee + Assignor + Auditor + Manager + Owner + + + + + _Modify_portal_content_Permission + + + Assignee + Assignor + Manager + Owner + + + + + _View_Permission + + + Assignee + Assignor + Auditor + Manager + Owner + + + + + _identity_criterion + + AAAAAAAAAAI= + + + + _range_criterion + + AAAAAAAAAAM= + + + + categories + + + group/test_group + + + + + description + + + + + + id + 1 + + + portal_type + Assignment + + + workflow_history + + AAAAAAAAAAQ= + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + assignment_workflow + + AAAAAAAAAAU= + + + + edit_workflow + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + + + + action + + + + + + actor + zope + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1428318982.17 + UTC + + + + + + + validation_state + draft + + + + + + + + + + + + + + + + + action + edit + + + actor + zope + + + comment + + + + + + error_message + + + + serial + 942.10090.25961.26606 + + + state + current + + + time + + + + + + + + + + + 1433410985.17 + UTC + + + + + + + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/2.xml b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6f8b10eb28e306e07677f38f578cb310825942f --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/2.xml @@ -0,0 +1,292 @@ + + + + + + + + + + _Access_contents_information_Permission + + + Assignor + Auditor + Manager + Owner + + + + + _Modify_portal_content_Permission + + + Manager + + + + + _View_Permission + + + Assignor + Auditor + Manager + Owner + + + + + _identity_criterion + + AAAAAAAAAAI= + + + + _range_criterion + + AAAAAAAAAAM= + + + + categories + + + group/develop_group + + + + + description + + + + + + id + 2 + + + portal_type + Assignment + + + start_date + + + + + + + + + + + 978307200.0 + UTC + + + + + + + stop_date + + + + + + + + + 7289654400.0 + UTC + + + + + + + title + Developer Group + + + workflow_history + + AAAAAAAAAAQ= + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + assignment_workflow + + AAAAAAAAAAU= + + + + edit_workflow + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + + + + action + open + + + actor + zope + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1428320244.8 + UTC + + + + + + + validation_state + open + + + + + + + + + + + + + + + + + action + edit + + + actor + zope + + + comment + + + + + + error_message + + + + serial + 942.10105.27094.39236 + + + state + current + + + time + + + + + + + + + + + 1433410985.17 + UTC + + + + + + + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/3.xml b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/3.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fec5e5e6fd53d86dcf0510f8a39538b3c575943 --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/3.xml @@ -0,0 +1,210 @@ + + + + + + + + + + _Access_contents_information_Permission + + + Assignee + Assignor + Associate + Auditor + Manager + + + + + _Add_portal_content_Permission + + + Manager + + + + + _Modify_portal_content_Permission + + + Manager + + + + + _View_Permission + + + Assignee + Assignor + Associate + Auditor + Manager + + + + + default_reference + workflow_development + + + id + 3 + + + portal_type + ERP5 Login + + + workflow_history + + AAAAAAAAAAI= + + + + + + + + + + + + + data + + + + edit_workflow + + AAAAAAAAAAM= + + + + login_validation_workflow + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + + + + action + edit + + + actor + ERP5TypeTestCase + + + comment + + + + + + error_message + + + + serial + 956.27221.25187.60262 + + + state + current + + + time + + + + + + + + + + + 1483533511.11 + GMT + + + + + + + + + + + + + + + + + + + + + action + validate + + + actor + ERP5TypeTestCase + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1483533770.62 + GMT + + + + + + + validation_state + validated + + + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/default_career.xml b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/default_career.xml new file mode 100644 index 0000000000000000000000000000000000000000..66e960f4596e72c05383ac3f33309129001a6fde --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/person_module/test_workflow_developper/default_career.xml @@ -0,0 +1,186 @@ + + + + + + + + + + _Access_contents_information_Permission + + + Assignee + Assignor + Auditor + Manager + Owner + + + + + _Modify_portal_content_Permission + + + Assignee + Assignor + Manager + Owner + + + + + _View_Permission + + + Assignee + Assignor + Auditor + Manager + Owner + + + + + _identity_criterion + + AAAAAAAAAAI= + + + + _range_criterion + + AAAAAAAAAAM= + + + + categories + + + + + + id + default_career + + + portal_type + Career + + + workflow_history + + AAAAAAAAAAQ= + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + career_workflow + + AAAAAAAAAAU= + + + + + + + + + + + + + + + + + + + action + + + + + + actor + zope + + + comment + + + + error_message + + + + time + + + + + + + + + + + 1428318915.53 + UTC + + + + + + + validation_state + draft + + + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/develop_group.xml b/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/develop_group.xml new file mode 100644 index 0000000000000000000000000000000000000000..608e92f754c50a583edf9abd8285b69bf457a8aa --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/develop_group.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + group/develop_group + + + + + codification + DEVELOP + + + description + + + + + + id + develop_group + + + portal_type + Category + + + title + Develop + + + + + diff --git a/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/test_group.xml b/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/test_group.xml new file mode 100644 index 0000000000000000000000000000000000000000..189fcc6ff929b3a5c6e0a536d7776cff89cfcda7 --- /dev/null +++ b/bt5/erp5_workflow_test/PathTemplateItem/portal_categories/group/test_group.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + group/test_group + + + + + codification + TEST + + + description + + + + + + id + test_group + + + portal_type + Category + + + title + Test + + + + + diff --git a/bt5/erp5_workflow_test/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml b/bt5/erp5_workflow_test/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml new file mode 100644 index 0000000000000000000000000000000000000000..8d88fd058072c6ae6eedf111a9623aafa13418fb --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml @@ -0,0 +1,5 @@ + + + Workflow Test Document + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeBaseCategoryTemplateItem/base_category_list.xml b/bt5/erp5_workflow_test/PortalTypeBaseCategoryTemplateItem/base_category_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..439cce5cdfd33fb5ad875905612eed51e8c81e3f --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeBaseCategoryTemplateItem/base_category_list.xml @@ -0,0 +1,5 @@ + + + business_application + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypePropertySheetTemplateItem/property_sheet_list.xml b/bt5/erp5_workflow_test/PortalTypePropertySheetTemplateItem/property_sheet_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..c27e764854f0042aed5cab4f59077b8cae012688 --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypePropertySheetTemplateItem/property_sheet_list.xml @@ -0,0 +1,5 @@ + + + Comment + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction%20Workflow.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction%20Workflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b39fde9ba89c79a7d4dd415305958383f2290db --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction%20Workflow.xml @@ -0,0 +1,6 @@ + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b39fde9ba89c79a7d4dd415305958383f2290db --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Interaction.xml @@ -0,0 +1,6 @@ + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/PermissionRoles.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/PermissionRoles.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b39fde9ba89c79a7d4dd415305958383f2290db --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/PermissionRoles.xml @@ -0,0 +1,6 @@ + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/State.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/State.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa8f81845f0db79bbf0d14302795ef72c5bcc2ac --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/State.xml @@ -0,0 +1,9 @@ + + + group/test_group + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Transition.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Transition.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa8f81845f0db79bbf0d14302795ef72c5bcc2ac --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Transition.xml @@ -0,0 +1,9 @@ + + + group/test_group + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Script.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Script.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b39fde9ba89c79a7d4dd415305958383f2290db --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Script.xml @@ -0,0 +1,6 @@ + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Document.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Document.xml new file mode 100644 index 0000000000000000000000000000000000000000..558080fbb001a4df0372a9261f6cab6735a5c5c6 --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Document.xml @@ -0,0 +1,11 @@ + + + Developer Group + group/develop_group + + + Test Group + Everyone in the main group can work on documents + group/test_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Module.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Module.xml new file mode 100644 index 0000000000000000000000000000000000000000..8454d3c32d636cb61217b2638521240bced7fa14 --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Test%20Module.xml @@ -0,0 +1,11 @@ + + + Developer Group + group/develop_group + + + Test Group + Everyone in the main group can see and create documents + group/test_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Tool.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Tool.xml new file mode 100644 index 0000000000000000000000000000000000000000..600ebe860dd0f884a53c0e7a8e5bb4f3e5abf22f --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Tool.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Variable.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Variable.xml new file mode 100644 index 0000000000000000000000000000000000000000..600ebe860dd0f884a53c0e7a8e5bb4f3e5abf22f --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow%20Variable.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e8175ea570fb4bd98309441af7c7866332369de --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Workflow.xml @@ -0,0 +1,9 @@ + + + group/test_group + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Worklist.xml b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Worklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa8f81845f0db79bbf0d14302795ef72c5bcc2ac --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeRolesTemplateItem/Worklist.xml @@ -0,0 +1,9 @@ + + + group/test_group + + + Developer Group + group/develop_group + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Document.xml b/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Document.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a0e21a73394eafc6a97ba2e98c72ad15cdda47c --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Document.xml @@ -0,0 +1,94 @@ + + + + + + + + + + content_icon + + + + + + description + + + + + + factory + addXMLObject + + + group_list + + + node + + + + + id + Workflow Test Document + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + searchable_text_property_id + + + title + description + comment + reference + short_title + + + + + type_class + TextDocument + + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + testing_erp5_workflow + testing_erp5_interaction_workflow + edit_workflow + + + + + + + diff --git a/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Module.xml b/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Module.xml new file mode 100644 index 0000000000000000000000000000000000000000..c68a6408f00bc3d97f457677910a88ec7c5e82c9 --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeTemplateItem/portal_types/Workflow%20Test%20Module.xml @@ -0,0 +1,142 @@ + + + + + + + + + + _property_domain_dict + + AAAAAAAAAAI= + + + + acquire_local_roles + 1 + + + content_icon + folder_icon.gif + + + description + + + + + + factory + addFolder + + + group_list + + + module + + + + + id + Workflow Test Module + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + Folder + + + type_interface + + + + + + type_mixin + + + + + + + + + + + + + + + data + + + + short_title + + AAAAAAAAAAM= + + + + title + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + domain_name + erp5_ui + + + property_name + short_title + + + + + + + + + + + + domain_name + erp5_ui + + + property_name + title + + + + + diff --git a/bt5/erp5_workflow_test/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml b/bt5/erp5_workflow_test/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..5dbb9891e43f7cedf9f76679030b33e69d8bbc0f --- /dev/null +++ b/bt5/erp5_workflow_test/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml @@ -0,0 +1,6 @@ + + + Workflow Test Document + edit_workflow + + \ No newline at end of file diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test.xml new file mode 100644 index 0000000000000000000000000000000000000000..2686ec5616424ec83714368f197fba724d8b9baf --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test.xml @@ -0,0 +1,26 @@ + + + + + + + + + + _objects + + + + + + id + workflow_test + + + title + Workflow Test + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..aeafdbc27f66d3c864d8193e6b7c34ab6fd5c245 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view.xml @@ -0,0 +1,134 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + + + + center + + + + + + hidden + + + + + + left + + + my_title + my_description + my_validation_state_title + my_comment + + + + + right + + + + + + + + + id + WorkflowTestDocument_view + + + method + POST + + + name + WorkflowTestObject_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflow Test Object + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_comment.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..ccc7da11557199b8302beaa6336ec34a94c109d7 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_comment.xml @@ -0,0 +1,264 @@ + + + + + + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Comment + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_description.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a74a8902c8ea3bf28662c8ada890d8e1324a244 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_description.xml @@ -0,0 +1,260 @@ + + + + + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + max_length + + + + required + 0 + + + title + Description + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_title.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..d6199321352b21416392967e3de27a45c556c957 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_title.xml @@ -0,0 +1,260 @@ + + + + + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + max_length + + + + required + 0 + + + title + Title + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_validation_state_title.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_validation_state_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..771400ebd3872674ee419eb31ee5510644147ae7 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestDocument_view/my_validation_state_title.xml @@ -0,0 +1,90 @@ + + + + + + + + + + delegated_list + + + + + + id + my_validation_state_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_translated_workflow_state_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc6404c2ad8cfdac02da9be8ae925c25a5f08ce0 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList.xml @@ -0,0 +1,131 @@ + + + + + + + + + + _objects + + + + + + action + Base_doSelect + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + + + + hidden + + + + + + left + + + + + + right + + + + + + + + + id + WorkflowTestModule_viewWorkflowTestDocumentList + + + method + POST + + + name + WorkflowTestModule_viewWorkflowTestObjectList + + + pt + form_list + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflow Tests + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList/listbox.xml b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf03aea3161856a1af4871ebf7739115e2d220f2 --- /dev/null +++ b/bt5/erp5_workflow_test/SkinTemplateItem/portal_skins/workflow_test/WorkflowTestModule_viewWorkflowTestDocumentList/listbox.xml @@ -0,0 +1,136 @@ + + + + + + + + + + delegated_list + + + columns + selection_name + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + title + Title + + + description + Description + + + comment + Comment + + + translated_validation_state_title + State + + + + + + field_id + my_list_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_type + + + + ERP5Workflow Test Object + ERP5Workflow Test Object + + + + + + selection_name + workflow_test_module_selection + + + target + Click to edit the target + + + title + Workflow Tests + + + + + + + + diff --git a/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.py b/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.py new file mode 100644 index 0000000000000000000000000000000000000000..01fceb222cf68cbf3daa625919e231bb08b5ea86 --- /dev/null +++ b/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.py @@ -0,0 +1,415 @@ +import unittest +from erp5.component.test.testWorkflowMixin import testWorkflowMixin +from Products.DCWorkflow.DCWorkflow import ValidationFailed +from DateTime import DateTime + +class TestERP5WorkflowMixin(testWorkflowMixin, object): + + initial_dc_workflow_id = "testing_initial_dc_workflow" + initial_dc_interaction_workflow_id = "testing_initial_dc_interaction_workflow" + + def afterSetUp(self): + test_module = self.portal.workflow_test_module + test_module.updateLocalRolesOnSecurityGroups() + + module = self.portal.workflow_test_module + module.manage_delObjects(list(module.objectIds())) + + self.copyWorkflow(self.portal.portal_workflow, self.initial_dc_workflow_id, self.workflow_id) + self.copyWorkflow(self.portal.portal_workflow, self.initial_dc_interaction_workflow_id, self.interaction_workflow_id) + + def copyWorkflow(self, portal_workflow, old_wf_id, new_wf_id): + portal_workflow.copyWorkflow(old_wf_id, new_wf_id) + self.commit() + + def getTestObject(self): + self.portal = self.getPortal() + test_object = self.portal.workflow_test_module.newContent(portal_type='Workflow Test Document') + return test_object + + def doActionFor(self, document, action): + self.portal.portal_workflow.doActionFor(document, action, wf_id=self.workflow_id) + + def clearCache(self): + self.portal.portal_caches.clearAllCache() + + def checkDocumentState(self, document, state_id): + self.assertEqual(self.workflow._getWorkflowStateOf(document, id_only=True), state_id) + self.assertEqual(document.getValidationState(), state_id) + + def resetComponentTool(self): + # Force reset of portal_components to regenerate accessors + # Since it is already handled by interactions, we only need to commit + # to allow component tool to do it's reset + self.commit() + + def test_01_testAfterScriptAndInteractionOnTransition(self): + """ + This test uses workflow and interaction workflow + """ + new_object = self.getTestObject() + self.assertEqual(new_object.getDescription(), "") + + self.doActionFor(new_object, "validate_action") + + self.assertEqual(new_object.getDescription(), "After script was executed.") + ### mechanism: validate (after_script: changes description) => validate interaction + ### (setTitle: changes title ; afterSetTitle: changes comment) + self.assertEqual(new_object.getComment(), "Interaction of setTitle executed. setTitle is appeared in after validate script.") + + def test_02_testBeforeScript(self): + new_object = self.getTestObject() + self.assertEqual(new_object.getDescription(), "") + # required to be in validated state in order to be invalidated + self.doActionFor(new_object, "validate_action") + self.doActionFor(new_object, "invalidate_action") + self.assertEqual(new_object.getDescription(), "Before script was executed.") + + def test_03_testChangeOfState(self): + new_object = self.getTestObject() + self.doActionFor(new_object, "validate_action") + self.checkDocumentState(new_object, 'validated') + self.doActionFor(new_object, "invalidate_action") + self.checkDocumentState(new_object, 'invalidated') + + def test_04_testDoWorkflowMethodTransition(self): + """ + Check if workflow methods allows to change of state + """ + new_object = self.getTestObject() + self.checkDocumentState(new_object, 'draft') + new_object.validate() + self.checkDocumentState(new_object, 'validated') + + def test_05_testCheckHistoryStateAndActionForASingleTransition(self, workflow_id=None): + """ + Basic checking of workflow history, only check that state and actions + are available + """ + if workflow_id is None: + workflow_id = self.workflow_id + + new_object = self.getTestObject() + self.doActionFor(new_object, "validate_action") + # 3 history lines are expected : draft->validation_action->validate + history_list = new_object.workflow_history[workflow_id] + self.assertEqual(3, len(history_list)) + last_history = history_list[-1] + self.assertEqual(last_history.get("action", None), "validate") + self.assertEqual(last_history.get("validation_state", None), "validated") + return new_object + + def test_06_testCheckPermissionAreWellSet(self): + new_object = self.getTestObject() + self.assertEqual(new_object._View_Permission, ('Assignee', 'Assignor', 'Associate', 'Auditor', 'Author', 'Manager', 'Owner')) + self.doActionFor(new_object, "validate_action") + self.assertEqual(new_object._View_Permission, ('Assignee', 'Assignor', 'Associate', 'Auditor', 'Manager')) + + def test_07_testUserTransitionRaiseValidationFailed(self): + """ + perform a fail_action which does nothing but add an error message in the workflow history + """ + new_object = self.getTestObject() + self.assertRaises(ValidationFailed, self.doActionFor, new_object, "fail_action") + history_list = new_object.workflow_history[self.workflow_id] + self.assertEqual(2, len(history_list)) + last_history = history_list[-1] + self.assertEqual(last_history.get("error_message", None), "foo error") + + def test_08_testUserActionDisplay(self): + """ + Check the list of actions available to users + """ + new_object = self.getTestObject() + action_list = self.getWorkflowTool().listActions(object=new_object) + action = action_list[0] + def checkExpectedDict(expected_dict, action): + for key in expected_dict.keys(): + self.assertEqual(expected_dict[key], action.get(key)) + checkExpectedDict({"category": "workflow", "name": "Validate"}, + action) + self.doActionFor(new_object, "validate_action") + action_list = self.getWorkflowTool().listActions(object=new_object) + action = action_list[0] + checkExpectedDict({"category": "workflow", "name": "Invalidate"}, + action) + + def test_09_testBaseGetWorkflowHistoryItemListScript(self): + """ + Base_getWorkflowHistoryItemList is used for user interface, make sure it is still + working fine + """ + new_object = self.getTestObject() + self.doActionFor(new_object, "validate_action") + item_list = new_object.Base_getWorkflowHistoryItemList(self.workflow_id, display=0) + self.assertEqual(3, len(item_list)) + def checkLine(expected_data, index): + line = item_list[index] + for key in expected_data.keys(): + self.assertEqual(expected_data[key], line.getProperty(key)) + checkLine({'state': 'draft'}, 0) + checkLine({'state': 'draft'}, 1) + checkLine({'state': 'validated'}, 2) + + def test_10_testSimpleWorklist(self): + self.loginByUserName("workflow_development") + new_object = self.getTestObject() + workflow_tool = self.portal.portal_workflow + self.tic() # reindexing for security + self.clearCache() + result = workflow_tool.listActions(object=new_object) + self.checkWorklist(result, 'Document', 1, workflow_id=self.workflow_id) + + def test_11_testValidationInteraction(self): + """ + check the validate interaction which changes the title of the object. + """ + new_object = self.getTestObject() + new_object.setTitle('nana') + self.doActionFor(new_object, "validate_action") + self.assertEqual(new_object.getTitle(), "After validate interaction.") + self.checkDocumentState(new_object, 'validated') + new_object.setTitle("tictic") + self.assertEqual(new_object.getComment(), "Interaction of setTitle executed. setTitle is appeared in after validate script.") + + def test_12_testIsTransitionPossible(self): + new_object = self.getTestObject() + workflow_tool = self.portal.portal_workflow + self.assertEqual(workflow_tool.isTransitionPossible(new_object, 'invalidate'), 0) + self.doActionFor(new_object, "validate_action") + # XXX required ????, it should not be called: self.clearCache() + self.checkDocumentState(new_object, 'validated') + self.assertEqual(workflow_tool.isTransitionPossible(new_object, 'invalidate'), 1) + +class TestConvertedWorkflow(TestERP5WorkflowMixin): + """ + Tests Converted Workflow which generated dynamically from DCWorkflow. + """ + def createERP5Workflow(self, original_workflow_id, new_workflow_id): + portal_workflow = self.portal.portal_workflow + self.copyWorkflow(portal_workflow, original_workflow_id, + new_workflow_id) + # XXX(WORFKLOW): remove this code block once merged into erp5 master + # and DC Workflows are converted to ERP5 Workflows + workflow = portal_workflow._getOb(new_workflow_id) + if workflow.getPortalType() != 'Workflow': + portal_workflow.WorkflowTool_convertWorkflow( + batch_mode=True, + workflow_id_list=[new_workflow_id] + ) + self.tic() + workflow = portal_workflow._getOb(new_workflow_id) + return workflow + + def afterSetUp(self): + self.workflow_id = 'testing_erp5_workflow' + self.interaction_workflow_id = 'testing_erp5_interaction_workflow' + super(TestConvertedWorkflow, self).afterSetUp() + portal_workflow = self.portal.portal_workflow + + portal_type_value = self.portal.portal_types._getOb('Workflow Test Document') + portal_workflow.WorkflowTool_convertWorkflow(batch_mode=True, + workflow_id_list=[self.workflow_id, self.interaction_workflow_id]) + + portal_type_value.setTypeWorkflowList([self.workflow_id, self.interaction_workflow_id, 'edit_workflow']) + + self.workflow = portal_workflow._getOb(self.workflow_id) + self.resetComponentTool() + self.login() + + def test_13_permission(self): + """ + test permission/role mapping on states (ERP5 Workflow only) + """ + + text_portal_type = self.portal.portal_types._getOb('Workflow Test Document') + temporary_workflow_id = 'temporary_edit_workflow' + + workflow = self.createERP5Workflow('edit_workflow', temporary_workflow_id) + text_portal_type.setTypeWorkflowList([temporary_workflow_id]) + + # some permission to be added in the test + permission = 'View management screens' + permission_key = '_' + permission.replace(' ', '_') + '_Permission' + + # create a Workflow Test document: it will have the usual permissions + # defined by edit_workflow + text_document = self.getTestObject() + + # Verify that the permission 'View management screens' is not declared on + # the text document yet + self.assertFalse(getattr(text_document, permission_key, False)) + + self.assertEqual(workflow.getPortalType(), 'Workflow') + + workflow.setWorkflowManagedPermissionList([permission]) + + # Verify permission roles dict on 'current' state" + permission_roles_dict = workflow.state_current\ + .getStatePermissionRolesDict() + self.assertIn(permission, permission_roles_dict) + + # Update document permissions/roles mapping + # By default, there should be acquisition on the state for the new + # permission + self.assertEqual(workflow.state_current.getAcquirePermissionList(), [permission]) + + # change roles and update permission/roles mapping on text_document + # and check document permissions/roles mapping was updated + # it should now be a tuple, as there is no acquisition (otherwise a list) + permission_roles_dict[permission] = ['Assignor'] + workflow.state_current.setAcquirePermissionList([]) + workflow.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), ('Assignor',)) + + # set acquisition and verify that permission/roles mapping is now a list + workflow.state_current.setAcquirePermissionList([permission]) + workflow.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), ['Assignor']) + + # add role for permission, and verify it was changed on the text document + permission_roles_dict[permission] = ['Assignor', 'Auditor'] + workflow.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), ['Assignor', 'Auditor']) + + # remove permission from the workflow, it should be removed from state + workflow.setWorkflowManagedPermissionList([]) + self.assertEqual(workflow.state_current.getAcquirePermissionList(), []) + + + def test_14_multiple_workflow_different_permission_roles(self): + workflow1 = self.createERP5Workflow('edit_workflow', 'temporary_workflow1') + workflow2 = self.createERP5Workflow('edit_workflow', 'temporary_workflow2') + self.copyWorkflow(self.portal.portal_workflow, self.initial_dc_workflow_id, 'temporary_dc_workflow') + dc_workflow = self.portal.portal_workflow._getOb('temporary_dc_workflow') + text_portal_type = self.portal.portal_types._getOb('Workflow Test Document') + + permission = 'View management screens' + permission_key = '_' + permission.replace(' ', '_') + '_Permission' + + # set permission managed by the workflows + workflow1.setWorkflowManagedPermissionList([permission]) + workflow2.setWorkflowManagedPermissionList([permission]) + dc_workflow.permissions = [permission] + + # no acquisition + workflow1.state_current.setAcquirePermissionList([]) + workflow2.state_current.setAcquirePermissionList([]) + + # create document + text_document = self.getTestObject() + + permission_roles_dict1 = workflow1.state_current.getStatePermissionRolesDict() + permission_roles_dict1[permission] = ['Assignor', 'Assignee', 'Auditor', 'Author'] + text_portal_type.setTypeWorkflowList(['temporary_workflow1']) + workflow1.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), + ('Assignee', 'Assignor', 'Auditor', 'Author')) + + # a few workflows define different roles for the same permission, it should + # perform an intersection of the role sets to get the common values of the + # sets + permission_roles_dict2 = workflow2.state_current.getStatePermissionRolesDict() + permission_roles_dict2[permission] = ['Auditor', 'Author', 'Manager', 'Member', 'Owner', 'Reviewer'] + text_portal_type.setTypeWorkflowList(['temporary_workflow1', + 'temporary_workflow2']) + workflow2.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), + ('Auditor', 'Author')) + + dc_workflow.states.draft.permission_roles = {permission: ('Assignor', 'Auditor', 'Owner', 'Reviewer')} + text_portal_type.setTypeWorkflowList(['temporary_workflow1', + 'temporary_workflow2', + 'temporary_dc_workflow']) + dc_workflow.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), ('Auditor',)) + + # add role to workflow1 should change the roles on text document + permission_roles_dict1[permission].append('Owner') + # also add acquisition + workflow1.state_current.setAcquirePermissionList([permission]) + workflow1.updateRoleMappingsFor(text_document) + self.assertEqual(getattr(text_document, permission_key), + ['Auditor', 'Owner']) + + def test_15_testGuardsAreNotMessingUpBase_viewDict(self): + # check Base_viewDict is available on workflow's transition + self.workflow.transition_delete_action.Base_viewDict() + + def test_16_testWorklistViewIsAccessible(self): + # check worklist view is available on workflow + self.workflow.worklist_1_draft_test_workflow_document_list.view() + +class TestDCWorkflow(TestERP5WorkflowMixin): + """ + Check DC Workflow works correctly in new Workflow Tool. + """ + def afterSetUp(self): + self.workflow_id = 'testing_dc_workflow' + self.interaction_workflow_id = 'testing_dc_interaction_workflow' + super(TestDCWorkflow, self).afterSetUp() + portal_workflow = self.portal.portal_workflow + + type_test_object = self.portal.portal_types['Workflow Test Document'] + + type_test_object.setTypeWorkflowList([ + 'edit_workflow', self.workflow_id, self.initial_dc_workflow_id, + self.initial_dc_interaction_workflow_id, + ]) + + self.workflow = portal_workflow._getOb(self.workflow_id) + self.resetComponentTool() + self.login() + + def test_DC01_testWorkflowMigrationForExistingDocument(self): + """ + We will start some actions with a DC Workflow, then we do migration of + workflow, and then we make sure we can continue doing more actions on this + migrated workflow + """ + begin_time = DateTime() + self.portal = self.getPortal() + workflow_module = self.portal.portal_workflow + + # Move to state "validated" + document = self.test_05_testCheckHistoryStateAndActionForASingleTransition() + + # Migrate to ERP5 Workflows + workflow_module.WorkflowTool_convertWorkflow(batch_mode=True, workflow_id_list=[self.workflow_id]) + self.tic() + + # Check we can invalidate + self.doActionFor(document, "invalidate_action") + end_time = DateTime() + + # for draft, validated, and invalidated + item_list = document.Base_getWorkflowHistoryItemList(self.workflow_id, display=0) + self.assertEqual(5, len(item_list)) + def checkLine(expected_data, index): + line = item_list[index] + for key in expected_data.keys(): + self.assertEqual(expected_data[key], line.getProperty(key)) + checkLine({'state': 'draft'}, 0) + checkLine({'state': 'draft'}, 1) + checkLine({'state': 'validated'}, 2) + checkLine({'state': 'validated'}, 3) + checkLine({'state': 'invalidated'}, 4) + expected_validated_item_dict = {'comment': '', 'error_message': '', 'actor': 'ERP5TypeTestCase', 'state': 'validated', 'action': 'validate'} + expected_invalidated_item_dict = {'comment': '', 'error_message': '', 'actor': 'ERP5TypeTestCase', 'state': 'invalidated', 'action': 'invalidate'} + + # check history keys are identical before and after conversion. + self.assertEqual(sorted(item_list[2].keys()),sorted(item_list[4].keys())) + + # check key values are shown as expected; + for key in expected_invalidated_item_dict: + self.assertEqual(item_list[2].getProperty(key), expected_validated_item_dict[key]) + self.assertEqual(item_list[4].getProperty(key), expected_invalidated_item_dict[key]) + + # check date time is generated + self.assertTrue(begin_time < item_list[4].getProperty('time') < end_time) + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(TestDCWorkflow)) + suite.addTest(unittest.makeSuite(TestConvertedWorkflow)) + return suite diff --git a/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.xml b/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..4505aac1aee7caf6df50435e8c2651e9f1289934 --- /dev/null +++ b/bt5/erp5_workflow_test/TestTemplateItem/portal_components/test.erp5.testWorkflowAndDCWorkflow.xml @@ -0,0 +1,123 @@ + + + + + + + + + + _recorded_property_dict + + AAAAAAAAAAI= + + + + default_reference + testWorkflowAndDCWorkflow + + + description + + + + + + id + test.erp5.testWorkflowAndDCWorkflow + + + portal_type + Test Component + + + sid + + + + + + text_content_error_message + + + + + + text_content_warning_message + + + + + + version + erp5 + + + workflow_history + + AAAAAAAAAAM= + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + component_validation_workflow + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + + + + action + validate + + + validation_state + validated + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow.xml similarity index 57% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow.xml index d960369f35485d795ff6e0774573ab0aa1d0c048..286b7a27c394fd53aaea772063a972899193857d 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow.xml @@ -2,7 +2,7 @@ - + @@ -13,32 +13,32 @@ - groups + creation_guard - + - id - business_template_building_workflow - - - initial_state - draft + description + Interaction for live test. - permissions + groups - state_var - building_state + id + testing_initial_dc_interaction_workflow + + + manager_bypass + 0 title - Business Template Building Workflow + Testing Interaction Workflow diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions.xml new file mode 100644 index 0000000000000000000000000000000000000000..e18bf8cbf778a6808aa24ec39bba4b527d7b1bef --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions.xml @@ -0,0 +1,28 @@ + + + + + + + + + + _mapping + + + + + + _objects + + + + + + id + interactions + + + + + diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/setTitle_interaction.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/setTitle_interaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..db59749b87275e49351f98f3c6b2a5e8d9994dea --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/setTitle_interaction.xml @@ -0,0 +1,100 @@ + + + + + + + + + + actbox_category + workflow + + + actbox_name + + + + actbox_url + + + + activate_script_name + + + + + + after_script_name + + + afterSetTitle + + + + + before_commit_script_name + + + + + + description + + + + guard + + + + + + id + setTitle_interaction + + + method_id + + + setTitle + + + + + once_per_transaction + 0 + + + portal_type_filter + + + + + + portal_type_group_filter + + + + + + script_name + + + + + + temporary_document_disallowed + 0 + + + title + + + + trigger_type + 2 + + + + + diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/validate_interaction.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/validate_interaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..98b50df4fb23800744be0f3c541b83b828fa94ff --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/interactions/validate_interaction.xml @@ -0,0 +1,100 @@ + + + + + + + + + + actbox_category + workflow + + + actbox_name + + + + actbox_url + + + + activate_script_name + + + + + + after_script_name + + + afterValidate + + + + + before_commit_script_name + + + + + + description + + + + guard + + + + + + id + validate_interaction + + + method_id + + + validate + + + + + once_per_transaction + 0 + + + portal_type_filter + + + + + + portal_type_group_filter + + + + + + script_name + + + + + + temporary_document_disallowed + 0 + + + title + + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts.xml diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.py b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.py new file mode 100644 index 0000000000000000000000000000000000000000..15dbc0af6edb87326918f2b66f0e419096ca3e0d --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.py @@ -0,0 +1,2 @@ +document = sci.object +document.setComment('Interaction of setTitle executed. setTitle is appeared in after validate script.') diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.xml new file mode 100644 index 0000000000000000000000000000000000000000..96f76c670e66addfc441858d1021509d1d76e4a7 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterSetTitle.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + sci, **kw + + + id + afterSetTitle + + + title + Set Title Script + + + + + diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.py b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.py new file mode 100644 index 0000000000000000000000000000000000000000..90f2fa5eaeae38bf09c2fa2c2727a8b4d6ec69b3 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.py @@ -0,0 +1,2 @@ +document = sci.object +document.setTitle('After validate interaction.') diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.xml new file mode 100644 index 0000000000000000000000000000000000000000..437e177a47508a135d88de6abee6a71b0fdcc861 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/scripts/afterValidate.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + sci, **kw + + + id + afterValidate + + + title + After Validate + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/variables.xml similarity index 78% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/variables.xml index bb12bef805f190ec50e023368d6ee5c6c990b816..6ae03699d19840ac42b097dfc0a5f34edd416170 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/variables.xml @@ -12,12 +12,6 @@ - - _objects - - - - id variables diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/worklists.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/worklists.xml similarity index 78% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/worklists.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/worklists.xml index c7242ee1148db07bda32db11056a3ebf57c34632..c3432aa051eac2d67ec0692a384adb38d1b6bac8 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/worklists.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_interaction_workflow/worklists.xml @@ -12,12 +12,6 @@ - - _objects - - - - id worklists diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow.xml similarity index 57% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow.xml index f85429202d1085342d7cb9417e11e1663a9e0e77..6907db46cf90bd7db88c10424d4ef8127c995402 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow.xml @@ -12,6 +12,16 @@ + + creation_guard + + + + + + description + Validation helps confirming the entered data by relevant agents before it is shared. + groups @@ -20,28 +30,34 @@ id - business_template_installation_workflow + testing_initial_dc_workflow initial_state - not_installed + draft + + + manager_bypass + 0 permissions + Access contents information Modify portal content View + Add portal content state_var - installation_state + validation_state title - Business Template Installation Workflow + Testing Workflow diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts.xml similarity index 82% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts.xml index 27ec9069024e0f59bf4b612113789f37da98879b..072c8f6540c07806bee17a34c920ec09b2de1bd5 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts.xml @@ -2,7 +2,7 @@ - + @@ -20,7 +20,7 @@ id - states + scripts diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.py b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.py new file mode 100644 index 0000000000000000000000000000000000000000..2bb0f382ad8f89637a4aa3615ed1ae395a0382a5 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.py @@ -0,0 +1,2 @@ +document = state_change['object'] +document.setDescription("After script was executed.") diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..707636ea08049a5ac30bb5f370d8c25ca8bd813f --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/after_script.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + state_change + + + id + after_script + + + title + after_script + + + + + diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.py b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.py new file mode 100644 index 0000000000000000000000000000000000000000..5a94b76d3d42acc93bd14550adc48b8b27742549 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.py @@ -0,0 +1,2 @@ +document = state_change['object'] +document.setDescription("Before script was executed.") diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..80f57dcdffa804473baeec47f5fc5b875ece36e9 --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/before_script.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + state_change + + + id + before_script + + + title + Before Script + + + + + diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.py b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.py new file mode 100644 index 0000000000000000000000000000000000000000..73d308cc83e2dc5ba0ec9276b8c74304a59a136d --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.py @@ -0,0 +1,2 @@ +from Products.DCWorkflow.DCWorkflow import ValidationFailed +raise ValidationFailed ("foo error") diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a97b1d1e3cbade1c153691c3724188996fb920d --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/scripts/fail_message.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + self + + + id + fail_message + + + title + fail_message + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/deleted.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/deleted.xml similarity index 70% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/deleted.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/deleted.xml index e0fded0030bfc7a7945bc3136ca242990fbdec9b..06f2bafe59cee64605234d5d656997df1250992b 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/deleted.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/deleted.xml @@ -8,7 +8,7 @@ description - + Documents in this state were deleted by the user as a result of clicking on the trash button or calling the delete action id @@ -55,6 +55,22 @@ _container + + Access contents information + + + Manager + + + + + Add portal content + + + Manager + + + Modify portal content @@ -66,7 +82,9 @@ View - + + Manager + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/modified.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/draft.xml similarity index 77% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/modified.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/draft.xml index 084b73999a3fa871a3a547a6907e6368f5adeb82..73527b1d7f270dd2a2ea5e825700a3c7a1447ac9 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/modified.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/draft.xml @@ -8,11 +8,11 @@ description - + Default state of the document id - modified + draft permission_roles @@ -22,16 +22,17 @@ title - Modified + Draft transitions - build - build_action - clean - edit + delete + delete_action + fail_action + validate + validate_action @@ -46,18 +47,12 @@ - - - Persistence - PersistentMapping - - - + - _container + data @@ -77,9 +72,14 @@ Add portal content - - Reviewer - + + Assignee + Assignor + Associate + Author + Manager + Owner + @@ -88,20 +88,13 @@ Assignee Assignor + Associate Author Manager Owner - - Review portal content - - - Reviewer - - - View diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/replaced.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/invalidated.xml similarity index 54% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/replaced.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/invalidated.xml index 80bad1704dd9eee4667d428ef114a2c6284d14a1..4e48b52c2fa66f717921fa778cec3df980f3c448 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/replaced.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/invalidated.xml @@ -8,11 +8,11 @@ description - + State of a document that has been invalidated in ERP5 id - replaced + invalidated permission_roles @@ -22,7 +22,7 @@ title - Replaced + Invalidated transitions @@ -30,8 +30,8 @@ delete delete_action - install - install_action + validate + validate_action @@ -60,10 +60,36 @@ _container + + Access contents information + + + Assignee + Assignor + Associate + Auditor + Manager + + + + + Add portal content + + + Assignee + Assignor + Associate + Manager + + + Modify portal content + Assignee + Assignor + Associate Manager @@ -71,7 +97,13 @@ View - + + Assignee + Assignor + Associate + Auditor + Manager + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/built.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/validated.xml similarity index 78% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/built.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/validated.xml index 7a73ddf28d3a9e269d06a4d7cbc6cf4bbdf0da49..6600633dce53aabddf0a5f52b97a1b5148d25aed 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/built.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/states/validated.xml @@ -8,11 +8,11 @@ description - + State of a document that has been validated in ERP5 id - built + validated permission_roles @@ -22,17 +22,14 @@ title - Built + Validated transitions - build - clean - clean_action - edit - rebuild_action + invalidate + invalidate_action @@ -69,9 +66,18 @@ Assignor Associate Auditor - Author Manager - Owner + + + + + Add portal content + + + Assignee + Assignor + Associate + Manager @@ -81,9 +87,8 @@ Assignee Assignor - Author + Associate Manager - Owner @@ -95,9 +100,7 @@ Assignor Associate Auditor - Author Manager - Owner diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete.xml similarity index 72% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete.xml index 50d460314ef3937c3ec0ff57b0e0e488c17d44d1..c258c14dec8aa5d3b0ba489f9478a5fdae0bed21 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete.xml @@ -24,12 +24,12 @@ description - + Delete a document in ERP5 guard - AAAAAAAAAAI= + @@ -46,7 +46,7 @@ title - Delete Business Template + Delete trigger_type @@ -55,21 +55,4 @@ - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete_action.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete_action.xml similarity index 84% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete_action.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete_action.xml index 048f8fb78f997d3fe7275fe0418b0c6d9bc401ee..8dbec5ba9e5e92c20ea700a2eb1ae1c4ed00278b 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/delete_action.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/delete_action.xml @@ -24,7 +24,7 @@ description - + Delete a document in ERP5 guard @@ -46,7 +46,7 @@ title - Delete Business Template Action + Delete Action trigger_type @@ -57,18 +57,17 @@ - - - - + - permissions + roles - Manage portal + Assignee + Assignor + Manager diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/fail_action.xml similarity index 76% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/fail_action.xml index 01c9455cb44e5a81557aabb99637165b11821e3b..f4411d86ab325e85d84a217c10f832b055bb72b9 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/fail_action.xml @@ -10,6 +10,10 @@ actbox_category workflow + + actbox_icon + + actbox_name @@ -24,7 +28,7 @@ description - + This action does nothing but put an error message in workflow history. guard @@ -34,23 +38,23 @@ id - build + fail_action new_state_id - built + script_name - + fail_message title - Build Business Template + Fail Action trigger_type - 2 + 1 @@ -62,10 +66,12 @@ - permissions + roles - Manage portal + Assignee + Assignor + Manager diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/edit.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate.xml similarity index 68% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/edit.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate.xml index fdcd4a5d12f869d35f900b54b7066fac2a789d6b..aa02e3b059e403377e30ee6d79cc61f8dd3f1ca6 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/edit.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate.xml @@ -10,6 +10,10 @@ actbox_category workflow + + actbox_icon + + actbox_name @@ -24,29 +28,29 @@ description - + This action invalidates a document in ERP5 guard - AAAAAAAAAAI= + id - edit + invalidate new_state_id - modified + invalidated script_name - + before_script title - Edit Business Template + Invalidate trigger_type @@ -55,21 +59,4 @@ - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build_action.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate_action.xml similarity index 72% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build_action.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate_action.xml index dec27fca1c003c353170b5508ac17b44980929f0..f7437928b426e6df828a230daeafe9e69ba395c8 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/build_action.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/invalidate_action.xml @@ -10,21 +10,25 @@ actbox_category workflow + + actbox_icon + + actbox_name - Build Business Template + Invalidate actbox_url - %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=build_action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=invalidate_action after_script_name - build + invalidate description - + This action invalidates a document in ERP5 guard @@ -34,7 +38,7 @@ id - build_action + invalidate_action new_state_id @@ -46,7 +50,7 @@ title - Build Business Template Action + Invalidate Action trigger_type @@ -57,18 +61,17 @@ - - - - + - permissions + roles - Manage portal + Assignee + Assignor + Manager diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate.xml similarity index 68% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate.xml index 342795403cb76380c49c4185af1e130c524100ca..5476e48170e560129687057f3bb3bf606034533a 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate.xml @@ -10,6 +10,10 @@ actbox_category workflow + + actbox_icon + + actbox_name @@ -20,25 +24,25 @@ after_script_name - + after_script description - + Validates a document in ERP5 guard - AAAAAAAAAAI= + id - clean + validate new_state_id - modified + validated script_name @@ -46,7 +50,7 @@ title - Clean Business Template + Validate trigger_type @@ -55,21 +59,4 @@ - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/rebuild_action.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate_action.xml similarity index 73% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/rebuild_action.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate_action.xml index 8b8d37c3ab99950764c2a61276831e2f7b54b438..41e8f53914690c958ef23f51df2b2a048c57d56f 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/rebuild_action.xml +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/transitions/validate_action.xml @@ -10,21 +10,25 @@ actbox_category workflow + + actbox_icon + + actbox_name - Rebuild Business Template + Validate actbox_url - %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=rebuild_action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=validate_action after_script_name - build + validate description - + Validates a document in ERP5 guard @@ -34,7 +38,7 @@ id - rebuild_action + validate_action new_state_id @@ -46,7 +50,7 @@ title - Rebuild Business Template + Validate Action trigger_type @@ -57,18 +61,17 @@ - - - - + - permissions + roles - Manage portal + Assignee + Assignor + Manager diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/action.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/action.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/action.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/action.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/actor.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/actor.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/actor.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/actor.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/comment.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/comment.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/comment.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/comment.xml diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/error_message.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..69512a44bc5967c8c56eb45fa88a452ba0c388be --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/error_message.xml @@ -0,0 +1,48 @@ + + + + + + + + + + default_expr + + + + + + default_value + + + + description + + + + for_catalog + 0 + + + for_status + 1 + + + id + error_message + + + info_guard + + + + + + update_always + 1 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/history.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/history.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/history.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/history.xml diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/portal_type.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/portal_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..521a53aa171520987084020ee19ce4a8d48a40dc --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/portal_type.xml @@ -0,0 +1,48 @@ + + + + + + + + + + default_expr + + + + + + default_value + + + + description + + + + for_catalog + 1 + + + for_status + 0 + + + id + portal_type + + + info_guard + + + + + + update_always + 0 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/time.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/time.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/variables/time.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/variables/time.xml diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/worklists.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/worklists.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/worklists.xml rename to bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/worklists.xml diff --git a/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/worklists/1_draft_test_workflow_document_list.xml b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/worklists/1_draft_test_workflow_document_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b47e1ae1393dd406442fc57925f597c75cc742c --- /dev/null +++ b/bt5/erp5_workflow_test/WorkflowTemplateItem/portal_workflow/testing_initial_dc_workflow/worklists/1_draft_test_workflow_document_list.xml @@ -0,0 +1,102 @@ + + + + + + + + + + actbox_category + global + + + actbox_icon + + + + actbox_name + Document to Validate (%(count)s) + + + actbox_url + + + + description + Document to Validate + + + guard + + AAAAAAAAAAI= + + + + id + 1_draft_test_workflow_document_list + + + var_matches + + AAAAAAAAAAM= + + + + + + + + + + + + + roles + + + Assignee + Assignor + + + + + + + + + + + + + + data + + + + portal_type + + + Workflow Test Document + + + + + validation_state + + + draft + + + + + + + + + + diff --git a/bt5/erp5_workflow_test/bt/dependency_list b/bt5/erp5_workflow_test/bt/dependency_list new file mode 100644 index 0000000000000000000000000000000000000000..95e45590bf872d4bf4f76d89a4636ee6ac9fcaa8 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/dependency_list @@ -0,0 +1,4 @@ +erp5_full_text_mroonga_catalog +erp5_base +erp5_workflow +erp5_core_test diff --git a/bt5/erp5_workflow_test/bt/description b/bt5/erp5_workflow_test/bt/description new file mode 100644 index 0000000000000000000000000000000000000000..542422ef416086315d3375f6430e80653b2aafea --- /dev/null +++ b/bt5/erp5_workflow_test/bt/description @@ -0,0 +1 @@ +This template offer simulation data for erp5_workflow (old DC workflow, ERP5 workflow, worklist). \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_action_path_list b/bt5/erp5_workflow_test/bt/template_action_path_list new file mode 100644 index 0000000000000000000000000000000000000000..e4db0f72275a509b6b6be388c0d5511be6e719aa --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_action_path_list @@ -0,0 +1,2 @@ +Workflow Test Document | view +Workflow Test Module | view \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_format_version b/bt5/erp5_workflow_test/bt/template_format_version new file mode 100644 index 0000000000000000000000000000000000000000..56a6051ca2b02b04ef92d5150c9ef600403cb1de --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_format_version @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_keep_last_workflow_history_only_path_list b/bt5/erp5_workflow_test/bt/template_keep_last_workflow_history_only_path_list new file mode 100644 index 0000000000000000000000000000000000000000..7f1fe98ab69bc41329bbe5ca836ed1d21df19a6a --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_keep_last_workflow_history_only_path_list @@ -0,0 +1,2 @@ +person_module/test_workflow_developper +person_module/test_workflow_developper/* \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_module_id_list b/bt5/erp5_workflow_test/bt/template_module_id_list new file mode 100644 index 0000000000000000000000000000000000000000..5abea57a9df20953ba3edb6563c469d1984e375e --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_module_id_list @@ -0,0 +1 @@ +workflow_test_module \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_path_list b/bt5/erp5_workflow_test/bt/template_path_list new file mode 100644 index 0000000000000000000000000000000000000000..4ef274308df606468729131a95702be07b0f86fc --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_path_list @@ -0,0 +1,4 @@ +person_module/test_workflow_developper +person_module/test_workflow_developper/* +portal_categories/group/develop_group +portal_categories/group/test_group \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_allowed_content_type_list b/bt5/erp5_workflow_test/bt/template_portal_type_allowed_content_type_list new file mode 100644 index 0000000000000000000000000000000000000000..bfc6e68bcd9ed3bbef0e44544117b2aa04d2cceb --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_allowed_content_type_list @@ -0,0 +1 @@ +Workflow Test Module | Workflow Test Document \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_base_category_list b/bt5/erp5_workflow_test/bt/template_portal_type_base_category_list new file mode 100644 index 0000000000000000000000000000000000000000..028cb21de672c19d060b7dc3efe7ec16067f428c --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_base_category_list @@ -0,0 +1 @@ +Workflow Test Module | business_application \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_id_list b/bt5/erp5_workflow_test/bt/template_portal_type_id_list new file mode 100644 index 0000000000000000000000000000000000000000..ce988fe7ae2884b99c3d9474c226f0095b9855a4 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_id_list @@ -0,0 +1,2 @@ +Workflow Test Document +Workflow Test Module \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_property_sheet_list b/bt5/erp5_workflow_test/bt/template_portal_type_property_sheet_list new file mode 100644 index 0000000000000000000000000000000000000000..d0d38cabe0ad88cd87cc55195ec0b0a913e0fbef --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_property_sheet_list @@ -0,0 +1 @@ +Workflow Test Document | Comment \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_role_list b/bt5/erp5_workflow_test/bt/template_portal_type_role_list new file mode 100644 index 0000000000000000000000000000000000000000..fe1e6f09d16d73975e4e3376a38d9575281a21f6 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_role_list @@ -0,0 +1,12 @@ +Interaction +Interaction Workflow +PermissionRoles +State +Transition +Workflow +Workflow Script +Workflow Test Document +Workflow Test Module +Workflow Tool +Workflow Variable +Worklist \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_portal_type_workflow_chain_list b/bt5/erp5_workflow_test/bt/template_portal_type_workflow_chain_list new file mode 100644 index 0000000000000000000000000000000000000000..4c5219ca8a4784f310f0a50838afb9995c84a40f --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_portal_type_workflow_chain_list @@ -0,0 +1 @@ +Workflow Test Document | edit_workflow \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_skin_id_list b/bt5/erp5_workflow_test/bt/template_skin_id_list new file mode 100644 index 0000000000000000000000000000000000000000..6bf9236ee0dacda509b9961d4782d1ba9a393e91 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_skin_id_list @@ -0,0 +1 @@ +workflow_test \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_test_id_list b/bt5/erp5_workflow_test/bt/template_test_id_list new file mode 100644 index 0000000000000000000000000000000000000000..3e5376527d1915f737a4422f1c00c866a65c9e49 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_test_id_list @@ -0,0 +1 @@ +test.erp5.testWorkflowAndDCWorkflow \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/template_workflow_id_list b/bt5/erp5_workflow_test/bt/template_workflow_id_list new file mode 100644 index 0000000000000000000000000000000000000000..fb57e08e0b809ac9a8aae7136d47dd24ff368378 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/template_workflow_id_list @@ -0,0 +1,2 @@ +testing_initial_dc_interaction_workflow +testing_initial_dc_workflow \ No newline at end of file diff --git a/bt5/erp5_workflow_test/bt/title b/bt5/erp5_workflow_test/bt/title new file mode 100644 index 0000000000000000000000000000000000000000..bbde1d9be5b3f1b2a7f1d445489e3f998e0a8308 --- /dev/null +++ b/bt5/erp5_workflow_test/bt/title @@ -0,0 +1 @@ +erp5_workflow_test \ No newline at end of file diff --git a/product/ERP5/Document/BusinessTemplate.py b/product/ERP5/Document/BusinessTemplate.py index 9e1ff347f0209482dac4c46170a5ea1d8d100d35..8fae45bd080cb7445493eb6584393f1a80d92ae3 100644 --- a/product/ERP5/Document/BusinessTemplate.py +++ b/product/ERP5/Document/BusinessTemplate.py @@ -205,35 +205,6 @@ def removeAll(entry): DeprecationWarning) shutil.rmtree(entry, True) -def getChainByType(context): - """ - This is used in order to construct the full list - of mapping between type and list of workflow associated - This is only useful in order to use - portal_workflow.manage_changeWorkflows - """ - pw = context.getPortalObject().portal_workflow - cbt = pw._chains_by_type - ti = pw._listTypeInfo() - types_info = [] - for t in ti: - id = t.getId() - title = t.Title() - if title == id: - title = None - if cbt is not None and cbt.has_key(id): - chain = ', '.join(cbt[id]) - else: - chain = '(Default)' - types_info.append({'id': id, - 'title': title, - 'chain': chain}) - new_dict = {} - for item in types_info: - new_dict['chain_%s' % item['id']] = item['chain'] - default_chain=', '.join(pw._default_chain) - return (default_chain, new_dict) - def fixZSQLMethod(portal, method): """Make sure the ZSQLMethod uses a valid connection. """ @@ -1344,10 +1315,10 @@ class ObjectTemplateItem(BaseTemplateItem): for attr in ('allowed_content_types', 'hidden_content_type_list', 'property_sheet_list', + 'workflow_list', 'base_category_list'): portal_type_dict[attr] = getattr(old_obj, attr, ()) - portal_type_dict['workflow_chain'] = \ - getChainByType(context)[1].get('chain_' + object_id, '') + portal_type_dict['workflow_chain'] = old_obj.getTypeWorkflowList() container.manage_delObjects([object_id]) # unindex here when it is a broken object if isinstance(old_obj, Broken): @@ -1434,11 +1405,8 @@ class ObjectTemplateItem(BaseTemplateItem): obj.wl_clearLocks() if portal_type_dict: # set workflow chain - wf_chain = portal_type_dict.pop('workflow_chain') - chain_dict = getChainByType(context)[1] - default_chain = '' - chain_dict['chain_%s' % (object_id)] = wf_chain - context.portal_workflow.manage_changeWorkflows(default_chain, props=chain_dict) + workflow_list = portal_type_dict.pop('workflow_chain') + obj.setTypeWorkflowList(workflow_list) # restore some other properties obj.__dict__.update(portal_type_dict) # import sub objects if there is @@ -2265,10 +2233,15 @@ class WorkflowTemplateItem(ObjectTemplateItem): installed_bt.getTemplatePortalTypeWorkflowChainList()] new_chain_list = [[y.strip() for y in x.split('|')] for x in \ context.getTemplatePortalTypeWorkflowChainList()] - chain_dict = getChainByType(context)[1] + + types_tool = context.getPortalObject().portal_types + affected_portal_type_set = { + type_object.id for type_object in types_tool.listTypeInfo() + if any(workflow_id in removed_workflow_id_list for workflow_id in + type_object.getTypeWorkflowList()) + } + for workflow_id in removed_workflow_id_list: - affected_portal_type_set = {x[6:] for x, y in chain_dict.iteritems() - if any(workflow_id == y.strip() for y in y.split(','))} safe_portal_type_set = {x for x, y in installed_chain_list if y == workflow_id} safe_portal_type_set.difference_update(x for x, y in new_chain_list @@ -2315,19 +2288,18 @@ class WorkflowTemplateItem(ObjectTemplateItem): obj.wl_clearLocks() def uninstall(self, context, **kw): + types_tool = context.getPortalObject().portal_types object_path = kw.get('object_path', None) if object_path is not None: object_keys = [object_path] else: object_keys = self._archive.keys() removed_workflow_id_list = {x.split('/', 1)[1] for x in object_keys} - (default_chain, chain_dict) = getChainByType(context) - for portal_type, workflow_ids in chain_dict.iteritems(): - workflow_ids = {x.strip() for x in workflow_ids.split(',')} - \ - removed_workflow_id_list - chain_dict[portal_type] = ', '.join(workflow_ids) - context.portal_workflow.manage_changeWorkflows(default_chain, - props=chain_dict) + + for portal_type in types_tool.listTypeInfo(): + workflow_set = set(portal_type.getTypeWorkflowList()) - \ + removed_workflow_id_list + portal_type.setTypeWorkflowList(workflow_set) ObjectTemplateItem.uninstall(self, context, **kw) class PortalTypeTemplateItem(ObjectTemplateItem): @@ -2354,6 +2326,7 @@ class PortalTypeTemplateItem(ObjectTemplateItem): if attr[0] == '_' or attr in ('allowed_content_types', 'hidden_content_type_list', 'property_sheet_list', + 'workflow_list', 'base_category_list', 'last_id', 'uid') or \ (attr == 'workflow_history' and @@ -2396,11 +2369,6 @@ class PortalTypeTemplateItem(ObjectTemplateItem): force = kw.get('force') # We now need to setup the list of workflows corresponding to # each portal type - (default_chain, chain_dict) = getChainByType(context) - # Set the default chain to the empty string is probably the - # best solution, by default it is 'default_workflow', which is - # not very usefull - default_chain = '' for path, obj in self._objects.iteritems(): if update_dict.has_key(path) or force: if not force: @@ -2409,10 +2377,11 @@ class PortalTypeTemplateItem(ObjectTemplateItem): continue portal_type = obj.id if self._workflow_chain_archive.has_key(portal_type): - chain_dict['chain_%s' % portal_type] = \ - self._workflow_chain_archive[portal_type] - context.portal_workflow.manage_changeWorkflows(default_chain, - props=chain_dict) + obj.setTypeWorkflowList([ + w.strip() for w in + self._workflow_chain_archive[portal_type].split(',') + if w.strip() not in ('', '(Default)') + ]) # XXX : this method is kept temporarily, but can be removed once all bt5 are # re-exported with separated workflow-chain information def _importFile(self, file_name, file): @@ -2440,7 +2409,7 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): # if nothing or +, chain is added to the existing one # if - chain is removed from the exisiting one # if = chain replaced the existing one - (default_chain, chain_dict) = getChainByType(context) + types_tool = self.getPortalObject().portal_types for key in self._archive.keys(): wflist = key.split(' | ') if len(wflist) == 2: @@ -2450,11 +2419,11 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): # portal type with no workflow defined portal_type = wflist[0][:-2] workflow = '' - portal_type_key = '%s%s' % (self._chain_string_prefix, portal_type) - if portal_type_key in chain_dict: + type_object = types_tool.getTypeInfo(portal_type) + if type_object is not None: workflow_name = workflow.lstrip('+-=') if workflow[0] != '-' and workflow_name not in \ - chain_dict[portal_type_key].split(self._chain_string_separator): + type_object.getTypeWorkflowList(): if not self.is_bt_for_diff: # here, we use 'LOG' instead of 'raise', because it can # happen when a workflow is removed from the chain by @@ -2504,22 +2473,13 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): update_dict = kw.get('object_to_update') force = kw.get('force') installed_bt = kw.get('installed_bt') + types_tool = self.getPortalObject().portal_types + changed = False if installed_bt is not None: previous_portal_type_workflow_chain_list = list(installed_bt\ .getTemplatePortalTypeWorkflowChainList()) else: previous_portal_type_workflow_chain_list = [] - # We now need to setup the list of workflows corresponding to - # each portal type - (default_chain, chain_dict) = getChainByType(context) - # First convert all workflow_ids into list. - for key, value in chain_dict.iteritems(): - chain_dict[key] = value.split(self._chain_string_separator) - orig_chain_dict = chain_dict.copy() - # Set the default chain to the empty string is probably the - # best solution, by default it is 'default_workflow', which is - # not very usefull - default_chain = '' for path in self._objects: if path in update_dict or force: if not force: @@ -2531,13 +2491,10 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): if not path_splitted: continue portal_type = path_splitted[-1] - chain_key = '%s%s' % (self._chain_string_prefix, portal_type) - if chain_key in chain_dict: - # XXX we don't use the chain (Default) in erp5 so don't keep it - old_chain_list = [workflow_id for workflow_id in\ - chain_dict[chain_key] if workflow_id not in\ - ('(Default)', '',)] - old_chain_workflow_id_set = set(old_chain_list) + type_object = types_tool.getTypeInfo(portal_type) + if type_object is not None: + workflow_id_set = set(type_object.getTypeWorkflowList()) + old_workflow_id_set = workflow_id_set # get new workflow id list workflow_id_list = self._objects[path] # fetch list of new workflows which shall be added to chains @@ -2560,21 +2517,24 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): # portal type, but current Business Template cancels this # so it shall be removed workflow_id_list.append('-%s' % previous_workflow_id) + for wf_id in workflow_id_list: if wf_id[0] == '-': # remove wf id if already present - if wf_id[1:] in old_chain_workflow_id_set: - old_chain_workflow_id_set.remove(wf_id[1:]) + if wf_id[1:] in workflow_id_set: + workflow_id_set.remove(wf_id[1:]) elif wf_id[0] == '=': # replace existing chain by this one - old_chain_workflow_id_set = set() - old_chain_workflow_id_set.add(wf_id[1:]) + workflow_id_set = set() + workflow_id_set.add(wf_id[1:]) # then either '+' or nothing, add wf id to the list else: wf_id = wf_id.lstrip('+') - old_chain_workflow_id_set.add(wf_id) - # create the new chain - chain_dict[chain_key] = list(old_chain_workflow_id_set) + workflow_id_set.add(wf_id) + + changed = not(workflow_id_set == old_workflow_id_set) + type_object.setTypeWorkflowList(workflow_id_set) + if not workflow_id_list: # Check if it has normally to remove a workflow chain, in order to # improve the error message @@ -2582,25 +2542,18 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): if wf_id.startswith('-'): raise ValueError, '"%s" is not a workflow ID for %s' % \ (wf_id, portal_type) - chain_dict[chain_key] = self._objects[path] + changed = not(workflow_id_set == old_workflow_id_set) + type_object.setTypeWorkflowList(workflow_id_set) else: - if context.portal_types.getTypeInfo(portal_type) is None: - raise ValueError('Cannot chain workflow %r to non existing ' - 'portal type %r' % (self._chain_string_separator\ - .join(self._objects[path]) - , portal_type)) - chain_dict[chain_key] = self._objects[path] - if orig_chain_dict == chain_dict: - return - self._resetDynamicModules() - # convert workflow list into string only at the end. - for key, value in chain_dict.iteritems(): - chain_dict[key] = self._chain_string_separator.join(value) - context.portal_workflow.manage_changeWorkflows(default_chain, - props=chain_dict) + raise ValueError('Cannot chain workflow %r to non existing ' + 'portal type %r' % (self._chain_string_separator\ + .join(self._objects[path]) + , portal_type)) + if changed: + self._resetDynamicModules() def uninstall(self, context, **kw): - (default_chain, chain_dict) = getChainByType(context) + types_tool = self.getPortalObject().portal_types object_path = kw.get('object_path', None) if object_path is not None: object_key_list = [object_path] @@ -2612,20 +2565,13 @@ class PortalTypeWorkflowChainTemplateItem(BaseTemplateItem): continue portal_type = path_splitted[1] path = '%s%s' % (self._chain_string_prefix, portal_type) - if path in chain_dict: - workflow_id_list = chain_dict[path].\ - split(self._chain_string_separator) + type_object = types_tool.getTypeInfo(portal_type) + if type_object is not None: removed_workflow_id_list = self._objects[object_key] - for workflow_id in removed_workflow_id_list: - for i in range(workflow_id_list.count(workflow_id)): - workflow_id_list.remove(workflow_id) - if not workflow_id_list: - del chain_dict[path] - else: - chain_dict[path] = self._chain_string_separator.\ - join(workflow_id_list) - context.getPortalObject().portal_workflow.\ - manage_changeWorkflows('', props=chain_dict) + old_workflow_id_list = type_object.getTypeWorkflowList() + workflow_id_list = [workflow_id for workflow_id in old_workflow_id_list + if workflow_id not in removed_workflow_id_list] + type_object.setTypeWorkflowList(workflow_id_list) def preinstall(self, context, installed_item, **kw): modified_object_list = {} diff --git a/product/ERP5/Document/PythonScript.py b/product/ERP5/Document/PythonScript.py index ae7cf2b8a5f3f2dd10220ebb2835db20a4dd40c0..19c1130f920e1cba9249363a1fada7a60dbeaae6 100644 --- a/product/ERP5/Document/PythonScript.py +++ b/product/ERP5/Document/PythonScript.py @@ -27,7 +27,6 @@ ############################################################################## from AccessControl import ClassSecurityInfo - from Products.ERP5Type import Permissions, PropertySheet from App.special_dtml import HTMLFile from Products.ERP5Type.XMLObject import XMLObject diff --git a/product/ERP5/ERP5Site.py b/product/ERP5/ERP5Site.py index bcaed78514ddbd4b1abf2e6eb3a17142b97f2220..096467b51cf2528de41bb85c8eb118e852d00ec0 100644 --- a/product/ERP5/ERP5Site.py +++ b/product/ERP5/ERP5Site.py @@ -25,6 +25,7 @@ from Products.SiteErrorLog.SiteErrorLog import manage_addErrorLog from ZPublisher import BeforeTraverse from ZPublisher.BaseRequest import RequestContainer from AccessControl import ClassSecurityInfo + from Products.CMFDefault.Portal import CMFSite from Products.ERP5Type import Permissions from Products.ERP5Type.Core.Folder import FolderMixIn @@ -45,6 +46,8 @@ import os import warnings import transaction from App.config import getConfiguration +from Products.ERP5Workflow.Tool.WorkflowTool import WorkflowTool + MARKER = [] @@ -768,13 +771,12 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): Return a list of workflow states classified to a specific group. """ def getStateList(group): - state_dict = {} + state_list = [] for wf in self.portal_workflow.objectValues(): - if getattr(wf, 'states', None): - for state in wf.states.objectValues(): - if group in getattr(state, 'type_list', ()): - state_dict[state.getId()] = None - return tuple(state_dict.keys()) + for state in wf.getStateValueList(): + if group in state.getStateTypeList(): + state_list.append(state.getReference()) + return tuple(set(state_list)) getStateList = CachingMethod(getStateList, id=('_getPortalGroupedStateList', group), @@ -1294,15 +1296,13 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): Return all states which is related to simulation state workflow and state type """ def getStateList(): - state_dict = {} + state_list = [] for wf in self.portal_workflow.objectValues(): - if getattr(wf, 'variables', None) and \ - wf.variables.getStateVar() == 'simulation_state': - if getattr(wf, 'states', None): - for state in wf.states.objectValues(): - if getattr(state, 'type_list', None): - state_dict[state.getId()] = None - return tuple(sorted(state_dict.keys())) + if wf.getVariableValueDict() and wf.getStateVariable() == 'simulation_state': + for state in wf.getStateValueList(): + if state.getStateTypeList(): + state_list.append(state.getReference()) + return tuple(set(sorted_list)) getStateList = CachingMethod(getStateList, id=('getPortalGroupedSimulationStateList'), @@ -1693,6 +1693,39 @@ class ERP5Site(FolderMixIn, CMFSite, CacheCookieMixin): for obj in tool.objectValues(): obj.migrateToPortalTypeClass() + def migrateToPortalWorkflowClass(self): + """ + migrate dcworkflow to erp5workflow. + migrate workflow chain from tool to portal types + """ + tool = self.portal_workflow + if not isinstance(tool, WorkflowTool): + + # create new Workflow Tool + self._setObject('portal_workflow_new', WorkflowTool()) + new_tool = self._getOb("portal_workflow_new") + LOG("migrateToPortalWorkflowClass, new_tool", 0, new_tool) + new_tool._chains_by_type = tool._chains_by_type + + # copy-paste operation + for id in tool.objectIds(): + ob = tool._getOb(id) + ob = ob._getCopy(new_tool) + ob._setId(id) + new_tool._setObject(id, ob) + ob = new_tool._getOb(id) + ob._postCopy(new_tool, op=0) + ob.wl_clearLocks() + + # migration + self.portal_workflow = new_tool + self.portal_workflow.id = 'portal_workflow' + self._delObject('portal_workflow_new') + + # migrate workflow chain to portal type + if getattr(self.portal_workflow, '_chains_by_type', None) is not None: + self.portal_workflow.reassignWorkflowWithoutConversion() + Globals.InitializeClass(ERP5Site) def getBootstrapDirectory(): @@ -1732,7 +1765,8 @@ class PortalGenerator: addCMFCoreTool('CMF Skins Tool', None) addCMFCoreTool('CMF Undo Tool', None) addCMFCoreTool('CMF URL Tool', None) - addCMFCoreTool('CMF Workflow Tool', None) + # Add ERP5Workflow Tool + addERP5Tool(p, 'portal_workflow', 'Workflow Tool') addCMFDefaultTool = p.manage_addProduct['CMFDefault'].manage_addTool addCMFDefaultTool('Default Discussion Tool', None) @@ -2106,10 +2140,12 @@ class ERP5Generator(PortalGenerator): """ workflow_list = ['business_template_building_workflow', 'business_template_installation_workflow'] + workflow_template_item_list = ['portal_workflow/' + workflow_id + '**' for workflow_id in workflow_list] tool = p.portal_workflow tool.manage_delObjects(filter(tool.hasObject, workflow_list)) - self.bootstrap(tool, 'erp5_core', 'WorkflowTemplateItem', workflow_list) - tool.setChainForPortalTypes(('Business Template',), workflow_list) + self.bootstrap(tool, 'erp5_core', 'PathTemplateItem', workflow_list) + type_object = p.portal_types.getTypeInfo('Business Template') + type_object.setTypeWorkflowList(workflow_list) def setupIndex(self, p, **kw): # Make sure all tools and folders have been indexed diff --git a/product/ERP5/Extensions/CheckSkins.py b/product/ERP5/Extensions/CheckSkins.py index 25b49e98d39e569f1cf23f4c8fc175f5d135e11c..edfaa44bc2ebb53506b608106ad3b9cda95d60ab 100644 --- a/product/ERP5/Extensions/CheckSkins.py +++ b/product/ERP5/Extensions/CheckSkins.py @@ -310,34 +310,31 @@ def fixSkinNames(self, REQUEST=None, file=None, dry_run=0): # Workflows. for wf in self.portal_workflow.objectValues(): # Transitions. - for id in wf.transitions.objectIds(): - transition = wf.transitions._getOb(id) + for transition in wf.getTransitionValueList(): text = transition.actbox_url for info in info_list: if info.regexp.search(text) is not None: text = info.regexp.sub(info.new_name, text) - line = 'Transition %s of %s is modified for %s' % (id, 'portal_workflow/' + wf.id, info.name) + line = 'Transition %s of %s is modified for %s' % (transition.getReference(), 'portal_workflow/' + wf.id, info.name) LOG('fixSkinNames', 0, line) msg += '%s\n' % line if not dry_run: transition.actbox_url = text break # Worklists. - for id in wf.worklists.objectIds(): - worklist = wf.worklists._getOb(id) + for worklist in wf.getWorklistValueList(): text = worklist.actbox_url for info in info_list: if info.regexp.search(text) is not None: text = info.regexp.sub(info.new_name, text) - line = 'Worklist %s of %s is modified for %s' % (id, 'portal_workflow/' + wf.id, info.name) + line = 'Worklist %s of %s is modified for %s' % (worklist.getReference(), 'portal_workflow/' + wf.id, info.name) LOG('fixSkinNames', 0, line) msg += '%s\n' % line if not dry_run: worklist.actbox_url = text break # Scripts. - for id in wf.scripts.objectIds(): - script = wf.scripts._getOb(id) + for script in wf.getScriptValueList(): text = script.manage_FTPget() name_list = [] for info in info_list: @@ -345,7 +342,7 @@ def fixSkinNames(self, REQUEST=None, file=None, dry_run=0): text = info.regexp.sub(info.new_name, text) name_list.append(info.name) if len(name_list) > 0: - line = 'Script %s of %s is modified for %s' % (id, 'portal_workflow/' + wf.id, ', '.join(name_list)) + line = 'Script %s of %s is modified for %s' % (script.getReference(), 'portal_workflow/' + wf.id, ', '.join(name_list)) LOG('fixSkinNames', 0, line) msg += '%s\n' % line if not dry_run: diff --git a/product/ERP5/Interaction.py b/product/ERP5/Interaction.py index ecdd8fabfdb84c78fd8f394e2643aa2fef5af307..738e9cfd567e53582bd58a14289fc9e4ff3b6a32 100644 --- a/product/ERP5/Interaction.py +++ b/product/ERP5/Interaction.py @@ -106,6 +106,12 @@ class InteractionDefinition (SimpleItem): def getAvailableVarIds(self): return self.getWorkflow().variables.keys() + def getTriggerMethodIdList(self): + return self.method_id + + def getTriggerOncePerTransaction(self): + return self.once_per_transaction + _properties_form = DTMLFile('interaction_properties', _dtmldir) def manage_properties(self, REQUEST, manage_tabs_message=None): @@ -256,6 +262,19 @@ class InteractionDefinition (SimpleItem): return self.manage_variables(REQUEST, 'Variables changed.') + def getReference(self): + return self.id + + def showDict(self): + attr_dict = {} + for attr in sorted(self.__dict__.keys()): + value = getattr(self, attr) + if value is not None: + attr_dict[attr] = value + else: + attr_dict[attr] = '' + return attr_dict + Globals.InitializeClass(InteractionDefinition) diff --git a/product/ERP5/InteractionWorkflow.py b/product/ERP5/InteractionWorkflow.py index 2463d711895bb69ac6251baf331948f8935f4c13..bf95157f6804efbd2d4767b5b3582f1206f39f7b 100644 --- a/product/ERP5/InteractionWorkflow.py +++ b/product/ERP5/InteractionWorkflow.py @@ -32,6 +32,9 @@ from Products.ERP5Type.Workflow import addWorkflowFactory from Products.CMFActivity.ActiveObject import ActiveObject from Products.ERP5Type import Permissions +# show as xml library +from lxml.etree import Element, SubElement, tostring + _MARKER = [] class InteractionWorkflowDefinition (DCWorkflowDefinition, ActiveObject): @@ -115,18 +118,6 @@ class InteractionWorkflowDefinition (DCWorkflowDefinition, ActiveObject): from Products.DCWorkflow.Scripts import Scripts self._addObject(Scripts('scripts')) - security.declareProtected(Permissions.View, 'getChainedPortalTypeList') - def getChainedPortalTypeList(self): - """Returns the list of portal types that are chained to this - interaction workflow.""" - chained_ptype_list = [] - wf_tool = getToolByName(self, 'portal_workflow') - types_tool = getToolByName(self, 'portal_types') - for ptype in types_tool.objectIds(): - if self.getId() in wf_tool._chains_by_type.get(ptype, []) : - chained_ptype_list.append(ptype) - return chained_ptype_list - security.declarePrivate('listObjectActions') def listObjectActions(self, info): return [] @@ -345,6 +336,172 @@ class InteractionWorkflowDefinition (DCWorkflowDefinition, ActiveObject): return DCWorkflowDefinition._checkTransitionGuard(self, t, ob, **kw) + security.declarePrivate('getReference') + def getReference(self): + return self.id + + security.declarePrivate('getTransitionValueById') + def getTransitionValueById(self, transition_id): + if self.interactions is not None: + return self.interactions.get(transition_id, None) + return None + + security.declarePrivate('getTransitionValueList') + def getTransitionValueList(self): + if self.interactions is not None: + return self.interactions.values() + return [] + + security.declarePrivate('getTransitionIdList') + def getTransitionIdList(self): + if self.interactions is not None: + return self.interactions.objectIds() + return [] + + security.declarePrivate('getPortalType') + def getPortalType(self): + return self.__class__.__name__ + + security.declarePrivate('showAsXML') + def showAsXML(self, root=None): + if root is None: + root = Element('erp5') + return_as_object = False + interaction_workflow_prop_id_to_show = { + 'description':'text', 'manager_bypass':'int'} + interaction_workflow = SubElement(root, 'interaction_workflow', + attrib=dict(reference=self.getReference(), + portal_type='Interaction Workflow')) + + for prop_id in sorted(interaction_workflow_prop_id_to_show): + prop_value = self.__dict__.get(prop_id, None) + if prop_value is None or prop_value == [] or prop_value == (): + prop_value = '' + prop_type = interaction_workflow_prop_id_to_show[prop_id] + sub_object = SubElement(interaction_workflow, prop_id, attrib=dict(type=prop_type)) + sub_object.text = str(prop_value) + + # 1. Interaction as XML + interaction_reference_list = [] + interaction_id_list = sorted(self.interactions.keys()) + interaction_prop_id_to_show = {'actbox_category':'string', 'actbox_url':'string', + 'actbox_name':'string', 'activate_script_name':'string', + 'after_script_name':'string', 'before_commit_script_name':'string', + 'description':'text', 'guard':'object', 'method_id':'string', + 'once_per_transaction':'string', 'portal_type_filter':'string', + 'portal_type_group_filter':'string', 'script_name':'string', + 'temporary_document_disallowed':'string', 'trigger_type':'string'} + for tid in interaction_id_list: + interaction_reference_list.append(tid) + interactions = SubElement(interaction_workflow, 'interactions', attrib=dict( + interaction_list=str(interaction_reference_list), + number_of_element=str(len(interaction_reference_list)))) + for tid in interaction_id_list: + tdef = self.interactions[tid] + interaction = SubElement(interactions, 'interaction', attrib=dict( + reference=tdef.getReference(),portal_type='Interaction')) + guard = SubElement(interaction, 'guard', attrib=dict(type='object')) + for property_id in sorted(interaction_prop_id_to_show): + # creationg guard + if property_id == 'guard': + for prop_id in sorted(['groups', 'permissions', 'expr', 'roles']): + guard_obj = getattr(tdef, 'guard') + if guard_obj is not None: + if prop_id in guard_obj.__dict__: + if prop_id == 'expr': + prop_value = getattr(guard_obj.expr, 'text', '') + else: prop_value = guard_obj.__dict__[prop_id] + else: + prop_value = '' + else: + prop_value = '' + guard_config = SubElement(guard, prop_id, attrib=dict(type='guard configuration')) + if prop_value is None or prop_value == () or prop_value == []: + prop_value = '' + guard_config.text = str(prop_value) + # no-property definded action box configuration + elif property_id in sorted(['actbox_name', 'actbox_url', 'actbox_category']): + property_value = getattr(tdef, property_id, None) + sub_object = SubElement(interaction, property_id, attrib=dict(type='string')) + else: + if property_id in tdef.__dict__: + property_value = tdef.__dict__[property_id] + else: + property_value = '' + property_type = interaction_prop_id_to_show[property_id] + sub_object = SubElement(interaction, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value == [] or property_value == (): + property_value = '' + if property_id in ['once_per_transaction', 'temporary_document_disallowed']: + if property_value == True: + property_value = '1' + elif property_value == False or property_value is '': + property_value = '0' + sub_object.text = str(property_value) + + # 2. Variable as XML + variable_reference_list = [] + variable_id_list = sorted(self.variables.keys()) + variable_prop_id_to_show = {'description':'text', + 'default_expr':'string', 'for_catalog':'int', 'for_status':'int', + 'update_always':'int'} + for vid in variable_id_list: + variable_reference_list.append(vid) + variables = SubElement(interaction_workflow, 'variables', attrib=dict(variable_list=str(variable_reference_list), + number_of_element=str(len(variable_reference_list)))) + for vid in variable_id_list: + vdef = self.variables[vid] + variable = SubElement(variables, 'variable', attrib=dict(reference=vdef.getReference(), + portal_type='Workflow Variable')) + for property_id in sorted(variable_prop_id_to_show): + if property_id == 'default_expr': + expression = getattr(vdef, property_id, None) + if expression is not None: + property_value = expression.text + else: + property_value = '' + else: + property_value = getattr(vdef, property_id, '') + if property_value is None or property_value == [] or property_value ==(): + property_value = '' + property_type = variable_prop_id_to_show[property_id] + sub_object = SubElement(variable, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # 3. Script as XML + script_reference_list = [] + script_id_list = sorted(self.scripts.keys()) + script_prop_id_to_show = {'body':'string', 'parameter_signature':'string', + 'proxy_roles':'tokens'} + for sid in script_id_list: + script_reference_list.append(sid) + scripts = SubElement(interaction_workflow, 'scripts', attrib=dict(script_list=str(script_reference_list), + number_of_element=str(len(script_reference_list)))) + for sid in script_id_list: + sdef = self.scripts[sid] + script = SubElement(scripts, 'script', attrib=dict(reference=sid, + portal_type='Workflow Script')) + for property_id in sorted(script_prop_id_to_show): + if property_id == 'body': + property_value = sdef.getBody() + elif property_id == 'parameter_signature': + property_value = sdef.getParams() + elif property_id == 'proxy_roles': + property_value = sdef.getProxyRole() + else: + property_value = getattr(sdef, property_id) + property_type = script_prop_id_to_show[property_id] + sub_object = SubElement(script, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value == [] or property_value == (): + property_value = '' + sub_object.text = str(property_value) + + # return xml object + if return_as_object: + return root + return tostring(root, encoding='utf-8', + xml_declaration=True, pretty_print=True) + Globals.InitializeClass(InteractionWorkflowDefinition) addWorkflowFactory(InteractionWorkflowDefinition, id='interaction_workflow', diff --git a/product/ERP5/Interactor/PortalTypeClassInteractor.py b/product/ERP5/Interactor/PortalTypeClassInteractor.py index 3d98ff627e662fd7f778bebf914aa76c5599e53f..efc3829534fda5ada9f3a25ded3251ec75dc9fd8 100644 --- a/product/ERP5/Interactor/PortalTypeClassInteractor.py +++ b/product/ERP5/Interactor/PortalTypeClassInteractor.py @@ -37,12 +37,6 @@ class PortalTypeClassInteractor(Interactor): and dynamic properties. """ def install(self): - # changing chains or workflows on Workflow Tool - from Products.CMFCore.WorkflowTool import WorkflowTool - self.on(WorkflowTool.manage_changeWorkflows).doAfter(self.resetDynamic) - self.on(WorkflowTool.setDefaultChain).doAfter(self.resetDynamic) - self.on(WorkflowTool.setChainForPortalTypes).doAfter(self.resetDynamic) - from Products.DCWorkflow.Transitions import Transitions self.on(Transitions.addTransition).doAfter(self.resetDynamic) self.on(Transitions.deleteTransitions).doAfter(self.resetDynamic) @@ -55,6 +49,33 @@ class PortalTypeClassInteractor(Interactor): self.on(Localizer.add_language).doAfter(self.resetDynamic) self.on(Localizer.del_language).doAfter(self.resetDynamic) + # New workflow compatibility + + # Workflow/Portal Type association + from Products.ERP5Type.ERP5Type import ERP5TypeInformation + from product.ERP5.Document.SolverTypeInformation import SolverTypeInformation + self.on(ERP5TypeInformation.setTypeWorkflowList).doAfter(self.resetDynamic) + self.on(ERP5TypeInformation._edit).doAfter(self.resetDynamic) + self.on(SolverTypeInformation.setTypeWorkflowList).doAfter(self.resetDynamic) + self.on(SolverTypeInformation._edit).doAfter(self.resetDynamic) + + from Products.ERP5Workflow.Document.Workflow import Workflow + self.on(Workflow._delObject).doAfter(self.resetDynamic) + self.on(Workflow._edit).doAfter(self.resetDynamic) + + self.on(Workflow.addTransition).doAfter(self.resetDynamic) + self.on(Workflow.deleteTransitions).doAfter(self.resetDynamic) + + from Products.ERP5Workflow.Document.Transition import Transition + self.on(Transition._delObject).doAfter(self.resetDynamic) + self.on(Transition._edit).doAfter(self.resetDynamic) + + from Products.ERP5Workflow.Document.WorkflowVariable import WorkflowVariable + self.on(WorkflowVariable._edit).doAfter(self.resetDynamic) + + # XXX(WORKFLOW): add resetDynamic interaction on more method of new workflows? + + def resetDynamic(self, method_call_object, *args, **kw): """ Call resetDynamicDocuments at the end of the transaction diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Business%20Template/convert_to_ERP5_workflows.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Business%20Template/convert_to_ERP5_workflows.xml new file mode 100644 index 0000000000000000000000000000000000000000..904d32cfdc637a55ab493a83645513683e4afea1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Business%20Template/convert_to_ERP5_workflows.xml @@ -0,0 +1,101 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + AAAAAAAAAAM= + + + + description + + + + + + icon + + + + id + convert_to_ERP5_workflows + + + permissions + + + Modify portal content + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + Convert workflows to ERP5 Workflows + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/BusinessTemplate_convertToERP5Workflows + + + + + + + + + + + + text + python:\n +context.getInstallationState() != \'installed\' and context.getTemplateWorkflowIdList() + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/script_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/script_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..87c3be3907a10150b8f3abe25847136296d052af --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/script_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + script_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 3.0 + + + title + Scripts + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/InteractionWorkflow_viewWorkflowScriptList + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/variable_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/variable_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1d9bb0380e852b30d2e188db8f29bd5b750cdf2 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/variable_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + variable_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 2.0 + + + title + Variables + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/InteractionWorkflow_viewVariableList + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..d63e02dbed2163559bc967f764ff5a07dd61d57e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction%20Workflow/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/InteractionWorkflow_view + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..e741d6ae407537588a666c3bfa37001989d814b4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Interaction/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Interaction_view + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/State/permission.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/State/permission.xml new file mode 100644 index 0000000000000000000000000000000000000000..814e782f026cb8b4f7fd40ebfd1cc44962998b8a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/State/permission.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + permission + + + permissions + + + Add portal content + + + + + portal_type + Action Information + + + priority + 2.0 + + + title + Permission + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/State_viewPermission + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/State/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/State/view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/State/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/State/view.xml diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Transition%20Variable/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Transition%20Variable/view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Transition%20Variable/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Transition%20Variable/view.xml diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Transition/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Transition/view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Transition/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Transition/view.xml diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/proxy_role_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/proxy_role_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..780246d6c4004ffd399845a6607979afcd379c67 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/proxy_role_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + proxy_role_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 2.0 + + + title + Proxy Roles + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowScript_viewProxyRole + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/repository_history_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/repository_history_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..bfe00d4d144c9c8df84c54ebda46a891ea0405f3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/repository_history_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + repository_history_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 10.0 + + + title + Repository History + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Base_viewRepositoryHistory + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..ddd3ab40c0c5b360ca091929ade51cada7290068 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Script/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowScript_view + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/conversion.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/conversion.xml new file mode 100644 index 0000000000000000000000000000000000000000..67a6f4e694fccf95e047b4bf1f42ed4ee4e493bf --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/conversion.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + + + description + + + + + + icon + + + + id + conversion + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 2.0 + + + title + Convert DC Workflow + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowTool_viewWorkflowConversion + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..54f3e79aec7bcd8e83d1ee05532108a394c0e9fd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Tool/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorkflowTool_viewWorkflowList + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Variable/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Variable/view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Variable/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow%20Variable/view.xml diff --git a/bt5/erp5_configurator/ActionTemplateItem/portal_types/Workflow/launch_configuration.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/launch_configuration.xml similarity index 100% rename from bt5/erp5_configurator/ActionTemplateItem/portal_types/Workflow/launch_configuration.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/launch_configuration.xml diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/permission_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/permission_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..44b41e2555293d4ff0017405abc743103a72cc8e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/permission_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + permission_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 6.0 + + + title + Permissions + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_viewPermissionList + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/script_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/script_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..9cd035b81d65a8cddbae70471ca3f40276551f6b --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/script_view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + script_view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 5.0 + + + title + Scripts + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_viewWorkflowScriptList + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/transition_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/transition_view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/transition_view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/transition_view.xml diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/update_security_roles.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/update_security_roles.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b0bab9b7aa7b11632b0f98fe0fd8ffe7167f5cf --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/update_security_roles.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_action + + + + + category + object_action + + + condition + + + + description + + + + + + icon + + + + id + update_security_roles + + + permissions + + + Manage users + + + + + portal_type + Action Information + + + priority + 3.0 + + + title + Update Security Roles + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/Workflow_updateSecurityRoles + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/variable_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/variable_view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/variable_view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/variable_view.xml diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/view.xml similarity index 100% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/view.xml diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/worklist_view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/worklist_view.xml similarity index 97% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/worklist_view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/worklist_view.xml index 007c24b3a8b7c02bd5f31a2878b91f5b1ca73219..984509c6230836fb5817e33741256862d43c4995 100644 --- a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Workflow/worklist_view.xml +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Workflow/worklist_view.xml @@ -50,7 +50,7 @@ priority - 5.0 + 7.0 title diff --git a/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist%20Variable/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist%20Variable/view.xml new file mode 100644 index 0000000000000000000000000000000000000000..1c5a094a27909e5c3691f6697671c043fe5f5d14 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist%20Variable/view.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + AAAAAAAAAAI= + + + + categories + + + action_type/object_view + + + + + category + object_view + + + condition + + + + description + + + + + + icon + + + + id + view + + + permissions + + + View + + + + + portal_type + Action Information + + + priority + 1.0 + + + title + View + + + visible + 1 + + + + + + + + + + + + text + string:${object_url}/WorklistVariable_view + + + + + diff --git a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Worklist/view.xml b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist/view.xml similarity index 97% rename from bt5/erp5_workflow/ActionTemplateItem/portal_types/Worklist/view.xml rename to product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist/view.xml index 6fc1c218a79fbf161d76e8da043070abfd4f82f1..5c8a25fb7b5f72a75b72f70f9906e7021008e108 100644 --- a/bt5/erp5_workflow/ActionTemplateItem/portal_types/Worklist/view.xml +++ b/product/ERP5/bootstrap/erp5_core/ActionTemplateItem/portal_types/Worklist/view.xml @@ -30,7 +30,9 @@ description - + + + icon diff --git a/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/activate_script.xml b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/activate_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..4a196a3674731c8274a7f7e78bdbcb3961c26fc9 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/activate_script.xml @@ -0,0 +1,50 @@ + + + + + + + + + + acquisition_base_category + + + parent + + + + + acquisition_portal_type + python: [] + + + categories + + + activate_script + + + + + description + + + + + + id + activate_script + + + portal_type + Base Category + + + title + Activate Script + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/after_script.xml b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/after_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..79846dd66eeccc2ce185c293cd885db7e3fac5eb --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/after_script.xml @@ -0,0 +1,50 @@ + + + + + + + + + + acquisition_base_category + + + parent + + + + + acquisition_portal_type + python: [] + + + categories + + + after_script + + + + + description + + + + + + id + after_script + + + portal_type + Base Category + + + title + After Script + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_commit_script.xml b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_commit_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..39d7023d34c75ef60fe2d6ff8d385b0b5c064308 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_commit_script.xml @@ -0,0 +1,50 @@ + + + + + + + + + + acquisition_base_category + + + parent + + + + + acquisition_portal_type + python:[] + + + categories + + + before_commit_script + + + + + description + + + + + + id + before_commit_script + + + portal_type + Base Category + + + title + Before Commit Script + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_script.xml b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b4953c33d2bdadc788ccf217e3a217f46dab3c7 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/CategoryTemplateItem/portal_categories/before_script.xml @@ -0,0 +1,50 @@ + + + + + + + + + + acquisition_base_category + + + parent + + + + + acquisition_portal_type + python: [] + + + categories + + + before_script + + + + + description + + + + + + id + before_script + + + portal_type + Base Category + + + title + Before Script + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/ExtensionTemplateItem/portal_components/extension.erp5.FolderWorkflowActionUtils.py b/product/ERP5/bootstrap/erp5_core/ExtensionTemplateItem/portal_components/extension.erp5.FolderWorkflowActionUtils.py index 03e157940b8d842d4a0af92744c1aab335ba6624..61dd739d1abf56a2c81e2d3924130adb49f0fdb5 100644 --- a/product/ERP5/bootstrap/erp5_core/ExtensionTemplateItem/portal_components/extension.erp5.FolderWorkflowActionUtils.py +++ b/product/ERP5/bootstrap/erp5_core/ExtensionTemplateItem/portal_components/extension.erp5.FolderWorkflowActionUtils.py @@ -85,7 +85,7 @@ def getDocumentGroupByWorkflowStateList(self, form_id='', **kw): for workflow in wf_tool.getWorkflowsFor(doc): if workflow.getId() in skipped_workflow_id_list: continue - state_var = workflow.variables.getStateVar() + state_var = workflow.getStateVariable() translated_workflow_state_title = doc.getProperty( 'translated_%s_title' % state_var) if state_var == workflow_state: @@ -116,7 +116,7 @@ def getDocumentGroupByWorkflowStateList(self, form_id='', **kw): for workflow in wf_tool.getWorkflowsFor(document): if workflow.getId() in skipped_workflow_id_list: continue - if state_var == workflow.variables.getStateVar(): + if state_var == workflow.getStateVariable(): key = (document.getPortalTypeName(), workflow.getId(), document.getProperty(state_var)) document_count = workflow_state_dict.get(key, (None, 0))[1] @@ -126,7 +126,7 @@ def getDocumentGroupByWorkflowStateList(self, form_id='', **kw): for (ptype, workflow_id, _), (doc, document_count) in\ workflow_state_dict.iteritems(): workflow = wf_tool.getWorkflowById(workflow_id) - state_var = workflow.variables.getStateVar() + state_var = workflow.getStateVariable() translated_workflow_state_title = doc.getProperty( 'translated_%s_title' % state_var) workflow_id = workflow.getId() @@ -210,7 +210,7 @@ def getPossibleWorkflowActionItemList(self, brain, **kw): for action in portal.portal_actions.listFilteredActionsFor(brain).get('workflow', []): transition = action.get('transition', None) if transition is not None: - workflow_id = action['transition'].aq_parent.aq_parent.getId() + workflow_id = action['transition'].getParentValue().getId() if workflow_id == brain.workflow_id: dialog_id = action['url'].split('?', 1)[0].split('/')[-1] dialog_object = getattr(portal, dialog_id, None) diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/62.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow.xml similarity index 68% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/62.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow.xml index 60eade01b4595d5b14a90136973c395a616d004b..1482a861ae7c5a8b7993f6c620dcba285f405ffb 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/62.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow.xml @@ -2,7 +2,7 @@ - + @@ -24,18 +24,18 @@ AAAAAAAAAAQ= - - after_script_id - BusinessConfiguration_setupEmployeesNumber - categories - destination/workflow_module/erp5_standard_workflow/61 + source/portal_workflow/business_template_building_workflow/state_draft + + default_reference + business_template_building_workflow + description @@ -43,24 +43,30 @@ - guard_expression - python: True + id + business_template_building_workflow - id - 62 + manager_bypass + 0 portal_type - Transition + Workflow + + + state_variable + building_state title - Configure user accounts number + Business Template Building Workflow - transition_form_id - BusinessConfiguration_setupEmployeesNumberForm + workflow_managed_permission + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_built.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_built.xml new file mode 100644 index 0000000000000000000000000000000000000000..21662bd324136ffc1e9ef07a908543b7b1de5685 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_built.xml @@ -0,0 +1,214 @@ + + + + + + + + + + acquire_permission + + + + + + categories + + + destination/portal_workflow/business_template_building_workflow/transition_build + destination/portal_workflow/business_template_building_workflow/transition_clean + destination/portal_workflow/business_template_building_workflow/transition_clean_action + destination/portal_workflow/business_template_building_workflow/transition_edit + destination/portal_workflow/business_template_building_workflow/transition_rebuild_action + + + + + default_reference + built + + + description + + + + + + id + state_built + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Built + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_draft.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_draft.xml new file mode 100644 index 0000000000000000000000000000000000000000..26d3ad731b454c4f05658a9ccc24f950e4962159 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_draft.xml @@ -0,0 +1,213 @@ + + + + + + + + + + acquire_permission + + + + + + categories + + + destination/portal_workflow/business_template_building_workflow/transition_build + destination/portal_workflow/business_template_building_workflow/transition_build_action + destination/portal_workflow/business_template_building_workflow/transition_clean + destination/portal_workflow/business_template_building_workflow/transition_edit + + + + + default_reference + draft + + + description + + + + + + id + state_draft + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Draft + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_modified.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_modified.xml new file mode 100644 index 0000000000000000000000000000000000000000..49d350fe97c0a0d2ec09d5a72fd772b0796fc1d7 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/state_modified.xml @@ -0,0 +1,213 @@ + + + + + + + + + + acquire_permission + + + + + + categories + + + destination/portal_workflow/business_template_building_workflow/transition_build + destination/portal_workflow/business_template_building_workflow/transition_build_action + destination/portal_workflow/business_template_building_workflow/transition_clean + destination/portal_workflow/business_template_building_workflow/transition_edit + + + + + default_reference + modified + + + description + + + + + + id + state_modified + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Modified + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d1765dffffd7d4ec0c97dfd391567af0e0f968c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_building_workflow/state_built + + + + + default_reference + build + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_build + + + portal_type + Transition + + + title + Build Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..10569051fda7f39442037617aa208d88a6af2ecd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_build_action.xml @@ -0,0 +1,81 @@ + + + + + + + + + + action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=build_action + + + action_name + Build Business Template + + + categories + + + action_type/workflow + after_script/portal_workflow/business_template_building_workflow/transition_build + + + + + default_reference + build_action + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_build_action + + + portal_type + Transition + + + title + Build Business Template Action + + + trigger_type + 1 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd9185d2b270e6aac4db83a34f4de158c226387e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_building_workflow/state_modified + + + + + default_reference + clean + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_clean + + + portal_type + Transition + + + title + Clean Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean_action.xml similarity index 52% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean_action.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean_action.xml index d0156e38ffac9326ddd5d4da6e8d88b89ec608ac..70184e4f58bca7b392d36ec52c9fbbacc1af3778 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/transitions/clean_action.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_clean_action.xml @@ -2,47 +2,70 @@ - + - actbox_category - workflow + action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=clean_action - actbox_name + action_name Clean Business Template - actbox_url - %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=clean_action + categories + + + action_type/workflow + after_script/portal_workflow/business_template_building_workflow/transition_clean + + - after_script_name - clean + default_reference + clean_action description - + + + - guard + guard_group - AAAAAAAAAAI= + - id - clean_action + guard_permission + + + Manage portal + + - new_state_id - + guard_role + + + - script_name - + icon + + + + + + id + transition_clean_action + + + portal_type + Transition title @@ -55,24 +78,4 @@ - - - - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_edit.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..eea8a6c08ad7b315f42a85afe57b6dba6f137bd0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_edit.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_building_workflow/state_modified + + + + + default_reference + edit + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_edit + + + portal_type + Transition + + + title + Edit Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_rebuild_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_rebuild_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..64b6afb3112de8e73cb05557e428f870968b0eda --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/transition_rebuild_action.xml @@ -0,0 +1,81 @@ + + + + + + + + + + action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=rebuild_action + + + action_name + Rebuild Business Template + + + categories + + + action_type/workflow + after_script/portal_workflow/business_template_building_workflow/transition_build + + + + + default_reference + rebuild_action + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_rebuild_action + + + portal_type + Transition + + + title + Rebuild Business Template + + + trigger_type + 1 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..754889c08c067861c90ff091350c0626695e8c5a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_action.xml @@ -0,0 +1,67 @@ + + + + + + + + + + automatic_update + 1 + + + default_reference + action + + + description + + + + + + for_catalog + 0 + + + id + variable_action + + + portal_type + Workflow Variable + + + status_included + 1 + + + title + + + + + + variable_expression + + AAAAAAAAAAI= + + + + + + + + + + + + + text + transition/getReference|nothing + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/actor.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_actor.xml similarity index 69% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/actor.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_actor.xml index 8e78d8a17fd1c56d7bbac7f77e1a5ce399bdd7ac..c1a58f93f968d8a65ceb0e8d765f72bf07b70ac1 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/actor.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_actor.xml @@ -2,45 +2,51 @@ - + - default_expr - - AAAAAAAAAAI= - + automatic_update + 1 - default_value - + default_reference + actor description - + + + for_catalog 0 - for_status - 1 + id + variable_actor - id - actor + portal_type + Workflow Variable + + + status_included + 1 - info_guard + title - update_always - 1 + variable_expression + + AAAAAAAAAAI= + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/comment.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_comment.xml similarity index 69% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/comment.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_comment.xml index 73cd2e791368af4a8e45c18b443bdc7ce1044318..5d475668f53c4df55e14d4c825db076a171dd03e 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/comment.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_comment.xml @@ -2,45 +2,51 @@ - + - default_expr - - AAAAAAAAAAI= - + automatic_update + 1 - default_value - + default_reference + comment description - + + + for_catalog 0 - for_status - 1 + id + variable_comment - id - comment + portal_type + Workflow Variable + + + status_included + 1 - info_guard + title - update_always - 1 + variable_expression + + AAAAAAAAAAI= + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/history.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_history.xml similarity index 69% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/history.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_history.xml index e0fe339d69806e85c8cb3e1022cb1911912fad0e..55845ac32273e2b4f0e5e730a4507a5450aa7a4f 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/history.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_history.xml @@ -2,45 +2,51 @@ - + - default_expr - - AAAAAAAAAAI= - + automatic_update + 1 - default_value - + default_reference + history description - + + + for_catalog 0 - for_status - 0 + id + variable_history - id - history + portal_type + Workflow Variable + + + status_included + 0 - info_guard + title - update_always - 1 + variable_expression + + AAAAAAAAAAI= + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/time.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_time.xml similarity index 69% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/time.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_time.xml index 5ae6932d9904ddbf87ab731c4188bdcf279f62ba..e7d4f87cb72a0fecdedb78f01bc941333dd70793 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/time.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_building_workflow/variable_time.xml @@ -2,45 +2,51 @@ - + - default_expr - - AAAAAAAAAAI= - + automatic_update + 1 - default_value - + default_reference + time description - + + + for_catalog 0 - for_status - 1 + id + variable_time - id - time + portal_type + Workflow Variable + + + status_included + 1 - info_guard + title - update_always - 1 + variable_expression + + AAAAAAAAAAI= + diff --git a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/29.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow.xml similarity index 67% rename from bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/29.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow.xml index 0e23a693dc8d125b4747fedd24c7e28d712c55e8..474acb1a12dd1f8ca12c459cb41dc97f2876d1ac 100644 --- a/bt5/erp5_configurator_ebusiness_lotse/PathTemplateItem/workflow_module/ebusiness_lotse_configuration_workflow/29.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow.xml @@ -2,7 +2,7 @@ - + @@ -12,23 +12,6 @@ AAAAAAAAAAI= - - _local_properties - - - - - id - comment - - - type - string - - - - - _mt_index @@ -45,13 +28,13 @@ categories - destination/workflow_module/ebusiness_lotse_configuration_workflow/14 + source/portal_workflow/business_template_installation_workflow/state_not_installed - comment - Set Customer Business Template + default_reference + business_template_installation_workflow description @@ -61,15 +44,32 @@ id - 29 + business_template_installation_workflow + + + manager_bypass + 0 portal_type - State + Workflow + + + state_variable + installation_state title - Customer BT + Business Template Installation Workflow + + + workflow_managed_permission + + + Modify portal content + View + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/script_BusinessTemplate_install.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/script_BusinessTemplate_install.xml new file mode 100644 index 0000000000000000000000000000000000000000..adcca142aa3cf4074ccea759fafee2d2e08a2245 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/script_BusinessTemplate_install.xml @@ -0,0 +1,106 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _body + 0:\n + for item in listbox:\n + if item[\'choice\']:\n + # Choice parameter is now selected with a MultiCheckBoxField with only one element\n + # Business Template need to get a string and not a list\n + object_to_update[item[\'listbox_key\']] = item[\'choice\'][0]\n + else:\n + object_to_update[item[\'listbox_key\']] = "nothing"\n +\n +if workflow_action == \'install_action\':\n + business_template.install(force=0, object_to_update=object_to_update, \\\n + update_catalog=update_catalog, update_translation=update_translation)\n +elif workflow_action == \'reinstall_action\':\n + business_template.reinstall(force=0, object_to_update=object_to_update, \\\n + update_catalog=update_catalog, update_translation=update_translation)\n + + +]]> + + + _params + state_change + + + default_reference + BusinessTemplate_install + + + id + script_BusinessTemplate_install + + + portal_type + Workflow Script + + + title + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_deleted.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_deleted.xml new file mode 100644 index 0000000000000000000000000000000000000000..08cfb7b79dd8d8584011c4b5925a3104767b6c85 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_deleted.xml @@ -0,0 +1,226 @@ + + + + + + + + + + acquire_permission + + + + + + default_reference + deleted + + + description + + + + + + id + state_deleted + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Deleted + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + Modify portal content + + + Manager + + + + + View + + + + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + Modify portal content + 0 + + + View + 1 + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_installed.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_installed.xml new file mode 100644 index 0000000000000000000000000000000000000000..b295dbcb3a2860e59a5cb7c244339b0f9ec01225 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_installed.xml @@ -0,0 +1,238 @@ + + + + + + + + + + acquire_permission + + + View + + + + + categories + + + destination/portal_workflow/business_template_installation_workflow/transition_reinstall + destination/portal_workflow/business_template_installation_workflow/transition_reinstall_action + destination/portal_workflow/business_template_installation_workflow/transition_replace + destination/portal_workflow/business_template_installation_workflow/transition_uninstall + destination/portal_workflow/business_template_installation_workflow/transition_uninstall_action + + + + + default_reference + installed + + + description + + + + + + id + state_installed + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Installed + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + Modify portal content + + + + + + View + + + + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + Modify portal content + 0 + + + View + 1 + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_not_installed.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_not_installed.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a03f39989fdfa050176fd06d7072fa90157b121 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_not_installed.xml @@ -0,0 +1,239 @@ + + + + + + + + + + acquire_permission + + + View + + + + + categories + + + destination/portal_workflow/business_template_installation_workflow/transition_delete + destination/portal_workflow/business_template_installation_workflow/transition_delete_action + destination/portal_workflow/business_template_installation_workflow/transition_install + destination/portal_workflow/business_template_installation_workflow/transition_install_action + + + + + default_reference + not_installed + + + description + + + + + + id + state_not_installed + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Not Installed + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + Modify portal content + + + Manager + + + + + View + + + + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + Modify portal content + 0 + + + View + 1 + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_replaced.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_replaced.xml new file mode 100644 index 0000000000000000000000000000000000000000..fe2ff5aeddd60e17e91054c2eec755a4f2843152 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/state_replaced.xml @@ -0,0 +1,239 @@ + + + + + + + + + + acquire_permission + + + View + + + + + categories + + + destination/portal_workflow/business_template_installation_workflow/transition_delete + destination/portal_workflow/business_template_installation_workflow/transition_delete_action + destination/portal_workflow/business_template_installation_workflow/transition_install + destination/portal_workflow/business_template_installation_workflow/transition_install_action + + + + + default_reference + replaced + + + description + + + + + + id + state_replaced + + + index + + AAAAAAAAAAI= + + + + portal_type + State + + + state_permission_roles_dict + + AAAAAAAAAAM= + + + + state_type + + + + + + title + Replaced + + + + + + + + + + + + data + + + + cell + + AAAAAAAAAAQ= + + + + + + + + + + + + + + + + data + + + + Modify portal content + + + Manager + + + + + View + + + + + + + + + + + + + + + + + + data + + + + 0 + + AAAAAAAAAAU= + + + + 1 + + AAAAAAAAAAY= + + + + + + + + + + + + + + + + data + + + + Modify portal content + 0 + + + View + 1 + + + + + + + + + + + + + + + data + + + + Anonymous + 0 + + + Assignee + 1 + + + Assignor + 2 + + + Associate + 3 + + + Auditor + 4 + + + Authenticated + 5 + + + Author + 6 + + + Director + 7 + + + Manager + 8 + + + Member + 9 + + + Owner + 10 + + + Reviewer + 11 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d9078cb50c0c5feec3cfdabfc17b23be1693d54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_installation_workflow/state_deleted + + + + + default_reference + delete + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_delete + + + portal_type + Transition + + + title + Delete Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..75cb075e122b5f587630e153fb1d2687efa49401 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_delete_action.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + after_script/portal_workflow/business_template_installation_workflow/transition_delete + + + + + default_reference + delete_action + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_delete_action + + + portal_type + Transition + + + title + Delete Business Template Action + + + trigger_type + 1 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install.xml new file mode 100644 index 0000000000000000000000000000000000000000..f2cb06f69909ad06b0e748cd3599ee0dcd96c87e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_installation_workflow/state_installed + + + + + default_reference + install + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_install + + + portal_type + Transition + + + title + Install Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install_action.xml similarity index 52% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install_action.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install_action.xml index 0766c990de0783b6da671e9d7a369cdf7e580fa0..dbe5666cf5a9d5fbeaf331759ddcad2dea47cd57 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install_action.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_install_action.xml @@ -2,47 +2,70 @@ - + - actbox_category - workflow + action + %(content_url)s/BusinessTemplate_viewInstallationDialog?workflow_action=install_action - actbox_name + action_name Install Business Template - actbox_url - %(content_url)s/BusinessTemplate_viewInstallationDialog?workflow_action=install_action + categories + + + action_type/workflow + after_script/portal_workflow/business_template_installation_workflow/script_BusinessTemplate_install + + - after_script_name - BusinessTemplate_install + default_reference + install_action description - + + + - guard + guard_group - AAAAAAAAAAI= + - id - install_action + guard_permission + + + Manage portal + + - new_state_id - + guard_role + + + - script_name - + icon + + + + + + id + transition_install_action + + + portal_type + Transition title @@ -55,24 +78,4 @@ - - - - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall.xml new file mode 100644 index 0000000000000000000000000000000000000000..6300fca2ce96490e2b6383ba23c2f0c5bd34d423 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_installation_workflow/state_installed + + + + + default_reference + reinstall + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_reinstall + + + portal_type + Transition + + + title + Reinstall Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall_action.xml similarity index 52% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall_action.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall_action.xml index 9dd42786c4586a36342ef7a07271f618304d27b0..f4cc59ae2a1e414731d049bd52eb22bf843bb112 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall_action.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_reinstall_action.xml @@ -2,47 +2,70 @@ - + - actbox_category - workflow + action + %(content_url)s/BusinessTemplate_viewInstallationDialog?workflow_action=reinstall_action - actbox_name + action_name Re-install Business Template - actbox_url - %(content_url)s/BusinessTemplate_viewInstallationDialog?workflow_action=reinstall_action + categories + + + action_type/workflow + after_script/portal_workflow/business_template_installation_workflow/script_BusinessTemplate_install + + - after_script_name - BusinessTemplate_install + default_reference + reinstall_action description - + + + - guard + guard_group - AAAAAAAAAAI= + - id - reinstall_action + guard_permission + + + Manage portal + + - new_state_id - + guard_role + + + - script_name - + icon + + + + + + id + transition_reinstall_action + + + portal_type + Transition title @@ -55,24 +78,4 @@ - - - - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_replace.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_replace.xml new file mode 100644 index 0000000000000000000000000000000000000000..c60524f049f048b29d73f3ca99dc692c2359f005 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_replace.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_installation_workflow/state_replaced + + + + + default_reference + replace + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_replace + + + portal_type + Transition + + + title + Replace Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall.xml new file mode 100644 index 0000000000000000000000000000000000000000..4bbe373e627cd289fb25c01d0cbe76e11fe6e0d8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall.xml @@ -0,0 +1,85 @@ + + + + + + + + + + action + + + + + + action_name + + + + + + categories + + + action_type/workflow + destination/portal_workflow/business_template_installation_workflow/state_not_installed + + + + + default_reference + uninstall + + + description + + + + + + guard_group + + + + + + guard_permission + + + Manage portal + + + + + guard_role + + + + + + icon + + + + + + id + transition_uninstall + + + portal_type + Transition + + + title + Uninstall Business Template + + + trigger_type + 2 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall_action.xml similarity index 52% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall_action.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall_action.xml index b6a22e3df09af792e40de45706b50b7b4b0a38c4..bbdfeb500efdc511e28dcbb41df457ba5708e288 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall_action.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/transition_uninstall_action.xml @@ -2,47 +2,70 @@ - + - actbox_category - workflow + action + %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=uninstall_action - actbox_name + action_name Uninstall Business Template - actbox_url - %(content_url)s/Base_viewWorkflowActionDialog?workflow_action=uninstall_action + categories + + + action_type/workflow + after_script/portal_workflow/business_template_installation_workflow/transition_uninstall + + - after_script_name - uninstall + default_reference + uninstall_action description - + + + - guard + guard_group - AAAAAAAAAAI= + - id - uninstall_action + guard_permission + + + Manage portal + + - new_state_id - + guard_role + + + - script_name - + icon + + + + + + id + transition_uninstall_action + + + portal_type + Transition title @@ -55,24 +78,4 @@ - - - - - - - - - - - permissions - - - Manage portal - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..754889c08c067861c90ff091350c0626695e8c5a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_action.xml @@ -0,0 +1,67 @@ + + + + + + + + + + automatic_update + 1 + + + default_reference + action + + + description + + + + + + for_catalog + 0 + + + id + variable_action + + + portal_type + Workflow Variable + + + status_included + 1 + + + title + + + + + + variable_expression + + AAAAAAAAAAI= + + + + + + + + + + + + + text + transition/getReference|nothing + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_actor.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_actor.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1a58f93f968d8a65ceb0e8d765f72bf07b70ac1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_actor.xml @@ -0,0 +1,73 @@ + + + + + + + + + + automatic_update + 1 + + + default_reference + actor + + + description + + + + + + for_catalog + 0 + + + id + variable_actor + + + portal_type + Workflow Variable + + + status_included + 1 + + + title + + + + + + variable_expression + + AAAAAAAAAAI= + + + + + + + + + + Products.CMFCore.Expression + Expression + + + + + + + + text + user/getIdOrUserName + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_comment.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d475668f53c4df55e14d4c825db076a171dd03e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_comment.xml @@ -0,0 +1,73 @@ + + + + + + + + + + automatic_update + 1 + + + default_reference + comment + + + description + + + + + + for_catalog + 0 + + + id + variable_comment + + + portal_type + Workflow Variable + + + status_included + 1 + + + title + + + + + + variable_expression + + AAAAAAAAAAI= + + + + + + + + + + Products.CMFCore.Expression + Expression + + + + + + + + text + python:state_change.kwargs.get(\'comment\',\'\') + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_history.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_history.xml new file mode 100644 index 0000000000000000000000000000000000000000..55845ac32273e2b4f0e5e730a4507a5450aa7a4f --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_history.xml @@ -0,0 +1,73 @@ + + + + + + + + + + automatic_update + 1 + + + default_reference + history + + + description + + + + + + for_catalog + 0 + + + id + variable_history + + + portal_type + Workflow Variable + + + status_included + 0 + + + title + + + + + + variable_expression + + AAAAAAAAAAI= + + + + + + + + + + Products.CMFCore.Expression + Expression + + + + + + + + text + state_change/getHistory + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/action.xml b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_time.xml similarity index 63% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/action.xml rename to product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_time.xml index e00c8713348bce7b6fe4178219a5ec5ae633c413..e7d4f87cb72a0fecdedb78f01bc941333dd70793 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/variables/action.xml +++ b/product/ERP5/bootstrap/erp5_core/PathTemplateItem/portal_workflow/business_template_installation_workflow/variable_time.xml @@ -2,45 +2,51 @@ - + - default_expr - - AAAAAAAAAAI= - + automatic_update + 1 - default_value - + default_reference + time description - + + + for_catalog 0 - for_status - 1 + id + variable_time - id - action + portal_type + Workflow Variable + + + status_included + 1 - info_guard + title - update_always - 1 + variable_expression + + AAAAAAAAAAI= + @@ -59,7 +65,7 @@ text - transition/getId|nothing + state_change/getDateTime diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml index ca0f166cac7bbcd0938f52a4092625711379c4a2..42b4412dab7bae222ff242c0cdf3ad68bdd3fd1f 100644 --- a/product/ERP5/bootstrap/erp5_core/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml @@ -58,6 +58,14 @@ SQL Non Continuous Increasing Id Generator ZODB Continuous Increasing Id Generator + + Transition Variable + + + Interaction + Workflow Script + Workflow Variable + Memcached Plugin @@ -106,10 +114,27 @@ Business Template + + Transition Variable + Trash Bin Base Type + + State + Transition + Workflow Script + Workflow Variable + Worklist + + + Interaction Workflow + Workflow + + + Worklist Variable + \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeBaseCategoryTemplateItem/base_category_list.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeBaseCategoryTemplateItem/base_category_list.xml index 4781321181e3c03dda7aa2269df97d9c6055f06f..640996813c36ea99fc0e41e77f842fd0df822098 100644 --- a/product/ERP5/bootstrap/erp5_core/PortalTypeBaseCategoryTemplateItem/base_category_list.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeBaseCategoryTemplateItem/base_category_list.xml @@ -5,6 +5,9 @@ specialise + + causality + causality diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction%20Workflow.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction%20Workflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..db36a2897a5464fe8b3d43e36eb0492bc35f6c6b --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction%20Workflow.xml @@ -0,0 +1,68 @@ + + + + + + + + + + acquire_local_roles + 1 + + + content_icon + document.gif + + + description + + + + + + erp5workflow_list + + + + + + id + Interaction Workflow + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + InteractionWorkflow + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..1c6640910139ecae2d5308c7d02cf4536436ef07 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Interaction.xml @@ -0,0 +1,66 @@ + + + + + + + + + + acquire_local_roles + 1 + + + content_icon + document.gif + + + description + An ERP5 interaction. + + + erp5workflow_list + + + + + + id + Interaction + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + Interaction + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/State.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/State.xml similarity index 77% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/State.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/State.xml index ee8dbd2a59ce8d284767679c71e213ebf57e9317..33ba9834a691f5b69f6cb7303b19bab5f28416ef 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/State.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/State.xml @@ -39,6 +39,12 @@ A ERP5 State.\n + + erp5workflow_list + + + + factory addState @@ -47,6 +53,18 @@ id State + + init_script + + + + + + permission + + + + title @@ -55,6 +73,24 @@ type_class State + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Variable.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml similarity index 66% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Variable.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml index f42fde0c608855aa9b3faf7bfa23e8520abf82fc..f930baad327f36b9f6602a184f16c208b59aebe6 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Variable.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml @@ -25,6 +25,10 @@ + + acquire_local_roles + 1 + content_icon document.gif @@ -35,17 +39,44 @@ description - \n - A ERP5 Variable.\n + A Workflow Transition Variable.\n + + erp5workflow_list + + + + factory addVariable + + filter_content_types + 1 + + + group_list + + + + id - Variable + Transition Variable + + + init_script + + + + + + permission + + + title @@ -53,7 +84,25 @@ type_class - Variable + WorkflowVariable + + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition.xml similarity index 87% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition.xml index 24a4c95b7e1b0692a9e1cb47df571a70a73e66e0..256beddf6f85d9a679c5a5ef7d9e1c1a0e95cca8 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Transition.xml @@ -62,7 +62,15 @@ init_script - + + + + + + permission + + + title @@ -72,6 +80,18 @@ type_class Transition + + type_interface + + + + + + type_mixin + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Script.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Script.xml new file mode 100644 index 0000000000000000000000000000000000000000..89a0d34b936d601111dac9d5d4a59a88e4671837 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Script.xml @@ -0,0 +1,72 @@ + + + + + + + + + + content_icon + + + + + + description + + + + + + erp5workflow_list + + + + + + id + Workflow Script + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + WorkflowScript + + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Tool.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Tool.xml new file mode 100644 index 0000000000000000000000000000000000000000..b655278cefed4e9d665f70da4bd415e6339fbb85 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Tool.xml @@ -0,0 +1,167 @@ + + + + + + + + + + _property_domain_dict + + AAAAAAAAAAI= + + + + acquire_local_roles + 1 + + + content_icon + + + + + + description + Folder which holds the DCWorkflows and workflows. + + + group_list + + + + + + id + Workflow Tool + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + short_title + + + + + + type_class + WorkflowTool + + + type_interface + + + + + + type_mixin + + + + + + + + + + + + + + + data + + + + description + + AAAAAAAAAAM= + + + + short_title + + AAAAAAAAAAQ= + + + + title + + AAAAAAAAAAU= + + + + + + + + + + + + + + + + domain_name + + + + + + property_name + description + + + + + + + + + + + + domain_name + erp5_ui + + + property_name + short_title + + + + + + + + + + + + domain_name + erp5_ui + + + property_name + title + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Variable.xml similarity index 79% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Variable.xml index 98ee69d3ee3fba3ab77de2c6a7b2a03771494d06..1b6c949ad82cf7610000e1a106351f42b2cc7028 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Transition%20Variable.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow%20Variable.xml @@ -25,10 +25,6 @@ - - acquire_local_roles - 1 - content_icon document.gif @@ -39,30 +35,34 @@ description - A ERP5 Transition Variable.\n + A Workflow Variable.\n + + erp5workflow_list + + + + factory addVariable - filter_content_types - 1 + id + Workflow Variable - group_list + init_script - + - id - Transition Variable - - - init_script - + permission + + + title @@ -70,7 +70,25 @@ type_class - Variable + WorkflowVariable + + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow.xml similarity index 81% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow.xml index 96fef46236c2a5c2b42d9195f6b03f78541362d9..310d3594d2c70af8577e7bcb560bbf73405423ad 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Workflow.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Workflow.xml @@ -41,6 +41,12 @@ description An ERP5 Workflow. + + erp5workflow_list + + + + factory addWorkflow @@ -61,7 +67,13 @@ init_script - + Workflow_init + + + permission + + + title @@ -71,6 +83,24 @@ type_class Workflow + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist%20Variable.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist%20Variable.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba2f6082b88159c6d6ba8f7f9bc88cd4982937cd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist%20Variable.xml @@ -0,0 +1,64 @@ + + + + + + + + + + acquire_local_roles + 1 + + + content_icon + + + + + + description + + + + + + id + Worklist Variable + + + init_script + + + + + + permission + + + + + + portal_type + Base Type + + + type_class + WorklistVariable + + + type_interface + + + + + + type_mixin + + + + + + + + diff --git a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Worklist.xml b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist.xml similarity index 51% rename from bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Worklist.xml rename to product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist.xml index 28c72be7ec6ed468a236b7a1c197dee77375d035..8ff794256e1422a830a47223d536e4151a6256b2 100644 --- a/bt5/erp5_workflow/PortalTypeTemplateItem/portal_types/Worklist.xml +++ b/product/ERP5/bootstrap/erp5_core/PortalTypeTemplateItem/portal_types/Worklist.xml @@ -20,6 +20,12 @@ A ERP5 Worklist.\n + + erp5workflow_list + + + + factory addWorklist @@ -28,10 +34,44 @@ id Worklist + + init_script + + + + + + permission + + + + title + + type_class + Worklist + + + type_interface + + + + + + type_mixin + + + + + + workflow_list + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint.xml b/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint.xml new file mode 100644 index 0000000000000000000000000000000000000000..cde2699c2a47836ee249f097f43ef7bdb80510ea --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint.xml @@ -0,0 +1,64 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + description + Verifies that the portal type has the Workflow property set as expected. + + + id + UpgraderConstraint + + + portal_type + Property Sheet + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint/workflow_chain_consistency_constraint.xml b/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint/workflow_chain_dict_removal_constraint.xml similarity index 86% rename from bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint/workflow_chain_consistency_constraint.xml rename to product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint/workflow_chain_dict_removal_constraint.xml index e0888f12dfd5ba7347ecfa5d1f1bd03eb8199d97..597be9e939565343e5aed6e1d53d9970f78de3b3 100644 --- a/bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint/workflow_chain_consistency_constraint.xml +++ b/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/UpgraderConstraint/workflow_chain_dict_removal_constraint.xml @@ -26,6 +26,10 @@ + + default_reference + workflow_chain_dict_removal + description @@ -34,7 +38,7 @@ id - workflow_chain_consistency_constraint + workflow_chain_dict_removal_constraint portal_type @@ -42,7 +46,7 @@ script_id - TemplateTool_checkWorkflowChainConsistency + WorkflowTool_checkChainDictRemovalConsistency diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view.xml index 72151f9a685abc03ac8e89f1b95ae03cbd2ee765..eb305484748d5a725881dcfe8aed662589411879 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view.xml @@ -106,6 +106,7 @@ my_type_property_sheet_list my_type_base_category_list my_type_icon + my_type_workflow_list diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view/my_type_workflow_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view/my_type_workflow_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..9822e3554a4082efcfb4d1856eed4a3f7183d188 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseType_view/my_type_workflow_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_type_workflow_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + ERP5 Workflow + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getId()) for x in here.getPortalObject().portal_workflow.objectValues()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowHistoryItemList.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowHistoryItemList.py index 43604af49e7f408072557d495cc8d6f38f7bc7c2..d35c98f116b8d8b30029245c19ae036764cba2ac 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowHistoryItemList.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowHistoryItemList.py @@ -9,7 +9,6 @@ can_view_history = getSecurityManager().getUser().has_permission('View History', marker = [] result = [] -i = 1 portal_object = context.getPortalObject() portal_workflow = portal_object.portal_workflow workflow_id_list = [x for x, y in context.getWorkflowStateItemList()] @@ -28,61 +27,53 @@ def getActorName(actor): actor_name_cache[actor] = person.getTitle() return actor_name_cache[actor] - - # Get history -# XXX Compatibility -for history_name in ['history', 'building_history', 'installation_history']: - workflow_item_list = portal_workflow.getInfoFor(ob=context, - name='history', wf_id=workflow_id) - if workflow_item_list != []: - break +workflow_item_list = portal_workflow.getInfoFor(ob=context, name='history', + wf_id=workflow_id) -wf_state_var = portal_workflow[workflow_id].variables.getStateVar() -wf_states = portal_workflow[workflow_id].states -wf_transitions = portal_workflow[workflow_id].transitions +workflow = getattr(portal_workflow, workflow_id) +wf_state_variable = workflow.getStateVariable() next_serial = None previous_obj = None -for workflow_item in workflow_item_list: +for position, workflow_item in enumerate(workflow_item_list): # XXX removing str method generate a strange bug - o = newTempBase(portal_object, str(i)) - i += 1 + current_object = newTempBase(portal_object, str(position + 1)) for key, value in workflow_item.items(): if key == 'serial' and not can_view_history: continue - # XXX Compatibility - for compatibility_name in ['building_', 'installation_']: - if key.startswith(compatibility_name): - # Display the workflow state in the state columns - key = key[len(compatibility_name):] - if key == wf_state_var: + if key == wf_state_variable: + state = workflow.getStateValueById(value) # Store locally the id of state, usefull for merging action and transition - state_id = wf_states.get(value, marker) and wf_states[value].id - o.setProperty('state_id', state_id) + state_id = marker if not state else value + current_object.setProperty('state_id', state_id) key = 'state' if display: - value = wf_states.get(value, marker) and wf_states[value].title + value = marker if not state else state.title else: value = state_id if key == 'action': # Store locally the id of action, usefull for merging action and transition - o.setProperty('action_id', value) + current_object.setProperty('action_id', value) if value != '' and value is not None: if value == "'edit'": value = "edit" - if display: - value = wf_transitions.get(value, marker) and (wf_transitions[value].title or wf_transitions[value].actbox_name) or value - else: - value = wf_transitions.get(value, marker) and (wf_transitions[value].id or wf_transitions[value].actbox_name) or value + transition = workflow.getTransitionValueById(value) + if transition: + if display: + value = transition.title or transition.actbox_name or value + else: + value = transition.getReference() or transition.actbox_name or value if display: - if key == 'error_message' and same_type(value, ''): - value = context.Localizer.erp5_ui.gettext(value) - elif key == 'error_message' and same_type(value, []): - value = '. '.join(['%s' % x for x in value]) - elif key == 'error_message': - value = '%s' % value + if key == 'error_message': + if same_type(value, ''): + value = context.Localizer.erp5_ui.gettext(value) + if same_type(value, []): + value = '. '.join(['%s' % x for x in value]) + else: + value = '%s' % value + elif key == 'actor': value = getActorName(value) elif same_type(value, '') and key == 'state': @@ -91,13 +82,13 @@ for workflow_item in workflow_item_list: value = getTranslationStringWithContext(context, value, 'transition', workflow_id) if value is marker: value = 'Does not exist' - o.setProperty(key, value) - + current_object.setProperty(key, value) + # record current serial as "next serial" for the previous revision if next_serial is not None and can_view_history: - previous_obj.setProperty('next_serial', o.serial) - next_serial = getattr(o, 'serial', None) - previous_obj = o - result.append(o) + previous_obj.setProperty('next_serial', current_object.serial) + next_serial = getattr(current_object, 'serial', None) + previous_obj = current_object + result.append(current_object) return result diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowStateItemList.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowStateItemList.py index dcf1dec45d0d0ff714b68484be8b284e631be7a6..599df700a13a61053579d9db65417014179e07a9 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowStateItemList.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getWorkflowStateItemList.py @@ -11,10 +11,11 @@ state_dict = {} item_list = [] for workflow_id in workflow_id_list: workflow = getToolByName(context, 'portal_workflow')[workflow_id] - for state in workflow.states.objectValues(): - if state.title and state.id!='deleted': - if not state_dict.has_key(state.id): + for state in workflow.getStateValueList(): + state_id = state.getReference() + if state.title and state_id!='deleted': + if not state_dict.has_key(state_id): # we hide states without titles - item_list.append((state.title, state.id)) - state_dict[state.id] = None + item_list.append((state.title, state_id)) + state_dict[state_id] = None return item_list diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.py new file mode 100644 index 0000000000000000000000000000000000000000..8f92be4ab4f820384c075fec6cdcc9a3b96db2b3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.py @@ -0,0 +1,36 @@ +portal = context.getPortalObject() +REQUEST = context.REQUEST +dc_workflow_id_list = list(context.getTemplateWorkflowIdList()) #it's a tuple! +erp5_workflow_id_list = [] +unknown_workflow_id_list = [] + +# convert DC workflow to ERP5 workflow +for dc_workflow_id in context.getTemplateWorkflowIdList(): + workflow = portal.portal_workflow.get(dc_workflow_id, None) + if workflow is None: + # in case of bt not already installed or wrong workflow name + unknown_workflow_id_list.append(dc_workflow_id) + elif workflow.getPortalType() in ['DCWorkflowDefinition', 'InteractionWorkflowDefinition']: + workflow = portal.portal_workflow.dc_workflow_asERP5Object(workflow) + + if workflow and workflow.getPortalType() in ['Workflow', 'Interaction Workflow']: + dc_workflow_id_list.remove(dc_workflow_id) + erp5_workflow_id_list.append(dc_workflow_id) + +# move what was defined in field "workflows" to field "path" +context.setTemplatePathList(list(context.getTemplatePathList()) + # it's a tuple! + [('portal_workflow/%s**' % workflow_id) + for workflow_id in erp5_workflow_id_list]) +context.setTemplateWorkflowIdList(dc_workflow_id_list) + +if REQUEST is not None: + ret_url = context.absolute_url() + '/' + REQUEST.get('form_id', 'view') + formatted_message = '' + if erp5_workflow_id_list: + formatted_message += '''Conversion of workflows: %s''' % ', '.join(erp5_workflow_id_list) + if unknown_workflow_id_list: + formatted_message += 'ERROR: non-installed workflows: %s' % ', '.join(unknown_workflow_id_list) + if dc_workflow_id_list: + formatted_message += 'ERROR: unable to convert workflows: %s' % ', '.join(dc_workflow_id_list) + formatted_message.replace(' ', '+') + REQUEST.RESPONSE.redirect("%s?portal_status_message=%s"% (ret_url, formatted_message)) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.xml new file mode 100644 index 0000000000000000000000000000000000000000..80049761654002424c83e531e6f8ceb480982065 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_convertToERP5Workflows.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + **kw + + + id + BusinessTemplate_convertToERP5Workflows + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_checkNamingConventions.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_checkNamingConventions.py index 22a4fb1e4557ba72b8af464c234a8068f5c4b8d1..7d098e01a4201772e56f96c86dbc11d87b7634b1 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_checkNamingConventions.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_checkNamingConventions.py @@ -183,24 +183,14 @@ for folder in context.portal_skins.objectValues(spec=('Folder',)): for wf in context.portal_workflow.objectValues(): # Test workflow states - wf_states = wf.states + wf_state_list = wf.getStateValueList() message = '' - if wf_states not in (None, (), [], ''): - for state in wf_states.objectValues() : + if wf_state_list: + for state in wf_state_list: message += checkTitle('/'.join(['portal_workflow', wf.id, 'states', state.id]), 'title', state.title) if message: message_list.append(message) -# # Test workflow states -# wf_scripts = wf.scripts -# message = '' -# if wf_scripts not in (None, (), [], ''): -# for script in wf_scripts.objectValues(): -# message += checkTitle('/'.join(['portal_workflow', wf.id, 'scripts', script.id]), 'id', script.id) -# if message: -# message_list.append(message) - - # Test portal types IGNORE_PORTAL_TYPE_SET = set(("Application Id Generator", "Conceptual Id Generator", "DateTime Divergence Tester", diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_getWorkflowStateItemList.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_getWorkflowStateItemList.py index 35440528ae76fe089978e26acfda72436aa9e803..a530fac3d6ebb85a526bacb583003d52ccdfe178 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_getWorkflowStateItemList.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_getWorkflowStateItemList.py @@ -22,30 +22,25 @@ result_list = display_none_category and [('', '')] or [] if isinstance(portal_type, basestring): portal_type = portal_type, - -chain_dict = workflow_tool.getWorkflowChainDict() -for portal_type in portal_type: - for workflow_id in chain_dict['chain_%s' % portal_type].split(','): - workflow_id = workflow_id.strip() - if workflow_id in workflow_set: - continue - workflow_set.add(workflow_id) - - workflow = workflow_tool[workflow_id] - - # skip interaction workflows or workflows with only one state (such as edit_workflow) - if workflow.states is None or len(workflow.states.objectIds()) <= 1: - continue - - # skip workflows using another state variable - if state_var not in (None, workflow.variables.getStateVar()): - continue - - for state in workflow.states.objectValues(): - if state.id in state_set: - continue - state_set.add(state.id) - - result_list.append((str(translateString(state.title)), state.id)) + +portal = context.getPortalObject() +if isinstance(portal_type, str): + portal_type = (portal_type,) +for current_type in portal_type: + current_type = getattr(portal.portal_types, current_type) + current_workflow_list = current_type.getTypeWorkflowList() + for workflow_id in current_workflow_list: + if workflow_id not in workflow_set: + workflow_set.add(workflow_id) + workflow = workflow_tool[workflow_id] + state_value_list = workflow.getStateValueList() + if (state_value_list is not None and + len(workflow.getStateIdList()) > 1 and + state_var in (None, workflow.getStateVariable())): + for state in state_value_list: + state_id = state.getReference() + if not state_id in state_set: + state_set.add(state_id) + result_list.append((str(translateString(state.title)), state_id)) return result_list diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_updateTranslationTable.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_updateTranslationTable.py index 1bf98b65ca0000c8b2e3799cbf8bc903632077d7..f4c7c68a38ccc827fca4384419738f40afa56a61 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_updateTranslationTable.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/ERP5Site_updateTranslationTable.py @@ -19,35 +19,41 @@ def catalog_translation_list(object_list): # Translate every workflow state in the context of the state variable object_list = [] portal_workflow = context.portal_workflow -for wf_id, portal_type_list in portal_workflow.getChainDict().items(): - wf = getattr(portal_workflow, wf_id, None) - if wf is None: - continue - state_var = wf.variables.getStateVar() - if wf.states: - for state_id, state in wf.states.items(): +portal_type_list = context.portal_types.objectValues() +for portal_type in portal_type_list: + associated_workflow_id_list = [] + associated_workflow_id_list.extend(portal_type.getTypeWorkflowList()) + for wf_id in associated_workflow_id_list: + wf = getattr(context.portal_workflow, wf_id, None) + if wf is None: + continue + state_var = wf.getStateVariable() + + for state in wf.getStateValueList(): + state_id = state.getReference() for lang in supported_languages: - for portal_type in portal_type_list: - key = (lang, portal_type, state_var, state_id) + key = (lang, portal_type.id, state_var, state_id) + if not translated_keys.has_key(key): + translated_message = context.Localizer.erp5_ui.gettext(state_id, lang=lang).encode('utf-8') + translated_keys[key] = None # mark as translated + object_list.append(dict(language=lang, message_context=state_var, portal_type=portal_type.id, original_message=state_id, + translated_message=translated_message)) + + # translate state title as well + if state.title is not None and state.title != '': + state_var_title = '%s_title' % state_var + msg_id = getMessageIdWithContext(state.title, 'state', wf_id) + translated_message = context.Localizer.erp5_ui.gettext(msg_id, default='', lang=lang).encode('utf-8') + if translated_message == '': + msg_id = state.title + translated_message = context.Localizer.erp5_ui.gettext(state.title.decode('utf-8'), lang=lang).encode('utf-8') + key = (lang, portal_type.id, state_var_title, state_id, msg_id) if not translated_keys.has_key(key): - translated_message = context.Localizer.erp5_ui.gettext(state_id, lang=lang).encode('utf-8') translated_keys[key] = None # mark as translated - object_list.append(dict(language=lang, message_context=state_var, portal_type=portal_type, original_message=state_id, + object_list.append(dict(language=lang, message_context=state_var_title, portal_type=portal_type.id, original_message=state_id, translated_message=translated_message)) - # translate state title as well - if state.title != '' : - state_var_title = '%s_title' % state_var - msg_id = getMessageIdWithContext(state.title, 'state', wf.id) - translated_message = context.Localizer.erp5_ui.gettext(msg_id, default='', lang=lang).encode('utf-8') - if translated_message == '': - msg_id = state.title - translated_message = context.Localizer.erp5_ui.gettext(state.title.decode('utf-8'), lang=lang).encode('utf-8') - key = (lang, portal_type, state_var_title, state_id, msg_id) - if not translated_keys.has_key(key): - translated_keys[key] = None # mark as translated - object_list.append(dict(language=lang, message_context=state_var_title, portal_type=portal_type, original_message=state_id, - translated_message=translated_message)) + if object_list: catalog_translation_list(object_list) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_generateWorkflowReport.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_generateWorkflowReport.py index bd27f9bbc1dac587075cc3a89b8421b9e69b65d3..09c1b01a5b74ea0e5af98a5b8836fc0665605006 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_generateWorkflowReport.py +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Folder_generateWorkflowReport.py @@ -12,17 +12,19 @@ for portal_type in context.allowedContentTypes(): portal_type_id = portal_type.getId() portal_type_translated_title_dict[portal_type_id] = translateString(portal_type.getTitle()) for workflow in getWorkflowsFor(portal_type_id): - state_container = getattr(workflow, 'states', None) - if state_container is not None and len(state_container) > 1: - state_var = workflow.state_var + state_list = workflow.getStateValueList() + if state_list is not None and len(state_list) > 1: + state_var = workflow.getStateVariable() + if state_var is None: + state_var = 'state' workflow_id = workflow.getId() workflow_translated_title_dict[workflow_id] = translateString(workflow.title) type_state_variable_workflow_dict[(portal_type_id, state_var)] = workflow_id state_count_dict = type_workflow_state_count_dict_dict.setdefault((portal_type_id, workflow_id), {}) translated_state_title_dict = workflow_translated_state_title_dict.setdefault(workflow_id, {}) - for state in state_container.objectValues(): - state_id = state.getId() + for state in state_list: # TODO: support workflow-specific translations + state_id = state.getReference() translated_state_title_dict[state_id] = translateString(state.title) state_count_dict[state_id] = 0 add(state_var) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..c72d514f2693eb7fab33ed3f234dbc56a5619c78 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view.xml @@ -0,0 +1,146 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + interaction_listbox + + + + + center + + + my_description + + + + + hidden + + + interaction_listbox_trigger_method_id_list + interaction_listbox_after_script_id_list + interaction_listbox_before_script_id_list + interaction_listbox_before_commit_script_id_list + interaction_listbox_activate_script_id_list + + + + + left + + + my_id + my_reference + my_title + interaction_listbox_guard_role_list + + + + + right + + + my_comment + + + + + + + + id + InteractionWorkflow_view + + + method + POST + + + name + InteractionWorkflow_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Interaction Workflow + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d37427e5a82bbbfa887f6f456202746d849ea36 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox.xml @@ -0,0 +1,169 @@ + + + + + + + + + + delegated_list + + + columns + portal_types + selection_name + sort + title + + + + + id + interaction_listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + title + Title + + + trigger_method_id_list + Trigger + + + guard_role_list + Required Roles + + + before_script_id_list + Before Script + + + after_script_id_list + After Script + + + before_commit_script_id_list + Script (End of Transaction) + + + activate_script_id_list + Activities (Later) + + + description + Description + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Interaction + Interaction + + + + + + selection_name + interaction_selection + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + Interactions + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_activate_script_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_activate_script_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..4f81e1d2e8b00ec5c33d0c369ffc94be1240b6ab --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_activate_script_id_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_activate_script_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getActivateScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_after_script_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_after_script_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..c76b3984485139f9bb17a75e1fb88853197e96fe --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_after_script_id_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_after_script_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getAfterScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_commit_script_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_commit_script_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6102a91668dca997977b7549e1e456cb0369a83 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_commit_script_id_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_before_commit_script_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getBeforeCommitScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_script_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_script_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..6cc30fb0f423cad01b70224718c56dda9ccedf76 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_before_script_id_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_before_script_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getBeforeScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..a9ca906614aa6e24b52ccb72b6754a7d387bfaf9 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_guard_role_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_guard_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getGuardRoleList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_trigger_method_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_trigger_method_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a5738d43b55d7854a58d4194d1bebef74a9f272 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/interaction_listbox_trigger_method_id_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + interaction_listbox_trigger_method_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getTriggerMethodIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e1420ac8d6612d15640f6bd039fe5ba8284b0b0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_comment.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_comment + + + form_id + Base_viewFieldLibrary + + + title + Comment + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_description.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_description.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_description.xml index 4804fbd9924d6a7ad3c58a2425d0cb4a6630056c..8296818f72daddad5c1ebad46edf144483bbc7f1 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_description.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_description.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e198ee96657076295b1fc3c83799f9a9157eb34 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_id.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + editable + 0 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ID + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_reference.xml similarity index 90% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_reference.xml index e0e63bee67c8caac046dc47322f111e04ed2485e..51b37c19df80f5696a319717138261f2bf463a09 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/listbox_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_reference.xml @@ -6,15 +6,9 @@ - - delegated_list - - - - id - listbox_title + my_reference message_values @@ -71,7 +65,7 @@ field_id - my_title + my_view_mode_reference_as_name form_id diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_title.xml index c82e61b034c5c05f4d40d23ae067d94dd9b204fb..0a095bf71040bedc08fb64c14628f9118c8c5b54 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_view/my_title.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList.xml new file mode 100644 index 0000000000000000000000000000000000000000..49db1010d89aa45a41af545b4e5a3b8fecf2349f --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList.xml @@ -0,0 +1,154 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + + + + hidden + + + listbox_title + + + + + left + + + + + + right + + + + + + + + + id + InteractionWorkflow_viewVariableList + + + method + POST + + + name + InteractionWorkflow_viewVariableList + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Variables + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList/listbox.xml similarity index 83% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/listbox.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList/listbox.xml index 65400f9efbfdfb44392ac14bd122fe15a5d2267d..e6818e89b3959cc5af9c8dae9cd828148c599cec 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/listbox.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList/listbox.xml @@ -10,12 +10,13 @@ delegated_list - title columns - selection_name - portal_types default_params editable_columns + portal_types + selection_name + sort + title @@ -81,21 +82,29 @@ - id - ID + reference + Reference title Title - Variable_getNonEvaluatedInitialValue + Variable_getNonEvaluatedVariableValue Initial Value automatic_update Update on every Transition + + for_catalog + Available for Catalog + + + variable_expression + Expression + @@ -137,7 +146,18 @@ selection_name - workflow_variable_selection + interaction_workflow_variable_selection + + + sort + + + + reference + Reference + + + target diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/listbox_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList/listbox_title.xml similarity index 100% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/listbox_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewVariableList/listbox_title.xml diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ae875dbc5122909246b6817bce9112f5edd47af --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList.xml @@ -0,0 +1,133 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + WorkflowScript + + + + + center + + + + + + hidden + + + WorkflowScript_title + + + + + left + + + + + + right + + + + + + + + + id + InteractionWorkflow_viewWorkflowScriptList + + + method + POST + + + name + InteractionWorkflow_viewWorkflowScriptList + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Interactions + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript.xml new file mode 100644 index 0000000000000000000000000000000000000000..239f5ec398256b797158878c757688c1deda4214 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript.xml @@ -0,0 +1,223 @@ + + + + + + + + + + delegated_list + + + columns + editable_columns + portal_types + selection_name + sort + title + url_columns + + + + + id + WorkflowScript + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + columns + + + + editable_columns + + + + field_id + + + + form_id + + + + portal_types + + + + selection_name + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + columns + + + + id + Reference + + + title + Title + + + callable_type + Callable Type + + + parameter_signature + Parameters + + + description + Description + + + + + + editable_columns + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Workflow Script + Workflow Script + + + + + + selection_name + search_selection + + + sort + + + + id + Reference + + + + + + target + Click to edit the target + + + title + Scripts + + + url_columns + + + + id + WorkflowScript_getListBoxURL + + + title + WorkflowScript_getListBoxURL + + + callable_type + WorkflowScript_getListBoxURL + + + parameter_signature + WorkflowScript_getListBoxURL + + + description + WorkflowScript_getListBoxURL + + + + + + + + + + + + + + + + + + _text + python: \'%s_%s_selection\' % (form.getId(), field.getId()) + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript_title.xml index e0e63bee67c8caac046dc47322f111e04ed2485e..5d723478e5e145d04cb278e75199dd229d0556e3 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/listbox_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/InteractionWorkflow_viewWorkflowScriptList/WorkflowScript_title.xml @@ -14,7 +14,7 @@ id - listbox_title + WorkflowScript_title message_values diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5f08019b917c23271a33941efac93e0b694bc10 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view.xml @@ -0,0 +1,151 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + my_description + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_trigger_method_id_list + my_portal_type_filter_list + my_portal_type_group_filter_list + my_trigger_once_per_transaction + my_temporary_document_disallowed + + + + + right + + + my_guard_permission_list + my_guard_role_list + my_guard_group_list + my_guard_expression_text + my_before_script_list + my_after_script_list + my_before_commit_script_list + my_activate_script_list + + + + + + + + id + Interaction_view + + + method + POST + + + name + InteractionWorkflow_viewInteraction + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Interaction + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..7158886e99ca87f68a3e4208c1290bc26bebc97b --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/listbox.xml @@ -0,0 +1,133 @@ + + + + + + + + + + delegated_list + + + columns + portal_types + selection_name + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + id + ID + + + causality_title + Causality + + + Variable_getNonEvaluatedVariableValue + Value + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Transition Variable + Transition Variable + + + + + + selection_name + interaction_variable_selection + + + target + Click to edit the target + + + title + Interaction Variables + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_activate_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_activate_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..1ef8b2c1aa0e4de03ec273641b45d3006ece6ce0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_activate_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_activate_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Activities (Later) + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=\'Workflow Script\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_after_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_after_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..d7b0b6d816a85c8513ee89ef53c46fdfd3d96ada --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_after_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_after_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + After Script + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=\'Workflow Script\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_commit_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_commit_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..23da978a1e5974c8b8108644c7625bd32bccf275 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_commit_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_before_commit_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Script (End of Transaction) + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=\'Workflow Script\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..432d6fc12211bc3eafd1c7134627f3824c9591f4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_before_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_before_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Before Script + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=\'Workflow Script\')] + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_description.xml similarity index 95% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_comment.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_description.xml index 9a170e82c5496d774239f494d777a8a5a46a88c1..e98bd2614bed171964af7f47a08b452bd9c82b49 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/BaseWorkflow_FieldLibrary/my_comment.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_description.xml @@ -14,7 +14,7 @@ id - my_comment + my_description message_values @@ -71,7 +71,7 @@ field_id - my_comment + my_description form_id diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_expression_text.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_expression_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c59caf96263bb309298ea7f4ef39ce00850ef6c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_expression_text.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_guard_expression_text + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Guard Expression + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/your_workflow_graph.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_group_list.xml similarity index 80% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/your_workflow_graph.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_group_list.xml index 28102f64d757cd4881ff8bc6f15e32d3ddfe9542..7b5473d4fed7d2e7debe9ae9b7f0ad979af9dd75 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph/your_workflow_graph.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_group_list.xml @@ -2,13 +2,13 @@ - + id - your_workflow_graph + my_guard_group_list message_values @@ -18,13 +18,21 @@ external_validator_failed The input failed the external validator. + + line_too_long + A line was too long. + required_not_found Input is required but no input given. too_long - Too much input was given. + You entered too many characters. + + + too_many_lines + You entered too many lines. @@ -49,14 +57,6 @@ description - - display_maxwidth - - - - display_width - - editable @@ -74,23 +74,23 @@ - hidden + height - image_display + hidden - image_format + max_length - image_resolution + max_linelength - max_length + max_lines @@ -102,17 +102,21 @@ - truncate + unicode - unicode + view_separator whitespace_preserve + + width + + @@ -130,20 +134,10 @@ default - - AAAAAAAAAAI= - - - - description - display_maxwidth - - - - display_width + description @@ -163,23 +157,23 @@ - hidden + height - image_display + hidden - image_format + max_length - image_resolution + max_linelength - max_length + max_lines @@ -191,17 +185,21 @@ - truncate + unicode - unicode + view_separator whitespace_preserve + + width + + @@ -219,20 +217,14 @@ default - + + + description - - display_maxwidth - - - - display_width - 20 - editable 1 @@ -250,23 +242,23 @@ - hidden - 0 + height + 5 - image_display - thumbnail + hidden + 0 - image_format - gif + max_length + - image_resolution - 75 + max_linelength + - max_length + max_lines @@ -275,43 +267,32 @@ title - Image + Guard Group - truncate + unicode 0 - unicode - 0 + view_separator + + +]]> whitespace_preserve 0 + + width + 40 + - - - - - Products.Formulator.TALESField - TALESMethod - - - - - - - - _text - python: "%s/getGraph" % here.absolute_url() - - - - diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..6acc40a9ffbde2828470f9a5067c64153fb766ca --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_permission_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_guard_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Permission + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..a60f67396f7b16454c5b595e79e85bb9e0e03e02 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_guard_role_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_guard_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Guard Role(s) + + + + + + + + + + + + + + + _text + python: [(x, x) for x in here.getParent().getManagedRoleList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e198ee96657076295b1fc3c83799f9a9157eb34 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_id.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + editable + 0 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_filter_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_filter_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..889a0baddee856d3d2331cc0b401eee731ca4d40 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_filter_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_portal_type_filter_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Portal Type Filter + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getId()) for x in here.getPortalObject().portal_types.objectValues()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_group_filter_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_group_filter_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..27a89df6b782d19bc48a0994cf2313e317afadd3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_portal_type_group_filter_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_portal_type_group_filter_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Portal Type Group Filter + + + + + + + + + + + + + + + _text + python: [(x, x) for x in here.getPortalObject().portal_types[\'Base Type\'].getAvailableGroupList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..c48b4ddcf8c234b0f993d9ce4631ae8357de4fb6 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_reference.xml @@ -0,0 +1,96 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Reference + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_temporary_document_disallowed.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_temporary_document_disallowed.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb26554e6bf5460e89b43b6d6b523fa80fdcd735 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_temporary_document_disallowed.xml @@ -0,0 +1,168 @@ + + + + + + + + + + id + my_temporary_document_disallowed + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 0 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + Do not Trigger on a Temporary Document + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a095bf71040bedc08fb64c14628f9118c8c5b54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_title.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_method_id_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_method_id_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..a57684c65b600b5842b54b8dadba1085e48c35a0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_method_id_list.xml @@ -0,0 +1,299 @@ + + + + + + + + + + id + my_trigger_method_id_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Trigger Method + + + unicode + 0 + + + view_separator + \n + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_once_per_transaction.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_once_per_transaction.xml new file mode 100644 index 0000000000000000000000000000000000000000..0cd1417b0601bcfd52c56f19d91f9b35070d909a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Interaction_view/my_trigger_once_per_transaction.xml @@ -0,0 +1,168 @@ + + + + + + + + + + id + my_trigger_once_per_transaction + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 0 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + Trigger once per Transaction + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.py new file mode 100644 index 0000000000000000000000000000000000000000..c7c57cb491ea185c3a8864b83402f2f0d93f7433 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.py @@ -0,0 +1,12 @@ +managed_permissions = sorted(context.getParent().getWorkflowManagedPermissionList()) +available_roles = context.getManagedRoleList() + +ma_i = [] +ma_j = [] + +if matrixbox: + for perms in managed_permissions: + ma_i.append([perms,perms]) + for roles in available_roles: + ma_j.append([roles, roles]) + return [ma_i, ma_j] diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.xml new file mode 100644 index 0000000000000000000000000000000000000000..df0ebad2042c5c1df8ee67c7bfbff65eefe4e5a8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/PermissionRoles_asCellRange.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + matrixbox, base_id=\'cell\' + + + id + PermissionRoles_asCellRange + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..3dd4f551a2a0ed04cd8cacdc142b40bdd6cbd640 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view.xml @@ -0,0 +1,146 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + + + + center + + + my_description + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_destination_list + + + + + right + + + my_state_type_list + my_comment + + + + + + + + id + State_view + + + method + POST + + + name + State_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + State + + + unicode_mode + 0 + + + update_action + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e1420ac8d6612d15640f6bd039fe5ba8284b0b0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_comment.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_comment + + + form_id + Base_viewFieldLibrary + + + title + Comment + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_description.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_description.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_description.xml index 4804fbd9924d6a7ad3c58a2425d0cb4a6630056c..8296818f72daddad5c1ebad46edf144483bbc7f1 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_view/my_description.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_description.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_destination_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_destination_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..612c072adf3bedb14dda96ab8f7a79e931817222 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_destination_list.xml @@ -0,0 +1,259 @@ + + + + + + + + + + id + my_destination_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + unknown_selection + You selected an item that was not in the list. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra_item + + + + hidden + + + + items + + + + orientation + + + + required + + + + title + + + + unicode + + + + view_separator + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra_item + + + + hidden + + + + items + + AAAAAAAAAAI= + + + + orientation + + + + required + + + + title + + + + unicode + + + + view_separator + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra_item + + + + hidden + 0 + + + items + + + + + + orientation + vertical + + + required + 0 + + + title + Possible Transitions + + + unicode + 0 + + + view_separator + + +]]> + + + + + + + + + + + + + + + _text + python: [(x.getTitle(), x.getRelativeUrl()) for x in here.getParentValue().objectValues(portal_type=\'Transition\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e198ee96657076295b1fc3c83799f9a9157eb34 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_id.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + editable + 0 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..51b37c19df80f5696a319717138261f2bf463a09 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_reference.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_state_type_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_state_type_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..c01c22e967604ebf8aeb1ad458423fa64907f0a8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_state_type_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_state_type_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + State Type + + + + + + + + + + + + + + + _text + python: [ (x, x) for x in here.getAvailableTypeList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a095bf71040bedc08fb64c14628f9118c8c5b54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_view/my_title.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission.xml new file mode 100644 index 0000000000000000000000000000000000000000..3a573ed8937b3a18fd41c5ba6d68acb27bd674af --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission.xml @@ -0,0 +1,135 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + permission_role_matrixbox + + + + + center + + + + + + hidden + + + permission_role_matrixbox_selected + + + + + left + + + my_acquire_permission_list + + + + + right + + + + + + + + + id + State_viewPermission + + + method + POST + + + name + State_viewPermission + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Permission + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/my_acquire_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/my_acquire_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..12ef66c233009dbe4cdff2ed9694b258cce35219 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/my_acquire_permission_list.xml @@ -0,0 +1,259 @@ + + + + + + + + + + id + my_acquire_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + unknown_selection + You selected an item that was not in the list. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra_item + + + + hidden + + + + items + + + + orientation + + + + required + + + + title + + + + unicode + + + + view_separator + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra_item + + + + hidden + + + + items + + AAAAAAAAAAI= + + + + orientation + + + + required + + + + title + + + + unicode + + + + view_separator + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra_item + + + + hidden + 0 + + + items + + + + + + orientation + vertical + + + required + 0 + + + title + Acquire Permission Settings? + + + unicode + 0 + + + view_separator + + +]]> + + + + + + + + + + + + + + + _text + python: context.getWorkflowManagedPermissionList() + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..cef27f1a135b7c47e0edabe48cefb0a9164f4d16 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox.xml @@ -0,0 +1,317 @@ + + + + + + + + + + id + permission_role_matrixbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + as_cell_range_script_id + + + + cell_base_id + + + + cell_getter_method + + + + cell_portal_type + + + + columns + + + + css_class + + + + default + + + + description + + + + editable + + + + editable_attributes + + + + enabled + + + + external_validator + + + + getter_method + + + + global_attributes + + + + hidden + + + + lines + + + + tabs + + + + title + + + + update_cell_range + + + + url_cells + + + + + + + tales + + + + alternate_name + + + + as_cell_range_script_id + + + + cell_base_id + + + + cell_getter_method + + + + cell_portal_type + + + + columns + + + + css_class + + + + default + + + + description + + + + editable + + + + editable_attributes + + + + enabled + + + + external_validator + + + + getter_method + + + + global_attributes + + + + hidden + + + + lines + + + + tabs + + + + title + + + + update_cell_range + + + + url_cells + + + + + + + values + + + + alternate_name + + + + as_cell_range_script_id + PermissionRoles_asCellRange + + + cell_base_id + cell + + + cell_getter_method + + + + cell_portal_type + PermissionRoles + + + columns + + + + + + css_class + + + + default + + + + description + + + + editable + 1 + + + editable_attributes + + + + selected + checkerbox + + + + + + enabled + 1 + + + external_validator + + + + getter_method + + + + global_attributes + + + + + + hidden + 0 + + + lines + + + + + + tabs + + + + + + title + Permission Role Mapping + + + update_cell_range + 1 + + + url_cells + + + + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox_selected.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox_selected.xml new file mode 100644 index 0000000000000000000000000000000000000000..de9fa911168cbb2d625dce0a1bf3e8fe3c40810c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/State_viewPermission/permission_role_matrixbox_selected.xml @@ -0,0 +1,187 @@ + + + + + + + + + + id + permission_role_matrixbox_selected + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + AAAAAAAAAAI= + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + required + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 0 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + Checkerbox + + + + + + + + + + + + + + + _text + python: cell.getProperty(\'selected\') + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view.xml similarity index 94% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view.xml index 81a6b7168af9d9dabd4c838f406e2bf49bbd1e2a..f127cdf1c1c128081f5f7c90058aa98912bdcebd 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view.xml @@ -70,9 +70,7 @@ center - - my_comment - + @@ -86,8 +84,8 @@ my_causality - my_description - my_initial_value + my_variable_value + my_variable_expression diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_causality.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_causality.xml similarity index 99% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_causality.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_causality.xml index 5405f05da84b31b1013545df1b45d0ef6f9021cc..05d37df5436b6a8f8fb7b272f014ac1e7a46bbd3 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_causality.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_causality.xml @@ -275,7 +275,7 @@ _text - python: [(x.getTitle(), x.getRelativeUrl()) for x in here.getParentValue().getParentValue().contentValues(portal_type="Variable")] + python: [(x.getTitle(), x.getRelativeUrl()) for x in here.getParentValue().getParentValue().contentValues(portal_type="Workflow Variable")] diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_expression.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_expression.xml new file mode 100644 index 0000000000000000000000000000000000000000..964585c5a3902f4c8f53442ee68779c7e9d60370 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_expression.xml @@ -0,0 +1,260 @@ + + + + + + + + + + id + my_variable_expression + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 50 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + max_length + + + + required + 0 + + + title + Expression (Override Default Value if Set) + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_initial_value.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_value.xml similarity index 92% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_initial_value.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_value.xml index 5813f657ff5aa8e247ebe0f21fe75db1d2fef979..5c8823f66dfc1996223e925d2044000d08e33674 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_initial_value.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TransitionVariable_view/my_variable_value.xml @@ -8,7 +8,7 @@ id - my_initial_value + my_variable_value message_values @@ -118,9 +118,7 @@ default - - AAAAAAAAAAI= - + description @@ -259,23 +257,4 @@ - - - - - Products.Formulator.TALESField - TALESMethod - - - - - - - - _text - python: [\'python: None\',here.getInitialValue(evaluate=0)][str(here.getInitialValue(evaluate=0)).startswith(\'python\')] - - - - diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..6eaf050fd789c258fbeccfd3951ba5a8f151aaa4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view.xml @@ -0,0 +1,157 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + my_description + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_action_name + my_action + my_icon + my_action_type + my_trigger_type + my_destination + + + + + right + + + my_guard_permission_list + my_guard_role_list + my_guard_group_list + my_guard_expression_text + my_before_script_list + my_after_script_list + + + + + + + + id + Transition_view + + + method + POST + + + name + Transition_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Transition + + + unicode_mode + 0 + + + update_action + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/listbox.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/listbox.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/listbox.xml index 13d8354fa0295420929f481ee3ccb3d602a84238..ce15c0f64381d3bb5703dc23a84708f2dde7c35e 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Transition_view/listbox.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/listbox.xml @@ -10,10 +10,10 @@ delegated_list - title columns - selection_name portal_types + selection_name + title @@ -87,7 +87,7 @@ Causality - Variable_getNonEvaluatedInitialValue + Variable_getNonEvaluatedVariableValue Value diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..f70121b63486f7f7b497795b92e9c5d0f120ad6d --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action.xml @@ -0,0 +1,106 @@ + + + + + + + + + + delegated_list + + + description + display_width + title + + + + + id + my_action + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The URL of the transition displayed in Action Box. + + + display_width + 50 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box URL + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_name.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_name.xml new file mode 100644 index 0000000000000000000000000000000000000000..06bd9af360292f14397366ee6a1c3f17da403c89 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_name.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_action_name + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The name of this transition to be displayed in Action Box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Name + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_type.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..87f8b25e8d61dd950c795157f5239803a4d8e9d2 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_action_type.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_action_type + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The category of the transition displayed in Action Box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Category + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_after_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_after_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..ecf0be2c05e691c2f8ca5e47b4d8069e91e9bbb1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_after_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_after_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + After Script + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=[\'Transition\', \'Workflow Script\'])] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_before_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_before_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..494f4c374ed32e06a57901ba62f316f4d4724452 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_before_script_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_before_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Before Script + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getRelativeUrl()) for x in context.getParentValue().objectValues(portal_type=[\'Transition\', \'Workflow Script\'])] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..e98bd2614bed171964af7f47a08b452bd9c82b49 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_description.xml @@ -0,0 +1,90 @@ + + + + + + + + + + delegated_list + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_description + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_destination.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_destination.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c721845241bfc65da99b69c4899ccdc14e891c0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_destination.xml @@ -0,0 +1,277 @@ + + + + + + + + + + id + my_destination + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + unknown_selection + You selected an item that was not in the list. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + extra_item + + + + first_item + + + + hidden + + + + items + + + + required + + + + size + + + + title + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + extra_item + + + + first_item + + + + hidden + + + + items + + AAAAAAAAAAI= + + + + required + + + + size + + + + title + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + extra_item + + + + first_item + 0 + + + hidden + 0 + + + items + + + + + + required + 0 + + + size + 1 + + + title + Destination State + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + + + + + + + + _text + python: [(x.getTitle(), x.getRelativeUrl()) for x in here.getParentValue().objectValues(portal_type=\'State\')] + [\'\'] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_expression_text.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_expression_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..a47032d0c8d5a8cae6fbb65ef34af56fb282bac6 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_expression_text.xml @@ -0,0 +1,264 @@ + + + + + + + + + + id + my_guard_expression_text + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 60 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Guard Expression + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_group_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_group_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b5473d4fed7d2e7debe9ae9b7f0ad979af9dd75 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_group_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_guard_group_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Group + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..6acc40a9ffbde2828470f9a5067c64153fb766ca --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_permission_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_guard_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Permission + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c1ec296f4d32b5ddf780dd7249ee25474296cc0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_guard_role_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_guard_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Guard Role(s) + + + + + + + + + + + + + + + _text + python: [(x, x) for x in context.getManagedRoleList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_icon.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..811bf49c506f67404ab4bf9074690549b4cc66d5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_icon.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_icon + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The icon of the transition displayed in action box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Icon + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e198ee96657076295b1fc3c83799f9a9157eb34 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_id.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + editable + 0 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..51b37c19df80f5696a319717138261f2bf463a09 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_reference.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a095bf71040bedc08fb64c14628f9118c8c5b54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_title.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_trigger_type.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_trigger_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4c12ac58d6f7dd15f04cff819a1068fda4dacbc --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Transition_view/my_trigger_type.xml @@ -0,0 +1,139 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_trigger_type + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + Automatic + 0 + + + User_Action + 1 + + + Workflow_Method + 2 + + + + + + target + Click to edit the target + + + title + Trigger Type + + + + + + + + + + + + + + + _text + python: [(\'Automatic\', 0), (\'User_Action\', 1), (\'Workflow_Method\', 2)] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.py new file mode 100644 index 0000000000000000000000000000000000000000..218b3fc19a41110817958d20f84605e90dfa70c8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.py @@ -0,0 +1 @@ +return context.getVariableValue(evaluate=0) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fdc5927487535a4d9dc26c06dc09de41b45bcf0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_getNonEvaluatedVariableValue.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + + + + id + Variable_getNonEvaluatedVariableValue + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f83beb2778ff465d3c251dd4f233cb6f1951ef4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view.xml @@ -0,0 +1,153 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + + + + center + + + my_comment + my_description + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_for_catalog + my_status_included + my_automatic_update + my_variable_value + my_variable_expression_text + + + + + right + + + my_guard_expression_text + my_guard_group_list + my_guard_permission_list + my_guard_role_list + + + + + + + + id + Variable_view + + + method + POST + + + name + Variable_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Variable + + + unicode_mode + 0 + + + update_action + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_automatic_update.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_automatic_update.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_automatic_update.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_automatic_update.xml index 22f8224f4248c3575381f1069838f12676645db7..4da9abeed2e2edbd1dd09cd0d65c940a5b4412cc 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_automatic_update.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_automatic_update.xml @@ -169,13 +169,7 @@ - - - Products.Formulator.TALESField - TALESMethod - - - + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_comment.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_comment.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_comment.xml index 1dc23699fa9fe850200b2976de8b7d52fe6730e1..ca16bcbc8ac526b2caf873e3605a1559c03ade47 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_comment.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_comment.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..8296818f72daddad5c1ebad46edf144483bbc7f1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_description.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_description + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_for_catalog.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_for_catalog.xml new file mode 100644 index 0000000000000000000000000000000000000000..f8c4351749c8d2be4d458a675a221b4c90cede53 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_for_catalog.xml @@ -0,0 +1,183 @@ + + + + + + + + + + id + my_for_catalog + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + AAAAAAAAAAI= + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 1 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + Make Available to Catalog + + + + + + + + + + + + + + + _text + python: here.getForCatalog() + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_expression_text.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_expression_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c59caf96263bb309298ea7f4ef39ce00850ef6c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_expression_text.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_guard_expression_text + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Guard Expression + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_group_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_group_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..9794ccf094b83fd63d2b089213fa3266430bd35d --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_group_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_group_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Group + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..fee7d3ff258d38252fa1c5c08a37bec4a31e2781 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_permission_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Permission + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f2725eeb66abdd53235c818bdf880ebe975766a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_guard_role_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Guard Role(s) + + + + + + + + + + + + + + + _text + python: [(x, x) for x in here.getParent().getManagedRoleList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5eb81b7220fe09bad7141e987a674c68f9a4bf8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_id.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + editable + 0 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..51b37c19df80f5696a319717138261f2bf463a09 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_reference.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_status_included.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_status_included.xml new file mode 100644 index 0000000000000000000000000000000000000000..1ecdb187416369ef9bd1ab54397eb993ae1db878 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_status_included.xml @@ -0,0 +1,172 @@ + + + + + + + + + + id + my_status_included + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + required + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 0 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + Store in Workflow Status + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a095bf71040bedc08fb64c14628f9118c8c5b54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_title.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_expression_text.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_expression_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..17d77d7ae4498d36d9ca604c56357f9ff087298d --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_expression_text.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_variable_expression_text + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Default Expression (Overrides Default Value) + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_value.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_value.xml new file mode 100644 index 0000000000000000000000000000000000000000..6385a4e0c56d9d92762312b3af756f6c09f8ac47 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Variable_view/my_variable_value.xml @@ -0,0 +1,264 @@ + + + + + + + + + + id + my_variable_value + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 50 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Default Value + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList.xml similarity index 80% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList.xml index 1e925b211316d665b984fed40ed356ca3c17aed8..ad5255af99c5bf525c348fad47e3e8292807f46f 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList.xml @@ -37,6 +37,18 @@ action Base_doSelect + + description + + + + edit_order + + + [] + + + encoding UTF-8 @@ -50,6 +62,7 @@ bottom + hidden @@ -65,6 +78,14 @@ + + hidden + + + listbox_title + + + @@ -104,6 +125,10 @@ update_action + + update_action_title + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..b09b62925d9d867f4244601225b3beb83772708a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox.xml @@ -0,0 +1,633 @@ + + + + + + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + + + + overrides + + + + all_columns + + + + alternate_name + + + + anchor + + + + columns + + + + count_method + + + + css_class + + + + default_display_style + + + + default_params + + + + description + + + + display_style_list + + + + domain_root_list + + + + domain_tree + + + + editable + + + + editable_columns + + + + enabled + + + + external_validator + + + + global_attributes + + + + global_search_column + + + + hidden + + + + hide_rows_on_no_search_criterion + + + + lines + + + + list_action + + + + list_method + + + + meta_types + + + + page_navigation_template + + + + page_template + + + + portal_types + + + + report_root_list + + + + report_tree + + + + row_css_method + + + + search + + + + search_columns + + + + select + + + + selection_name + + + + sort + + + + sort_columns + + + + stat_columns + + + + stat_method + + + + style_columns + + + + title + + + + untranslatable_columns + + + + url_columns + + + + + + + tales + + + + all_columns + + + + alternate_name + + + + anchor + + + + columns + + + + count_method + + + + css_class + + + + default_display_style + + + + default_params + + + + description + + + + display_style_list + + + + domain_root_list + + + + domain_tree + + + + editable + + + + editable_columns + + + + enabled + + + + external_validator + + + + global_attributes + + + + global_search_column + + + + hidden + + + + hide_rows_on_no_search_criterion + + + + lines + + + + list_action + + + + list_method + + + + meta_types + + + + page_navigation_template + + + + page_template + + + + portal_types + + + + report_root_list + + + + report_tree + + + + row_css_method + + + + search + + + + search_columns + + + + select + + + + selection_name + + + + sort + + + + sort_columns + + + + stat_columns + + + + stat_method + + + + style_columns + + + + title + + + + untranslatable_columns + + + + url_columns + + + + + + + values + + + + all_columns + + + + + + all_editable_columns + + + + + + alternate_name + + + + anchor + 0 + + + columns + + + + id + Reference + + + title + Title + + + description + Description + + + + + + count_method + + + + css_class + + + + default + + + + default_display_style + table + + + default_params + + + + + + description + + + + display_style_list + + + + + + domain_root_list + + + + + + domain_tree + 0 + + + editable + 1 + + + editable_columns + + + + + + enabled + 1 + + + external_validator + + + + global_attributes + + + + + + global_search_column + + + + hidden + 0 + + + hide_rows_on_no_search_criterion + 0 + + + lines + 30 + + + list_action + list + + + list_method + + AAAAAAAAAAI= + + + + meta_types + + + + + + page_navigation_template + ListBox_viewSliderPageNavigationRenderer + + + page_template + + + + portal_types + + + + + + report_root_list + + + + + + report_tree + 0 + + + row_css_method + + + + search + 1 + + + search_columns + + + + + + select + 1 + + + selection_name + configuration_workflow_selection + + + sort + + + + title + title + + + + + + sort_columns + + + + + + stat_columns + + + + + + stat_method + + + + style_columns + + + + + + title + Workflows + + + untranslatable_columns + + + + + + url_columns + + + + + + + + + + + + + + + + + + method_name + searchFolder + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..271230c832c435f494c37a46fbf43128a101d22b --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowModule_viewWorkflowList/listbox_title.xml @@ -0,0 +1,96 @@ + + + + + + + + + + id + listbox_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ListBox Title + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.py new file mode 100644 index 0000000000000000000000000000000000000000..40bcdc71ffa2d8f91b83df411028883e71822253 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.py @@ -0,0 +1 @@ +return context.absolute_url() + '/view' diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6cbf939a697271d3858c9e9d1744caf6f6b3d4e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_getListBoxURL.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + **kw + + + id + WorkflowScript_getListBoxURL + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..a3dd3ecf2317665682b3f988ce2332621ceb91df --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view.xml @@ -0,0 +1,143 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + my_body + + + + + center + + + my_description + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_callable_type + my_parameter_signature + error_message + warning_message + + + + + right + + + my_comment + + + + + + + + id + WorkflowScript_view + + + method + POST + + + name + WorkflowScript_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflow Script + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/error_message.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/error_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..14778445d8a30d7fa6fd8006f1423f536b11dd13 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/error_message.xml @@ -0,0 +1,172 @@ + + + + + + + + + + delegated_list + + + default + editable + enabled + title + view_separator + + + + + id + error_message + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + editable + + + + enabled + + AAAAAAAAAAM= + + + + field_id + + + + form_id + + + + target + + + + title + + + + view_separator + + + + + + + values + + + + default + + + + + + editable + 0 + + + enabled + 1 + + + field_id + my_lines_field + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Errors + + + view_separator + + +]]> + + + + + + + + + + + + + + + _text + python: here.errors + + + + + + + + + + + + _text + python: len(here.errors) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_body.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_body.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c87e520c2f7a0669b3c52c73bf6e1d3af831616 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_body.xml @@ -0,0 +1,292 @@ + + + + + + + + + + id + my_body + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + text_editor + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + text_editor + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 20 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + text_editor + ace + + + title + Body + + + unicode + 0 + + + whitespace_preserve + 1 + + + width + 120 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_callable_type.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_callable_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..8857d39c8a90d285436f7cd3f30cc13aecdd90fc --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_callable_type.xml @@ -0,0 +1,96 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_callable_type + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_category + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Callable Type + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..982f0d217759927f74c3599785f8aebab09d9e74 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_comment.xml @@ -0,0 +1,280 @@ + + + + + + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Comments + + + unicode + 0 + + + whitespace_preserve + 1 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0ae7eeaa9820d224d1580d827db00d1b7b5fecd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_description.xml @@ -0,0 +1,280 @@ + + + + + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Description + + + unicode + 0 + + + whitespace_preserve + 1 + + + width + 80 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5eb81b7220fe09bad7141e987a674c68f9a4bf8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_id.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + editable + 0 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_parameter_signature.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_parameter_signature.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6022238e56431d8141486d7cdb8b32f7ca65c69 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_parameter_signature.xml @@ -0,0 +1,118 @@ + + + + + + + + + + delegated_list + + + default + editable + title + + + + + id + my_parameter_signature + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + default + + + + editable + + + + field_id + + + + form_id + + + + target + + + + title + + + + + + + values + + + + default + + + + editable + 1 + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Parameters + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..51b37c19df80f5696a319717138261f2bf463a09 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_reference.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ec6a3d1c5fd62fdc6472d79e12be6fe2e540b25 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/my_title.xml @@ -0,0 +1,260 @@ + + + + + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 40 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + max_length + + + + required + 0 + + + title + Title + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/warning_message.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/warning_message.xml new file mode 100644 index 0000000000000000000000000000000000000000..35fd006626bf733171a165b78af0880f419b38b4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_view/warning_message.xml @@ -0,0 +1,172 @@ + + + + + + + + + + delegated_list + + + default + editable + enabled + title + view_separator + + + + + id + warning_message + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + editable + + + + enabled + + AAAAAAAAAAM= + + + + field_id + + + + form_id + + + + target + + + + title + + + + view_separator + + + + + + + values + + + + default + + + + + + editable + 0 + + + enabled + 1 + + + field_id + my_lines_field + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Warnings + + + view_separator + + +]]> + + + + + + + + + + + + + + + _text + python: here.warnings + + + + + + + + + + + + _text + python: len(here.warnings) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole.xml new file mode 100644 index 0000000000000000000000000000000000000000..b51eafc5fe5a381bd07d63840d6a8e3a67e31a13 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole.xml @@ -0,0 +1,109 @@ + + + + + + + + + + _objects + + + + + + action + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + + + + center + + + + + + hidden + + + + + + left + + + my_proxy_role_list + + + + + right + + + + + + + + + id + WorkflowScript_viewProxyRole + + + method + POST + + + name + PythonScript_viewProxyRole + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Proxy Role + + + unicode_mode + 0 + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole/my_proxy_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole/my_proxy_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f44eace3b11f2dc64499b3aa364a077ac147bc5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowScript_viewProxyRole/my_proxy_role_list.xml @@ -0,0 +1,139 @@ + + + + + + + + + + delegated_list + + + title + required + view_separator + items + size + + + + + id + my_proxy_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_multi_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + Manager + Manager + + + Author + Author + + + Assignor + Assignor + + + Assignee + Assignee + + + + + + required + 1 + + + size + 5 + + + target + Click to edit the target + + + title + Proxy Roles + + + view_separator + + +]]> + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.py new file mode 100644 index 0000000000000000000000000000000000000000..2805900d0f7513f998d09774a737722b2cfadd06 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.py @@ -0,0 +1,10 @@ +portal = context.getPortalObject() +error_message = [] +chain_dict = portal.portal_workflow.getChainDict() +if chain_dict: + for workflow_id, portal_type_id_list in chain_dict.iteritems(): + error_message.append('workflow %s is associated to portal_types %s in chain_dict (portal_workflow) instead of portal_type' % (workflow_id, portal_type_id_list)) + if fixit: + portal.portal_workflow.reassignWorkflowWithoutConversion() + +return error_message diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.xml new file mode 100644 index 0000000000000000000000000000000000000000..be671addc3007ab5ba5821d31df885243252d0bf --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_checkChainDictRemovalConsistency.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + fixit=False, activate_kw={}, **kw + + + id + WorkflowTool_checkChainDictRemovalConsistency + + + title + WorkflowTool_checkChainDictRemovalConsistency + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.py new file mode 100644 index 0000000000000000000000000000000000000000..5185b22b680a2e9fdaebd830fe4b3ed8c9d472ec --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.py @@ -0,0 +1,45 @@ +from Products.PythonScripts.standard import url_quote + +REQUEST = container.REQUEST +RESPONSE = REQUEST.RESPONSE +workflow_list = kw.get('workflow_list') +selected_workflow_list = [] +selected_workflow_id_list = [] + +if batch_mode == False and workflow_id_list is None: + if workflow_list: + for workflow in workflow_list: + if workflow.get('listbox_selected'): + selected_workflow_list.append(context.restrictedTraverse(workflow.get('listbox_key'))) + + if len(selected_workflow_list) == 0: + return context.REQUEST.RESPONSE.redirect( + '%s/WorkflowTool_viewWorkflowConversion?' + 'portal_status_message=%s' % ( context.absolute_url(), + url_quote('No Workflow Selected.'))) +else: + for workflow_id in workflow_id_list: + selected_workflow_list.append(getattr(context, workflow_id)) + +for workflow in selected_workflow_list: + if workflow is not None and not workflow.isTempObject() and workflow.getPortalType() == 'Workflow': + return context.REQUEST.RESPONSE.redirect( + '%s/WorkflowTool_viewWorkflowConversion?' + 'portal_status_message=%s' % ( context.absolute_url(), + url_quote('workflow(s) is already exist.'))) + if workflow is not None and not workflow.isTempObject() and workflow.getPortalType() == 'Interaction Workflow': + return context.REQUEST.RESPONSE.redirect( + '%s/WorkflowTool_viewWorkflowConversion?' + 'portal_status_message=%s' % ( context.absolute_url(), + url_quote('workflow(s) is already exist.'))) + + # conversion and reassignment + new_workflow = context.dc_workflow_asERP5Object(workflow, is_temporary=False) + context.reassignWorkflow(new_workflow.getId()) + selected_workflow_id_list.append(new_workflow.getId()) + +if batch_mode: + return + +return RESPONSE.redirect("%s/view?portal_status_message=Workflow+%s+converted" + %(context.absolute_url(), ',+'.join(selected_workflow_id_list))) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..f766ba2ced1437576467ae4683b3c2d1462b8433 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_convertWorkflow.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + batch_mode=False, workflow_id_list=None, **kw + + + id + WorkflowTool_convertWorkflow + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.py new file mode 100644 index 0000000000000000000000000000000000000000..ed74cd8e3e70091909f1cd8fe7c3f83d9a1381cb --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.py @@ -0,0 +1,2 @@ +workflow_list = context.getWorkflowTempObjectList() +return workflow_list diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.xml new file mode 100644 index 0000000000000000000000000000000000000000..72dd670f7d005459e7007e314e5919798312f594 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_getWorkflowList.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + **kw + + + id + WorkflowTool_getWorkflowList + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion.xml new file mode 100644 index 0000000000000000000000000000000000000000..d748f058ad83c8714794dc35393992629b3ba887 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion.xml @@ -0,0 +1,131 @@ + + + + + + + + + + _objects + + + + + + action + WorkflowTool_convertWorkflow + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + multipart/form-data + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + workflow_list + + + + + center + + + + + + hidden + + + + + + left + + + + + + right + + + + + + + + + id + WorkflowTool_viewWorkflowConversion + + + method + POST + + + name + WorkflowTool_viewWorkflowConversion + + + pt + form_dialog + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Convert Selected Workflows + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion/workflow_list.xml similarity index 85% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList/listbox.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion/workflow_list.xml index 50cceaaa89e3858837e9918107f731fc7f5e497a..c1037621e595616f94fbc907f63e860515512179 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/WorkflowModule_viewWorkflowList/listbox.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowConversion/workflow_list.xml @@ -8,7 +8,7 @@ id - listbox + workflow_list message_values @@ -41,6 +41,10 @@ columns + + count_method + + css_class @@ -180,6 +184,10 @@ columns + + count_method + + css_class @@ -319,6 +327,10 @@ alternate_name + + anchor + 0 + columns @@ -331,6 +343,10 @@ title Title + + portal_type + After Conversion Type + description Description @@ -350,6 +366,10 @@ default + + default_display_style + table + default_params @@ -360,6 +380,12 @@ description + + display_style_list + + + + domain_root_list @@ -394,13 +420,21 @@ + + global_search_column + + hidden 0 + + hide_rows_on_no_search_criterion + 0 + lines - 30 + 50 list_action @@ -418,15 +452,18 @@ + + page_navigation_template + ListBox_viewSliderPageNavigationRenderer + + + page_template + + portal_types - - - Workflow - Workflow - - + @@ -439,9 +476,13 @@ report_tree 0 + + row_css_method + + search - 1 + 0 search_columns @@ -455,17 +496,12 @@ selection_name - workflow_module_selection + workflow_tool_conversion_selection sort - - - title - title - - + @@ -484,16 +520,45 @@ stat_method + + style_columns + + + + title - Workflows + Workflow Conversion - url_columns + untranslatable_columns + + url_columns + + + + id + + + + title + + + + portal_type + + + + description + + + + + @@ -502,19 +567,13 @@ - - - Products.Formulator.MethodField - Method - - - + method_name - searchFolder + WorkflowTool_getWorkflowList diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d15f4647d4be7b31e24aa3c97581a57392341b6 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList.xml @@ -0,0 +1,131 @@ + + + + + + + + + + _objects + + + + + + action + Base_doSelect + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + + + + hidden + + + + + + left + + + + + + right + + + + + + + + + id + WorkflowTool_viewWorkflowList + + + method + POST + + + name + WorkflowTool_viewWorkflowList + + + pt + form_list + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflows + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a8aaed744062c45cd7f525213f134e7c080433c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorkflowTool_viewWorkflowList/listbox.xml @@ -0,0 +1,141 @@ + + + + + + + + + + delegated_list + + + columns + editable_columns + hide_rows_on_no_search_criterion + selection_name + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + id + ID + + + title + Title + + + portal_type + Portal Type + + + description + Description + + + + + + editable_columns + + + + + + field_id + my_list_mode_listbox + + + form_id + Base_viewFieldLibrary + + + hide_rows_on_no_search_criterion + 0 + + + selection_name + portal_workflow_selection + + + target + Click to edit the target + + + title + Workflows + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.py new file mode 100644 index 0000000000000000000000000000000000000000..575289146ff22e6515dfb74ccf13ad28e8396f34 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.py @@ -0,0 +1 @@ +return context.showAsXML() diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.xml new file mode 100644 index 0000000000000000000000000000000000000000..95e628129ceb8fd4321ce860daf96c80dd8feb92 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_asXML.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + + + + id + Workflow_asXML + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.py new file mode 100644 index 0000000000000000000000000000000000000000..ad3d051e4550f16d64259186d71bc0b90cbbb7b3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.py @@ -0,0 +1,50 @@ +"""Sets up an Workflow with defaults variables needed by ERP5. +""" +for state_id, state_title in (('draft', 'Draft'),): + state = context.newContent(portal_type='State') + state.setReference(state_id) + state.setTitle(state_title) +context.setSourceValue(state) +for v, property_dict in ( + ('action', { + 'description': 'Transition id', + 'variable_expression': 'transition/getReference|nothing', + 'for_status': 1, + 'automatic_update': 1, + }), + ('actor', { + 'description': 'Name of the user who performed transition', + 'variable_expression': 'user/getIdOrUserName', + 'for_status': 1, + 'automatic_update': 1, + }), + ('comment', { + 'description': 'Comment about transition', + 'variable_expression': "python:state_change.kwargs.get('comment', '')", + 'for_status': 1, + 'automatic_update': 1, + }), + ('history', { + 'description': 'Provides access to workflow history', + 'variable_expression': 'state_change/getHistory', + }), + ('time', { + 'description': 'Transition timestamp', + 'variable_expression': 'state_change/getDateTime', + 'for_status': 1, + 'automatic_update': 1, + }), + ('error_message', { + 'description': 'Error message if validation failed', + 'for_status': 1, + 'automatic_update': 1, + }), + ('portal_type', { + 'description': 'Portal type (used as filter for worklists)', + 'for_catalog': 1, + }), + ): + variable = context.newContent(portal_type='Workflow Variable') + variable.setReference(v) + variable.edit(**property_dict) +context.setStateVariable('simulation_state') diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3b632e79dd45aa1769a4115b0204dec1569a9ef --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_init.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + *args, **kw + + + id + Workflow_init + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.py new file mode 100644 index 0000000000000000000000000000000000000000..601768c6b891ca09553c597bd0812f996287bc08 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.py @@ -0,0 +1,2 @@ +message = context.updateRoleMappings(context.REQUEST) +return context.Base_redirect(form_id, keep_items={'portal_status_message': message}) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f02ff10a7bbc6a2ed42db5cc40f922d423d5a83 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_updateSecurityRoles.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + form_id=None + + + id + Workflow_updateSecurityRoles + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c76294b9c2e40e015a0a86cd6e6a05a6bfbdcda --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view.xml @@ -0,0 +1,164 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + state_listbox + + + + + center + + + my_description + my_source_title + + + + + hidden + + + state_listbox_destination_title_list + + + + + left + + + my_id + my_reference + my_title + my_manager_bypass + + + + + right + + + my_comment + + + + + + + + id + Workflow_view + + + method + POST + + + name + Workflow_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflow + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_comment.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e1420ac8d6612d15640f6bd039fe5ba8284b0b0 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_comment.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_comment + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_comment + + + form_id + Base_viewFieldLibrary + + + title + Comment + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..8296818f72daddad5c1ebad46edf144483bbc7f1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_description.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_description + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..fc66545c4bb7db6669d4a1dbed8179f7aeae2c8a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_id.xml @@ -0,0 +1,96 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_read_only_id + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_manager_bypass.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_manager_bypass.xml new file mode 100644 index 0000000000000000000000000000000000000000..1467c72dd47f98bb72a5e025dc6166ca34029078 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_manager_bypass.xml @@ -0,0 +1,168 @@ + + + + + + + + + + id + my_manager_bypass + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + 0 + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + title + \'Manager\' Role Bypass Guard + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..51b37c19df80f5696a319717138261f2bf463a09 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_reference.xml @@ -0,0 +1,84 @@ + + + + + + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_source_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_source_title.xml similarity index 98% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_source_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_source_title.xml index 84bfbb0d20d67fa679740a471ac7359ed0e5a62e..95383340f1cabbc66c8091143785ea2e556b6d5d 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewStateList/my_source_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_source_title.xml @@ -10,11 +10,11 @@ delegated_list - title base_category - portal_type catalog_index parameter_list + portal_type + title @@ -120,7 +120,7 @@ title - Initial State + Workflow\'s Initial State diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a095bf71040bedc08fb64c14628f9118c8c5b54 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/my_title.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..139e1eb388853e2a3371be5da70632d10ac24586 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox.xml @@ -0,0 +1,168 @@ + + + + + + + + + + delegated_list + + + columns + default_params + editable_columns + portal_types + selection_name + sort + title + + + + + id + state_listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + title + Title + + + destination_title_list + Possibles Transition + + + description + Description + + + + + + default_params + + + + + + editable_columns + + + + title + Title + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + State + State + + + + + + selection_name + workflow_state_selection + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + States + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox_destination_title_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox_destination_title_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..6dede03832c937599eedb7ea8fd503b99a9e2a51 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_view/state_listbox_destination_title_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + state_listbox_destination_title_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getDestinationTitleList()) + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph.xml index 73c9f435526528e2faaedf660d27f11e45a7ffcd..d914961dbbba465190c95f2f0d383e6dec357828 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewGraph.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph.xml @@ -64,7 +64,9 @@ bottom - + + my_jsplumb_graph + @@ -84,7 +86,6 @@ my_title - your_workflow_graph diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_jsplumb_graph.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_jsplumb_graph.xml new file mode 100644 index 0000000000000000000000000000000000000000..a60be4cf222ff44c51b529f8b43406fb6566a083 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_jsplumb_graph.xml @@ -0,0 +1,278 @@ + + + + + + + + + + id + my_jsplumb_graph + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + gadget_url + + + + hidden + + + + js_sandbox + + + + required + + + + title + + + + + + + tales + + + + alternate_name + + + + css_class + + + + data_url + + + + default + + AAAAAAAAAAI= + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + gadget_url + + AAAAAAAAAAM= + + + + hidden + + + + input_type + + + + js_sandbox + + + + required + + + + title + + + + + + + values + + + + alternate_name + + + + css_class + page + + + data_url + 0 + + + default + + + + description + + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + gadget_url + + + + hidden + 0 + + + input_type + text + + + js_sandbox + + + + required + 0 + + + title + Graph + + + + + + + + + + + + + + + _text + context/Workflow_getGraph + + + + + + + + + + + + _text + python: context.getPortalObject().restrictedTraverse(\'dream_graph_editor/jsplumb/index.html\').absolute_url() + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/my_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_title.xml index a0a914a8b59e77f59c2ca04be6fe9ca967aebe5d..6f15862db9fc4a849e17963f29b8ede23df9ba78 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList/my_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewGraph/my_title.xml @@ -87,7 +87,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList.xml new file mode 100644 index 0000000000000000000000000000000000000000..09382625ca086887240113d055154dfa6bba2832 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList.xml @@ -0,0 +1,131 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + + + + center + + + + + + hidden + + + + + + left + + + my_workflow_managed_permission_list + + + + + right + + + + + + + + + id + Workflow_viewPermissionList + + + method + POST + + + name + Workflow_viewPermission + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Workflow Permission + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList/my_workflow_managed_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList/my_workflow_managed_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..1f5efa61683ffa79a8a2f162121b809630ce9ce6 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewPermissionList/my_workflow_managed_permission_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_workflow_managed_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Permission Managed by this Workflow + + + + + + + + + + + + + + + _text + python: [ (\'\', \'\') ] + here.getPortalObject().portal_property_sheets.getPropertyAvailablePermissionList() + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList.xml similarity index 94% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList.xml index 58b2b10fe02d5f5b51ec38e281ee71ef3b4b256a..1a3d0b13119c65b4e0cc8efbe5265f2e8abefce4 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewTransitionList.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList.xml @@ -79,7 +79,10 @@ hidden - listbox_title + listbox_trigger_type + listbox_guard_role_list + listbox_before_script_list + listbox_after_script_list diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ab9e433307a4989e703e7ec56468e2b22ae790a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox.xml @@ -0,0 +1,173 @@ + + + + + + + + + + delegated_list + + + columns + editable_columns + portal_types + selection_name + sort + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + title + Title + + + trigger_type + Trigger + + + destination_title + Destination State + + + guard_role_list + Guard Roles + + + before_script_list + Before Script + + + after_script_list + After Script + + + + + + editable_columns + + + + title + Title + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Transition + Transition + + + + + + selection_name + workflow_transition_selection + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + Transitions + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_after_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_after_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f25e28362974c59e0cf712c0503da4002fbdfdc --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_after_script_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + listbox_after_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getAfterScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_before_script_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_before_script_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..53388c8846af0142f63519c85e777afcef8368f3 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_before_script_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + listbox_before_script_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getBeforeScriptIdList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..183bb8ac0ab4fbfb6df0f3485e28920766d29040 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_guard_role_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + default + + + + + id + listbox_guard_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + + + + tales + + + + default + + AAAAAAAAAAI= + + + + field_id + + + + form_id + + + + + + + values + + + + default + + + + field_id + my_string_field + + + form_id + Base_viewFieldLibrary + + + + + + + + + + + + + + + _text + python: \', \'.join(cell.getGuardRoleList()) + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_trigger_type.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_trigger_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..e31eab58b23c7ebe9a4dbe6234f6cdb3324375fd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/listbox_trigger_type.xml @@ -0,0 +1,139 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + listbox_trigger_type + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + Automatic + 0 + + + User_Action + 1 + + + Workflow_Method + 2 + + + + + + target + Click to edit the target + + + title + Trigger Type + + + + + + + + + + + + + + + _text + python: [(\'Automatic\', 0), (\'User_Action\', 1), (\'Workflow_Method\', 2)] + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/my_title.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_title.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/my_title.xml index a0a914a8b59e77f59c2ca04be6fe9ca967aebe5d..6f15862db9fc4a849e17963f29b8ede23df9ba78 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList/my_title.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewTransitionList/my_title.xml @@ -87,7 +87,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList.xml index 05d753d909693821a699a20c5b6b354190dedfa1..11289c649d4f7b9538d75569046b2ab11876c4ae 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewVariableList.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList.xml @@ -79,7 +79,7 @@ hidden - listbox_title + listbox_variable_expression @@ -88,7 +88,7 @@ my_title - my_state_base_category + my_state_variable diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..93a3d1fc5a339b6b9bc9e4ad336559a40f31422d --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox.xml @@ -0,0 +1,176 @@ + + + + + + + + + + delegated_list + + + columns + default_params + editable_columns + portal_types + selection_name + sort + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + columns + + + + reference + Reference + + + title + Title + + + Variable_getNonEvaluatedVariableValue + Initial Value + + + automatic_update + Update on every Transition + + + for_catalog + Available for Catalog + + + variable_expression + Expression + + + + + + default_params + + + + + + editable_columns + + + + title + Title + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Workflow Variable + Workflow Variable + + + + + + selection_name + workflow_variable_selection + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + Variables + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_initial_value.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox_variable_expression.xml similarity index 93% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_initial_value.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox_variable_expression.xml index 280d024cc6ebb2b77994b50bdd0e43b8e1532767..df40d0f6b4202db1b25abf293487d552705078a7 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view/my_initial_value.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/listbox_variable_expression.xml @@ -8,7 +8,7 @@ id - my_initial_value + listbox_variable_expression message_values @@ -154,6 +154,10 @@ hidden + + input_type + + max_length @@ -199,7 +203,7 @@ description - + This variable is used in workflow state accessor generation. display_maxwidth @@ -229,6 +233,10 @@ hidden 0 + + input_type + text + max_length @@ -239,7 +247,7 @@ title - Default Value + Expression truncate @@ -261,19 +269,13 @@ - - - Products.Formulator.TALESField - TALESMethod - - - + _text - python: [\'python: None\',here.getInitialValue(evaluate=0)][str(here.getInitialValue(evaluate=0)).startswith(\'python\')] + python: cell.getVariableExpressionText() diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_state_variable.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_state_variable.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a5cc17c2e54335043d9375766d7bc766c48f837 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_state_variable.xml @@ -0,0 +1,260 @@ + + + + + + + + + + id + my_state_variable + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + This variable is used in workflow state accessor generation. + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + max_length + + + + required + 0 + + + title + State Variable + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..6f15862db9fc4a849e17963f29b8ede23df9ba78 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewVariableList/my_title.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + editable + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + editable + 0 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList.xml new file mode 100644 index 0000000000000000000000000000000000000000..862ea6a6517bb1acbd66a5b8586cbdf936d2f81a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList.xml @@ -0,0 +1,131 @@ + + + + + + + + + + _objects + + + + + + action + Base_edit + + + description + + + + edit_order + + + + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + WorkflowScripts + + + + + center + + + + + + hidden + + + + + + left + + + + + + right + + + + + + + + + id + Workflow_viewWorkflowScriptList + + + method + POST + + + name + Workflow_viewPythonScriptList + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Scripts + + + unicode_mode + 0 + + + update_action + + + + update_action_title + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList/WorkflowScripts.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList/WorkflowScripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..783d1a6be13671b1a53147b6fa2be3e955fa2ce5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorkflowScriptList/WorkflowScripts.xml @@ -0,0 +1,239 @@ + + + + + + + + + + delegated_list + + + columns + editable_columns + list_action + portal_types + sort + title + url_columns + + + + + id + WorkflowScripts + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + columns + + + + editable_columns + + + + field_id + + + + form_id + + + + list_action + + AAAAAAAAAAI= + + + + portal_types + + + + target + + + + title + + + + url_columns + + + + + + + values + + + + columns + + + + id + ID + + + reference + Reference + + + title + Title + + + callable_type + Callable Type + + + parameter_signature + Parameters + + + description + Description + + + + + + editable_columns + + + + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + list_action + list + + + portal_types + + + + Workflow Script + Workflow Script + + + + + + sort + + + + reference + Reference + + + + + + target + Click to edit the target + + + title + Scripts + + + url_columns + + + + id + WorkflowScript_getListBoxURL + + + reference + WorkflowScript_getListBoxURL + + + title + WorkflowScript_getListBoxURL + + + callable_type + WorkflowScript_getListBoxURL + + + parameter_signature + WorkflowScript_getListBoxURL + + + description + WorkflowScript_getListBoxURL + + + + + + + + + + + + + + + + + + _text + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList.xml index 9533fbf3daf320e7f67ada22a5522b9e11a65b5a..b1cb3d77f9f389a14980717eb35bacc95b22bdfb 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList.xml @@ -78,9 +78,7 @@ hidden - - listbox_title - + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/listbox.xml similarity index 88% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/listbox.xml index 6959dd158b730afdda9fa4971a06e3289e28ab13..a6c51ef5fa25223325b34491b2f4182a93589cd2 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Workflow_viewWorklistList/listbox.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/listbox.xml @@ -10,11 +10,12 @@ delegated_list - title columns - selection_name - portal_types editable_columns + portal_types + selection_name + sort + title @@ -80,25 +81,24 @@ - id - ID + reference + Reference title Title + + description + Description + editable_columns - - - title - Title - - + @@ -124,6 +124,17 @@ selection_name workflow_worklist_selection + + sort + + + + ref + Reference + + + + target Click to edit the target diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..6f15862db9fc4a849e17963f29b8ede23df9ba78 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Workflow_viewWorklistList/my_title.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + editable + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + editable + 0 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view.xml similarity index 91% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view.xml index 30c9030aecdbe3abf446be0276d818bf8ec422ef..5633b04c2faadb29e1be806f49678b6304ea65dd 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/Variable_view.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view.xml @@ -70,9 +70,7 @@ center - - my_comment - + @@ -85,10 +83,9 @@ left - my_title - my_description - my_automatic_update - my_initial_value + my_reference + my_variable_value + my_variable_expression @@ -103,7 +100,7 @@ id - Variable_view + WorklistVariable_view method diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..c44ddce42428ac7d80a85b7470b93a3002f5b67c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_reference.xml @@ -0,0 +1,96 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + field_id + my_view_mode_reference_as_name + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Variable Name + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_expression.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_expression.xml new file mode 100644 index 0000000000000000000000000000000000000000..0dc56ecf515ef399dcd64923581f42cda2857fe8 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_expression.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_variable_expression + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Variable Expression (Overrides Variable Value) + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_value.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_value.xml new file mode 100644 index 0000000000000000000000000000000000000000..2cea0d6117155750bccc276e7b2f13e43e94a2ef --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/WorklistVariable_view/my_variable_value.xml @@ -0,0 +1,264 @@ + + + + + + + + + + id + my_variable_value + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 50 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Variable Value + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0be6a532540dd20eda9333539382d6525154242 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view.xml @@ -0,0 +1,158 @@ + + + + + + + + + + _bind_names + + + + + + + + + + _asgns + + + + + + + + + + + _objects + + + + + + action + Base_edit + + + encoding + UTF-8 + + + enctype + + + + group_list + + + left + right + center + bottom + hidden + + + + + groups + + + + bottom + + + listbox + + + + + center + + + my_comment + + + + + hidden + + + + + + left + + + my_id + my_reference + my_title + my_description + my_matched_portal_type_list + my_matched_simulation_state_list + my_matched_validation_state_list + my_matched_causality_state + my_action_name + my_action + my_icon + my_action_type + + + + + right + + + my_guard_permission_list + my_guard_role_list + my_guard_group_list + my_guard_expression_text + + + + + + + + id + Worklist_view + + + method + POST + + + name + Worklist_view + + + pt + form_view + + + row_length + 4 + + + stored_encoding + UTF-8 + + + title + Worklist + + + unicode_mode + 0 + + + update_action + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/listbox.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/listbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..74f7123326d4b403a03a84ac219decc6ec531565 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/listbox.xml @@ -0,0 +1,143 @@ + + + + + + + + + + delegated_list + + + anchor + columns + description + portal_types + selection_name + title + + + + + id + listbox + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + anchor + 1 + + + columns + + + + reference + Variable Name + + + variable_expression + Expression + + + Variable_getNonEvaluatedVariableValue + Value + + + + + + description + Variable serves as dynamic variable. + + + field_id + my_view_mode_listbox + + + form_id + Base_viewFieldLibrary + + + portal_types + + + + Worklist Variable + Worklist Variable + + + + + + selection_name + worklist_variable_selection + + + target + Click to edit the target + + + title + Worklist Variables + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action.xml new file mode 100644 index 0000000000000000000000000000000000000000..c27275ae1e0f10ca5b99888169169b85025890d1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action.xml @@ -0,0 +1,106 @@ + + + + + + + + + + delegated_list + + + description + display_width + title + + + + + id + my_action + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The URL of the transition displayed in Action Box. + + + display_width + 80 + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box URL + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_name.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_name.xml new file mode 100644 index 0000000000000000000000000000000000000000..06bd9af360292f14397366ee6a1c3f17da403c89 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_name.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_action_name + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The name of this transition to be displayed in Action Box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Name + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_type.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_type.xml new file mode 100644 index 0000000000000000000000000000000000000000..87f8b25e8d61dd950c795157f5239803a4d8e9d2 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_action_type.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_action_type + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The category of the transition displayed in Action Box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Category + + + + + + + + diff --git a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_comment.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_comment.xml similarity index 97% rename from bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_comment.xml rename to product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_comment.xml index 1dc23699fa9fe850200b2976de8b7d52fe6730e1..ca16bcbc8ac526b2caf873e3605a1559c03ade47 100644 --- a/bt5/erp5_workflow/SkinTemplateItem/portal_skins/erp5_workflow/TransitionVariable_view/my_comment.xml +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_comment.xml @@ -81,7 +81,7 @@ form_id - BaseWorkflow_FieldLibrary + Base_viewFieldLibrary diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_description.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_description.xml new file mode 100644 index 0000000000000000000000000000000000000000..8296818f72daddad5c1ebad46edf144483bbc7f1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_description.xml @@ -0,0 +1,92 @@ + + + + + + + + + + delegated_list + + + + + + id + my_description + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_description + + + form_id + Base_viewFieldLibrary + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_expression_text.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_expression_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c59caf96263bb309298ea7f4ef39ce00850ef6c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_expression_text.xml @@ -0,0 +1,98 @@ + + + + + + + + + + delegated_list + + + title + + + + + id + my_guard_expression_text + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Guard Expression + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_group_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_group_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b5473d4fed7d2e7debe9ae9b7f0ad979af9dd75 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_group_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_guard_group_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Group + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_permission_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_permission_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..6acc40a9ffbde2828470f9a5067c64153fb766ca --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_permission_list.xml @@ -0,0 +1,298 @@ + + + + + + + + + + id + my_guard_permission_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + line_too_long + A line was too long. + + + required_not_found + Input is required but no input given. + + + too_long + You entered too many characters. + + + too_many_lines + You entered too many lines. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + height + + + + hidden + + + + max_length + + + + max_linelength + + + + max_lines + + + + required + + + + title + + + + unicode + + + + view_separator + + + + whitespace_preserve + + + + width + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + + + description + + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + height + 5 + + + hidden + 0 + + + max_length + + + + max_linelength + + + + max_lines + + + + required + 0 + + + title + Guard Permission + + + unicode + 0 + + + view_separator + + +]]> + + + whitespace_preserve + 0 + + + width + 40 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_role_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_role_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..a60f67396f7b16454c5b595e79e85bb9e0e03e02 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_guard_role_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_guard_role_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Guard Role(s) + + + + + + + + + + + + + + + _text + python: [(x, x) for x in here.getParent().getManagedRoleList()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_icon.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..811bf49c506f67404ab4bf9074690549b4cc66d5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_icon.xml @@ -0,0 +1,101 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_icon + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + target + + + + + + + values + + + + description + The icon of the transition displayed in action box. + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + target + Click to edit the target + + + title + Display in Action Box Icon + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_id.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_id.xml new file mode 100644 index 0000000000000000000000000000000000000000..132503911cf333ef4760185dd13317693eb5b2da --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_id.xml @@ -0,0 +1,108 @@ + + + + + + + + + + delegated_list + + + description + editable + title + + + + + id + my_id + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + description + The ID of a document in ERP5 + + + editable + 0 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + ID + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_causality_state.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_causality_state.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc35a26cca9561ced76708f00d398c9e0a853c97 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_causality_state.xml @@ -0,0 +1,272 @@ + + + + + + + + + + id + my_matched_causality_state + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + required_not_found + Input is required but no input given. + + + too_long + Too much input was given. + + + + + + overrides + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + input_type + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + tales + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + + + + editable + + + + enabled + + + + external_validator + + + + extra + + + + hidden + + + + input_type + + + + max_length + + + + required + + + + title + + + + truncate + + + + unicode + + + + whitespace_preserve + + + + + + + values + + + + alternate_name + + + + css_class + + + + default + + + + description + + + + display_maxwidth + + + + display_width + 20 + + + editable + 1 + + + enabled + 1 + + + external_validator + + + + extra + + + + hidden + 0 + + + input_type + text + + + max_length + + + + required + 0 + + + title + Matched Causality State + + + truncate + 0 + + + unicode + 0 + + + whitespace_preserve + 0 + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_portal_type_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_portal_type_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..a499011203bc121a79ab542dcd796fb1ae9f35d2 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_portal_type_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_matched_portal_type_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Cataloged Portal Type Matches + + + + + + + + + + + + + + + _text + python: [(x.getId(), x.getId()) for x in here.getPortalObject().portal_types.objectValues()] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_simulation_state_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_simulation_state_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..ee3bbb53f7412c1ae1b43db013c58dbe9e2d7644 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_simulation_state_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_matched_simulation_state_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Matched Simulation State + + + + + + + + + + + + + + + _text + python: [(x.getTitle(), x.getId()) for x in here.getParent().objectValues(portal_type=\'State\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_validation_state_list.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_validation_state_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..f5e256b422f75feb4ee3c0d172e3db0fb32eafe4 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_matched_validation_state_list.xml @@ -0,0 +1,126 @@ + + + + + + + + + + delegated_list + + + items + title + + + + + id + my_matched_validation_state_list + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + field_id + + + + form_id + + + + target + + + + + + + tales + + + + field_id + + + + form_id + + + + items + + AAAAAAAAAAI= + + + + target + + + + title + + + + + + + values + + + + field_id + my_parallel_list_field + + + form_id + Base_viewFieldLibrary + + + items + + + + + + target + Click to edit the target + + + title + Matched Validation State + + + + + + + + + + + + + + + _text + python: [(x.getTitle(), x.getId()) for x in here.getParent().objectValues(portal_type=\'State\')] + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_reference.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d52fb7326acef12761ef767be637e7cadd8ec4d --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_reference.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_reference + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + description + The ID of a document in ERP5 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Reference + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_title.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_title.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6b01c22f67471f4d59519823ca773637ceba7b1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Worklist_view/my_title.xml @@ -0,0 +1,103 @@ + + + + + + + + + + delegated_list + + + description + title + + + + + id + my_title + + + message_values + + + + external_validator_failed + The input failed the external validator. + + + + + + overrides + + + + extra_context + + + + field_id + + + + form_id + + + + + + + tales + + + + extra_context + + + + field_id + + + + form_id + + + + + + + values + + + + description + The ID of a document in ERP5 + + + extra_context + + + + + + field_id + my_title + + + form_id + Base_viewFieldLibrary + + + title + Title + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.py new file mode 100644 index 0000000000000000000000000000000000000000..8f9609eb2d75546aeb8d4cec97fed716fdffe51c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.py @@ -0,0 +1,21 @@ +""" +This script should be called in following case: +- new business installation after workflow conversion; +- workflow assignement in _chain_by_type with converted workflows' id coming with this new installed bt. +""" + +workflow_tool = context.getPortalObject().portal_workflow +type_workflow_dict = workflow_tool.getChainsByType() + +for ptype_id in type_workflow_dict: + ptype = getattr(context.getPortalObject().portal_types, ptype_id, None) + if ptype is not None: + for workflow_id in type_workflow_dict[ptype_id]: + workflow = getattr(workflow_tool, workflow_id, None) + if workflow and workflow.getPortalType() in ['Workflow', 'Interaction Workflow']: + # 1. clean DC workflow assignement: + workflow_tool.delTypeCBT(ptype.id, workflow.id) + # 2. assign ERP5 Workflow to portal type: + type_workflow_list = ptype.getTypeWorkflowList() + if workflow_id not in type_workflow_list: + ptype.setTypeWorkflowList(ptype.getTypeWorkflowList() + [workflow_id]) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.xml new file mode 100644 index 0000000000000000000000000000000000000000..acc27835e631950a38ea3dcdf592635bbe696544 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/reassign_workflow_please.xml @@ -0,0 +1,62 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + + + + id + reassign_workflow_please + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.py new file mode 100644 index 0000000000000000000000000000000000000000..12b440ac55ada8e4a351ae18a29bff02ae947f61 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.py @@ -0,0 +1,24 @@ +""" +for ptype in context.getPortalObject().portal_types.objectValues(): + for workflow_id in ['interactionworkflow_testing_interaction_workflow', 'workflow_testing_workflow']: + ptype.delTypeWorkflowList(workflow_id) + +""" +# rapair _chains_by_type +type_workflow_dict = {'Category': ('edit_workflow',), 'Dynamic Category Property': ('dynamic_class_generation_interaction_workflow',), 'System Preference': ('edit_workflow', 'preference_workflow'), 'Bug Line': ('edit_workflow', 'bug_event_workflow'), 'Embedded Folder': ('edit_workflow', 'embedded_workflow'), 'Test Component': ('edit_workflow', 'dynamic_class_generation_interaction_workflow', 'component_validation_workflow'), 'Base Category': ('edit_workflow', 'dynamic_class_generation_interaction_workflow'), 'Organisation': ('validation_workflow', 'edit_workflow'), 'Property Type Validity Constraint': ('dynamic_class_generation_interaction_workflow',), 'Property Existence Constraint': ('dynamic_class_generation_interaction_workflow',), 'Action Information': ('base_type_interaction_workflow',), 'ERP5Workflow Test Document': ('testing_workflow', 'testing_interaction_workflow', 'edit_workflow'), 'Document': ('edit_workflow',), 'Email': ('edit_workflow',), 'Career': ('career_workflow',), 'Document Component': ('edit_workflow', 'dynamic_class_generation_interaction_workflow', 'component_validation_workflow'), 'Category Acquired Membership State Constraint': ('dynamic_class_generation_interaction_workflow',), 'Predicate': ('rule_interaction_workflow', 'edit_workflow'), 'Category Tool': ('dynamic_class_generation_interaction_workflow',), 'Attribute Unicity Constraint': ('dynamic_class_generation_interaction_workflow',), 'Role Definition': ('edit_workflow', 'local_permission_interaction_workflow'), 'Category Membership State Constraint': ('dynamic_class_generation_interaction_workflow',), 'Assignment': ('edit_workflow', 'assignment_workflow'), 'Distributed Ram Cache': ('distributed_ram_cache_interaction_workflow',), 'Rounding Model': ('validation_workflow',), 'Component': ('validation_workflow', 'edit_workflow'), 'Configuration Save': ('edit_workflow',), 'Link': ('edit_workflow',), 'Preference': ('edit_workflow', 'preference_workflow'), 'Address': ('edit_workflow',), 'TALES Constraint': ('dynamic_class_generation_interaction_workflow',), 'Category Property': ('dynamic_class_generation_interaction_workflow',), 'Category Related Membership Arity Constraint': ('dynamic_class_generation_interaction_workflow',), 'Content Existence Constraint': ('dynamic_class_generation_interaction_workflow',), 'Notification Message': ('document_security_interaction_workflow', 'notification_message_workflow', 'processing_status_workflow', 'document_conversion_interaction_workflow', 'edit_workflow'), 'Acquired Property': ('dynamic_class_generation_interaction_workflow',), 'Property Sheet': ('dynamic_class_generation_interaction_workflow',), 'Embedded File': ('edit_workflow', 'embedded_workflow', 'document_conversion_interaction_workflow'), 'Category Membership Arity Constraint': ('dynamic_class_generation_interaction_workflow',), 'Category Related Membership State Constraint': ('dynamic_class_generation_interaction_workflow',), 'Alarm': ('edit_workflow',), 'Bank Account': ('validation_workflow', 'edit_workflow'), 'Fax': ('edit_workflow',), 'Mapped Value': ('edit_workflow',), 'Business Template': ('business_template_building_workflow', 'business_template_installation_workflow'), 'Memcached Plugin': ('memcached_plugin_interaction_workflow',), 'Attribute Blacklisted Constraint': ('dynamic_class_generation_interaction_workflow',), 'Category Existence Constraint': ('dynamic_class_generation_interaction_workflow',), 'Query': ('edit_workflow', 'query_workflow'), 'Attribute Equality Constraint': ('dynamic_class_generation_interaction_workflow',), 'Simulation Movement': ('simulation_movement_causality_interaction_workflow',), 'Person': ('validation_workflow', 'edit_workflow', 'person_interaction_workflow', 'user_account_workflow'), 'File': ('document_security_interaction_workflow', 'document_conversion_interaction_workflow', 'edit_workflow'), 'ERP5Workflow Test Object': ('dc_test_workflow',), 'Glossary Term': ('validation_workflow', 'edit_workflow'), 'Telephone': ('edit_workflow',), 'Agent': ('edit_workflow',), 'Bug': ('edit_workflow', 'bug_workflow'), 'String Attribute Match Constraint': ('dynamic_class_generation_interaction_workflow',), 'Currency': ('validation_workflow', 'edit_workflow'), 'Base Type': ('dynamic_class_generation_interaction_workflow', 'base_type_interaction_workflow'), 'Extension Component': ('edit_workflow', 'dynamic_class_generation_interaction_workflow', 'component_validation_workflow'), 'Chat Address': ('edit_workflow',), 'Credit Card': ('validation_workflow', 'edit_workflow'), 'Currency Exchange Line': ('currency_exchange_line_interaction_workflow', 'edit_workflow', 'validation_workflow'), 'Business Configuration': ('validation_workflow', 'edit_workflow', 'business_configuration_simulation_workflow'), 'Standard Property': ('dynamic_class_generation_interaction_workflow',), 'Image': ('document_security_interaction_workflow', 'document_conversion_interaction_workflow', 'edit_workflow'), 'Property Sheet Tool': ('dynamic_class_generation_interaction_workflow',)} +chains_by_type = context.getChainsByType() + +# the workflow_id to repair +workflow_id_to_repair_list = ['edit_workflow', 'validation_workflow'] + +# repair process +for workflow_id in workflow_id_to_repair_list: + for type_id in chains_by_type: + type_ob = getattr(context.getPortalObject().portal_types, type_id, None) + if type_ob is not None: + if workflow_id in type_workflow_dict[type_id] and workflow_id not in chains_by_type[type_id]: + #raise NotImplementedError(type_id, type_workflow_dict[type_id], chains_by_type[type_id]) + context.addTypeCBT(type_id, workflow_id) + if type_ob is not None: + type_ob.delTypeWorkflowList('workflow_'+workflow_id) + type_ob.delTypeWorkflowList('interactionworkflow_'+workflow_id) diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.xml b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab33b5509cead1e31836e991c8455b6e01195bf7 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/repair_cbt.xml @@ -0,0 +1,66 @@ + + + + + + + + + + Script_magic + 3 + + + _bind_names + + + + + + + + + + _asgns + + + + name_container + container + + + name_context + context + + + name_m_self + script + + + name_subpath + traverse_subpath + + + + + + + + + + + _params + + + + id + repair_cbt + + + title + Chain By Type Repair Tool + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/draft.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/draft.xml deleted file mode 100644 index 977080daef7eb1c5b9dc7c2c6e44fe672d4ceed1..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/states/draft.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - description - - - - id - draft - - - title - Draft - - - transitions - - - build - build_action - clean - edit - - - - - type_list - - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.py b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.py deleted file mode 100644 index 5e0f29155ead8249e87c09b7e5ed0654c0b668ee..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.py +++ /dev/null @@ -1,22 +0,0 @@ -business_template = state_change['object'] -listbox = state_change.kwargs.get('listbox') -update_catalog = state_change.kwargs.get('update_catalog') -update_translation = state_change.kwargs.get('update_translation') -workflow_action = state_change.kwargs.get('workflow_action') - -object_to_update = {} -if listbox is not None and len(listbox) > 0: - for item in listbox: - if item['choice']: - # Choice parameter is now selected with a MultiCheckBoxField with only one element - # Business Template need to get a string and not a list - object_to_update[item['listbox_key']] = item['choice'][0] - else: - object_to_update[item['listbox_key']] = "nothing" - -if workflow_action == 'install_action': - business_template.install(force=0, object_to_update=object_to_update, \ - update_catalog=update_catalog, update_translation=update_translation) -elif workflow_action == 'reinstall_action': - business_template.reinstall(force=0, object_to_update=object_to_update, \ - update_catalog=update_catalog, update_translation=update_translation) diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/installed.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/installed.xml deleted file mode 100644 index a3a6aef0588cd226a534f3dcdf990adee164a3bf..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/installed.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - description - - - - id - installed - - - permission_roles - - AAAAAAAAAAI= - - - - title - Installed - - - transitions - - - reinstall - reinstall_action - replace - uninstall - uninstall_action - - - - - type_list - - - - - - - - - - - - Persistence - PersistentMapping - - - - - - - - _container - - - - Modify portal content - - - - - - View - - - - - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/not_installed.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/not_installed.xml deleted file mode 100644 index 00f08c1a5cadabe02ed8fbf3b7522099e5d84d20..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/states/not_installed.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - description - - - - id - not_installed - - - permission_roles - - AAAAAAAAAAI= - - - - title - Not Installed - - - transitions - - - delete - delete_action - install - install_action - - - - - type_list - - - - - - - - - - - - Persistence - PersistentMapping - - - - - - - - _container - - - - Modify portal content - - - Manager - - - - - View - - - - - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions.xml deleted file mode 100644 index aa36144efed916b804f5f80df9452b1e3166bdec..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - _mapping - - - - - - _objects - - - - - - id - transitions - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install.xml deleted file mode 100644 index 658fb6794ef5ff22a6d2d6650bef3420b1bc3383..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/install.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - actbox_category - workflow - - - actbox_name - - - - actbox_url - - - - after_script_name - - - - description - - - - guard - - AAAAAAAAAAI= - - - - id - install - - - new_state_id - installed - - - script_name - - - - title - Install Business Template - - - trigger_type - 2 - - - - - - - - - - - - permissions - - - Manage portal - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall.xml deleted file mode 100644 index c4d5ff4b4110579c1d1ad5b7bdffd3d8aa81e346..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/reinstall.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - actbox_category - workflow - - - actbox_name - - - - actbox_url - - - - after_script_name - - - - description - - - - guard - - AAAAAAAAAAI= - - - - id - reinstall - - - new_state_id - installed - - - script_name - - - - title - Reinstall Business Template - - - trigger_type - 2 - - - - - - - - - - - - permissions - - - Manage portal - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/replace.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/replace.xml deleted file mode 100644 index 6b0fe36e1d31ec8117d748e9ac10e8e630dc22cd..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/replace.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - actbox_category - workflow - - - actbox_name - - - - actbox_url - - - - after_script_name - - - - description - - - - guard - - AAAAAAAAAAI= - - - - id - replace - - - new_state_id - replaced - - - script_name - - - - title - Replace Business Template - - - trigger_type - 2 - - - - - - - - - - - - permissions - - - Manage portal - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall.xml deleted file mode 100644 index ece396a4977fbe360d0f2fd29911f97a532b503d..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/transitions/uninstall.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - actbox_category - workflow - - - actbox_name - - - - actbox_url - - - - after_script_name - - - - description - - - - guard - - AAAAAAAAAAI= - - - - id - uninstall - - - new_state_id - not_installed - - - script_name - - - - title - Uninstall Business Template - - - trigger_type - 2 - - - - - - - - - - - - permissions - - - Manage portal - - - - - - - diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/dynamic_class_generation_interaction_workflow/interactions/BaseType_resetDynamicClasses.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/dynamic_class_generation_interaction_workflow/interactions/BaseType_resetDynamicClasses.xml index 376df67524ffd7fd3c6d668aa1443b868f70580c..e29b9ffb83e3e3f3abc3d6b2c35c445fe1c03ff0 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/dynamic_class_generation_interaction_workflow/interactions/BaseType_resetDynamicClasses.xml +++ b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/dynamic_class_generation_interaction_workflow/interactions/BaseType_resetDynamicClasses.xml @@ -61,6 +61,7 @@ _setTypeInterface.* _setTypePropertySheet.* _setTypeBaseCategory.* + _setTypeWorkflow.* @@ -82,6 +83,12 @@ + + portal_type_group_filter + + + + script_name diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/Document_checkConsistency.xml similarity index 96% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.xml rename to product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/Document_checkConsistency.xml index e3a5b1d37f3c11bb752adff4111157063ffced37..24e3a5bc156e3fb3da6dedf480cc67c422a39467 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_installation_workflow/scripts/BusinessTemplate_install.xml +++ b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/scripts/Document_checkConsistency.xml @@ -54,7 +54,7 @@ id - BusinessTemplate_install + Document_checkConsistency diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/transitions/validate_action.xml b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/transitions/validate_action.xml index e5c515feddbb37cf53b4b21cf9d803e100f65c41..b7bd1b1d2d301954d5af487155dd11fcbd3bbc66 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/transitions/validate_action.xml +++ b/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/validation_workflow/transitions/validate_action.xml @@ -10,6 +10,10 @@ actbox_category workflow + + actbox_icon + + actbox_name Validate @@ -42,7 +46,7 @@ script_name - checkConsistency + Document_checkConsistency title diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_action_path_list b/product/ERP5/bootstrap/erp5_core/bt/template_action_path_list index 6671b9c224ea599823ee5cc161cae958eed62889..b18093f0746d77a3fb2039acced89e0c4d60837e 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_action_path_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_action_path_list @@ -28,6 +28,7 @@ Base Type | role_view Base Type | translation_view Base Type | update_local_roles Base Type | view +Business Template | convert_to_ERP5_workflows Business Template | export Business Template | get_portal_type_properties Business Template | guess_portal_types @@ -77,6 +78,10 @@ Dynamic Category Property | view Extension Component | view Folder | view Id Tool | view +Interaction Workflow | script_view +Interaction Workflow | variable_view +Interaction Workflow | view +Interaction | view Memcached Plugin | view Memcached Tool | view Predicate | view @@ -111,6 +116,8 @@ SQL Non Continuous Increasing Id Generator | view Script Constraint | predicate Script Constraint | view Standard Property | view +State | permission +State | view String Attribute Match Constraint | predicate String Attribute Match Constraint | view System Preference | captcha @@ -128,11 +135,31 @@ Template Tool | update Template Tool | upgrade_from_repository Template Tool | view Test Component | view +Transition Variable | view +Transition | view Trash Bin | jump_bt5 Trash Bin | view Trash Folder | view Trash Tool | view Types Tool | view +Workflow Script | proxy_role_view +Workflow Script | proxy_role_view +Workflow Script | repository_history_view +Workflow Script | view +Workflow Script | view +Workflow Tool | conversion +Workflow Tool | view +Workflow Variable | view +Workflow | launch_configuration +Workflow | permission_view +Workflow | script_view +Workflow | transition_view +Workflow | update_security_roles +Workflow | variable_view +Workflow | view +Workflow | worklist_view +Worklist Variable | view +Worklist | view ZODB Continuous Increasing Id Generator | view portal_actions | bt_tool portal_actions | category_tool diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_base_category_list b/product/ERP5/bootstrap/erp5_core/bt/template_base_category_list index fc6056540255e3fdcd08bba9e8c4e85a4c9bbe50..5643849d9f2d5923a09da297ff41f570d5c3af6d 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_base_category_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_base_category_list @@ -1,6 +1,10 @@ action_type +activate_script activity +after_script aggregate +before_commit_script +before_script business_application callable_type causality diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_document_id_list b/product/ERP5/bootstrap/erp5_core/bt/template_document_id_list deleted file mode 100644 index e60c07d3676077995c4a531cc5fe98e3ecabb7a6..0000000000000000000000000000000000000000 --- a/product/ERP5/bootstrap/erp5_core/bt/template_document_id_list +++ /dev/null @@ -1 +0,0 @@ -document.erp5.ScriptConstraint \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_path_list b/product/ERP5/bootstrap/erp5_core/bt/template_path_list index 88d0f27d7d2141b7b40f0527d21c2a34c8549905..6dc4e10be2fed1da9e73f2467f3399ca17e172b8 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_path_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_path_list @@ -32,4 +32,6 @@ portal_domains/parent_domain portal_ids/** portal_memcached/default_memcached_plugin portal_preferences/default_site_preference -portal_transforms/** \ No newline at end of file +portal_transforms/** +portal_workflow/business_template_building_workflow** +portal_workflow/business_template_installation_workflow** \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_allowed_content_type_list b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_allowed_content_type_list index 680082233be5121db21f4ebae752b8b89919d7c2..36a34d252f652e23a844268a2f1802d17bec3de5 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_allowed_content_type_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_allowed_content_type_list @@ -25,6 +25,10 @@ Id Tool | Application Id Generator Id Tool | Conceptual Id Generator Id Tool | SQL Non Continuous Increasing Id Generator Id Tool | ZODB Continuous Increasing Id Generator +Interaction Workflow | Interaction +Interaction Workflow | Workflow Script +Interaction Workflow | Workflow Variable +Interaction | Transition Variable Memcached Tool | Memcached Plugin Preference Tool Type | Action Information Preference Tool Type | Role Information @@ -55,5 +59,14 @@ Property Sheet | TALES Constraint Simulation Movement | Applied Rule Simulation Tool | Applied Rule Template Tool | Business Template +Transition | Transition Variable Trash Tool | Trash Bin -Types Tool | Base Type \ No newline at end of file +Types Tool | Base Type +Workflow Tool | Interaction Workflow +Workflow Tool | Workflow +Workflow | State +Workflow | Transition +Workflow | Workflow Script +Workflow | Workflow Variable +Workflow | Worklist +Worklist | Worklist Variable \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_base_category_list b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_base_category_list index b5a5eee75ec3b0124a9fe25b1c85bbe3049ff4ea..47700752ca1f45497603d62980519378498f2edc 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_base_category_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_base_category_list @@ -1,3 +1,4 @@ Application Id Generator | specialise Conceptual Id Generator | specialise +Transition Variable | causality Trash Bin | causality \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_id_list b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_id_list index 4ea29617e76433ba7bc03c546ce24d522f83c066..8fd660970ba840691fcbb56efdd4747a31c41d13 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_id_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_portal_type_id_list @@ -44,6 +44,8 @@ Event Extension Component Folder Id Tool +Interaction +Interaction Workflow Mapped Value Memcached Plugin Memcached Tool @@ -71,14 +73,24 @@ Session Tool Simulation Movement Simulation Tool Standard Property +State String Attribute Match Constraint System Preference TALES Constraint Template Tool Test Component Test Tool +Transition +Transition Variable Trash Bin Trash Folder Trash Tool Types Tool +Workflow +Workflow Script +Workflow Script +Workflow Tool +Workflow Variable +Worklist +Worklist Variable ZODB Continuous Increasing Id Generator \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_property_sheet_id_list b/product/ERP5/bootstrap/erp5_core/bt/template_property_sheet_id_list index 203fba9b0db8b9367b9a8a211b6881a7cdb137b7..0a7456947719f558689ec338390c6f7e3e743798 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_property_sheet_id_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_property_sheet_id_list @@ -1,2 +1,2 @@ -ScriptConstraint -ConstraintType \ No newline at end of file +ConstraintType +UpgraderConstraint \ No newline at end of file diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_workflow_id_list b/product/ERP5/bootstrap/erp5_core/bt/template_workflow_id_list index 11778b697ecd6c3e05e36ea9d9d9486cc168e562..42e187834e15be99d71c5ec9f1bf9b5a545a235b 100644 --- a/product/ERP5/bootstrap/erp5_core/bt/template_workflow_id_list +++ b/product/ERP5/bootstrap/erp5_core/bt/template_workflow_id_list @@ -1,6 +1,4 @@ base_type_interaction_workflow -business_template_building_workflow -business_template_installation_workflow component_validation_workflow distributed_ram_cache_interaction_workflow dynamic_class_generation_interaction_workflow diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ActionInformation/action_name_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ActionInformation/action_name_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..ee72bee43be3aaf2aa7492194bb5c519e995e989 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ActionInformation/action_name_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + action_name + + + description + + + + + + id + action_name_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/BaseType/type_workflow_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/BaseType/type_workflow_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..4fcbee182a63c3a17b55967b45d4d2cccaabaebc --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/BaseType/type_workflow_property.xml @@ -0,0 +1,97 @@ + + + + + + + + + + _local_properties + + + + + id + select_variable + + + type + string + + + + + id + label + + + type + string + + + + + id + mode + + + type + string + + + + + + + categories + + + elementary_type/multiple selection + + + + + default_reference + type_workflow + + + description + + + + + + id + type_workflow_property + + + label + Base Categories + + + mode + w + + + portal_type + Standard Property + + + property_default + + + + + + select_variable + getAvailableBaseCategoryList + + + storage_id + workflow_list + + + + + diff --git a/bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition.xml similarity index 94% rename from bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition.xml index 46778af0946965fd37d3c970359ddf8393922234..004d4c5aaff7dc20e7a14318fdb0f1fc96ac1cde 100644 --- a/bt5/erp5_upgrader/PropertySheetTemplateItem/portal_property_sheets/TemplateToolWorkflowChainConsistencyConstraint.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition.xml @@ -32,7 +32,7 @@ id - TemplateToolWorkflowChainConsistencyConstraint + ConfiguratorTransition portal_type diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/after_script_id_property.xml similarity index 54% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_id_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/after_script_id_property.xml index 638afcb7eee062d2ac6bc554536c4e8ab0e6f519..1cfd9ff74db0b6605696bb58034e0053f1b8804a 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_id_property.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/after_script_id_property.xml @@ -7,46 +7,35 @@ - _local_properties + categories - - - id - mode - - - type - string - - + elementary_type/lines - categories - - - elementary_type/string - - + default_reference + after_script_id description - Defines the script called after a transition. + Defines the id of the script called at the end of the transition. id after_script_id_property - - mode - w - portal_type Standard Property + + storage_id + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/before_script_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/before_script_id_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..baade7eb5c9b3840914311c1e94d33067d95fa49 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/before_script_id_property.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + elementary_type/lines + + + + + default_reference + before_script_id + + + description + Defines the id of the script called at the beginning of the transition. + + + id + before_script_id_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/scripts.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/destination_category.xml similarity index 53% rename from product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/scripts.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/destination_category.xml index a703b14c4ca0bde0a51a531783d85f8be1ccd853..a484237f61b13c835e6345f57804b1a1345bf4fd 100644 --- a/product/ERP5/bootstrap/erp5_core/WorkflowTemplateItem/portal_workflow/business_template_building_workflow/scripts.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/destination_category.xml @@ -2,19 +2,17 @@ - + - _mapping - - - + id + destination_category - id - scripts + portal_type + Category Property diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/transition_form_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/transition_form_id_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d914e1c14c8d6573133ff20c38a614889d6ae35 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/transition_form_id_property.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + transition_form_id + + + description + Defines the form use to display question to the user. + + + id + transition_form_id_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/trigger_type_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/trigger_type_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e5dbda104ed2d2dbae6b574a8729ea4ee6ce633 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ConfiguratorTransition/trigger_type_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + trigger_type_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/63.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard.xml similarity index 85% rename from bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/63.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard.xml index 365a712f821e1af9d7ac3e122331d73629f4518a..67cd8f6cf279a3c0c50a967bcb4e2114c3346c0c 100644 --- a/bt5/erp5_configurator_run_my_doc/PathTemplateItem/workflow_module/run_my_doc_configuration_workflow/63.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard.xml @@ -2,7 +2,7 @@ - + @@ -32,15 +32,11 @@ id - 63 + Guard portal_type - State - - - title - End + Property Sheet diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_expression_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_expression_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..89bff1601fbe4b80f70bbd246a76478cde183fdb --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_expression_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + guard_expression + + + description + + + + + + id + guard_expression_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_group_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_group_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..6abe3014d874448b68996cc48d2b31ba62361400 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_group_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/lines + + + + + default_reference + guard_group + + + description + + + + + + id + guard_group_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_permission_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_permission_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5f47035c25b0a26dbe5ea7071af39010c864d36 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_permission_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/lines + + + + + default_reference + guard_permission + + + description + + + + + + id + guard_permission_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_role_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_role_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec46280c759d8290bb8403ff39f913a639380cae --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Guard/guard_role_property.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + guard_role + + + description + + + + + + id + guard_role_property + + + multivalued + 1 + + + portal_type + Standard Property + + + + + diff --git a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/63.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction.xml similarity index 85% rename from bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/63.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction.xml index 365a712f821e1af9d7ac3e122331d73629f4518a..4b1280969837d34f1d1527dfda30dc971193117f 100644 --- a/bt5/erp5_configurator_standard/PathTemplateItem/workflow_module/erp5_standard_workflow/63.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction.xml @@ -2,7 +2,7 @@ - + @@ -32,15 +32,11 @@ id - 63 + Interaction portal_type - State - - - title - End + Property Sheet diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/activate_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/activate_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..987c1958f8db988e9fe942269f3b5e0b4c206e92 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/activate_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + activate_script + + + description + + + + + + id + activate_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/after_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/after_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..997939b513249fd85cf2fdc9c6f4b2dd7445f153 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/after_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + after_script + + + description + + + + + + id + after_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_commit_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_commit_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..a93b8bc148f993e3ad803755c60cce3a3be5e713 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_commit_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + before_commit_script + + + description + + + + + + id + before_commit_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..c65a26963d3d75f5ca4e9f3f5566f8772ec2eccb --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/before_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + before_script + + + description + + + + + + id + before_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_filter_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_filter_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..28906293a65cfe74ab739d631a8317b0574377cd --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_filter_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + portal_type_filter_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_group_filter_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_group_filter_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..23e31c9af95cdc26c18bb9e9a4e1ee008b65de4e --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/portal_type_group_filter_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + portal_type_group_filter_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/temporary_document_disallowed_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/temporary_document_disallowed_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb5d20b5ea2a65cf1c287ed7ecf507e9bfcc20 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/temporary_document_disallowed_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + temporary_document_disallowed_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/transition_form_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/transition_form_id_property.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/transition_form_id_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/transition_form_id_property.xml diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_method_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_method_id_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..39409422838e117851a0cd6f15ecbe067ed23e15 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_method_id_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + trigger_method_id_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_once_per_transaction_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_once_per_transaction_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d582ebf8b737707b58312b921a0b7ca4d86a597 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_once_per_transaction_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + trigger_once_per_transaction_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_type_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_type_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e5dbda104ed2d2dbae6b574a8729ea4ee6ce633 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Interaction/trigger_type_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + trigger_type_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint.xml diff --git a/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint/script_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint/script_id_property.xml similarity index 100% rename from product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint/script_id_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/ScriptConstraint/script_id_property.xml diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/acquire_permission_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/acquire_permission_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..8242c2e03a18be56f27c1314cfae5b86f018d686 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/acquire_permission_property.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + elementary_type/lines + + + + + default_reference + acquire_permission + + + description + + + + + + id + acquire_permission_property + + + portal_type + Standard Property + + + property_default + python: [] + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/automatic_update_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/selected_property.xml similarity index 50% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/automatic_update_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/selected_property.xml index d5b9d11fd7f6f69af62feea9630a69de11049d56..dc8319c30d0c50406fcffe5949a7b9de2a054fef 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/automatic_update_property.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/selected_property.xml @@ -7,46 +7,49 @@ - _local_properties + categories - - - id - mode - - - type - string - - + elementary_type/int - categories - - - elementary_type/boolean - - + default_reference + selected description - Do we update the value in each transition ? + + + id - automatic_update_property + selected_property - mode - w + multivalued + 0 portal_type Standard Property + + preference + 0 + + + property_default + python: 0 + + + storage_id + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/state_type_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/state_type_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..003fa9b65cce0bb53aadac642573d05b0d60f195 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/State/state_type_property.xml @@ -0,0 +1,48 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + state_type + + + description + + + + + + id + state_type_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..997939b513249fd85cf2fdc9c6f4b2dd7445f153 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/after_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + after_script + + + description + + + + + + id + after_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_category.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_category.xml new file mode 100644 index 0000000000000000000000000000000000000000..c65a26963d3d75f5ca4e9f3f5566f8772ec2eccb --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_category.xml @@ -0,0 +1,30 @@ + + + + + + + + + + default_reference + before_script + + + description + + + + + + id + before_script_category + + + portal_type + Category Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/trigger_type_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/trigger_type_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e5dbda104ed2d2dbae6b574a8729ea4ee6ce633 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/trigger_type_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + trigger_type_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_expression_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_expression_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..e7d63e4188ff9b6ff1b57f57f48513473c829686 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_expression_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + variable_expression_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/initial_value_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_value_property.xml similarity index 77% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/initial_value_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_value_property.xml index 7d93094a68810fdda29ec5e0a5934dfe925151f5..9d3e5ce7f6bda57446f4ff14c9c2ef3822a8767e 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/initial_value_property.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Variable/variable_value_property.xml @@ -27,7 +27,7 @@ categories - elementary_type/tales + elementary_type/string @@ -37,7 +37,7 @@ id - initial_value_property + variable_value_property mode @@ -47,6 +47,18 @@ portal_type Standard Property + + property_default + + + + + + storage_id + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow.xml index 40a3c293759fd32cbd0298278a924741a194d164..d089e7f1837f45f4f8589dcb6bd88ed94938a886 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow.xml @@ -24,6 +24,12 @@ AAAAAAAAAAQ= + + description + + + + id Workflow diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/manager_bypass_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/manager_bypass_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..d6ad45b89159dd22f2ce053652f9e2f9750120c6 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/manager_bypass_property.xml @@ -0,0 +1,40 @@ + + + + + + + + + + categories + + + elementary_type/int + + + + + description + + + + + + id + manager_bypass_property + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_base_category_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_base_category_property.xml index cff39b887e56ba001b7f95b31eae3cec3c9db16d..87fecca002ed5aa8b4bbfda9ee1970025cc7a0c6 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_base_category_property.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_base_category_property.xml @@ -6,23 +6,6 @@ - - _local_properties - - - - - id - mode - - - type - string - - - - - categories @@ -31,18 +14,20 @@ + + default_reference + state_base_category + description - Defines the base category used to save the currentstate + + + id state_base_category_property - - mode - w - portal_type Standard Property diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_variable_property.xml similarity index 82% rename from product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_id_property.xml rename to product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_variable_property.xml index 7e30a027ce8e4d9b71281bdb8ceda3627662f5e5..9b6124fc2077b828bb6cbe42c4d47bac2538fb0b 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Transition/before_script_id_property.xml +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/state_variable_property.xml @@ -33,11 +33,11 @@ description - Defines the script called before a transition. + Defines the base category used to save the currentstate id - before_script_id_property + state_variable_property mode @@ -47,6 +47,12 @@ portal_type Standard Property + + storage_id + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/workflow_managed_permission_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/workflow_managed_permission_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d453a904a7c30f83cc84109a922896d3345976a --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Workflow/workflow_managed_permission_property.xml @@ -0,0 +1,93 @@ + + + + + + + + + + _local_properties + + + + + id + select_variable + + + type + string + + + + + id + label + + + type + string + + + + + id + mode + + + type + string + + + + + + + categories + + + elementary_type/multiple selection + + + + + description + + + + + + id + workflow_managed_permission_property + + + label + Base Categories + + + mode + w + + + portal_type + Standard Property + + + property_default + python: () + + + select_variable + getAvailableBaseCategoryList + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator.xml new file mode 100644 index 0000000000000000000000000000000000000000..f7dba61c248c7d673932007a72ef2f4d080d13b5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator.xml @@ -0,0 +1,66 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + description + + + + + + id + WorkflowConfigurator + + + portal_type + Property Sheet + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator/configuration_after_script_id_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator/configuration_after_script_id_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..52cd675dc3eef360abf6afc0e428a1b65aec25d1 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowConfigurator/configuration_after_script_id_property.xml @@ -0,0 +1,34 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + configuration_after_script_id_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable.xml new file mode 100644 index 0000000000000000000000000000000000000000..7fbeeef18d628a92e48cf32d12a4285d3741afad --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable.xml @@ -0,0 +1,66 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + description + + + + + + id + WorkflowVariable + + + portal_type + Property Sheet + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/automatic_update_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/automatic_update_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..edc0fe2540078849281072db6fe7d2f29dbfcf4f --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/automatic_update_property.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + elementary_type/boolean + + + + + default_reference + automatic_update + + + description + If set to true, update the value at each transition. + + + id + automatic_update_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/for_catalog_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/for_catalog_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f936f7ea8aee896701b0a3a2e3039764c6665e5 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/for_catalog_property.xml @@ -0,0 +1,36 @@ + + + + + + + + + + categories + + + elementary_type/boolean + + + + + default_reference + for_catalog + + + description + will be removed + + + id + for_catalog_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/status_included_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/status_included_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..c76a84c6eb3919627e9c7e4e199fffb4329ea35f --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/WorkflowVariable/status_included_property.xml @@ -0,0 +1,38 @@ + + + + + + + + + + categories + + + elementary_type/boolean + + + + + default_reference + status_included + + + description + + + + + + id + status_included_property + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..8d0e0abe4980e8bff38d2fa5b4cf58acdecfbee7 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist.xml @@ -0,0 +1,66 @@ + + + + + + + + + + _count + + AAAAAAAAAAI= + + + + _mt_index + + AAAAAAAAAAM= + + + + _tree + + AAAAAAAAAAQ= + + + + description + + + + + + id + Worklist + + + portal_type + Property Sheet + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_causality_state_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_causality_state_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4e07caa80631abe9b6eb5608cf73d8818c1774c --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_causality_state_property.xml @@ -0,0 +1,42 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + default_reference + matched_causality_state + + + description + + + + + + id + matched_causality_state_property + + + multivalued + 0 + + + portal_type + Standard Property + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_portal_type_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_portal_type_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..36addb7d50f0a09a652198bb84b10d8a73231c51 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_portal_type_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/text + + + + + description + + + + + + id + matched_portal_type_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_simulation_state_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_simulation_state_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..f1fa1a1fdf00cc8d619f095173373bff97f59889 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_simulation_state_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + matched_simulation_state_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_validation_state_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_validation_state_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed63a200fae124246bf4e31721c8a5cb71b73922 --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/matched_validation_state_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + matched_validation_state_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/var_matches_property.xml b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/var_matches_property.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5bf8445c66b3f96a711d73ea84050d1e7adb43f --- /dev/null +++ b/product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/Worklist/var_matches_property.xml @@ -0,0 +1,44 @@ + + + + + + + + + + categories + + + elementary_type/string + + + + + description + + + + + + id + var_matches_property + + + multivalued + 1 + + + portal_type + Standard Property + + + storage_id + + + + + + + + diff --git a/product/ERP5/bootstrap/erp5_property_sheets/bt/template_property_sheet_id_list b/product/ERP5/bootstrap/erp5_property_sheets/bt/template_property_sheet_id_list index 57604b55ab727b1621e5e78bed25718a6bf9a617..f20614766752772be87e6834886090da68cba34a 100644 --- a/product/ERP5/bootstrap/erp5_property_sheets/bt/template_property_sheet_id_list +++ b/product/ERP5/bootstrap/erp5_property_sheets/bt/template_property_sheet_id_list @@ -177,9 +177,12 @@ TradePreference Transformation TransformedResource Transition +ConfiguratorTransition TranslatableProperty Url Variable +WorkflowVariable +Guard Variation VariationRange Version @@ -190,4 +193,8 @@ Workflow XMLObject AttributeBlacklistedConstraint CaptchaPreference -GeographicalPoint \ No newline at end of file +GeographicalPoint +Interaction +WorkflowConfigurator +Worklist +ScriptConstraint \ No newline at end of file diff --git a/product/ERP5/mixin/solver.py b/product/ERP5/mixin/solver.py index a9152dcc867617b60530385717384cc6acbb1a8a..b82cfff061ba60064e678120de9dc032de46cebf 100644 --- a/product/ERP5/mixin/solver.py +++ b/product/ERP5/mixin/solver.py @@ -46,6 +46,7 @@ class SolverMixin(object): # Declarative interfaces zope.interface.implements(interfaces.ISolver,) + workflow_list = () def _solve(self, activate_kw=None): raise NotImplementedError diff --git a/product/ERP5/tests/testBase.py b/product/ERP5/tests/testBase.py index e8880e479bc577a9a328a3e1bdbbf710bec172c5..86a035333a1695821d035e71e5fdcd4d5cf32374 100644 --- a/product/ERP5/tests/testBase.py +++ b/product/ERP5/tests/testBase.py @@ -132,23 +132,24 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): """ Remove workflow related to the portal type """ - self.getWorkflowTool().setChainForPortalTypes( - ['Organisation'], ()) + self.getPortalObject().portal_types.Organisation.setTypeWorkflowList([]) def stepAssociateWorkflows(self, sequence=None, sequence_list=None, **kw): """ Associate workflow to the portal type """ - self.getWorkflowTool().setChainForPortalTypes( - ['Organisation'], ('validation_workflow', 'edit_workflow')) + self.getPortalObject().portal_types.Organisation.setTypeWorkflowList([ + 'validation_workflow', 'edit_workflow' + ]) def stepAssociateWorkflowsExcludingEdit(self, sequence=None, sequence_list=None, **kw): """ Associate workflow to the portal type """ - self.getWorkflowTool().setChainForPortalTypes( - ['Organisation'], ('validation_workflow',)) + self.getPortalObject().portal_types.Organisation.setTypeWorkflowList([ + 'validation_workflow' + ]) def stepCreateObject(self, sequence=None, sequence_list=None, **kw): """ @@ -204,7 +205,7 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): def stepSetSameTitleValueWithEdit(self, sequence=None, sequence_list=None, **kw): """ - Set a different title value + Set the same title value """ object_instance = sequence.get('object_instance') object_instance.edit(title=object_instance.getTitle()) @@ -922,8 +923,8 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): 'workflow_history', property_value) def test_12_editTempObject(self, quiet=quiet, run=run_all_test): - """Simple t - est to edit a temp object. + """ + Simple test to edit a temp object. """ portal = self.getPortal() from Products.ERP5Type.Document import newTempOrganisation @@ -942,20 +943,19 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): obj = module.newContent(portal_type = portal_type) # Add a non-existent workflow. - pw = self.getWorkflowTool() - dummy_worlflow_id = 'never_existent_workflow' - addWorkflowByType(pw, 'erp5_workflow', dummy_worlflow_id) + portal_workflow = self.getWorkflowTool() + non_existent_worlflow_id = 'never_existent_workflow' + addWorkflowByType(portal_workflow, 'erp5_workflow', non_existent_worlflow_id) self.commit() - cbt = pw._chains_by_type - props = {} - for id, wf_ids in cbt.iteritems(): - if id == portal_type: - wf_ids = list(wf_ids) + [dummy_worlflow_id] - props['chain_%s' % id] = ','.join(wf_ids) - pw.manage_changeWorkflows('', props = props) - pw.manage_delObjects([dummy_worlflow_id]) + organisation_type = portal.portal_types.getTypeInfo(portal_type) + organisation_initial_workflow_list = organisation_type.getTypeWorkflowList() + organisation_type.setTypeWorkflowList( + organisation_initial_workflow_list + [non_existent_worlflow_id] + ) + + portal_workflow.manage_delObjects([non_existent_worlflow_id]) self.commit() @@ -964,15 +964,7 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): 'thisMethodShouldNotBePresent') finally: # Make sure that the artificial workflow is not referred to any longer. - cbt = pw._chains_by_type - props = {} - for id, wf_ids in cbt.iteritems(): - if id == portal_type: - # Remove the non-existent workflow. - wf_ids = [wf_id for wf_id in wf_ids \ - if wf_id != dummy_worlflow_id] - props['chain_%s' % id] = ','.join(wf_ids) - pw.manage_changeWorkflows('', props = props) + organisation_type.setTypeWorkflowList(organisation_initial_workflow_list) self.commit() @@ -999,13 +991,13 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): dummy_simulation_worlflow = pw[dummy_simulation_worlflow_id] dummy_validation_worlflow = pw[dummy_validation_worlflow_id] dummy_validation_worlflow.variables.setStateVar('validation_state') - cbt = pw._chains_by_type - props = {} - for id, wf_ids in cbt.iteritems(): - if id == portal_type: - old_wf_ids = wf_ids - props['chain_%s' % id] = ','.join([dummy_validation_worlflow_id, dummy_simulation_worlflow_id]) - pw.manage_changeWorkflows('', props=props) + + organisation_type = portal.portal_types.getTypeInfo(portal_type) + organisation_initial_workflow_list = organisation_type.getTypeWorkflowList() + organisation_type.setTypeWorkflowList( + [dummy_validation_worlflow_id, dummy_simulation_worlflow_id] + ) + permission_list = list(dummy_simulation_worlflow.permissions) manager_has_permission = {} for permission in permission_list: @@ -1047,14 +1039,7 @@ class TestBase(ERP5TypeTestCase, ZopeTestCase.Functional): self.assertTrue(user.has_permission(permission, obj)) finally: # Make sure that the artificial workflow is not referred to any longer. - cbt = pw._chains_by_type - props = {} - for id, wf_ids in cbt.iteritems(): - if id == portal_type: - # Remove the non-existent workflow. - wf_ids = old_wf_ids - props['chain_%s' % id] = ','.join(wf_ids) - pw.manage_changeWorkflows('', props=props) + organisation_type.setTypeWorkflowList(organisation_initial_workflow_list) pw.manage_delObjects([dummy_simulation_worlflow_id, dummy_validation_worlflow_id]) def test_getViewPermissionOwnerDefault(self): diff --git a/product/ERP5/tests/testBusinessTemplate.py b/product/ERP5/tests/testBusinessTemplate.py index aa22d7a6f2c91a01c4116d359017d591cbab4a5c..ab2718b35fb0c7e3736c56debaa83ecbee23dbdd 100644 --- a/product/ERP5/tests/testBusinessTemplate.py +++ b/product/ERP5/tests/testBusinessTemplate.py @@ -133,17 +133,14 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): pw = self.getWorkflowTool() - cbt = pw._chains_by_type props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - wf_ids = list(wf_ids) - if 'geek_workflow' in wf_ids: - wf_ids.remove('geek_workflow') - if id != "Geek Object": - props['chain_%s' % id] = ', '.join(wf_ids) - - pw.manage_changeWorkflows('', props=props) + + for type_object in self.getTypesTool().listTypeInfo(): + workflow_list = type_object.getTypeWorkflowList() + if 'geek_workflow' in workflow_list: + workflow_set = set(workflow_list) - {'geek_workflow'} + type_object.setTypeWorkflowList(workflow_set) + if 'erp5_geek' in self.getSkinsTool().objectIds(): self.getSkinsTool().manage_delObjects(['erp5_geek']) ps = self.getSkinsTool() @@ -1333,13 +1330,9 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): workflow = pw._getOb(wf_id, None) self.assertTrue(workflow is not None) sequence.edit(workflow_id=workflow.getId()) - cbt = pw._chains_by_type - props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - props['chain_%s' % id] = ','.join(wf_ids) - props['chain_Geek Object'] = wf_id - pw.manage_changeWorkflows('', props=props) + + type_object = self.getPortalObject().portal_types.getTypeInfo('Geek Object') + type_object.setTypeWorkflowList([wf_id]) def stepModifyWorkflowChain(self, sequence=None, **kw): """ @@ -1349,49 +1342,18 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): pw = self.getWorkflowTool() workflow = pw._getOb(wf_id, None) self.assertTrue(workflow is not None) - cbt = pw._chains_by_type - props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - props['chain_%s' % id] = ','.join(wf_ids) - props['chain_Base Category'] = 'edit_workflow,%s' % wf_id - pw.manage_changeWorkflows('', props=props) - - def stepSaveWorkflowChain(self, sequence=None, **kw): - """ - Save the workflow chain as it is - """ - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - props['chain_%s' % id] = ','.join(wf_ids) - pw.manage_changeWorkflows('', props=props) + type_object = self.getPortalObject().portal_types.getTypeInfo('Base Category') + type_object.setTypeWorkflowList(['edit_workflow', wf_id]) def stepCheckWorkflowChainRemoved(self, sequence=None, **kw): """ Check if the workflowChain has been removed """ - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - if cbt is not None: - for id, wf_ids in cbt.items(): - if id == "Geek Object": - self.assertEqual(len(wf_ids), 0) + type_object = self.getPortalObject().portal_types._getOb("Geek Object", None) + + if type_object is not None: + self.assertEqual(len(type_object.getTypeWorkflowList()), 0) - def stepCheckWorkflowChainExists(self, sequence=None, **kw): - """ - Check if the workflowChain has been added - """ - present = 0 - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - if cbt is not None: - for id, wf_ids in cbt.items(): - if id == "Geek Object": - present = 1 - self.assertEqual(present, 1) def stepAppendWorkflowToBusinessTemplate(self, sequence=None, **kw): bt = sequence.get('current_bt', None) @@ -1441,15 +1403,11 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): workflow = pw._getOb(wf_id, None) self.assertTrue(workflow is None) # remove workflowChain - cbt = pw._chains_by_type - props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - wf_ids = list(wf_ids) - if wf_id in wf_ids: - wf_ids.remove(wf_id) - props['chain_%s' % id] = ','.join(wf_ids) - pw.manage_changeWorkflows('', props=props) + for type_object in self.getTypesTool().listTypeInfo(): + workflow_list = type_object.getTypeWorkflowList() + if wf_id in workflow_list: + workflow_set = set(workflow_list) - {wf_id} + type_object.setTypeWorkflowList(workflow_set) def stepCheckWorkflowExists(self, sequence=None, **kw): """ @@ -2967,17 +2925,9 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): workflow = pw._getOb(wf_id, None) self.assertTrue(workflow is not None) sequence.edit(workflow_id=workflow.getId()) - cbt = pw._chains_by_type - props = {} - if cbt is not None: - for id, wf_ids in cbt.items(): - props['chain_%s' % id] = ','.join(wf_ids) - key = 'chain_Geek Object' - if props.has_key(key): - props[key] = '%s,%s' % (props[key], wf_id) - else: - props[key] = wf_id - pw.manage_changeWorkflows('', props=props) + + type_object = self.getPortalObject().portal_types.getTypeInfo('Geek Object') + type_object.setTypeWorkflowList(type_object.getTypeWorkflowList() + [wf_id]) def stepCreateCustomBusinessTemplate(self, sequence=None, **kw): """ @@ -2996,46 +2946,27 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): """ Check custom workflow chain """ - present = 0 - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - if cbt is not None: - for id, wf_ids in cbt.items(): - if id == "Geek Object": - present = 1 - self.assertEqual(present, 1) - self.assertSameSet(cbt['Geek Object'], + type_object = self.getPortalObject().portal_types._getOb('Geek Object', None) + self.assertNotEqual(type_object, None) + self.assertSameSet(type_object.getTypeWorkflowList(), ('geek_workflow', 'custom_geek_workflow')) def stepCheckOriginalWorkflowChain(self, sequence=None, **kw): """ Check original workflow chain """ - present = 0 - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - if cbt is not None: - for id, wf_ids in cbt.items(): - if id == "Geek Object": - present = 1 - self.assertEqual(present, 1) - self.assertSameSet(cbt['Geek Object'], + type_object = self.getPortalObject().portal_types._getOb('Geek Object', None) + self.assertNotEqual(type_object, None) + self.assertSameSet(type_object.getTypeWorkflowList(), ('geek_workflow', )) def stepCheckEmptyWorkflowChain(self, sequence=None, **kw): """ Check that workflow chain is empty """ - present = 0 - pw = self.getWorkflowTool() - cbt = pw._chains_by_type - if cbt is not None: - for id, wf_ids in cbt.items(): - if id == "Geek Object": - present = 1 - break - if present: - self.assertEqual(0, len(wf_ids)) + type_object = self.getPortalObject().portal_types._getOb('Geek Object', None) + if type_object is not None: + self.assertEqual(type_object.getTypeWorkflowList(), []) def stepCopyBusinessTemplate(self, sequence=None, **kw): """ @@ -3616,7 +3547,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckNoTrashBin \ CheckSkinsLayers \ CheckWorkflowExists \ - CheckWorkflowChainExists \ CreateSecondBusinessTemplate \ UseSecondBusinessTemplate \ CheckModifiedBuildingState \ @@ -3642,7 +3572,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckSkinsLayers \ CheckWorkflowExists \ CheckWorkflowChainRemoved \ - SaveWorkflowChain \ ' sequence_list.addSequenceString(sequence_string) sequence_list.play(self) @@ -3681,7 +3610,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckNoTrashBin \ CheckSkinsLayers \ CheckWorkflowExists \ - CheckWorkflowChainExists \ CreateSecondBusinessTemplate \ UseSecondBusinessTemplate \ CheckModifiedBuildingState \ @@ -3707,7 +3635,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckSkinsLayers \ CheckWorkflowRemoved \ CheckWorkflowChainRemoved \ - SaveWorkflowChain \ ' sequence_list.addSequenceString(sequence_string) sequence_list.play(self) @@ -3745,7 +3672,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckNoTrashBin \ CheckSkinsLayers \ CheckWorkflowExists \ - CheckWorkflowChainExists \ CreateSecondBusinessTemplate \ UseSecondBusinessTemplate \ AddWorkflowToBusinessTemplate \ @@ -4919,7 +4845,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckCategoriesExists \ CheckSubCategoriesExists \ CheckWorkflowExists \ - CheckWorkflowChainExists \ CheckFirstActionExists \ CheckSecondActionExists \ CheckCatalogMethodExists \ @@ -4945,7 +4870,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): CheckCategoriesExists \ CheckSubCategoriesExists \ CheckWorkflowExists \ - CheckWorkflowChainExists \ CheckFirstActionExists \ CheckSecondActionExists \ CheckCatalogMethodExists \ @@ -5676,7 +5600,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): UninstallBusinessTemplate \ Tic \ CheckOriginalWorkflowChain \ - CheckWorkflowChainExists \ ' sequence_list.addSequenceString(sequence_string) sequence_list.play(self) @@ -5745,7 +5668,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): InstallWithoutForceBusinessTemplate \ Tic \ CheckOriginalWorkflowChain \ - CheckWorkflowChainExists \ ' sequence_list.addSequenceString(sequence_string) sequence_list.play(self) @@ -5821,7 +5743,6 @@ class TestBusinessTemplate(BusinessTemplateMixin): InstallBusinessTemplate \ Tic \ CheckOriginalWorkflowChain \ - CheckWorkflowChainExists \ ' sequence_list.addSequenceString(sequence_string) sequence_list.play(self) @@ -6422,14 +6343,8 @@ class TestBusinessTemplate(BusinessTemplateMixin): title='Dummy Role Definition', role_name_list=('Assignee', )) - pw = self.getWorkflowTool() - cbt = pw._chains_by_type.copy() - props = {} - for id, wf_ids in cbt.items(): - props['chain_%s' % id] = ','.join(wf_ids) - props['chain_Dummy Type'] = 'edit_workflow' - pw.manage_changeWorkflows('', props=props) - self.assertEqual(('edit_workflow', ), pw.getChainFor('Dummy Type')) + dummy_type_initial_workflow_list = dummy_type.getTypeWorkflowList() + dummy_type.setTypeWorkflowList(['edit_workflow']) bt = self.portal.portal_templates.newContent( portal_type='Business Template', @@ -6467,8 +6382,8 @@ class TestBusinessTemplate(BusinessTemplateMixin): finally: shutil.rmtree(export_dir) - # uninstall the workflow chain - pw._chains_by_type = cbt + # undo changes on workflow list associated to Dummy Type portal type + dummy_type.setTypeWorkflowList(dummy_type_initial_workflow_list) # unregister type provider types_tool.type_provider_list = registered_type_provider_list # uninstall the type provider (this will also uninstall the contained types) @@ -6505,7 +6420,7 @@ class TestBusinessTemplate(BusinessTemplateMixin): self.assertEqual(['Dummy Role Definition'], [role.getTitle() for role in role_list]) - self.assertEqual(('edit_workflow',), pw.getChainFor('Dummy Type')) + self.assertEqual(['edit_workflow'], dummy_type.getTypeWorkflowList()) # and our type can be used instance = self.portal.newContent(portal_type='Dummy Type', diff --git a/product/ERP5/tests/testInteractionWorkflow.py b/product/ERP5/tests/testInteractionWorkflow.py index fcde4988c9b94888bc8f4df0cc6aca935e284e9d..2877a980ee6846be8b3807013c4699022a735789 100644 --- a/product/ERP5/tests/testInteractionWorkflow.py +++ b/product/ERP5/tests/testInteractionWorkflow.py @@ -92,8 +92,9 @@ class TestInteractionWorkflow(ERP5TypeTestCase): if getattr(wf.interactions, 'edit_interaction', None) is None: wf.interactions.addInteraction(id='edit_interaction') self.interaction = wf.interactions['edit_interaction'] - self.getWorkflowTool().setChainForPortalTypes( - [self.portal_type],'test_workflow, validation_workflow') + portal = self.getPortalObject() + type_object = portal.portal_types.getTypeInfo(self.portal_type) + type_object.setTypeWorkflowList(['test_workflow', 'validation_workflow']) _aq_reset() # XXX Fails XXX _setLastId not found when doing newContent def createInteractionWorkflowWithTwoInteractions(self): @@ -111,8 +112,9 @@ class TestInteractionWorkflow(ERP5TypeTestCase): self.scriptB = wf.scripts['afterEditB'] wf.interactions.addInteraction(id='editB') self.interactionB = wf.interactions['editB'] - self.getWorkflowTool().setChainForPortalTypes( - [self.portal_type],'test_workflow, validation_workflow') + portal = self.getPortalObject() + type_object = portal.portal_types.getTypeInfo(self.portal_type) + type_object.setTypeWorkflowList(['test_workflow', 'validation_workflow']) _aq_reset() # XXX Fails XXX _setLastId not found when doing newContent def test_no_interactions(self): @@ -680,8 +682,9 @@ context.setTitle('Bar') def test_portal_type_filter(self): self.createInteractionWorkflow() - self.getWorkflowTool().setChainForPortalTypes( - ['Bank Account'],'test_workflow, validation_workflow') + portal = self.getPortalObject() + type_object = portal.portal_types.getTypeInfo('Bank Account') + type_object.setTypeWorkflowList(['test_workflow', 'validation_workflow']) self.interaction.setProperties( 'default', # only for bank accounts @@ -705,8 +708,9 @@ context.setTitle('Bar') def test_portal_type_group_filter(self): self.createInteractionWorkflow() - self.getWorkflowTool().setChainForPortalTypes( - ['Bank Account'],'test_workflow, validation_workflow') + portal = self.getPortalObject() + type_object = portal.portal_types.getTypeInfo('Bank Account') + type_object.setTypeWorkflowList(['test_workflow', 'validation_workflow']) self.interaction.setProperties( 'default', # only for payment nodes portal type group (ie. bank account) diff --git a/product/ERP5/tests/testInventory.py b/product/ERP5/tests/testInventory.py index 4cb927598f080ac180033a8ad9884153e074f7d9..e338929a0342fafaad3fab94c5dcefcbfa476b61 100644 --- a/product/ERP5/tests/testInventory.py +++ b/product/ERP5/tests/testInventory.py @@ -2742,8 +2742,8 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase): Make sure that changing workflow state after delivered changes records in stock table. """ - delivered_state = self.portal.portal_workflow.inventory_workflow.states['delivered'] - delivered_state.transitions = delivered_state.transitions + ('cancel',) + delivered_state = self.portal.portal_workflow.inventory_workflow.getStateValueById('delivered') + delivered_state.addPossibleTransition('cancel') self.commit() diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5/tests/testPackingList.py index 0874d4761b00e0ea50106c3d65d27608bf54d865..de60e834862c0e699349151672e619202c7921e9 100644 --- a/product/ERP5/tests/testPackingList.py +++ b/product/ERP5/tests/testPackingList.py @@ -30,7 +30,6 @@ import unittest from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod -from Products.ERP5.Document.BusinessTemplate import getChainByType from zLOG import LOG from Products.ERP5Type.tests.Sequence import SequenceList from Products.ERP5.tests.testOrder import TestOrderMixin @@ -1946,10 +1945,8 @@ class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase): solver_process_type_info.getTypeAllowedContentTypeList() + [solver_id] ) - (default_chain, chain_dict) = getChainByType(self.portal) - chain_dict['chain_%s' % solver_id] = 'solver_workflow' - self.portal.portal_workflow.manage_changeWorkflows(default_chain, - props=chain_dict) + type_object = self.portal.portal_types.getTypeInfo(solver_id) + type_object.setTypeWorkflowList(['solver_workflow']) self.portal.portal_caches.clearAllCache() self.added_target_solver_list.append(solver_id) diff --git a/product/ERP5/tests/testSecurity.py b/product/ERP5/tests/testSecurity.py index 8d9e2f7b77349864a5de67ecae22c3c6bb2eb815..b9099003534c5ae1aba5f8951c23ec30ff0521b1 100644 --- a/product/ERP5/tests/testSecurity.py +++ b/product/ERP5/tests/testSecurity.py @@ -115,13 +115,13 @@ class TestSecurityMixin(ERP5TypeTestCase): """ error_list = [] for wf in self.portal.portal_workflow.objectValues(): - if wf.__class__.__name__ == 'InteractionWorkflowDefinition': + if wf.__class__.__name__ in ['InteractionWorkflowDefinition', 'Interaction Workflow']: continue - for transition in wf.transitions.objectValues(): + for transition in wf.getTransitionValueList(): if getattr(transition, 'trigger_type', 1) == 0: # Automatic transition without guard is safe continue - if getattr(transition, 'guard', None) is None: + if not transition.isGuarded(): error_list.append('%s/transitions/%s' % (wf.getId(), transition.getId())) if error_list: message = '\nThe following %s workflow transitions are not guarded.\n\t%s' \ diff --git a/product/ERP5/tests/testTranslation.py b/product/ERP5/tests/testTranslation.py index 5c4699c02b4d00bdb61d916d0b829f29c83825ad..d9b77e39a1f45180eef2e764a17df7aa33870b34 100644 --- a/product/ERP5/tests/testTranslation.py +++ b/product/ERP5/tests/testTranslation.py @@ -306,8 +306,9 @@ class TestWorkflowStateTitleTranslation(ERP5TypeTestCase): # Get one portal type and its related workflow portal_type_id = 'Bug' workflow_id = 'bug_workflow' - assert(workflow_id in \ - self.portal.portal_workflow.getChainFor(portal_type_id)) + workflow_value = self.portal.portal_workflow._getOb(workflow_id) + assert(workflow_value in \ + self.portal.portal_workflow.getWorkflowsFor(portal_type_id)) bug = self.portal.getDefaultModule(portal_type_id).newContent( portal_type=portal_type_id) state_title = bug.getSimulationStateTitle() diff --git a/product/ERP5/tests/testWorklist.py b/product/ERP5/tests/testWorklist.py deleted file mode 100644 index ea9896641df5f92a3922119ea16da873d6c4e561..0000000000000000000000000000000000000000 --- a/product/ERP5/tests/testWorklist.py +++ /dev/null @@ -1,523 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Nexedi SA and Contributors. -# All Rights Reserved. -# Romain Courteaud -# -# 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. -# -############################################################################## - -import unittest - -from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase -from Testing.ZopeTestCase.PortalTestCase import PortalTestCase - -class TestWorklist(ERP5TypeTestCase): - - run_all_test = 1 - quiet = 1 - login = PortalTestCase.login - - checked_portal_type = 'Organisation' - module_selection_name = 'organisation_module_selection' - checked_validation_state = 'draft' - not_checked_validation_state = 'not_draft' - checked_workflow = 'validation_workflow' - worklist_assignor_id = 'assignor_worklist' - actbox_assignor_name = 'assignor_todo' - worklist_owner_id = 'owner_worklist' - actbox_owner_name = 'owner_todo' - worklist_assignor_owner_id = 'assignor_owner_worklist' - actbox_assignor_owner_name = 'assignor_owner_todo' - worklist_desactivated_id = '%s_desactivated' % worklist_owner_id - actbox_desactivated_by_expression = '%s_desactivated' % actbox_owner_name - worklist_wrong_state_id = '%s_wrong_state' % worklist_owner_id - actbox_wrong_state = '%s_wrong_state' % actbox_owner_name - - worklist_int_variable_id = 'int_value_worklist' - actbox_int_variable_name = 'int_value_todo' - int_catalogued_variable_id = 'int_index' - int_value = 1 - - def getTitle(self): - return "Worklist" - - def clearModule(self, module): - module.manage_delObjects(list(module.objectIds())) - self.tic() - - def beforeTearDown(self): - self.clearModule(self.portal.person_module) - self.clearModule(self.portal.organisation_module) - self.clearModule(self.portal.portal_categories.region) - self.clearModule(self.portal.portal_categories.role) - - def getBusinessTemplateList(self): - """ - Return list of bt5 to install - """ - return ('erp5_base',) - - def getUserFolder(self): - """ - Return the user folder - """ - return getattr(self.getPortal(), 'acl_users', None) - - def createManagerAndLogin(self): - """ - Create a simple user in user_folder with manager rights. - This user will be used to initialize data in the method afterSetup - """ - self.getUserFolder()._doAddUser('manager', '', ['Manager'], []) - self.loginByUserName('manager') - - def createERP5Users(self, user_dict): - """ - Create all ERP5 users needed for the test. - ERP5 user = Person object + Assignment object in erp5 person_module. - """ - portal = self.getPortal() - module = portal.getDefaultModule("Person") - # Create the Person. - for user_login, user_data in user_dict.items(): - # Create the Person. - self.logMessage("Create user: %s" % user_login) - person = module.newContent( - portal_type='Person', - user_id=user_login, - password='hackme', - ) - # Create the Assignment. - assignment = person.newContent( - portal_type = 'Assignment', - group = "%s" % user_data[0], - function = "%s" % user_data[1], - start_date = '01/01/1900', - stop_date = '01/01/2900', - ) - assignment.open() - person.newContent(portal_type='ERP5 Login', reference=user_login).validate() - # Reindexing is required for the security to work - self.tic() - - def createUsers(self): - """ - Create all users needed for the test - """ - self.createERP5Users(self.getUserDict()) - - def getUserDict(self): - """ - Return dict of users needed for the test - """ - user_dict = { - 'foo': [None, None], - 'bar': [None, None], - } - return user_dict - - def createDocument(self, **kw): - module = self.getPortal().getDefaultModule(self.checked_portal_type) - result = module.newContent(portal_type=self.checked_portal_type, **kw) - result.setProperty(self.int_catalogued_variable_id, self.int_value) - assert result.getValidationState() == self.checked_validation_state - return result - - def getWorklistDocumentCountFromActionName(self, action_name): - self.assertEqual(action_name[-1], ')') - left_parenthesis_offset = action_name.rfind('(') - self.assertNotEquals(left_parenthesis_offset, -1) - return int(action_name[left_parenthesis_offset + 1:-1]) - - def associatePropertySheet(self): - self._addPropertySheet(self.checked_portal_type, 'SortIndex') - - def addWorkflowCataloguedVariable(self, workflow_id, variable_id): - variables = self.getWorkflowTool()[workflow_id].variables - variables.addVariable(variable_id) - assert variables[variable_id].for_catalog == 1 - - def createWorklist(self, workflow_id, worklist_id, actbox_name, - actbox_url=None, **kw): - worklists = self.getWorkflowTool()[workflow_id].worklists - worklists.addWorklist(worklist_id) - worklists._getOb(worklist_id).setProperties('', - actbox_name='%s (%%(count)s)' % actbox_name, actbox_url=actbox_url, - props={k if k.startswith('guard_') else 'var_match_' + k: v - for k, v in kw.iteritems()}) - - def removeWorklist(self, workflow_id, worklist_id_list): - worklists = self.getWorkflowTool()[workflow_id].worklists - worklists.deleteWorklists(worklist_id_list) - - def createWorklists(self): - for worklist_id, actbox_name, role, expr, state, int_variable in [ - (self.worklist_assignor_id, self.actbox_assignor_name, - 'Assignor', None, self.checked_validation_state, None), - (self.worklist_owner_id, self.actbox_owner_name, - 'Owner', None, self.checked_validation_state, None), - (self.worklist_desactivated_id, self.actbox_desactivated_by_expression, - 'Owner', 'python: 0', self.checked_validation_state, None), - (self.worklist_wrong_state_id, self.actbox_wrong_state, - 'Owner', None, self.not_checked_validation_state, None), - (self.worklist_assignor_owner_id, self.actbox_assignor_owner_name, - 'Assignor; Owner', None, self.checked_validation_state, None), - (self.worklist_int_variable_id, self.actbox_int_variable_name, - None, None, None, str(self.int_value)), - ]: - self.createWorklist(self.checked_workflow, worklist_id, actbox_name, - guard_roles=role, guard_expr=expr, - portal_type=self.checked_portal_type, - validation_state=state, - **{self.int_catalogued_variable_id: int_variable}) - - def removeWorklists(self): - self.removeWorklist(self.checked_workflow, [ - self.worklist_assignor_id, - self.worklist_owner_id, - self.worklist_desactivated_id, - self.worklist_wrong_state_id, - self.worklist_assignor_owner_id, - self.worklist_int_variable_id, - ]) - - def clearCache(self): - self.portal.portal_caches.clearAllCache() - - def checkWorklist(self, result, name, count, url_parameter_dict=None): - entry_list = [x for x in result if x['name'].startswith(name)] - self.assertEqual(len(entry_list), count and 1) - if count: - self.assertEqual(count, - self.getWorklistDocumentCountFromActionName(entry_list[0]['name'])) - if not entry_list: - return - url = entry_list[0].get('url') - if url_parameter_dict: - self.assertTrue(url, 'Can not check url parameters without url') - url = '%s%s' % (self.portal.getId(), url[len(self.portal.absolute_url()):]) - # Touch URL to save worklist parameters in listbox selection - self.publish(url, 'manager:') # XXX which user ? - selection_parameter_dict = self.portal.portal_selections.getSelectionParamsFor( - self.module_selection_name) - for parameter, value in url_parameter_dict.iteritems(): - self.assertTrue(parameter in selection_parameter_dict) - self.assertEqual(value, selection_parameter_dict[parameter]) - - def test_01_permission(self, quiet=0, run=run_all_test): - """ - Test the permission of the building module. - """ - if not run: - return - - workflow_tool = self.portal.portal_workflow - - self.logMessage("Create users") - self.createManagerAndLogin() - self.createUsers() - self.logMessage("Create worklists") - self.associatePropertySheet() - self.addWorkflowCataloguedVariable(self.checked_workflow, - self.int_catalogued_variable_id) - self.createWorklists() - try: - self.logMessage("Create document as Manager") - document = self.createDocument() - - self.tic() - self.clearCache() - - result = workflow_tool.listActions(object=document) - - # Users can not see worklist as they are not Assignor - for user_id in ('manager', ): - self.loginByUserName(user_id) - result = workflow_tool.listActions(object=document) - self.logMessage("Check %s worklist as Assignor" % user_id) - self.checkWorklist(result, self.actbox_assignor_name, 0) - self.logMessage("Check %s worklist as Owner" % user_id) - self.checkWorklist(result, self.actbox_owner_name, 1) - for user_id in ('foo', 'bar'): - self.logMessage("Check %s worklist" % user_id) - self.loginByUserName(user_id) - result = workflow_tool.listActions(object=document) - self.assertEqual(result, []) - - for role, user_id_list in (('Assignor', ('foo', 'manager')), - ('Assignee', ('foo', 'bar'))): - self.loginByUserName('manager') - for user_id in user_id_list: - self.logMessage("Give %s %s role" % (user_id, role)) - document.manage_addLocalRoles(user_id, [role]) - document.reindexObject() - self.tic() - self.clearCache() - - for user_id, assignor, owner, both in (('manager', 1, 1, 1), - ('bar' , 0, 0, 0), - ('foo' , 1, 0, 1)): - self.loginByUserName(user_id) - result = workflow_tool.listActions(object=document) - self.logMessage(" Check %s worklist as Assignor" % user_id) - self.checkWorklist(result, self.actbox_assignor_name, assignor) - self.logMessage(" Check %s worklist as Owner" % user_id) - self.checkWorklist(result, self.actbox_owner_name, owner) - self.logMessage(" Check %s worklist as Owner and Assignor" % user_id) - self.checkWorklist(result, self.actbox_assignor_owner_name, both) - - # Check if int variable are managed by the worklist - user_id = 'manager' - self.loginByUserName(user_id) - result = workflow_tool.listActions(object=document) - self.logMessage("Check %s worklist with int value as %s" % \ - (user_id, self.int_value)) - self.checkWorklist(result, self.actbox_int_variable_name, 1) - - # Change int value on document - new_value = self.int_value + 1 - document.setProperty(self.int_catalogued_variable_id, new_value) - self.tic() - self.clearCache() - - result = workflow_tool.listActions(object=document) - self.logMessage("Check %s worklist with int value as %s" % \ - (user_id, new_value)) - self.checkWorklist(result, self.actbox_int_variable_name, 0) - - # - # Check monovalued security role - # - self.loginByUserName('manager') - module = self.getPortal().getDefaultModule(self.checked_portal_type) - module.manage_setLocalRoles('bar', ['Author']) - - self.loginByUserName('bar') - - bar_document = self.createDocument() - bar_document.manage_permission('View', ['Owner', 'Assignee'], 0) - - bar_assignee_document = self.createDocument() - bar_assignee_document.manage_setLocalRoles('manager', ['Assignee']) - bar_assignee_document.manage_permission('View', ['Owner', 'Assignee'], 0) - - user_id = 'manager' - self.loginByUserName(user_id) - - module.manage_delLocalRoles('bar') - - def test(*count_list): - local_role_list = 'Assignee', 'Owner' - document.manage_setLocalRoles('manager', local_role_list) - - for i, count in enumerate(count_list): - document.manage_permission('View', local_role_list[:i], 0) - document.reindexObject() - self.tic() - self.clearCache() - - result = workflow_tool.listActions(object=document) - self.logMessage("Check %s worklist as Owner (%s)" % (user_id, count)) - self.checkWorklist(result, self.actbox_owner_name, count) - - test(0, 0, 1) - - # Define a local role key - sql_catalog = self.portal.portal_catalog.getSQLCatalog() - current_sql_catalog_local_role_keys = \ - sql_catalog.sql_catalog_local_role_keys - sql_catalog.sql_catalog_local_role_keys = ('Owner | owner', ) - self.commit() - self.portal.portal_caches.clearAllCache() - - try: - test(0, 1, 1) - finally: - sql_catalog.sql_catalog_local_role_keys = \ - current_sql_catalog_local_role_keys - self.commit() - finally: - self.removeWorklists() - - def test_02_related_key(self, quiet=0, run=run_all_test): - """ - Test related keys - """ - if not run: - return - - workflow_tool = self.getWorkflowTool() - self.createManagerAndLogin() - - self.logMessage("Create categories") - for base_category, category_list in ( - ('region', ('somewhere', 'elsewhere')), - ('role', ('client', 'supplier'))): - newContent = self.getCategoryTool()[base_category].newContent - for category in category_list: - newContent(portal_type='Category', id=category) - - self.logMessage("Create worklists using 'base_category_id' related key") - self.addWorkflowCataloguedVariable(self.checked_workflow, - 'base_category_id') - self.createWorklist(self.checked_workflow, 'region_worklist', 'has_region', - portal_type=self.checked_portal_type, - base_category_id='region') - self.createWorklist(self.checked_workflow, 'role_worklist', 'has_role', - portal_type=self.checked_portal_type, - base_category_id='role') - - try: - document = self.createDocument() - self.tic() - self.clearCache() - self.logMessage(" Check no document has region/role categories defined") - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'has_region', 0) - self.checkWorklist(result, 'has_role', 0) - - self.logMessage(" Creates documents with region/role categories defined") - self.createDocument(role='client') - self.createDocument(region='somewhere') - self.createDocument(region='elsewhere') - - self.tic() - self.clearCache() - self.logMessage( - " Check there are documents with region/role categories defined") - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'has_region', 2) - self.checkWorklist(result, 'has_role', 1) - finally: - self.removeWorklist(self.checked_workflow, - ['region_worklist', 'role_worklist']) - - def test_03_worklist_guard(self, quiet=0, run=run_all_test): - """ - Test worklist guard - """ - if not run: - return - - workflow_tool = self.getWorkflowTool() - self.createManagerAndLogin() - self.createUsers() - - self.logMessage("Create worklists with guard expression") - self.createWorklist(self.checked_workflow, 'guard_expression_worklist', - 'valid_guard_expression', - portal_type=self.checked_portal_type, - validation_state='validated', - guard_roles="Associate", - guard_expr='python: user.getId() == "bar"') - - try: - document = self.createDocument() - document.manage_addLocalRoles("bar", ["Associate"]) - document.manage_addLocalRoles("foo", ["Associate"]) - document.validate() - document.reindexObject() - self.tic() - self.clearCache() - - self.logMessage(" Check that manager can not access worklist") - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'valid_guard_expression', 0) - - self.logMessage(" Check that user bar can access worklist") - self.loginByUserName('bar') - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'valid_guard_expression', 1) - - self.logMessage(" Check that user foo can not access worklist") - self.loginByUserName('foo') - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'valid_guard_expression', 0) - finally: - self.removeWorklist(self.checked_workflow, - ['guard_expression_worklist']) - - def test_04_dynamic_variables(self): - """ - Test related keys and TALES Expression - """ - - workflow_tool = self.getWorkflowTool() - self.createManagerAndLogin() - - self.logMessage("Create categories") - for base_category, category_list in ( - ('region', ('somewhere', 'elsewhere')), - ('role', ('client', 'supplier'))): - newContent = self.getCategoryTool()[base_category].newContent - for category in category_list: - newContent(portal_type='Category', id=category) - - self.logMessage("Create worklists using 'region_uid' related key"\ - " and TALES Expression") - self.addWorkflowCataloguedVariable(self.checked_workflow, - 'region_uid') - self.createWorklist(self.checked_workflow, 'region_worklist', - 'has_semewhere_region', - portal_type=self.checked_portal_type, - actbox_url='organisation_module?'\ - 'region_uid:list=%(region_uid)s&'\ - 'portal_type:list=%(portal_type)s&reset:int=1', - region_uid='python:object.getPortalObject().'\ - 'portal_categories.getCategoryUid("somewhere",'\ - ' base_category="region")') - - try: - document = self.createDocument() - self.tic() - self.clearCache() - self.logMessage(" Check no document has region categories defined") - result = workflow_tool.listActions(object=document) - self.checkWorklist(result, 'has_semewhere_region', 0) - - self.logMessage(" Creates documents with region categories defined") - - self.createDocument(region='somewhere') - self.createDocument(region='somewhere') - self.createDocument(region='elsewhere') - - self.tic() - self.clearCache() - self.logMessage( - " Check there are documents with region categories defined") - result = workflow_tool.listActions(object=document) - url_parameter_dict = {'region_uid': [str(self.portal.portal_categories.\ - getCategoryUid("region/somewhere"))], - 'portal_type': [self.checked_portal_type]} - self.checkWorklist(result, 'has_semewhere_region', 2, - url_parameter_dict=url_parameter_dict) - - finally: - self.removeWorklist(self.checked_workflow, ['region_worklist']) - - -def test_suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestWorklist)) - return suite diff --git a/product/ERP5Catalog/tests/testERP5Catalog.py b/product/ERP5Catalog/tests/testERP5Catalog.py index cbeeb185f9d23c7eb73301e18f25f34625851e02..b8bbd0daf934cc0020f8ae3327fffa2599395dee 100644 --- a/product/ERP5Catalog/tests/testERP5Catalog.py +++ b/product/ERP5Catalog/tests/testERP5Catalog.py @@ -1248,15 +1248,14 @@ class TestERP5Catalog(ERP5TypeTestCase, LogInterceptor): self.commit() portal_activities = self.getActivityTool() for i in range(0,100): - message_list = portal_activities.getMessageList() + message_list = portal_activities.getMessageList(method_id=method_id_list, count=None) for message in message_list: #if message.method_id=='_setHotReindexingState': # import pdb;pdb.set_trace() - if message.method_id in method_id_list: - try: - portal_activities.manageInvoke(message.object_path,message.method_id) - except ActivityFlushError,m: - pass + try: + portal_activities.manageInvoke(message.object_path,message.method_id) + except ActivityFlushError,m: + pass self.commit() def test_48_ERP5Site_hotReindexAll(self): @@ -1375,11 +1374,13 @@ class TestERP5Catalog(ERP5TypeTestCase, LogInterceptor): 'immediateReindexObject', 'Folder_reindexObjectList', 'unindexObject', + 'SQLCatalog_deferFullTextIndexActivity', 'recursiveImmediateReindexObject')) # try to delete objects in double indexing state module.manage_delObjects(ids=[self.organisation2.getId()]) self.playActivityList(('immediateReindexObject', 'unindexObject', + 'SQLCatalog_deferFullTextIndexActivity', 'recursiveImmediateReindexObject', 'playBackRecordedObjectList', 'getId', diff --git a/product/ERP5Configurator/Document/BusinessConfiguration.py b/product/ERP5Configurator/Document/BusinessConfiguration.py index 2a535f5ad1bc4d30baefb9dbf01e5da61e16b75e..1bb436d186955bf3bde2d167234d3273aac4249e 100644 --- a/product/ERP5Configurator/Document/BusinessConfiguration.py +++ b/product/ERP5Configurator/Document/BusinessConfiguration.py @@ -241,16 +241,20 @@ class BusinessConfiguration(Item): """ Render previous form using workflow history. """ workflow_history = self.getCurrentStateValue().getWorkflowHistory(self, remove_undo=1) workflow_history.reverse() - for wh in workflow_history: + for history_line in workflow_history: ## go one step back current_state = self.getCurrentStateValue() current_state.undoTransition(self) - transition = self.unrestrictedTraverse(wh['transition']) - conf_save = self.unrestrictedTraverse(wh['configuration_save_url']) + if not history_line['transition']: + raise ValueError("Empty URL for transition in workflow history.") + transition = self.unrestrictedTraverse(history_line['transition']) + configuration_save = self.unrestrictedTraverse( + history_line['configuration_save_url'] + ) ## check if this transition can be shown to user ... if transition._checkPermission(self) and \ - transition.getTransitionFormId() is not None: - return self._displayNextForm(context=conf_save, transition=transition) + transition.getTransitionFormId() is not None: + return self._displayNextForm(context=configuration_save, transition=transition) security.declarePrivate('_validateNextForm') def _validateNextForm(self, **kw): diff --git a/product/ERP5Configurator/Document/WorkflowSecurityConfiguratorItem.py b/product/ERP5Configurator/Document/WorkflowSecurityConfiguratorItem.py index ca1959da68d4b46725871eb0f8c66ff24d84890c..987e37684b55865efc29f0a41735d1382333359d 100644 --- a/product/ERP5Configurator/Document/WorkflowSecurityConfiguratorItem.py +++ b/product/ERP5Configurator/Document/WorkflowSecurityConfiguratorItem.py @@ -88,7 +88,7 @@ class WorkflowSecurityConfiguratorItem(ConfiguratorItemMixin, XMLObject): state_list = table_dict['state'] for state_config in state_list: state_id = state_config.pop('state') - state = workflow.states[state_id] + state = workflow.getStateValueById(state_id) # Clean the state matrix for permission in permission_list: state.setPermission(permission, 0, []) @@ -116,7 +116,7 @@ class WorkflowSecurityConfiguratorItem(ConfiguratorItemMixin, XMLObject): transition_list = table_dict['transition'] for transition_conf in transition_list: transition_id = transition_conf.pop('transition') - transition = workflow.transitions[transition_id] + transition = workflow.getTransitionValueById(transition_id) guard = transition.getGuard() role_list = [x.capitalize() for x in transition_conf.keys()] role_string = ';'.join(role_list) diff --git a/product/ERP5Form/Extensions/Folder_viewSearchDialog.py b/product/ERP5Form/Extensions/Folder_viewSearchDialog.py index 206ff209e5090180ff1dc6e6bd133e54835d0a2a..fdbdbf739c4bff2993bef06087ada5c402d5ee2b 100644 --- a/product/ERP5Form/Extensions/Folder_viewSearchDialog.py +++ b/product/ERP5Form/Extensions/Folder_viewSearchDialog.py @@ -317,16 +317,17 @@ def getSearchDialog(self, REQUEST=None): workflow_set = set() # possible workflow states for type_name in allowed_content_types: - for workflow_id in workflow_tool.getChainFor(type_name): - workflow = workflow_tool.getWorkflowById(workflow_id) - state_var = workflow.variables.getStateVar() + for workflow in workflow_tool.getWorkflowsFor(type_name): + workflow_id = workflow.getReference() + state_var = workflow.getStateVariable() if state_var in workflow_set: continue workflow_set.add(state_var) - if workflow.states is None or \ - len(workflow.states.objectIds()) <= 1: + state_list = workflow.getStateValueList() + if state_list is None or \ + len(state_list) <= 1: continue field_id = 'your_%s' % state_var @@ -336,9 +337,8 @@ def getSearchDialog(self, REQUEST=None): field.manage_edit_xmlrpc(dict( form_id='Base_viewDialogFieldLibrary', field_id='your_category_list')) - items = sorted([(translateString(x.title), x.id) for x - in workflow.states.objectValues()], - key=lambda x:str(x[0])) + items = sorted([(translateString(state.title), state.getReference()) for state in state_list], + key=lambda state:str(state[0])) field._surcharged_edit( dict(title=translateString(workflow.title), items=items, diff --git a/product/ERP5Form/tests/testOOoChart.py b/product/ERP5Form/tests/testOOoChart.py index b84fc8fcf76a29ed06e328f8a0fdb5198fa3f477..d189a809f6407ddb6d1d4bcc6c1dba5ee35f6dce 100644 --- a/product/ERP5Form/tests/testOOoChart.py +++ b/product/ERP5Form/tests/testOOoChart.py @@ -101,8 +101,8 @@ class TestOOoChart(ERP5TypeTestCase, ZopeTestCase.Functional): preference = self.getPortal().portal_preferences.default_site_preference preference.setPriority(1) if preference.getPreferenceState() == 'disabled': - self.getWorkflowTool().doActionFor(ob=preference, - action='enable_action', + self.getWorkflowTool().doActionFor(preference, # object + 'enable_action', # action wf_id='preference_workflow') self.validator = Validator() diff --git a/product/ERP5OOo/tests/testDms.py b/product/ERP5OOo/tests/testDms.py index c7109d21b95772c682bf1e735f11fbcbcfe987ac..dcca5318ffd729a8724eb8dd445a7a9e14d91d1d 100644 --- a/product/ERP5OOo/tests/testDms.py +++ b/product/ERP5OOo/tests/testDms.py @@ -2499,7 +2499,11 @@ return 1 document.reject() document.share() logged_in_user = self.portal.portal_membership.getAuthenticatedMember().getId() - event_list = document.Base_getWorkflowEventInfoList() + # on the new document, during initialization, some workflow set the event's + # action to None, but they are not interesting in this test, just filter + # them + event_list = [event for event in document.Base_getWorkflowEventInfoList() + if event.action is not None] event_list.reverse() # all actions by logged in user for event in event_list: diff --git a/product/ERP5SyncML/Conduit/ERP5Conduit.py b/product/ERP5SyncML/Conduit/ERP5Conduit.py index 5ac9d7f0cc0caa14440a56b1e63096ebea2ba519..6cf02d441376cb44d1bb322429707b810111a7ec 100644 --- a/product/ERP5SyncML/Conduit/ERP5Conduit.py +++ b/product/ERP5SyncML/Conduit/ERP5Conduit.py @@ -902,7 +902,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): addable = WORKFLOW_ACTION_ADDABLE time = status.get('time') for action in action_list: - this_one = WORKFLOW_ACTION_ADDABLE + this_one = True if time <= action.get('time'): # action in the past are not appended addable = WORKFLOW_ACTION_INSERTABLE @@ -910,7 +910,7 @@ class ERP5Conduit(XMLSyncUtilsMixin): key_list.remove("time") for key in key_list: if status[key] != action[key]: - this_one = WORKFLOW_ACTION_NOT_ADDABLE + this_one = False break if this_one: addable = WORKFLOW_ACTION_NOT_ADDABLE diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py index a882e60b37bd174af165e6482131649a7c772260..836f1741e138a0ef3b722eb8cb02546ede99cd75 100644 --- a/product/ERP5Type/Base.py +++ b/product/ERP5Type/Base.py @@ -203,22 +203,27 @@ class WorkflowMethod(Method): for wf_id, transition_list in candidate_transition_item_list: candidate_workflow = wf[wf_id] valid_list = [] + state = candidate_workflow._getWorkflowStateOf(instance, id_only=0) for transition_id in transition_list: - if candidate_workflow.isWorkflowMethodSupported(instance, transition_id): + # cannot pass state parameter to an interaction workflow's + # isWorkflowMethodSupported method + is_supported_kw = {} if state is None else {'state': state} + + is_workflow_method_supported = candidate_workflow.isWorkflowMethodSupported(instance, transition_id, **is_supported_kw) + if is_workflow_method_supported: valid_list.append(transition_id) once_transition_key = once_transition_dict.get((wf_id, transition_id)) if once_transition_key: # a run-once transition, prevent it from running again in # the same transaction transactional_variable[once_transition_key] = 1 - elif candidate_workflow.__class__.__name__ == 'DCWorkflowDefinition': + elif candidate_workflow.__class__.__name__ in ['DCWorkflowDefinition', 'Workflow']: raise UnsupportedWorkflowMethod(instance, wf_id, transition_id) # XXX Keep the log for projects that needs to comment out # the previous line. LOG("WorkflowMethod.__call__", ERROR, "Transition %s/%s on %r is ignored. Current state is %r." - % (wf_id, transition_id, instance, - candidate_workflow._getWorkflowStateOf(instance, id_only=1))) + % (wf_id, transition_id, instance, state)) if valid_list: valid_transition_item_list.append((wf_id, valid_list)) @@ -484,23 +489,23 @@ def getClassPropertyList(klass): def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): """We should now make sure workflow methods are defined and also make sure simulation state is defined.""" + # aq_inner is required to prevent extra name lookups from happening # infinitely. For instance, if a workflow is missing, and the acquisition # wrapper contains an object with _aq_dynamic defined, the workflow id # is looked up with _aq_dynamic, thus causes infinite recursions. - portal_workflow = aq_inner(portal_workflow) portal_type = ptype_klass.__name__ - dc_workflow_dict = {} + workflow_dict = {} interaction_workflow_dict = {} for wf in portal_workflow.getWorkflowsFor(portal_type): - wf_id = wf.id + wf_id = wf.getId() wf_type = wf.__class__.__name__ - if wf_type == "DCWorkflowDefinition": + if wf_type in ['DCWorkflowDefinition', 'Workflow']: # Create state var accessor # and generate methods that support the translation of workflow states - state_var = wf.variables.getStateVar() + state_var = wf.getStateVariable() for method_id, getter in ( ('get%s' % UpperCase(state_var), WorkflowState.Getter), ('get%sTitle' % UpperCase(state_var), WorkflowState.TitleGetter), @@ -516,25 +521,25 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): ptype_klass.registerAccessor(method, Permissions.AccessContentsInformation) - storage = dc_workflow_dict - transitions = wf.transitions - elif wf_type == "InteractionWorkflowDefinition": + storage = workflow_dict + elif wf_type in ['InteractionWorkflowDefinition', 'Interaction Workflow']: storage = interaction_workflow_dict - transitions = wf.interactions else: continue # extract Trigger transitions from workflow definitions for later - transition_id_set = set(transitions.objectIds()) + transition_id_set = set(wf.getTransitionIdList()) + trigger_dict = {} for tr_id in transition_id_set: - tdef = transitions[tr_id] + tdef = wf.getTransitionValueById(tr_id) if tdef.trigger_type == TRIGGER_WORKFLOW_METHOD: trigger_dict[tr_id] = tdef storage[wf_id] = (transition_id_set, trigger_dict) - for wf_id, v in dc_workflow_dict.iteritems(): + # Generate Workflow method + for wf_id, v in workflow_dict.iteritems(): transition_id_set, trigger_dict = v for tr_id, tdef in trigger_dict.iteritems(): method_id = convertToMixedCase(tr_id) @@ -589,7 +594,7 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): portal_type_group in tdef.portal_type_group_filter): continue - for imethod_id in tdef.method_id: + for imethod_id in tdef.getTriggerMethodIdList(): if wildcard_interaction_method_id_match(imethod_id): # Interactions workflows can use regexp based wildcard methods # XXX What happens if exception ? @@ -599,7 +604,7 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): interaction_queue.append((wf_id, tr_id, transition_id_set, - tdef.once_per_transaction, + tdef.getTriggerOncePerTransaction(), method_id_matcher)) # XXX - class stuff is missing here @@ -618,7 +623,7 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): ptype_klass.security.declareProtected( Permissions.AccessContentsInformation, method_id) ptype_klass.registerWorkflowMethod(method_id, wf_id, tr_id, - tdef.once_per_transaction) + tdef.getTriggerOncePerTransaction()) continue # Wrap method @@ -641,7 +646,7 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): transition_id = method.getTransitionId() if transition_id in transition_id_set: method.registerTransitionAlways(portal_type, wf_id, transition_id) - if tdef.once_per_transaction: + if tdef.getTriggerOncePerTransaction(): method.registerTransitionOncePerTransaction(portal_type, wf_id, tr_id) else: method.registerTransitionAlways(portal_type, wf_id, tr_id) @@ -1323,8 +1328,8 @@ class Base( CopyContainer, ERP5PropertyManager._setPropValue(self, key, value) #except ConflictError: # raise - # This should not be there, because this ignore all checks made by - # the PropertyManager. If there is problems, please complain to + # This should not be there, because this ignores all checks made by + # the PropertyManager. If there are problems, please complain to # seb@nexedi.com #except: # # This should be removed if we want strict property checking @@ -2751,7 +2756,7 @@ class Base( CopyContainer, """Test if the context is in 'deleted' state""" for wf in self.getPortalObject().portal_workflow.getWorkflowsFor(self): state = wf._getWorkflowStateOf(self) - if state is not None and state.getId() == 'deleted': + if state is not None and state.getReference() == 'deleted': return True return False @@ -2791,8 +2796,8 @@ class Base( CopyContainer, Returns a list of tuples {id:workflow_id, state:workflow_state} """ result = [] - for wf in self.portal_workflow.getWorkflowsFor(self): - result += [(wf.id, wf._getWorkflowStateOf(self, id_only=1))] + for wf in self.portal_workflow.getWorkflowsFor(self.getPortalType()): + result += [(wf.getId(), wf._getWorkflowStateOf(self, id_only=1))] return result security.declarePublic('getWorkflowInfo') @@ -3437,12 +3442,14 @@ class Base( CopyContainer, # Use meta transition to jump from one state to another # without existing transitions. from Products.ERP5.InteractionWorkflow import InteractionWorkflowDefinition + from Products.ERP5Workflow.Document.InteractionWorkflow import InteractionWorkflow portal = self.getPortalObject() workflow_tool = portal.portal_workflow worflow_variable_list = [] for workflow in workflow_tool.getWorkflowsFor(self): - if not isinstance(workflow, InteractionWorkflowDefinition): - worflow_variable_list.append(self.getProperty(workflow.state_var)) + if not isinstance(workflow, InteractionWorkflowDefinition) and \ + not isinstance(workflow, InteractionWorkflow): + worflow_variable_list.append(self.getProperty(workflow.getStateVariable())) # then restart ingestion with new portal_type # XXX Contribution Tool accept only document which are containing diff --git a/product/ERP5Type/CopySupport.py b/product/ERP5Type/CopySupport.py index 7d0101fc3b4301d1f837e397d2e93fce2695a112..7780a0099ac214f56c6b1e93582da13e30212692 100644 --- a/product/ERP5Type/CopySupport.py +++ b/product/ERP5Type/CopySupport.py @@ -283,7 +283,7 @@ class CopyContainer: # Add info about copy to edit workflow REQUEST = get_request() pw = portal.portal_workflow - if 'edit_workflow' in pw.getChainFor(self)\ + if portal.portal_workflow._getOb('edit_workflow') in pw.getWorkflowsFor(self)\ and (REQUEST is None or not REQUEST.get('is_business_template_installation', 0)): if REQUEST is not None and REQUEST.get('__cp', None): diff --git a/product/ERP5Type/Core/Folder.py b/product/ERP5Type/Core/Folder.py index 3dd350c8f5ff1e745b595e962cf8d8a0aae8b304..4459000df7132e1ca122107e8dab43ea628efc4a 100644 --- a/product/ERP5Type/Core/Folder.py +++ b/product/ERP5Type/Core/Folder.py @@ -1537,8 +1537,7 @@ class Folder(CopyContainer, CMFBTreeFolder, CMFHBTreeFolder, Base, FolderMixIn): if portal_type is not None: if isinstance(portal_type, str): portal_type = (portal_type,) - object_list = filter(lambda x: x.getPortalType() in portal_type, - object_list) + object_list = [o for o in object_list if o.getPortalType() in portal_type] if checked_permission is not None: checkPermission = getSecurityManager().checkPermission object_list = [o for o in object_list diff --git a/product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.py b/product/ERP5Type/Core/ScriptConstraint.py similarity index 95% rename from product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.py rename to product/ERP5Type/Core/ScriptConstraint.py index 0234e101e2bbc562a5f981fd545d94d14024b439..a4c16f2645852afeda93de8b7c3b9d7be3d8310e 100644 --- a/product/ERP5/bootstrap/erp5_core/DocumentTemplateItem/portal_components/document.erp5.ScriptConstraint.py +++ b/product/ERP5Type/Core/ScriptConstraint.py @@ -37,7 +37,7 @@ class ScriptConstraint(ConstraintMixin): portal_type = 'Script Constraint' def _createConsistencyMessage(self, object_relative_url, message, mapping): - # XXX If I put in the right place I have TypeError: 'NoneType' object is not callable + #XXX If I put in the right place I have TypeError: 'NoneType' object is not callable from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage return ConsistencyMessage(self, object_relative_url=object_relative_url, @@ -64,4 +64,4 @@ class ScriptConstraint(ConstraintMixin): message = item mapping = {} message_list.append(createConsistencyMessage(object_relative_url, message, mapping)) - return message_list \ No newline at end of file + return message_list diff --git a/product/ERP5Type/ERP5Type.py b/product/ERP5Type/ERP5Type.py index 0eb3e217eaaa8d4e20b6eee1252e18ce7277492e..89c6cb44182508f39e5b28a74631e9764f1c9ae6 100644 --- a/product/ERP5Type/ERP5Type.py +++ b/product/ERP5Type/ERP5Type.py @@ -4,7 +4,7 @@ # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. # Copyright (c) 2002-2004 Nexedi SARL and Contributors. All Rights Reserved. # Jean-Paul Smets-Solanes -# +# 2014 Wenjie.Zheng # 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 @@ -45,6 +45,8 @@ from TranslationProviderBase import TranslationProviderBase from Products.ERP5Type.Accessor.Translation import TRANSLATION_DOMAIN_CONTENT_TRANSLATION from sys import exc_info +from TranslationProviderBase import TranslationProviderBase +from types import NoneType from zLOG import LOG, ERROR from Products.CMFCore.exceptions import zExceptions_Unauthorized @@ -227,6 +229,7 @@ class ERP5TypeInformation(XMLObject, acquire_local_roles = False property_sheet_list = () base_category_list = () + workflow_list = () init_script = '' product = 'ERP5Type' hidden_content_type_list = () @@ -407,7 +410,7 @@ class ERP5TypeInformation(XMLObject, if notify_workflow: # notify workflow after generating local roles, in order to prevent # Unauthorized error on transition's condition - workflow_tool = getToolByName(portal, 'portal_workflow', None) + workflow_tool = portal.portal_workflow if workflow_tool is not None: for workflow in workflow_tool.getWorkflowsFor(ob): workflow.notifyCreated(ob) @@ -428,7 +431,7 @@ class ERP5TypeInformation(XMLObject, import erp5.portal_type as module return getattr(module, self.getId()) - # The following 2 methods are needed before there are generated. + # The following methods are needed before there are generated. security.declareProtected(Permissions.AccessContentsInformation, 'getTypePropertySheetList') @@ -442,6 +445,25 @@ class ERP5TypeInformation(XMLObject, """Getter for 'type_base_category' property""" return list(self.base_category_list) + security.declareProtected(Permissions.AccessContentsInformation, + 'getTypeWorkflowList') + def getTypeWorkflowList(self): + """Getter for 'type_workflow' property""" + return list(self.workflow_list) + + security.declareProtected(Permissions.ModifyPortalContent, + 'setTypeWorkflowList') + def setTypeWorkflowList(self, type_workflow_list): + """Setter for 'type_workflow' property""" + # We use 'sorted' below to keep an order in the workflow list. Without + # this line, the actions can have different order depending on the order + # set during the installation or later. This is bad! + # It might not be the ideal solution, if you need to have the workflow + # defined in a specific order. Then, your new implementation should use + # indexes on workflows as in portal types action's priority. + # Note: 'sorted' also convert a tuple or a set to a list + self.workflow_list = sorted(type_workflow_list) + def getTypePropertySheetValueList(self): type_property_sheet_list = self.getTypePropertySheetList() if not type_property_sheet_list: @@ -606,6 +628,7 @@ class ERP5TypeInformation(XMLObject, self.getTypeInitScriptId()] search_source_list += self.getTypePropertySheetList() search_source_list += self.getTypeBaseCategoryList() + search_source_list += self.getTypeWorkflowList() return ' '.join(filter(None, search_source_list)) security.declareProtected(Permissions.AccessContentsInformation, diff --git a/product/ERP5Type/Tool/PropertySheetTool.py b/product/ERP5Type/Tool/PropertySheetTool.py index bcfc8d4d02dd35ff536b3a104eaed0834520b735..3ec61452c81ccb556352e9b16933db8fb55a71b3 100644 --- a/product/ERP5Type/Tool/PropertySheetTool.py +++ b/product/ERP5Type/Tool/PropertySheetTool.py @@ -69,6 +69,12 @@ class PropertySheetTool(BaseTool): 'SimpleItem', 'Version', 'Comment', + # for workflow: + 'Workflow', + 'Variable', + 'WorkflowVariable', + 'Transition', + 'State', # the following ones are required to upgrade an existing site 'Reference', 'BaseCategory', diff --git a/product/ERP5Type/Tool/TypesTool.py b/product/ERP5Type/Tool/TypesTool.py index 37ae34ba71df01b7db0dab2cb1e5325604a7d844..fbb522ba09c03e9b74f7af96f2523d8b9bd160ee 100644 --- a/product/ERP5Type/Tool/TypesTool.py +++ b/product/ERP5Type/Tool/TypesTool.py @@ -111,8 +111,11 @@ class TypesTool(TypeProvider): except AttributeError: pass try: - script = self.getPortalObject().portal_workflow \ - .dynamic_class_generation_interaction_workflow.scripts \ + workflow_tool = self.getPortalObject().portal_workflow + workflow = workflow_tool.dynamic_class_generation_interaction_workflow + script_dict = {script.getReference(): script + for script in workflow.getScriptValueList()} + script = script_dict\ .DynamicClassGeneration_resetDynamicDocuments new = '.resetDynamicDocumentsOnceAtTransactionBoundary(' if new not in script._body: @@ -128,6 +131,8 @@ class TypesTool(TypeProvider): 'Business Template', 'Standard Property', 'Acquired Property', + # workflow + 'Workflow', # the following ones are required to upgrade an existing site 'Category Property', )) diff --git a/product/ERP5Type/XMLExportImport.py b/product/ERP5Type/XMLExportImport.py index eb12e8708eada52d2f2851b391443c525adb6537..40ac58d8065647843c4687338c1ed5be8ff4620a 100644 --- a/product/ERP5Type/XMLExportImport.py +++ b/product/ERP5Type/XMLExportImport.py @@ -125,7 +125,10 @@ def Base_asXML(object, root=None): for word in value] sub_object.append(marshaller(value)) elif prop_type in ('text', 'string',): - sub_object.text = unicode(escape(value), 'utf-8') + if type(value) in (tuple, list, dict): + sub_object.text = str(value) + else: + sub_object.text = unicode(escape(value), 'utf-8') elif prop_type != 'None': sub_object.text = str(value) diff --git a/product/ERP5Type/ZopePatch.py b/product/ERP5Type/ZopePatch.py index a5bdcb60e040297dc841741be3a9cc16f7ef4c0e..ba85b54547eccfc37dd3b2a1ccb607b76a790d20 100644 --- a/product/ERP5Type/ZopePatch.py +++ b/product/ERP5Type/ZopePatch.py @@ -27,13 +27,13 @@ from Products.ERP5Type.patches import ObjectManager from Products.ERP5Type.patches import PropertyManager from Products.ERP5Type.patches import TM from Products.ERP5Type.patches import DA +from Products.ERP5Type.patches import Expression from Products.ERP5Type.patches import DCWorkflow from Products.ERP5Type.patches import Worklists from Products.ERP5Type.patches import BTreeFolder2 from Products.ERP5Type.patches import WorkflowTool from Products.ERP5Type.patches import XMLExportImport from Products.ERP5Type.patches import ppml -from Products.ERP5Type.patches import Expression from Products.ERP5Type.patches import sqltest from Products.ERP5Type.patches import sqlvar from Products.ERP5Type.patches import CMFCatalogAware diff --git a/product/ERP5Type/dynamic/portal_type_class.py b/product/ERP5Type/dynamic/portal_type_class.py index 66c49e197cc8ac066f305529159ecc23f0c7e732..679d6ae8f1b5409ba55ed867f7d0ac0f9c295143 100644 --- a/product/ERP5Type/dynamic/portal_type_class.py +++ b/product/ERP5Type/dynamic/portal_type_class.py @@ -327,7 +327,10 @@ def synchronizeDynamicModules(context, force=False): from Products.ERP5Type.Tool.PropertySheetTool import PropertySheetTool from Products.ERP5Type.Tool.TypesTool import TypesTool from Products.ERP5Type.Tool.ComponentTool import ComponentTool + from Products.ERP5Workflow.Tool.WorkflowTool import WorkflowTool + try: + # migration of tools leading to call of migrateToPortalTypeClass for tool_class in TypesTool, PropertySheetTool, ComponentTool: # if the instance has no property sheet tool, or incomplete # property sheets, we need to import some data to bootstrap @@ -363,6 +366,14 @@ def synchronizeDynamicModules(context, force=False): ' business templates') else: _bootstrapped.add(portal.id) + + # migration of other tools + for tool_class in (WorkflowTool,): + tool = getattr(portal, tool_class.id, None) + if tool is not None and tool._isBootstrapRequired(): + tool._bootstrap() + tool.__class__ = getattr(erp5.portal_type, tool.portal_type) + except: # Required because the exception may be silently dropped by the caller. transaction.doom() diff --git a/product/ERP5Type/id_as_reference.py b/product/ERP5Type/id_as_reference.py index fa9e89627e0eb2d620a41bbaf39b9f91a13e6ead..e92c21d35a30076563506cd0fee352c39c8e8468 100644 --- a/product/ERP5Type/id_as_reference.py +++ b/product/ERP5Type/id_as_reference.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## # Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved. -# Julien Muchembled +# Julien Muchembled +# 2015 wenjie Zheng # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsibility of assessing all potential @@ -33,8 +34,9 @@ from Products.CMFActivity.Errors import ActivityPendingError from zLOG import LOG, WARNING from Acquisition import aq_base -def IdAsReferenceMixin(suffix): - suffix_index = - len(suffix) +def IdAsReferenceMixin(extra_string, string_type="suffix"): + + extra_string_index = len(extra_string) class IdAsReferenceMixin(object): # Declarative security @@ -43,27 +45,46 @@ def IdAsReferenceMixin(suffix): def cb_isMoveable(self): return self.cb_userHasCopyOrMovePermission() - security.declareProtected(Permissions.AccessContentsInformation, 'getIdAsReferenceSuffix') @staticmethod def getIdAsReferenceSuffix(): - return suffix + return extra_string security.declareProtected(Permissions.AccessContentsInformation, 'getReference') def getReference(self, *args): id = self.id - if id[suffix_index:] == suffix: - return id[:suffix_index] - try: - return self._baseGetReference(*args) - except AttributeError: - return getattr(aq_base(self), 'default_reference', (args or [None])[0]) + if string_type == "suffix": + if id[-extra_string_index:] == extra_string: + return id[:-extra_string_index] + try: + return self._baseGetReference(*args) + except AttributeError: + return getattr(aq_base(self), 'default_reference', (args or [None])[0]) + elif string_type == "prefix": + if id[:extra_string_index] == extra_string: + return id[extra_string_index:] + try: + return self._baseGetReference(*args) + except AttributeError: + return getattr(aq_base(self), 'default_reference', (args or [None])[0]) def _setReference(self, value): - self.__dict__.pop('default_reference', None) # BBB - self.setId(value + suffix) + parent = self.getParentValue() + self.__dict__.pop('default_reference', None) + if value is None: + raise ValueError('Reference is not set.') + if string_type == "prefix": + new_id = extra_string + value + elif string_type == "suffix": + new_id = value + extra_string + if parent.has_key(new_id): + LOG("IdAsReferenceMixin", WARNING, "Skipping adding of %r in %r" + " property sheet, due to ID conflict" % (new_id, parent.getId())) + else: + self.setId(new_id) + self.default_reference = value security.declareProtected(Permissions.ModifyPortalContent, 'setReference') setReference = _setReference diff --git a/product/ERP5Type/patches/ActionsTool.py b/product/ERP5Type/patches/ActionsTool.py index d8ac5f446d1956c9ea58978dffae663c5660b260..e009b060a6925a000ea772d9b2c6d52ccf8b9537 100644 --- a/product/ERP5Type/patches/ActionsTool.py +++ b/product/ERP5Type/patches/ActionsTool.py @@ -58,9 +58,11 @@ def listFilteredActionsFor(self, object=None): invokes the migration of their actions to portal_actions """ actions = [] - + listActionProviderlist = list(self.listActionProviders()) + if 'portal_workflow' not in listActionProviderlist: + listActionProviderlist.append('portal_workflow') + for provider_name in listActionProviderlist: # Include actions from specific tools. - for provider_name in self.listActionProviders(): provider = getattr(self, provider_name) if hasattr(provider, 'getActionListFor'): from Products.ERP5Type.Utils import createExpressionContext diff --git a/product/ERP5Type/patches/DCWorkflow.py b/product/ERP5Type/patches/DCWorkflow.py index 45cc0209c2cd77d8a4acb00e20f1908c48a686f3..54db69dcd75be260880e1242f1e45c6ee4bc688b 100644 --- a/product/ERP5Type/patches/DCWorkflow.py +++ b/product/ERP5Type/patches/DCWorkflow.py @@ -2,7 +2,7 @@ ############################################################################## # # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. -# Copyright (c) 2002,2005 Nexedi SARL and Contributors. All Rights Reserved. +# Copyright (c) 2002,2005,2015 Nexedi SARL and Contributors. All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. @@ -40,9 +40,19 @@ from copy import deepcopy # Patch WorkflowUIMixin to add description on workflows from Products.DCWorkflow.WorkflowUIMixin import WorkflowUIMixin as WorkflowUIMixin_class from Products.DCWorkflow.Guard import Guard, _checkPermission +from Products.DCWorkflow.States import StateDefinition +from Products.DCWorkflow.Variables import VariableDefinition +from Products.DCWorkflow.Worklists import WorklistDefinition +from types import StringTypes +from zLOG import LOG, INFO, WARNING +# Libraries related to showAsXML +from lxml import etree +from lxml.etree import Element, SubElement ACTIVITY_GROUPING_COUNT = 100 +_marker = '' + def WorkflowUIMixin_setProperties( self, title , description='' # the only addition to WorkflowUIMixin.setProperties , manager_bypass=0, props=None, REQUEST=None): @@ -63,7 +73,6 @@ def WorkflowUIMixin_setProperties( self, title WorkflowUIMixin_class.setProperties = WorkflowUIMixin_setProperties WorkflowUIMixin_class.manage_properties = DTMLFile('workflow_properties', _dtmldir) - def Guard_checkWithoutRoles(self, sm, wf_def, ob, **kw): """Checks conditions in this guard. This function is the same as Guard.check, but roles are not taken @@ -268,13 +277,8 @@ def DCWorkflowDefinition_getWorklistVariableMatchDict(self, info, portal = self.getPortalObject() def getPortalTypeListForWorkflow(workflow_id): workflow_tool = portal.portal_workflow - result = [] - append = result.append - for type_info in workflow_tool._listTypeInfo(): - portal_type = type_info.id - if workflow_id in workflow_tool.getChainFor(portal_type): - append(portal_type) - return result + return [type_info.id for type_info in workflow_tool._listTypeInfo() + if workflow_id in type_info.getTypeWorkflowList()] _getPortalTypeListForWorkflow = CachingMethod(getPortalTypeListForWorkflow, id='_getPortalTypeListForWorkflow', cache_factory = 'erp5_ui_long') @@ -341,6 +345,25 @@ def DCWorkflowDefinition_getWorklistVariableMatchDict(self, info, DCWorkflowDefinition.security.declarePrivate('getWorklistVariableMatchDict') DCWorkflowDefinition.getWorklistVariableMatchDict = DCWorkflowDefinition_getWorklistVariableMatchDict +def DCWorkflowDefinition_isWorkflowMethodSupported(self, ob, method_id, state=None): + ''' + Returns a true value if the given workflow method + is supported in the current state. + ''' + if state is None: + state = self._getWorkflowStateOf(ob) + if state is None: + return False + if method_id in state.transitions: + tdef = self.transitions.get(method_id, None) + if (tdef is not None and + tdef.trigger_type == TRIGGER_WORKFLOW_METHOD and + self._checkTransitionGuard(tdef, ob)): + return True + return False +DCWorkflowDefinition.security.declarePrivate('isWorkflowMethodSupported') +DCWorkflowDefinition.isWorkflowMethodSupported = DCWorkflowDefinition_isWorkflowMethodSupported + TransitionDefinition__init__orig = TransitionDefinition.__init__ def TransitionDefinition__init__(self, *args, **kw): TransitionDefinition__init__orig(self, *args, **kw) @@ -604,6 +627,20 @@ def DCWorkflowDefinition_wrapWorkflowMethod(self, ob, method_id, func, args, kw) DCWorkflowDefinition.wrapWorkflowMethod = DCWorkflowDefinition_wrapWorkflowMethod +def StateDefinition_getStatePermissionRolesDict(self): + return self.permission_roles + +def StateDefinition_getAcquirePermissionList(self): + return _marker + +def DCWorkflowDefinition_getWorkflowManagedPermissionList(self): + permission_list = self.permissions + if permission_list: + permission_list = permission_list if isinstance(permission_list, list) else list(permission_list) + else: + permission_list = [] + return permission_list +DCWorkflowDefinition.getWorkflowManagedPermissionList = DCWorkflowDefinition_getWorkflowManagedPermissionList # Patch updateRoleMappingsFor so that if 2 workflows define security, then we # should do an AND operation between each permission @@ -617,11 +654,11 @@ def updateRoleMappingsFor(self, ob): tool = aq_parent(aq_inner(self)) other_workflow_list = \ - [x for x in tool.getWorkflowsFor(ob) if x.id != self.id and isinstance(x,DCWorkflowDefinition)] + [x for x in tool.getWorkflowsFor(ob) if x.id != self.id and x.getPortalType() in ('DCWorkflowDefinition', 'Workflow')] other_data_list = [] for other_workflow in other_workflow_list: other_sdef = other_workflow._getWorkflowStateOf(ob) - if other_sdef is not None and other_sdef.permission_roles is not None: + if other_sdef is not None and other_sdef.getStatePermissionRolesDict() is not None: other_data_list.append((other_workflow,other_sdef)) # Be carefull, permissions_roles should not change # from list to tuple or vice-versa. (in modifyRolesForPermission, @@ -640,12 +677,14 @@ def updateRoleMappingsFor(self, ob): # We will check that each role is activated # in each DCWorkflow for other_workflow,other_sdef in other_data_list: - if p in other_workflow.permissions: - other_roles = other_sdef.permission_roles.get(p, []) - if type(other_roles) is type(()) : - other_role_type_list.append('tuple') - else: - other_role_type_list.append('list') + if p in other_workflow.getWorkflowManagedPermissionList(): + other_roles = other_sdef.getStatePermissionRolesDict().get(p, []) + acquire_permission_list = other_sdef.getAcquirePermissionList() + if acquire_permission_list is _marker: # DC Workflow + other_role_type = 'tuple' if type(other_roles) is type(()) else 'list' + else: # ERP5 Workflow + other_role_type = 'list' if p in acquire_permission_list else 'tuple' + other_role_type_list.append(other_role_type) for role in roles: if role not in other_roles : refused_roles.append(role) @@ -668,22 +707,17 @@ def updateRoleMappings(self, REQUEST=None): Changes permissions of all objects related to this workflow """ wf_tool = aq_parent(aq_inner(self)) - chain_by_type = wf_tool._chains_by_type type_info_list = wf_tool._listTypeInfo() wf_id = self.id portal_type_list = [] # get the list of portal types to update if wf_id in wf_tool._default_chain: - include_default = 1 + include_default = True else: - include_default = 0 + include_default = False for type_info in type_info_list: - tid = type_info.getId() - if chain_by_type.has_key(tid): - if wf_id in chain_by_type[tid]: - portal_type_list.append(tid) - elif include_default == 1: - portal_type_list.append(tid) + if wf_id in type_info.getTypeWorkflowList() or include_default: + portal_type_list.append(type_info.getId()) if portal_type_list: object_list = self.portal_catalog(portal_type=portal_type_list, limit=None) object_list_len = len(object_list) @@ -748,6 +782,417 @@ DCWorkflowDefinition.getFutureStateSet = DCWorkflowDefinition_getFutureStateSet InitializeClass(DCWorkflowDefinition) +def DCWorkflowDefinition_notifyWorkflowMethod(self, ob, transition_list, args=None, kw=None): + ''' + Allows the system to request a workflow action. This method + must perform its own security checks. + ''' + if type(transition_list) in StringTypes: + method_id = transition_list + elif len(transition_list) == 1: + method_id = transition_list[0] + else: + raise ValueError('WorkflowMethod should be attached to exactly 1 transition per DCWorkflow instance.') + sdef = self._getWorkflowStateOf(ob) + if sdef is None: + raise WorkflowException, 'Object is in an undefined state' + if method_id not in sdef.transitions: + raise Unauthorized(method_id) + tdef = self.transitions.get(method_id, None) + if tdef is None or tdef.trigger_type != TRIGGER_WORKFLOW_METHOD: + raise WorkflowException, ( + 'Transition %s is not triggered by a workflow method' + % method_id) + if not self._checkTransitionGuard(tdef, ob): + raise Unauthorized(method_id) + self._changeStateOf(ob, tdef, kw) + if getattr(ob, 'reindexObject', None) is not None: + if kw is not None: + activate_kw = kw.get('activate_kw', {}) + else: + activate_kw = {} + ob.reindexObject(activate_kw=activate_kw) + +def DCWorkflowDefinition_notifyBefore(self, ob, transition_list, args=None, kw=None): + ''' + Notifies this workflow of an action before it happens, + allowing veto by exception. Unless an exception is thrown, either + a notifySuccess() or notifyException() can be expected later on. + The action usually corresponds to a method name. + ''' + pass + +def DCWorkflowDefinition_notifySuccess(self, ob, transition_list, result, args=None, kw=None): + ''' + Notifies this workflow that an action has taken place. + ''' + pass + +# following patches are required for the new workflow tool compatibility. +def DCWorkflowDefinition_getVariableValueDict(self): + if self.variables is not None: + return self.variables + return {} +def DCWorkflowDefinition_getVariableValueById(self, variable_id): + if self.variables is not None: + return self.variables.get(variable_id, None) + return None +def DCWorkflowDefinition_getVariableIdList(self): + if self.variables is not None: + return self.variables.objectIds() + return [] +def DCWorkflowDefinition_getStateVariable(self): + return self.state_var +def DCWorkflowDefinition_getStateValueById(self, state_id): + if self.states is not None: + return self.states.get(state_id, None) + return None +def DCWorkflowDefinition_getStateValueList(self): + if self.states is not None: + return self.states.values() + return [] +def DCWorkflowDefinition_getStateIdList(self): + if self.states is not None: + return self.states.objectIds() + return [] +def DCWorkflowDefinition_getTransitionValueById(self, transition_id): + if self.transitions is not None: + return self.transitions.get(transition_id, None) + return None +def DCWorkflowDefinition_getTransitionValueList(self): + if self.transitions is not None: + return self.transitions.values() + else: + return [] +def DCWorkflowDefinition_getTransitionIdByReference(self, reference): + return reference +def DCWorkflowDefinition_getTransitionIdList(self): + if self.transitions is not None: + return self.transitions.objectIds() + return [] +def DCWorkflowDefinition_getWorklistValueById(self, worklist_id): + if self.worklists is not None: + return self.worklists.get(worklist_id, None) + return None +def DCWorkflowDefinition_getWorklistValueList(self): + if self.worklists is not None: + return self.worklists.values() + return [] +def DCWorkflowDefinition_getWorklistIdList(self): + if self.worklists is not None: + return self.worklists.objectIds() + return [] +def DCWorkflowDefinition_propertyIds(self): + return sorted(self.__dict__.keys()) +def DCWorkflowDefinition_getScriptIdByReference(self, reference): + return reference +def DCWorkflowDefinition_getScriptValueById(self, script_id): + if self.scripts is not None: + return self.scripts.get(script_id, None) + return None +def DCWorkflowDefinition_getScriptValueList(self): + if self.scripts is not None: + return self.scripts.values() + return [] +def StateDefinition_getDestinationIdList(self): + return self.transitions +def StateDefinition_getStateTypeList(self): + return getattr(self, 'type_list', ()) +def DCWorkflowDefinition_getPortalType(self): + return self.__class__.__name__ +def method_getReference(self): + return self.id +# a necessary funtion in Base_viewDict +def DCWorkflowDefinition_showDict(self): + attr_dict = {} + for attr in sorted(self.__dict__.keys()): + value = getattr(self, attr) + if value is not None: + attr_dict[attr] = value + else: + continue + return attr_dict +# generate XML file for the workflow contents comparison between DCWorkflow +# and converted workflow. +def DCWorkflowDefinition_showAsXML(self, root=None): + if root is None: + root = Element('erp5') + return_as_object = False + + # Define a list of __dict__.keys to show to users: + workflow_prop_id_to_show = {'description':'text', + 'state_var':'string', 'permissions':'multiple selection', + 'initial_state':'string'} + + # workflow as XML, need to rename DC workflow's portal_type before comparison. + workflow = SubElement(root, 'workflow', + attrib=dict(reference=self.id, + portal_type='Workflow')) + + for prop_id in sorted(workflow_prop_id_to_show): + value = getattr(self, prop_id, '') + if value == () or value == []: + value = '' + prop_type = workflow_prop_id_to_show[prop_id] + sub_object = SubElement(workflow, prop_id, attrib=dict(type=prop_type)) + sub_object.text = str(value) + + # 1. State as XML + state_reference_list = [] + state_id_list = sorted(self.states.keys()) + # show reference instead of id + state_prop_id_to_show = {'description':'text', + 'transitions':'multiple selection', 'permission_roles':'string'} + for sid in state_id_list: + state_reference_list.append(sid) + states = SubElement(workflow, 'states', attrib=dict(state_list=str(state_reference_list), + number_of_element=str(len(state_reference_list)))) + for sid in state_id_list: + sdef = self.states[sid] + state = SubElement(states, 'state', attrib=dict(reference=sid,portal_type='State')) + for property_id in sorted(state_prop_id_to_show): + property_value = getattr(sdef, property_id, '') + if property_value is None or property_value == [] or property_value ==(): + property_value = '' + property_type = state_prop_id_to_show[property_id] + sub_object = SubElement(state, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # 2. Transition as XML + transition_reference_list = [] + transition_id_list = sorted(self.transitions.keys()) + transition_prop_id_to_show = {'description':'text', + 'new_state_id':'string', 'trigger_type':'int', 'script_name':'string', + 'after_script_name':'string', 'actbox_category':'string', 'actbox_icon':'string', + 'actbox_name':'string', 'actbox_url':'string', 'guard':'string', 'transition_variable':'object'} + + for tid in transition_id_list: + transition_reference_list.append(tid) + transitions = SubElement(workflow, 'transitions', + attrib=dict(transition_list=str(transition_reference_list), + number_of_element=str(len(transition_reference_list)))) + for tid in transition_id_list: + tdef = self.transitions[tid] + transition = SubElement(transitions, 'transition', + attrib=dict(reference=tid, portal_type='Transition')) + guard = SubElement(transition, 'guard', attrib=dict(type='object')) + transition_variables = SubElement(transition, 'transition_variables', attrib=dict(type='object')) + for property_id in sorted(transition_prop_id_to_show): + if property_id == 'guard': + guard_obj = getattr(tdef, 'guard', None) + guard_prop_to_show = sorted({'roles':'guard configuration', + 'groups':'guard configuration', 'permissions':'guard configuration', + 'expr':'guard configuration'}) + for prop_id in guard_prop_to_show: + if guard_obj is not None: + if prop_id == 'expr': + prop_value = getattr(guard_obj.expr, 'text', '') + else: prop_value = getattr(guard_obj, prop_id, '') + else: + prop_value = '' + sub_object = SubElement(guard, prop_id, attrib=dict(type='guard configuration')) + if prop_value is None or prop_value == [] or prop_value ==(): + prop_value = '' + sub_object.text = str(prop_value) + elif property_id == 'transition_variable': + if tdef.var_exprs is not None: + tr_var_list = tdef.var_exprs + else: + tr_var_list = {} + for tr_var in tr_var_list: + transition_variable = SubElement(transition_variables, property_id, attrib=dict(id=tr_var,type='variable')) + transition_variable.text = str(tr_var_list[tr_var].text) + else: + property_value = getattr(tdef, property_id) + property_type = transition_prop_id_to_show[property_id] + sub_object = SubElement(transition, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value == [] or property_value ==(): + property_value = '' + sub_object.text = str(property_value) + + # 3. Variable as XML + variable_reference_list = [] + variable_id_list = sorted(self.variables.keys()) + variable_prop_id_to_show = {'description':'text', + 'default_expr':'string', 'for_catalog':'int', 'for_status':'int', + 'update_always':'int'} + for vid in variable_id_list: + variable_reference_list.append(vid) + variables = SubElement(workflow, 'variables', attrib=dict(variable_list=str(variable_reference_list), + number_of_element=str(len(variable_reference_list)))) + for vid in variable_id_list: + vdef = self.variables[vid] + variable = SubElement(variables, 'variable', attrib=dict(reference=vdef.getReference(), + portal_type='Workflow Variable')) + for property_id in sorted(variable_prop_id_to_show): + if property_id == 'default_expr': + expression = getattr(vdef, property_id, None) + if expression is not None: + property_value = expression.text + else: + property_value = '' + else: + property_value = getattr(vdef, property_id, '') + if property_value is None or property_value == [] or property_value ==(): + property_value = '' + property_type = variable_prop_id_to_show[property_id] + sub_object = SubElement(variable, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # 4. Worklist as XML + worklist_reference_list = [] + worklist_id_list = sorted(self.worklists.keys()) + worklist_prop_id_to_show = {'description':'text', + 'matched_portal_type_list':'text', + 'matched_validation_state_list':'string', + 'matched_simulation_state_list':'string', 'actbox_category':'string', + 'actbox_name':'string', 'actbox_url':'string', 'actbox_icon':'string', + 'guard':'object'} + for qid in worklist_id_list: + worklist_reference_list.append(qid) + worklists = SubElement(workflow, 'worklists', attrib=dict(worklist_list=str(worklist_reference_list), + number_of_element=str(len(worklist_reference_list)))) + for qid in worklist_id_list: + qdef = self.worklists[qid] + worklist = SubElement(worklists, 'worklist', attrib=dict(reference=qdef.getReference(), + portal_type='Worklist')) + guard = SubElement(worklist, 'guard', attrib=dict(type='object')) + var_matches = getattr(qdef, 'var_matches') + for property_id in sorted(worklist_prop_id_to_show): + if property_id == 'guard': + guard_obj = getattr(qdef, 'guard', None) + guard_prop_to_show = sorted({'roles':'guard configuration', + 'groups':'guard configuration', 'permissions':'guard configuration', + 'expr':'guard configuration'}) + for prop_id in guard_prop_to_show: + if guard_obj is not None: + prop_value = getattr(guard_obj, prop_id, '') + else: + prop_value = '' + property_type='guard configuration' + sub_object = SubElement(guard, prop_id, attrib=dict(type=property_type)) + if prop_value is None or prop_value == [] or prop_value ==(): + prop_value = '' + sub_object.text = str(prop_value) + else: + if property_id == 'matched_portal_type_list': + var_id = 'portal_type' + property_value = var_matches.get(var_id) + elif property_id == 'matched_validation_state_list': + var_id = 'validation_state' + property_value = var_matches.get(var_id) + elif property_id == 'matched_simulation_state_list': + var_id = 'simulation_state' + property_value = var_matches.get(var_id) + else: + property_value = getattr(qdef, property_id) + property_type = worklist_prop_id_to_show[property_id] + sub_object = SubElement(worklist, property_id, attrib=dict(type=property_type)) + + if property_value is None or property_value == [] or property_value ==(): + property_value = '' + sub_object.text = str(property_value) + + # 5. Script as XML + script_reference_list = [] + script_id_list = sorted(self.scripts.keys()) + script_prop_id_to_show = {'body':'string', 'parameter_signature':'string', + 'proxy_roles':'tokens'} + for sid in script_id_list: + script_reference_list.append(sid) + scripts = SubElement(workflow, 'scripts', attrib=dict(script_list=str(script_reference_list), + number_of_element=str(len(script_reference_list)))) + for sid in script_id_list: + sdef = self.scripts[sid] + script = SubElement(scripts, 'script', attrib=dict(reference=sid, + portal_type='Workflow Script')) + for property_id in sorted(script_prop_id_to_show): + if property_id == 'body': + property_value = sdef.getBody() + elif property_id == 'parameter_signature': + property_value = sdef.getParams() + elif property_id == 'proxy_roles': + property_value = sdef.getProxyRole() + else: + property_value = getattr(sdef, property_id) + property_type = script_prop_id_to_show[property_id] + sub_object = SubElement(script, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # return xml object + if return_as_object: + return root + return etree.tostring(root, encoding='utf-8', + xml_declaration=True, pretty_print=True) + +def TransitionDefinition_getParentValue(self): + return self.aq_parent.aq_parent + +def DCWorkflowDefinition_getSourceValue(self): + return self.states[self.initial_state] + +def DCWorkflowDefinition_setStateVariable(self, name): + self.variables.setStateVar(name) + +def DCWorkflowDefinition_addTransition(self, name): + self.transitions.addTransition(name) + +def DCWorkflowDefinition_deleteTransitions(self, name): + self.transitions.deleteTransitions(name) + +def WorklistDefinition_getGuardRoleList(self): + return self.getGuard().getRolesText().split(';') + +def method_isGuarded(self): + guard = getattr(self, 'guard', None) + return guard is not None + +DCWorkflowDefinition.addTransition = DCWorkflowDefinition_addTransition +DCWorkflowDefinition.deleteTransitions = DCWorkflowDefinition_deleteTransitions +DCWorkflowDefinition.getReference = method_getReference +DCWorkflowDefinition.getSourceValue = DCWorkflowDefinition_getSourceValue +DCWorkflowDefinition.notifyWorkflowMethod = DCWorkflowDefinition_notifyWorkflowMethod +DCWorkflowDefinition.notifyBefore = DCWorkflowDefinition_notifyBefore +DCWorkflowDefinition.notifySuccess = DCWorkflowDefinition_notifySuccess +DCWorkflowDefinition.getVariableValueDict = DCWorkflowDefinition_getVariableValueDict +DCWorkflowDefinition.getVariableValueById = DCWorkflowDefinition_getVariableValueById +DCWorkflowDefinition.getStateValueById = DCWorkflowDefinition_getStateValueById +DCWorkflowDefinition.getStateValueList = DCWorkflowDefinition_getStateValueList +DCWorkflowDefinition.getTransitionValueById = DCWorkflowDefinition_getTransitionValueById +DCWorkflowDefinition.getTransitionValueList = DCWorkflowDefinition_getTransitionValueList +DCWorkflowDefinition.getWorklistValueById = DCWorkflowDefinition_getWorklistValueById +DCWorkflowDefinition.getWorklistValueList = DCWorkflowDefinition_getWorklistValueList +DCWorkflowDefinition.getScriptValueList = DCWorkflowDefinition_getScriptValueList +DCWorkflowDefinition.getScriptValueById = DCWorkflowDefinition_getScriptValueById +DCWorkflowDefinition.getVariableIdList = DCWorkflowDefinition_getVariableIdList +DCWorkflowDefinition.getStateIdList = DCWorkflowDefinition_getStateIdList +DCWorkflowDefinition.getTransitionIdList = DCWorkflowDefinition_getTransitionIdList +DCWorkflowDefinition.getWorklistIdList = DCWorkflowDefinition_getWorklistIdList +DCWorkflowDefinition.setStateVariable = DCWorkflowDefinition_setStateVariable +DCWorkflowDefinition.showAsXML = DCWorkflowDefinition_showAsXML +DCWorkflowDefinition.showDict = DCWorkflowDefinition_showDict +DCWorkflowDefinition.propertyIds = DCWorkflowDefinition_propertyIds +DCWorkflowDefinition.getStateVariable = DCWorkflowDefinition_getStateVariable +DCWorkflowDefinition.getPortalType = DCWorkflowDefinition_getPortalType +DCWorkflowDefinition.getScriptIdByReference = DCWorkflowDefinition_getScriptIdByReference +DCWorkflowDefinition.getTransitionIdByReference = DCWorkflowDefinition_getTransitionIdByReference +StateDefinition.getReference = method_getReference +StateDefinition.getDestinationIdList = StateDefinition_getDestinationIdList +StateDefinition.getDestinationReferenceList = StateDefinition_getDestinationIdList +StateDefinition.showDict = DCWorkflowDefinition_showDict +StateDefinition.getStateTypeList = StateDefinition_getStateTypeList +StateDefinition.getStatePermissionRolesDict = StateDefinition_getStatePermissionRolesDict +StateDefinition.getAcquirePermissionList = StateDefinition_getAcquirePermissionList +TransitionDefinition.getParentValue = TransitionDefinition_getParentValue +TransitionDefinition.getReference = method_getReference +TransitionDefinition.showDict = DCWorkflowDefinition_showDict +TransitionDefinition.isGuarded = method_isGuarded +VariableDefinition.getReference = method_getReference +VariableDefinition.showDict = DCWorkflowDefinition_showDict +WorklistDefinition.getReference = method_getReference +WorklistDefinition.showDict = DCWorkflowDefinition_showDict +WorklistDefinition.getGuardRoleList = WorklistDefinition_getGuardRoleList + # This patch allows to use workflowmethod as an after_script # However, the right way of doing would be to have a combined state of TRIGGER_USER_ACTION and TRIGGER_WORKFLOW_METHOD # as well as workflow inheritance. This way, different user actions and dialogs can be specified easliy diff --git a/product/ERP5Type/patches/Expression.py b/product/ERP5Type/patches/Expression.py index ec2b84e528801d3cd4cda889cf9b1aa30e9439a9..97cfdc4a472661f9c9187fd0ca13d7e1ad305d6d 100644 --- a/product/ERP5Type/patches/Expression.py +++ b/product/ERP5Type/patches/Expression.py @@ -14,9 +14,48 @@ # Expression patch -from Products.CMFCore.Expression import Expression +from Products.CMFCore.Expression import Expression as CMFCore_Expression +from Products.DCWorkflow import Expression +from Acquisition import aq_inner +from Acquisition import aq_parent +from Products.PageTemplates.Expressions import getEngine +from Products.PageTemplates.Expressions import SecureModuleImporter +from AccessControl.SecurityManagement import getSecurityManager +from Products.DCWorkflow.Expression import StateChangeInfo def Expression_hash(self): return hash(self.text) -Expression.__hash__ = Expression_hash +CMFCore_Expression.__hash__ = Expression_hash + +# compatibility according to the new structure of workflow: +# deploy script getter to return a list of script. +def _createExprContext(sci): + ''' + An expression context provides names for TALES expressions. + ''' + ob = sci.object + wf = sci.workflow + script_dict = {script.getReference(): script + for script in wf.getScriptValueList()} + container = aq_parent(aq_inner(ob)) + data = { + 'here': ob, + 'object': ob, + 'container': container, + 'folder': container, + 'nothing': None, + 'root': ob.getPhysicalRoot(), + 'request': getattr( ob, 'REQUEST', None ), + 'modules': SecureModuleImporter, + 'user': getSecurityManager().getUser(), + 'state_change': sci, + 'transition': sci.transition, + 'status': sci.status, + 'kwargs': sci.kwargs, + 'workflow': wf, + 'scripts': script_dict, + } + return getEngine().getContext(data) + +Expression.createExprContext = _createExprContext diff --git a/product/ERP5Type/patches/PythonScript.py b/product/ERP5Type/patches/PythonScript.py index c252e40f520a21e903eadd7400cb84db1b67abb1..2cd18fb5b2821a1ac856a16df460c0245a9d37da 100644 --- a/product/ERP5Type/patches/PythonScript.py +++ b/product/ERP5Type/patches/PythonScript.py @@ -190,3 +190,14 @@ class _(PatchClass(PythonScript)): addGuard(PythonScript, 'Change Python Scripts') InitializeClass(PythonScript) + +# following methods are necessary for showAsXML function: +def pyscript_getBody(self): + return self._body +def pyscript_getParams(self): + return self._params +def pyscript_getProxyRole(self): + return self._proxy_roles +PythonScript.getBody = pyscript_getBody +PythonScript.getParams = pyscript_getParams +PythonScript.getProxyRole = pyscript_getProxyRole diff --git a/product/ERP5Type/patches/StateChangeInfoPatch.py b/product/ERP5Type/patches/StateChangeInfoPatch.py index 7b90e146d04228acbf9d0dda326c27817ccb4330..3ebe14266f248b0fe88ac7166b50a6a433cd3845 100644 --- a/product/ERP5Type/patches/StateChangeInfoPatch.py +++ b/product/ERP5Type/patches/StateChangeInfoPatch.py @@ -35,7 +35,7 @@ def setWorkflowVariable(self, **kw): Allows to go through security checking and let a script allows to modify a workflow variable """ - history = self.object.workflow_history[self.workflow.id] + history = self.object.workflow_history[self.workflow.getReference()] history[-1].update(kw) history._p_changed = 1 diff --git a/product/ERP5Type/patches/States.py b/product/ERP5Type/patches/States.py index 4e59bb0c7ca9a1921cb8f78e5a5e43e83b8e7d38..b8d7360577738591d68fe1159f47184158f858d5 100644 --- a/product/ERP5Type/patches/States.py +++ b/product/ERP5Type/patches/States.py @@ -42,6 +42,10 @@ def setProperties(self, title='', transitions=(), REQUEST=None, description='', if REQUEST is not None: return self.manage_properties(REQUEST, 'Properties changed.') +def addPossibleTransition(self, tr_ref): + self.transitions = self.transitions + (tr_ref,) + +StateDefinition.addPossibleTransition = addPossibleTransition StateDefinition._properties_form = _properties_form StateDefinition.getAvailableTypeList = getAvailableTypeList StateDefinition.setProperties = setProperties diff --git a/product/ERP5Type/patches/WorkflowTool.py b/product/ERP5Type/patches/WorkflowTool.py index 5b42a4114ec62ba1a64fff9bbb403fbf89e3ac7b..1658bb733c240a7f1347b13fe35edecc4133793c 100644 --- a/product/ERP5Type/patches/WorkflowTool.py +++ b/product/ERP5Type/patches/WorkflowTool.py @@ -2,7 +2,7 @@ ############################################################################## # # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved. -# Copyright (c) 2002,2005 Nexedi SARL and Contributors. All Rights Reserved. +# Copyright (c) 2002,2005,2015 Nexedi SARL and Contributors. All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. @@ -44,57 +44,6 @@ from DateTime import DateTime security = ClassSecurityInfo() WorkflowTool.security = security -def DCWorkflowDefinition_notifyWorkflowMethod(self, ob, transition_list, args=None, kw=None): - ''' - Allows the system to request a workflow action. This method - must perform its own security checks. - ''' - if type(transition_list) in StringTypes: - method_id = transition_list - elif len(transition_list) == 1: - method_id = transition_list[0] - else: - raise ValueError('WorkflowMethod should be attached to exactly 1 transition per DCWorkflow instance.') - sdef = self._getWorkflowStateOf(ob) - if sdef is None: - raise WorkflowException, 'Object is in an undefined state' - if method_id not in sdef.transitions: - raise Unauthorized(method_id) - tdef = self.transitions.get(method_id, None) - if tdef is None or tdef.trigger_type != TRIGGER_WORKFLOW_METHOD: - raise WorkflowException, ( - 'Transition %s is not triggered by a workflow method' - % method_id) - if not self._checkTransitionGuard(tdef, ob): - raise Unauthorized(method_id) - self._changeStateOf(ob, tdef, kw) - if getattr(ob, 'reindexObject', None) is not None: - if kw is not None: - activate_kw = kw.get('activate_kw', {}) - else: - activate_kw = {} - ob.reindexObject(activate_kw=activate_kw) - -def DCWorkflowDefinition_notifyBefore(self, ob, transition_list, args=None, kw=None): - ''' - Notifies this workflow of an action before it happens, - allowing veto by exception. Unless an exception is thrown, either - a notifySuccess() or notifyException() can be expected later on. - The action usually corresponds to a method name. - ''' - pass - -def DCWorkflowDefinition_notifySuccess(self, ob, transition_list, result, args=None, kw=None): - ''' - Notifies this workflow that an action has taken place. - ''' - pass - -security.declarePrivate('notifyWorkflowMethod') -DCWorkflowDefinition.notifyWorkflowMethod = DCWorkflowDefinition_notifyWorkflowMethod -DCWorkflowDefinition.notifyBefore = DCWorkflowDefinition_notifyBefore -DCWorkflowDefinition.notifySuccess = DCWorkflowDefinition_notifySuccess - WORKLIST_METADATA_KEY = 'metadata' SECURITY_PARAMETER_ID = 'local_roles' COUNT_COLUMN_TITLE = 'count' @@ -439,6 +388,18 @@ def generateActionList(worklist_metadata, worklist_result, portal_url): 'category': metadata['action_box_category']}) return action_list +# following 2 functions are necessary for workflow tool dynamic migration +def WorkflowTool_isBootstrapRequired(self): + # migration is required if the tool is not the new one from ERP5 Workflow + # in case of old workflow tool, it acquires the portal type from ERP5 Site + return self.getPortalType() != "Workflow Tool" + +def WorkflowTool_bootstrap(self): + self.getPortalObject().migrateToPortalWorkflowClass() + +WorkflowTool._isBootstrapRequired = WorkflowTool_isBootstrapRequired +WorkflowTool._bootstrap = WorkflowTool_bootstrap + def WorkflowTool_listActions(self, info=None, object=None, src__=False): """ Returns a list of actions to be displayed to the user. @@ -842,20 +803,6 @@ def WorkflowTool_isTransitionPossible(self, ob, transition_id, wf_id=None): security.declarePublic('isTransitionPossible') WorkflowTool.isTransitionPossible = WorkflowTool_isTransitionPossible -def WorkflowTool_getWorkflowChainDict(self, sorted=True): - """Returns workflow chain compatible with workflow_chain_dict signature""" - chain = self._chains_by_type.copy() - return_dict = {} - for portal_type, workflow_id_list in chain.iteritems(): - if sorted: - workflow_id_list = list(workflow_id_list) - workflow_id_list.sort() - return_dict['chain_%s' % portal_type] = ', '.join(workflow_id_list) - return return_dict - -security.declareProtected(Permissions.ManagePortal, 'getWorkflowChainDict') -WorkflowTool.getWorkflowChainDict = WorkflowTool_getWorkflowChainDict - WorkflowTool._reindexWorkflowVariables = lambda self, ob: \ hasattr(aq_base(ob), 'reindexObjectSecurity') and ob.reindexObjectSecurity() diff --git a/product/ERP5Type/tests/ERP5TypeLiveTestCase.py b/product/ERP5Type/tests/ERP5TypeLiveTestCase.py index 4bbc480912b04e5078fedc73eea564a7a5c31ae3..71028cc67ec177f1371dd650f7c30eb44d546820 100644 --- a/product/ERP5Type/tests/ERP5TypeLiveTestCase.py +++ b/product/ERP5Type/tests/ERP5TypeLiveTestCase.py @@ -69,6 +69,7 @@ class ERP5TypeLiveTestCase(ERP5TypeTestCaseMixin): defined. """ portal = None + _added_property_sheets = {} def getPortalName(self): """ Return the default ERP5 site id. diff --git a/product/ERP5Type/tests/ERP5TypeTestCase.py b/product/ERP5Type/tests/ERP5TypeTestCase.py index 8627bf7d3f55034b903e2cdf526db14ca5f21156..92fd30e19823bef0b998c733320c3d9aeb650653 100644 --- a/product/ERP5Type/tests/ERP5TypeTestCase.py +++ b/product/ERP5Type/tests/ERP5TypeTestCase.py @@ -21,6 +21,7 @@ import traceback import urllib import ConfigParser from contextlib import contextmanager + from cStringIO import StringIO from cPickle import dumps from glob import glob @@ -60,7 +61,7 @@ from Testing.ZopeTestCase import PortalTestCase, user_name from Products.DCWorkflow.DCWorkflow import ValidationFailed from Products.PythonScripts.PythonScript import PythonScript from Products.ERP5Type.Accessor.Constant import PropertyGetter as ConstantGetter -from zLOG import LOG, DEBUG +from zLOG import LOG, DEBUG, WARNING from Products.ERP5Type.tests.backportUnittest import SetupSiteError from Products.ERP5Type.tests.utils import addUserToDeveloperRole @@ -842,7 +843,6 @@ class ERP5TypeCommandLineTestCase(ERP5TypeTestCaseMixin): # Let's be a litte tolerant for the moment. BaseMessage.max_retry = property(lambda self: self.activity_kw.get('max_retry', 1)) - template_list = list(self.getBusinessTemplateList()) erp5_catalog_storage = os.environ.get('erp5_catalog_storage', 'erp5_mysql_innodb_catalog') @@ -858,6 +858,14 @@ class ERP5TypeCommandLineTestCase(ERP5TypeTestCaseMixin): light_install = self.enableLightInstall() create_activities = self.enableActivityTool() hot_reindexing = self.enableHotReindexing() + for x, y in (("erp5_core_proxy_field_legacy", "erp5_base"), + ("erp5_stock_cache", "erp5_pdm")): + if x not in template_list: + try: + template_list.insert(template_list.index(y), x) + except ValueError: + pass + self.setUpERP5Site(business_template_list=template_list, light_install=light_install, create_activities=create_activities, @@ -1039,6 +1047,33 @@ class ERP5TypeCommandLineTestCase(ERP5TypeTestCaseMixin): if not quiet: ZopeTestCase._print('done (%.3fs)\n' % (time.time() - start)) + def dynamicWorkflowConversion(self): + # Converting DCWorkflow dynamically + workflow_tool = self.getWorkflowTool() + type_workflow_dict = workflow_tool.getChainsByType() + type_tool = self.getTypesTool() + if workflow_tool: + for workflow_id in workflow_tool.objectIds(): + # Do not convert workflow's live test related workflows. + if workflow_id in ['testing_initial_dc_interaction_workflow', 'testing_initial_dc_workflow']: + continue + workflow = workflow_tool._getOb(workflow_id) + if workflow.getPortalType() not in ['Workflow', 'Interaction Workflow', 'Configuration Workflow']: + new_workflow = workflow_tool.dc_workflow_asERP5Object(workflow, is_temporary=False) + workflow_tool.reassignWorkflow(workflow_id) + self.commit() + # force convert edit_workflow: Why have to load edit_workflow this way? + edit_workflow = workflow_tool._getOb('edit_workflow', None) + if edit_workflow is not None: + new_workflow = workflow_tool.dc_workflow_asERP5Object(edit_workflow, is_temporary=False) + workflow_tool.reassignWorkflow('edit_workflow') + self.commit() + # Reset the original workflows assignement order. + for type_value in sorted(type_tool.objectValues()): + type_value.workflow_list = tuple(reversed(type_value.workflow_list)) + LOG(" || Portal Type: '%s': '%s'"%(type_value.getId(), type_value.workflow_list), 0, "") + self.commit() + def setUpERP5Site(self, business_template_list=(), quiet=0, @@ -1137,17 +1172,17 @@ class ERP5TypeCommandLineTestCase(ERP5TypeTestCaseMixin): user = uf.getUserById('ERP5TypeTestCase').__of__(uf) self._callSetUpOnce() - self._reindexSite() # Enable reindexing # Do hot reindexing # Does not work if hot_reindexing: setattr(app,'isIndexable', 1) portal.portal_catalog.manage_hotReindexAll() - + self.dynamicWorkflowConversion() portal.portal_types.resetDynamicDocumentsOnceAtTransactionBoundary() + self.getPortal().erp5_sql_connection.manage_test("update message_queue set processing_node=0, priority=1 where processing_node=-1") + self.getPortal().erp5_sql_connection.manage_test("update message set processing_node=0, priority=2 where processing_node=-1") self.tic(not quiet) - # Log out if not quiet: ZopeTestCase._print('Logout ... \n') diff --git a/product/ERP5Type/tests/SecurityTestCase.py b/product/ERP5Type/tests/SecurityTestCase.py index 20422b6f842b2986755cb5d879510648fc9fe39b..c557d2256dae974da4ba91d56848f8bcb5c1aed9 100644 --- a/product/ERP5Type/tests/SecurityTestCase.py +++ b/product/ERP5Type/tests/SecurityTestCase.py @@ -215,11 +215,11 @@ class SecurityTestCase(ERP5TypeTestCase): for wf in self.workflow_tool.getWorkflowsFor(document) or []: if wf.getId() == 'edit_workflow': continue - if isinstance(wf, InteractionWorkflowDefinition): + if wf.__class__.__name__ in ['InteractionWorkflowDefinition', 'Interaction Workflow'] : continue for wf_transition_id in wf._getWorkflowStateOf( document).getTransitions(): - wf_transition = wf.transitions[wf_transition_id] + wf_transition = wf.getTransitionValueById(wf_transition_id) if wf_transition.trigger_type == TRIGGER_USER_ACTION: workflow_transitions_description.append( "%s%s[%s]: %s" % ( diff --git a/product/ERP5Type/tests/testERP5NamingConvention.py b/product/ERP5Type/tests/testERP5NamingConvention.py index 21ebc7240e64577e05609843514724f95608beee..751d432b35b48875ed981e29e4391947156adacd 100644 --- a/product/ERP5Type/tests/testERP5NamingConvention.py +++ b/product/ERP5Type/tests/testERP5NamingConvention.py @@ -67,7 +67,7 @@ class TestNamingConvention(ERP5TypeTestCase): 'erp5_jquery_plugin_jgraduate', 'erp5_jquery_plugin_svgicon', 'erp5_jquery_plugin_jquerybbq', 'erp5_jquery_plugin_spinbtn', 'erp5_jquery_plugin_svg_editor', 'erp5_svg_editor', 'erp5_syncml', 'erp5_system_event', 'erp5_tiosafe_core', 'erp5_tiosafe_accounting', 'erp5_tiosafe_document', - 'erp5_tiosafe_pdm', 'erp5_utils', 'erp5_workflow', 'erp5_wizard', 'tiolive_base', + 'erp5_tiosafe_pdm', 'erp5_utils', 'erp5_workflow', 'erp5_workflow_test', 'erp5_wizard', 'tiolive_base', 'tiolive_decouple_instance', 'erp5_public_accounting_budget', 'erp5_publication', 'erp5_social_contracts', 'test_core', 'test_accounting', 'test_web', 'test_html_style', 'test_xhtml_style', 'cloudooo_data', 'cloudooo_web', 'erp5_configurator', diff --git a/product/ERP5Type/tests/testERP5Type.py b/product/ERP5Type/tests/testERP5Type.py index 74cb56243b4eef0ce561a945faf2aa70db8f0661..1a85b299bf4e6a08135ffc9890da3f15124ae387 100644 --- a/product/ERP5Type/tests/testERP5Type.py +++ b/product/ERP5Type/tests/testERP5Type.py @@ -129,11 +129,12 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): self.login() # all those tests does strange things with Person type, so we won't # filter content types to add inside Person. - self.getTypesTool().getTypeInfo('Person').filter_content_types = 0 + person_type_object = self.getTypesTool().getTypeInfo('Person') + person_type_object.filter_content_types = 0 self.commit() # save workflow chain for Person type - self.person_chain = self.getWorkflowTool().getChainFor('Person') + self.person_workflow_list = person_type_object.getTypeWorkflowList() def beforeTearDown(self): self.abort() @@ -144,14 +145,14 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): self.getCategoryTool().region ]: module.manage_delObjects(list(module.objectIds())) + person_type_object = self.getTypesTool().getTypeInfo('Person') # set Person.acquire_local_roles back. if getattr(self, 'person_acquire_local_roles', None) is not None: - self.getTypesTool().getTypeInfo('Person').acquire_local_roles = self.person_acquire_local_roles + person_type_object.acquire_local_roles = self.person_acquire_local_roles self.portal.portal_caches.clearAllCache() # restore workflows for other tests - self.getWorkflowTool().setChainForPortalTypes( - ['Person'], self.person_chain) + person_type_object.setTypeWorkflowList(self.person_workflow_list) super(TestERP5Type, self).beforeTearDown() @@ -969,24 +970,24 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): person = self.getPersonModule().newContent(id='1', portal_type='Person') wf = self.getWorkflowTool().validation_workflow # those are assumptions for this test. - self.assertTrue(wf.getId() in - self.getWorkflowTool().getChainFor('Person')) - self.assertEqual('validation_state', wf.variables.getStateVar()) - initial_state = wf.states[wf.initial_state] - other_state = wf.states['validated'] + self.assertTrue(wf in + self.getWorkflowTool().getWorkflowValueListFor('Person')) + self.assertEqual('validation_state', wf.getStateVariable()) + initial_state = wf.getSourceValue() + other_state = wf.getStateValueById('validated') self.assertTrue(hasattr(person, 'getValidationState')) self.assertTrue(hasattr(person, 'getValidationStateTitle')) self.assertTrue(hasattr(person, 'getTranslatedValidationStateTitle')) - self.assertEqual(initial_state.getId(), person.getValidationState()) + self.assertEqual(initial_state.getReference(), person.getValidationState()) self.assertEqual(initial_state.title, person.getValidationStateTitle()) self.assertEqual(initial_state.title, person.getTranslatedValidationStateTitle()) self.assertTrue([initial_state.title], message_catalog._translated) - self.assertEqual(initial_state.getId(), + self.assertEqual(initial_state.getReference(), person.getProperty('validation_state')) self.assertEqual(initial_state.title, person.getProperty('validation_state_title')) @@ -996,7 +997,7 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): self.assertTrue([initial_state.title], message_catalog._translated) # default parameter is accepted by getProperty for compatibility - self.assertEqual(initial_state.getId(), + self.assertEqual(initial_state.getReference(), person.getProperty('validation_state', 'default')) self.assertEqual(initial_state.title, person.getProperty('validation_state_title', 'default')) @@ -1008,12 +1009,12 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): # pass a transition and check accessors again. person.validate() - self.assertEqual(other_state.getId(), person.getValidationState()) + self.assertEqual(other_state.getReference(), person.getValidationState()) self.assertEqual(other_state.title, person.getValidationStateTitle()) self.assertEqual(other_state.title, person.getTranslatedValidationStateTitle()) - self.assertEqual(other_state.getId(), + self.assertEqual(other_state.getReference(), person.getProperty('validation_state')) self.assertEqual(other_state.title, person.getProperty('validation_state_title')) @@ -2462,51 +2463,54 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor): self.commit() self.assertFalse(hasattr(doc, 'getDestination')) - def test_aq_reset_on_workflow_chain_change(self): + def test_aq_reset_on_type_workflow_list_change(self): doc = self.portal.person_module.newContent(portal_type='Person') self.assertFalse(hasattr(doc, 'getCausalityState')) # chain the portal type with a workflow that has 'causality_state' as # state variable name, this should regenerate the getCausalityState # accessor. This test might have to be updated whenever # delivery_causality_workflow changes. - self.getWorkflowTool().setChainForPortalTypes( - ['Person'], ('delivery_causality_workflow')) + person_type_object = self.getTypesTool().getTypeInfo('Person') + person_type_object.setTypeWorkflowList(['delivery_causality_workflow']) self.commit() self.assertTrue(hasattr(doc, 'getCausalityState')) def test_aq_reset_on_workflow_method_change(self): doc = self.portal.person_module.newContent(portal_type='Person') - self.getWorkflowTool().setChainForPortalTypes( - ['Person'], ('delivery_causality_workflow')) - + person_type_object = self.portal.portal_types._getOb('Person') + person_type_object.setTypeWorkflowList(person_type_object.getTypeWorkflowList() + ['delivery_causality_workflow']) self.commit() self.assertTrue(hasattr(doc, 'diverge')) wf = self.portal.portal_workflow.delivery_causality_workflow - wf.transitions.addTransition('dummy_workflow_method') + wf.addTransition('dummy_workflow_method') + from Products.DCWorkflow.Transitions import TRIGGER_WORKFLOW_METHOD - wf.transitions.dummy_workflow_method.setProperties( + if wf.getPortalType() == 'Workflow': + wf._getOb('transition_dummy_workflow_method')._edit(trigger_type=TRIGGER_WORKFLOW_METHOD) + else: + wf.transitions.dummy_workflow_method.setProperties( title='', new_state_id='', trigger_type=TRIGGER_WORKFLOW_METHOD) self.commit() self.assertTrue(hasattr(doc, 'dummyWorkflowMethod')) - wf.transitions.deleteTransitions(['dummy_workflow_method']) - + wf.deleteTransitions(['dummy_workflow_method']) self.commit() self.assertFalse(hasattr(doc, 'dummyWorkflowMethod')) def test_aq_reset_on_workflow_state_variable_change(self): doc = self.portal.person_module.newContent(portal_type='Person') - self.getWorkflowTool().setChainForPortalTypes( - ['Person'], ('delivery_causality_workflow')) - + person_type_object = self.portal.portal_types._getOb('Person') + person_type_object.setTypeWorkflowList(person_type_object.getTypeWorkflowList() + ['delivery_causality_workflow']) self.commit() self.assertTrue(hasattr(doc, 'getCausalityState')) - wf = self.portal.portal_workflow.delivery_causality_workflow - wf.variables.setStateVar('dummy_state') - + wf = self.portal.portal_workflow._getOb('delivery_causality_workflow') + if wf.getPortalType() == 'Workflow': + wf._edit(state_variable='dummy_state') + else: + wf.setStateVariable('dummy_state') self.commit() self.assertTrue(hasattr(doc, 'getDummyState')) diff --git a/product/ERP5Workflow/Document/ConfigurationState.py b/product/ERP5Workflow/Document/ConfigurationState.py new file mode 100644 index 0000000000000000000000000000000000000000..56883fd630c7bcf38779b6d0d437b7955973e5f6 --- /dev/null +++ b/product/ERP5Workflow/Document/ConfigurationState.py @@ -0,0 +1,125 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Romain Courteaud +# +# 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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.XMLObject import XMLObject +from zLOG import LOG, ERROR, DEBUG, WARNING + +class StateError(Exception): + """ + Must call only an available transition + """ + pass + +class ConfigurationState(XMLObject): + """ + A Busniess Configuration State. + """ + meta_type = 'ERP5 State' + portal_type = 'Configuration State' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.State,) + + def getAvailableTransitionList(self, document): + """ + Return available transitions only if they are accessible for document. + """ + transition_list = self.getDestinationValueList(portal_type = 'Configuration Transition') + result_list = [] + for transition in transition_list: + value = transition._checkPermission(document) + if value: + result_list.append(transition) + return result_list + + def executeTransition(self, transition, document, form_kw=None): + """ + Execute transition on the object. + """ + if transition not in self.getAvailableTransitionList(document): + raise StateError + else: + transition.execute(document, form_kw=form_kw) + + def undoTransition(self, document): + """ + Reverse previous transition + """ + wh = self.getWorkflowHistory(document, remove_undo=1) + status_dict = wh[-2] + # Update workflow state + state_bc_id = self.getParentValue().getStateBaseCategory() + document.setCategoryMembership(state_bc_id, status_dict[state_bc_id]) + # Update workflow history + status_dict['undo'] = 1 + self.getParentValue()._updateWorkflowHistory(document, status_dict) + # XXX + LOG("State, undo", ERROR, "Variable (like DateTime) need to be updated!") + + def getWorkflowHistory(self, document, remove_undo=0, remove_not_displayed=0): + """ + Return history tuple + """ + wh = document.workflow_history[self.getParentValue()._generateHistoryKey()] + result = [] + # Remove undo + if not remove_undo: + result = [x.copy() for x in wh] + else: + result = [] + for x in wh: + if x.has_key('undo') and x['undo'] == 1: + result.pop() + else: + result.append(x.copy()) + return result + + def getVariableValue(self, document, variable_name): + """ + Get current value of the variable from the object + """ + status_dict = self.getParentValue().getCurrentStatusDict(document) + return status_dict[variable_name] + + def getDestinationReferenceList(self): + return self.getDestinationIdList() diff --git a/product/ERP5Workflow/Document/ConfigurationTransition.py b/product/ERP5Workflow/Document/ConfigurationTransition.py new file mode 100644 index 0000000000000000000000000000000000000000..84bfad5494d73099ac9b5c9871b031ba9ff8e0d8 --- /dev/null +++ b/product/ERP5Workflow/Document/ConfigurationTransition.py @@ -0,0 +1,148 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Romain Courteaud +# +# 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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Type.Accessor.Base import _evaluateTales + +class ConfigurationTransition(XMLObject): + """ + A Business Configuration Transition. + """ + + meta_type = 'ERP5 Transition' + portal_type = 'Configuration Transition' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.ConfiguratorTransition, + PropertySheet.Guard, + ) + + def execute(self, document, form_kw=None): + """ + Execute transition. + """ + workflow = self.getParentValue() + # Call the before script + self._executeBeforeScript(document) + + # Modify the state + self._changeState(document) + + # Get variable values + status_dict = workflow.getCurrentStatusDict(document) + status_dict['undo'] = 0 + + # Modify workflow history + state_bc_id = workflow.getStateBaseCategory() + status_dict[state_bc_id] = document.getCategoryMembershipList(state_bc_id)[0] + + state_object = document.unrestrictedTraverse(status_dict[state_bc_id]) + object = workflow.getStateChangeInformation(document, state_object, transition=self) + + # Update all variables + for variable in workflow.contentValues(portal_type='Workflow Variable'): + if variable.getAutomaticUpdate(): + # if we have it in form get it from there + # otherwise use default + variable_title = variable.getTitle() + if variable_title in form_kw: + status_dict[variable_title] = form_kw[variable_title] + else: + status_dict[variable_title] = variable.getVariableValue(object=object) + + # Update all transition variables + if form_kw is not None: + object.REQUEST.other.update(form_kw) + for variable in self.contentValues(portal_type='Transition Variable'): + status_dict[variable.getCausalityTitle()] = variable.getVariableValue(object=object) + + workflow._updateWorkflowHistory(document, status_dict) + + # Call the after script + self._executeAfterScript(document, form_kw=form_kw) + + def _changeState(self, document): + """ + Change the state of the object. + """ + state = self.getDestination() + if state is not None: + # Some transitions don't update the state + state_bc_id = self.getParentValue().getStateBaseCategory() + document.setCategoryMembership(state_bc_id, state) + + def _executeAfterScript(self, document, form_kw=None): + """ + Execute post transition script. + """ + if form_kw is None: + form_kw = {} + script_id = self.getAfterScriptId() + if script_id is not None: + script = getattr(document, script_id) + script(**form_kw) + + def _executeBeforeScript(self, document, form_kw=None): + """ + Execute pre transition script. + """ + if form_kw is None: + form_kw = {} + script_id = self.getBeforeScriptId() + if script_id is not None: + script = getattr(document, script_id) + script(**form_kw) + + def _checkPermission(self, document): + """ + Check if transition is allowed. + """ + expr_value = self.getGuardExpression(evaluate=0) + if expr_value is not None: + # do not use 'getGuardExpression' to calculate tales because + # it caches value which is bad. Instead do it manually + value = _evaluateTales(document, expr_value) + else: + value = True + #print "CALC", expr_value, '-->', value + return value diff --git a/product/ERP5Workflow/Document/ConfigurationWorkflow.py b/product/ERP5Workflow/Document/ConfigurationWorkflow.py new file mode 100644 index 0000000000000000000000000000000000000000..b8f5c6a11d83e5d44e36554c64097fce636f1079 --- /dev/null +++ b/product/ERP5Workflow/Document/ConfigurationWorkflow.py @@ -0,0 +1,191 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Romain Courteaud +# +# 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 AccessControl import ClassSecurityInfo + +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Workflow.Document.Workflow import Workflow +from Products.ERP5Type.Globals import PersistentMapping + +from tempfile import mktemp +import os +from Products.DCWorkflowGraph.config import DOT_EXE +from Products.DCWorkflowGraph.DCWorkflowGraph import bin_search, getGraph + +from Acquisition import aq_base + +from DateTime import DateTime + +class ConfigurationWorkflow(Workflow): + """ + A Business Configuration Workflow. + """ + + meta_type = 'ERP5 Workflow' + portal_type = 'Configuration Workflow' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.Workflow, + ) + + def initializeDocument(self, document): + """ + Set initial state on the Document + """ + state_bc_id = self.getStateBaseCategory() + document.setCategoryMembership(state_bc_id, self.getSource()) + + object = self.getStateChangeInformation(document, self.getSourceValue()) + + # Initialize workflow history + status_dict = {state_bc_id: self.getSource()} + variable_list = self.contentValues(portal_type='Workflow Variable') + for variable in variable_list: + status_dict[variable.getTitle()] = variable.getVariableValue(object=object) + self._updateWorkflowHistory(document, status_dict) + + def _generateHistoryKey(self): + """ + Generate a key used in the workflow history. + """ + return self.getRelativeUrl() + + def _updateWorkflowHistory(self, document, status_dict): + """ + Change the state of the object. + """ + # Create history attributes if needed + if getattr(aq_base(document), 'workflow_history', None) is None: + document.workflow_history = PersistentMapping() + # XXX this _p_changed is apparently not necessary + document._p_changed = 1 + + # Add an entry for the workflow in the history + workflow_key = self._generateHistoryKey() + if not document.workflow_history.has_key(workflow_key): + document.workflow_history[workflow_key] = () + + # Update history + document.workflow_history[workflow_key] += (status_dict, ) + # XXX this _p_changed marks the document modified, but the + # only the PersistentMapping is modified + document._p_changed = 1 + # XXX this _p_changed is apparently not necessary + document.workflow_history._p_changed = 1 + + def getCurrentStatusDict(self, document): + """ + Get the current status dict. + """ + workflow_key = self._generateHistoryKey() + + # Copy is requested + result = document.workflow_history[workflow_key][-1].copy() + return result + + def _getWorkflowStateOf(self, ob, id_only=0): + tool = self.getPortalObject().portal_workflow + id = self.getId() + status = tool.getStatusOf(id, ob) + if status is None: + state = self.getSourceValue() + else: + state_id = status.get(self.getStateVariable(), None) + state = self._getOb(state_id) + if state is None: + state = self.getSourceValue() + if id_only: + return state.getId() + else: + return state + ########### + ## Graph ## + ############ + + getGraph = getGraph + + def getPOT(self, *args, **kwargs): + """ + get the pot, copy from: + "dcworkfow2dot.py":http://awkly.org/Members/sidnei/weblog_storage/blog_27014 + and Sidnei da Silva owns the copyright of the this function + """ + out = [] + transition_dict = {} + out.append('digraph "%s" {' % self.getTitle()) + transition_with_init_state_list = [] + for state in self.contentValues(portal_type='Configuration State'): + out.append('%s [shape=box,label="%s",' \ + 'style="filled",fillcolor="#ffcc99"];' % \ + (state.getId(), state.getTitle())) + # XXX Use API instead of getDestinationValueList + for available_transition in state.getDestinationValueList(): + transition_with_init_state_list.append(available_transition.getId()) + destination_state = available_transition.getDestinationValue() + if destination_state is None: + # take care of 'remain in state' transitions + destination_state = state + # + key = (state.getId(), destination_state.getId()) + value = transition_dict.get(key, []) + value.append(available_transition.getTitle()) + transition_dict[key] = value + + # iterate also on transitions, and add transitions with no initial state + for transition in self.contentValues(portal_type='Configuration Transition'): + trans_id = transition.getId() + if trans_id not in transition_with_init_state_list: + destination_state = transition.getDestinationValue() + if destination_state is None: + dest_state_id = None + else: + dest_state_id = destination_state.getId() + + key = (None, dest_state_id) + value = transition_dict.get(key, []) + value.append(transition.getTitle()) + transition_dict[key] = value + + for k, v in transition_dict.items(): + out.append('%s -> %s [label="%s"];' % (k[0], k[1], + ',\\n'.join(v))) + + out.append('}') + return '\n'.join(out) diff --git a/product/ERP5Workflow/Document/Interaction.py b/product/ERP5Workflow/Document/Interaction.py new file mode 100644 index 0000000000000000000000000000000000000000..bc68eea09637b3d562cbe2705f4b0d1f18370714 --- /dev/null +++ b/product/ERP5Workflow/Document/Interaction.py @@ -0,0 +1,139 @@ +############################################################################## +# +# Copyright (c) 2015 Nexedi SARL and Contributors. All Rights Reserved. +# Wenjie Zheng +# +# 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. +# +############################################################################## + +import transaction + +from AccessControl import getSecurityManager, ClassSecurityInfo +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.Document.Transition import TRIGGER_WORKFLOW_METHOD +from Products.ERP5Workflow.mixin.guardable import GuardableMixin + +class Interaction(IdAsReferenceMixin('interaction_', "prefix"), XMLObject, + GuardableMixin): + + """ + An ERP5 Interaction. + """ + + meta_type = 'ERP5 Interaction' + portal_type = 'Interaction' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + managed_permission_list = () + managed_role = () + state_permission_roles = {} # { permission: [role] or (role,) } + manager_bypass = 0 + trigger_method_id = None + trigger_type = TRIGGER_WORKFLOW_METHOD + portal_type_filter = None + portal_type_group_filter = None + trigger_once_per_transaction = False + temporary_document_disallowed = False + var_exprs = None # A mapping. + default_reference = '' + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.Reference, + PropertySheet.Interaction, + PropertySheet.Guard, + ) + + # following getters are redefined for performance improvements + # they use the categories paths directly and string operations + # instead of traversing from the portal to get the objects + # in order to have their id or value + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeCommitScriptIdList') + def getBeforeCommitScriptIdList(self): + """ + returns the list of before commit script ids + """ + return [path.split('/')[-1] for path in self.getBeforeCommitScriptList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeCommitScriptValueList') + def getBeforeCommitScriptValueList(self): + """ + returns the list of before commit script values + """ + parent = self.getParentValue() + return [parent._getOb(transition_id) for transition_id + in self.getBeforeCommitScriptIdList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getActivateScriptIdList') + def getActivateScriptIdList(self): + """ + returns the list of activate script ids + """ + return [path.split('/')[-1] for path in self.getActivateScriptList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getActivateScriptValueList') + def getActivateScriptValueList(self): + """ + returns the list of activate script values + """ + parent = self.getParentValue() + return [parent._getOb(transition_id) for transition_id + in self.getActivateScriptIdList()] + + # XXX(PERF): hack to see Category Tool responsability in new workflow slowness + security.declareProtected(Permissions.AccessContentsInformation, + 'getActivateScriptList') + def getActivateScriptList(self): + """ + returns the list of activate script + """ + prefix_length = len('activate_script/') + return [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('activate_script/')] + + # XXX(PERF): hack to see Category Tool responsability in new workflow slowness + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeCommitScriptList') + def getBeforeCommitScriptList(self): + """ + returns the list of before commit script + """ + prefix_length = len('before_commit_script/') + return [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('before_commit_script/')] diff --git a/product/ERP5Workflow/Document/InteractionWorkflow.py b/product/ERP5Workflow/Document/InteractionWorkflow.py new file mode 100644 index 0000000000000000000000000000000000000000..c922262739609ae51eef58b75b8b236e81308d1b --- /dev/null +++ b/product/ERP5Workflow/Document/InteractionWorkflow.py @@ -0,0 +1,530 @@ +############################################################################## +# +# Copyright (c) 2015 Nexedi SARL and Contributors. All Rights Reserved. +# Wenjie Zheng +# +# 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. +# +############################################################################## + +import App +import transaction + +from AccessControl import getSecurityManager, ClassSecurityInfo +from AccessControl.SecurityManagement import setSecurityManager +from Acquisition import aq_base +from Products.CMFActivity.ActiveObject import ActiveObject +from Products.CMFCore.Expression import Expression +from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition +from Products.DCWorkflow.Expression import StateChangeInfo +from Products.ERP5Type import Permissions, PropertySheet, Globals +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.Globals import PersistentMapping +from Products.DCWorkflow.Expression import createExprContext +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Type.Workflow import addWorkflowFactory +from Products.ERP5Workflow.Document.Transition import TRIGGER_WORKFLOW_METHOD +from Products.ERP5Workflow.Document.Workflow import Workflow +from Products.ERP5Workflow.Document.WorkflowScript import SCRIPT_PREFIX +from types import StringTypes +from zLOG import LOG, INFO, WARNING + +# show as xml library +from lxml import etree +from lxml.etree import Element, SubElement + +_MARKER = [] + +class InteractionWorkflow(IdAsReferenceMixin("", "prefix"), Workflow): + """ + An ERP5 Interaction Workflow. + """ + meta_type = 'ERP5 Workflow' + portal_type = 'Interaction Workflow' + _isAWorkflow = True # DCWorkflow Tool compatibility + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + id = '' + default_reference = '' + managed_role = () + + intaractions = None + manager_bypass = 0 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.Reference, + ) + + security.declarePrivate('notifyCreated') + def notifyCreated(self, document): + pass + + security.declareProtected(Permissions.AccessContentsInformation, + 'getChainedPortalTypeList') + def getChainedPortalTypeList(self): + """Returns the list of portal types that are chained to this + interaction workflow.""" + wf_tool = self.getParentValue() + type_list = wf_tool._listTypeInfo() + interaction_workflow_id = self.getId() + + portal_type_list = [ + portal_type.getId() for portal_type in type_list + if interaction_workflow_id in portal_type.getTypeWorkflowList() + ] + return portal_type_list + + security.declarePrivate('listObjectActions') + def listObjectActions(self, info): + return [] + + security.declarePrivate('_changeStateOf') + def _changeStateOf(self, ob, tdef=None, kwargs=None) : + """ + InteractionWorkflow is stateless. Thus, this function should do nothing. + """ + return + + security.declarePrivate('isInfoSupported') + def isInfoSupported(self, ob, name): + ''' + Returns a true value if the given info name is supported. + ''' + vdef = self.getVariableValueDict().get(name, None) + if vdef is None: + return 0 + return 1 + + security.declarePrivate('getInfoFor') + def getInfoFor(self, ob, name, default): + ''' + Allows the user to request information provided by the + workflow. This method must perform its own security checks. + ''' + vdef = getattr(self, name, _MARKER) + for x in self.objectValues(portal_type='Workflow Variable'): + if x.getReference() == name: + vdef = x + break + if vdef is _MARKER: + return default + if not vdef.checkGuard(getSecurityManager(), self, ob): + return default + status = self._getStatusOf(ob) + variable_expression = vdef.getVariableExpression() + if status is not None and name in status: + value = status[name] + # Not set yet. Use a default. + elif variable_expression is not None: + ec = createExprContext(StateChangeInfo(ob, self, status)) + value = variable_expression(ec) + else: + value = vdef.getVariableValue() + + return value + + security.declarePrivate('isWorkflowMethodSupported') + def isWorkflowMethodSupported(self, ob, tid): + ''' + Returns a true value if the given workflow method + is supported in the current state. + ''' + tdef = self._getOb('interaction_' + tid) + return tdef is not None and self._checkTransitionGuard(tdef, ob) + + def _checkTransitionGuard(self, tdef, document, **kw): + if tdef.getTemporaryDocumentDisallowed(): + isTempDocument = getattr(document, 'isTempDocument', None) + if isTempDocument is not None: + if isTempDocument(): + return 0 + return Workflow._checkTransitionGuard(self, tdef, document, **kw) + + security.declarePrivate('getValidRoleList') + def getValidRoleList(self): + return sorted(self.getPortalObject().acl_users.valid_roles()) + + security.declarePrivate('_updateWorkflowHistory') + def _updateWorkflowHistory(self, document, status_dict): + """ + Stateless. + """ + return + + security.declarePrivate('getinteraction_workflowVariableMatchDict') + def getWorklistVariableMatchDict(self, info, check_guard=True): + return None + + def _getWorkflowStateOf(self, ob, id_only=0): + return None + + security.declarePrivate('getScriptValueList') + def getScriptValueList(self): + return self.objectValues(portal_type='Workflow Script') + + security.declarePrivate('getTransitionValueById') + def getTransitionValueById(self, transition_id): + return self._getOb('interaction_' + transition_id, default=None) + + security.declarePrivate('getTransitionValueList') + def getTransitionValueList(self): + return self.objectValues(portal_type="Interaction") + + security.declarePrivate('getTransitionValueById') + def getTransitionValueById(self, transition_id): + return self._getOb('interaction_' + transition_id, default=None) + + security.declarePrivate('getTransitionValueList') + def getTransitionValueList(self): + return self.objectValues(portal_type="Interaction") + + security.declarePrivate('getTransitionIdList') + def getTransitionIdList(self): + return [ob.getReference() for ob in self.objectValues(portal_type="Interaction")] + + security.declarePrivate('notifyWorkflowMethod') + def notifyWorkflowMethod(self, ob, transition_list, args=None, kw=None): + """ InteractionWorkflow is stateless. Thus, this function should do nothing. + """ + pass + + security.declarePrivate('notifyBefore') + def notifyBefore(self, ob, transition_list, args=None, kw=None): + if type(transition_list) in StringTypes: + return + + if kw is None: + kw = {'workflow_method_args' : args} + else: + kw = kw.copy() + kw['workflow_method_args'] = args + filtered_transition_list = [] + append = filtered_transition_list.append + for t_id in transition_list: + tdef = self._getOb('interaction_' + t_id ) + assert tdef.getTriggerType() == TRIGGER_WORKFLOW_METHOD + append(tdef.getId()) + former_status = {} + + sci = StateChangeInfo( + ob, self, former_status, tdef, None, None, kwargs=kw) + + script_value_list = tdef.getBeforeScriptValueList() + if script_value_list: + script_context = self._asScriptContext() + for script in script_value_list: + if script: + script = getattr(script_context, script.id) + script(sci) # May throw an exception. + return filtered_transition_list + + security.declarePrivate('notifySuccess') + def notifySuccess(self, ob, transition_list, result, args=None, kw=None): + """ + Notifies this workflow that an action has taken place. + """ + if type(transition_list) in StringTypes: + return + + if kw is None: + kw['workflow_method_args'] = args + kw['workflow_method_result'] = result + else: + kw = kw.copy() + kw['workflow_method_args'] = args + kw['workflow_method_result'] = result + + workflow_variable_list = self.objectValues(portal_type='Workflow Variable') + for t_id in transition_list: + tdef = self._getOb('interaction_' + t_id ) + assert tdef.getTriggerType() == TRIGGER_WORKFLOW_METHOD + former_status = {} + econtext = None + sci = None + + # Update variables. + tdef_exprs = tdef.objectValues(portal_type='Transition Variable') + if tdef_exprs is None: tdef_exprs = {} + status = {} + + for vdef in workflow_variable_list: + id = vdef.getId() + if not vdef.getStatusIncluded(): + continue + expression = None + if id in tdef_exprs: + expression = tdef_exprs[id] + elif not vdef.getAutomaticUpdate() and id in former_status: + # Preserve former value + value = former_status[id] + else: + variable_expression = vdef.getVariableExpression() + if variable_expression is not None: + expression = variable_expression + else: + value = vdef.getVariableValue() + if expression is not None: + # Evaluate an expression. + if econtext is None: + # Lazily create the expression context. + if sci is None: + sci = StateChangeInfo( + ob, self, former_status, tdef, + None, None, None) + econtext = createExprContext(sci) + value = expression(econtext) + status[id] = value + + sci = StateChangeInfo( + ob, self, former_status, tdef, None, None, kwargs=kw) + + # Execute the "after" script. + after_script_value_list = tdef.getAfterScriptValueList() + if after_script_value_list: + script_context = self._asScriptContext() + for script in after_script_value_list: + if script: + script = getattr(script_context, script.id) + script(sci) # May throw an exception. + + # Queue the "Before Commit" scripts + sm = getSecurityManager() + before_commit_script_list = tdef.getBeforeCommitScriptValueList() + for script in before_commit_script_list: + transaction.get().addBeforeCommitHook(self._before_commit, + (sci, script.id, sm)) + + # Execute "activity" scripts + activity_script_list = tdef.getActivateScriptValueList() + for script in activity_script_list: + self.activate(activity='SQLQueue')\ + .activeScript(script.id, ob.getRelativeUrl(), status, tdef.getId()) + + def _before_commit(self, sci, script_name, security_manager): + # check the object still exists before calling the script + ob = sci.object + while ob.isTempObject(): + ob = ob.getParentValue() + if aq_base(self.unrestrictedTraverse(ob.getPhysicalPath(), None)) is \ + aq_base(ob): + current_security_manager = getSecurityManager() + try: + # Who knows what happened to the authentication context + # between here and when the interaction was executed... So we + # need to switch to the security manager as it was back then + setSecurityManager(security_manager) + self._getOb(script_name)(sci) + finally: + setSecurityManager(current_security_manager) + + security.declarePrivate('activeScript') + def activeScript(self, script_name, ob_url, former_status, tdef_id, + script_context=None): + script_context = self._asScriptContext() + script = getattr(script_context, script_name) + ob = self.unrestrictedTraverse(ob_url) + tdef = self._getOb(tdef_id) + sci = StateChangeInfo( + ob, self, former_status, tdef, None, None, None) + script(sci) + + security.declarePrivate('isActionSupported') + def isActionSupported(self, document, action, **kw): + ''' + Returns a true value if the given action name + is possible in the current state. + ''' + sdef = self._getWorkflowStateOf(document, id_only=0) + if sdef is None: + return 0 + + if action in sdef.getDestinationIdList(): + tdef = self._getOb(action, None) + if (tdef is not None and + tdef.getTriggerType() == TRIGGER_USER_ACTION and + self._checkTransitionGuard(tdef, document, **kw)): + return 1 + return 0 + + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateValueById') + def getStateValueById(self, reference): + return None + + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateValueList') + def getStateValueList(self): + return [] + + security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML') + def showAsXML(self, root=None): + if root is None: + root = Element('erp5') + return_as_object = False + + # Define a list of property to show to users: + # It seems even in DC interaction workflow, creation guard hasn't been configured; + # so it is not used? thus I didn't show creation guard as xml here. (zwj) + interaction_workflow_prop_id_to_show = sorted(['description', + 'manager_bypass']) + # workflow as XML, need to rename DC workflow's portal_type before comparison. + interaction_workflow = SubElement(root, 'interaction_workflow', + attrib=dict(reference=self.getReference(), + portal_type=self.getPortalType())) + + for prop_id in sorted(interaction_workflow_prop_id_to_show): + prop_value = self.getProperty(prop_id) + prop_type = self.getPropertyType(prop_id) + sub_object = SubElement(interaction_workflow, prop_id, attrib=dict(type=prop_type)) + if prop_value is None or prop_value == [] or prop_value == (): + prop_value = '' + sub_object.text = str(prop_value) + + # 1. Interaction as XML + interaction_reference_list = [] + interaction_list = self.objectValues(portal_type='Interaction') + interaction_prop_id_to_show = sorted(['activate_script_name', + 'after_script_name', 'before_commit_script_name', 'description', + 'groups', 'roles', 'expr', 'permissions', 'trigger_method_id', + 'trigger_once_per_transaction', 'portal_type_filter', 'portal_type_group_filter', + 'script_name', 'temporary_document_disallowed', 'trigger_type']) + for tdef in interaction_list: + interaction_reference_list.append(tdef.getReference()) + interactions = SubElement(interaction_workflow, 'interactions', attrib=dict( + interaction_list=str(interaction_reference_list), + number_of_element=str(len(interaction_reference_list)))) + for tdef in interaction_list: + interaction = SubElement(interactions, 'interaction', attrib=dict( + reference=tdef.getReference(),portal_type=tdef.getPortalType())) + guard = SubElement(interaction, 'guard', attrib=dict(type='object')) + for property_id in interaction_prop_id_to_show: + # creationg guard + if property_id in ['groups', 'permissions', 'roles']: + if property_id == 'groups': prop_id = 'group_list' + if property_id == 'permissions': prop_id = 'permission_list' + if property_id == 'roles': prop_id = 'role_list' + property_value = tdef.getProperty(prop_id) + if property_value is not None: + property_value = tuple(property_value) + sub_object = SubElement(guard, property_id, attrib=dict(type='guard configuration')) + elif property_id == 'expr': + property_value = tdef.getGuardExpression() + sub_object = SubElement(guard, property_id, attrib=dict(type='guard configuration')) + # no-property definded action box configuration + elif property_id == 'trigger_type': + property_value = getattr(tdef, property_id, None) + sub_object = SubElement(interaction, property_id, attrib=dict(type='string')) + elif property_id in ['activate_script_name', 'after_script_name', + 'before_commit_script_name', 'portal_type_filter', 'trigger_method_id', 'method_id', + 'portal_type_group_filter', 'script_name', 'once_per_transaction', + 'temporary_document_disallowed']: + if property_id == 'activate_script_name': prop_id = 'activate_script_name_list' + if property_id == 'after_script_name': prop_id = 'after_script_name_list' + if property_id == 'before_commit_script_name': prop_id = 'before_commit_script_name_list' + if property_id in ('method_id', 'trigger_method_id'): prop_id = 'trigger_method_id_list' + if property_id == 'once_per_transaction': prop_id = 'trigger_once_per_transaction' + if property_id == 'portal_type_filter': prop_id = 'portal_type_filter_list' + if property_id == 'portal_type_group_filter': prop_id = 'portal_type_group_filter_list' + if property_id == 'script_name': prop_id = 'before_script_name_list' + if property_id == 'temporary_document_disallowed': prop_id = 'temporary_document_disallowed' + property_value = tdef.getProperty(prop_id) + + if property_id in ['activate_script_name', 'after_script_name', + 'before_commit_script_name','script_name'] and property_value is not None: + list_temp =[] + for value in property_value: + list_temp.append(self._getOb(value).getReference()) + property_value = list_temp + sub_object = SubElement(interaction, property_id, attrib=dict(type='string')) + else: + property_value = tdef.getProperty(property_id) + property_type = tdef.getPropertyType(property_id) + sub_object = SubElement(interaction, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value == [] or property_value == (): + property_value = '' + sub_object.text = str(property_value) + + # 2. Variable as XML + variable_reference_list = [] + variable_list = self.objectValues(portal_type='Workflow Variable') + variable_prop_id_to_show = ['description', 'variable_expression', + 'for_catalog', 'for_status', 'automatic_update'] + for vdef in variable_list: + variable_reference_list.append(vdef.getReference()) + variables = SubElement(interaction_workflow, 'variables', attrib=dict(variable_list=str(variable_reference_list), + number_of_element=str(len(variable_reference_list)))) + for vdef in variable_list: + variable = SubElement(variables, 'variable', attrib=dict(reference=vdef.getReference(), + portal_type=vdef.getPortalType())) + for property_id in sorted(variable_prop_id_to_show): + if property_id == 'automatic_update': + property_value = vdef.getAutomaticUpdate() + sub_object = SubElement(variable, property_id, attrib=dict(type='int')) + elif property_id == 'variable_value': + property_value = vdef.getVariableValue() + sub_object = SubElement(variable, property_id, attrib=dict(type='string')) + else: + property_value = vdef.getProperty(property_id) + property_type = vdef.getPropertyType(property_id) + sub_object = SubElement(variable, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value ==() or property_value == []: + property_value = '' + sub_object.text = str(property_value) + + # 3. Script as XML + script_reference_list = [] + script_list = self.objectValues(portal_type='Workflow Script') + script_prop_id_to_show = sorted(['body', 'parameter_signature','proxy_roles']) + for sdef in script_list: + script_reference_list.append(sdef.getReference()) + scripts = SubElement(interaction_workflow, 'scripts', attrib=dict(script_list=str(script_reference_list), + number_of_element=str(len(script_reference_list)))) + for sdef in script_list: + script = SubElement(scripts, 'script', attrib=dict(reference=sdef.getReference(), + portal_type=sdef.getPortalType())) + for property_id in script_prop_id_to_show: + if property_id == 'proxy_roles': + property_value = tuple(sdef.getProperty('proxy_role_list')) + property_type = sdef.getPropertyType('proxy_role_list') + else: + property_value = sdef.getProperty(property_id) + property_type = sdef.getPropertyType(property_id) + sub_object = SubElement(script, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value == [] or property_value == (): + property_value = '' + sub_object.text = str(property_value) + + # return xml object + if return_as_object: + return root + return etree.tostring(root, encoding='utf-8', + xml_declaration=True, pretty_print=True) diff --git a/product/ERP5Workflow/Document/State.py b/product/ERP5Workflow/Document/State.py index f1d9db82dae12cc6e546772b7eb14a55c345ec04..1322e4045f8d570cbd7cbc8f0bae18c10aea41b1 100644 --- a/product/ERP5Workflow/Document/State.py +++ b/product/ERP5Workflow/Document/State.py @@ -2,7 +2,7 @@ # # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. # Romain Courteaud -# +# 2015 Wenjie ZHENG # 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 @@ -27,8 +27,11 @@ ############################################################################## from AccessControl import ClassSecurityInfo - +from Acquisition import aq_inner, aq_parent +from Persistence import PersistentMapping from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.XMLMatrix import XMLMatrix from Products.ERP5Type.XMLObject import XMLObject from zLOG import LOG, ERROR, DEBUG, WARNING @@ -38,7 +41,21 @@ class StateError(Exception): """ pass -class State(XMLObject): +# Prototype of a mixin allowing to have custom storage for matrix +class CustomStorageMatrixMixin(XMLMatrix): + + def newCellContent(self, cell_id, **kw): + """ + Creates a new content as a matrix box cell. + """ + cell = self.newContent(id=cell_id, temp_object=True, **kw) + self.updateCellFromCustomStorage(cell) + return cell + + def getCell(self, *kw , **kwd): + return self.newCell(*kw , **kwd) + +class State(IdAsReferenceMixin("state_", "prefix"), XMLObject, CustomStorageMatrixMixin): """ A ERP5 State. """ @@ -47,76 +64,125 @@ class State(XMLObject): add_permission = Permissions.AddPortalContent isPortalContent = 1 isRADContent = 1 + default_reference = '' + state_type = () + acquire_permission = [] + state_permission_roles_dict = {} # Declarative security security = ClassSecurityInfo() security.declareObjectProtected(Permissions.AccessContentsInformation) - + var_values = None # Declarative properties property_sheets = ( PropertySheet.Base, PropertySheet.XMLObject, PropertySheet.CategoryCore, PropertySheet.DublinCore, + PropertySheet.Reference, PropertySheet.State,) - def getAvailableTransitionList(self, document): + def addPossibleTransition(self, tr_ref): + possible_transition_list = self.getCategoryList() + transition = self.getParentValue()._getOb('transition_'+tr_ref, None) + if transition is not None: + tr_path = 'destination/' + '/'.join(transition.getPath().split('/')[2:]) + possible_transition_list.append(tr_path) + self.setCategoryList(possible_transition_list) + + + # XXX(PERF): hack to see Category Tool responsability in new workflow slowness + security.declareProtected(Permissions.AccessContentsInformation, + 'getDestinationList') + def getDestinationList(self): + """ + this getter is redefined to improve performance: + instead of getting all the transition objects from the destination list + to then use their ids, extract the information from the string + """ + prefix_length = len('destination/') + return [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('destination/')] + + + security.declareProtected(Permissions.AccessContentsInformation, + 'getDestinationIdList') + def getDestinationIdList(self): + """ + this getter is redefined to improve performance: + instead of getting all the transition objects from the destination list + to then use their ids, extract the information from the string + """ + return [path.split('/')[-1] for path in self.getCategoryList() + if path.startswith('destination/')] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getDestinationValueList') + def getDestinationValueList(self): + """ + this getter is redefined to improve performance: + instead of getting all the transition objects from the destination list + to then use their ids, extract the information from the string + """ + parent = self.getParentValue() + return [parent._getOb(destination_id) for destination_id in + self.getDestinationIdList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getTransitions') + getTransitions = getDestinationIdList + + security.declareProtected(Permissions.AccessContentsInformation, + 'setStatePermissionRolesDict') + def setStatePermissionRolesDict(self, permission_roles): """ - Return available transitions only if they are accessible for document. + create a dict containing the state's permission (as key) and its + associated role list (value) + use a PersistentMapping so that the ZODB is updated + when this dict is changed """ - transition_list = self.getDestinationValueList(portal_type = 'Transition') - result_list = [] - for transition in transition_list: - value = transition._checkPermission(document) - if value: - result_list.append(transition) - return result_list + self.state_permission_roles_dict = PersistentMapping(permission_roles) - def executeTransition(self, transition, document, form_kw=None): + security.declareProtected(Permissions.ModifyPortalContent, + 'getStatePermissionRolesDict') + def getStatePermissionRolesDict(self): """ - Execute transition on the object. + return the permission/roles dict """ - if transition not in self.getAvailableTransitionList(document): - raise StateError - else: - transition.execute(document, form_kw=form_kw) + if self.state_permission_roles_dict is None: + return {} + return self.state_permission_roles_dict - def undoTransition(self, document): + security.declareProtected(Permissions.ModifyPortalContent, + 'setPermission') + def setPermission(self, permission, acquired, roles, REQUEST=None): """ - Reverse previous transition + Set a permission for this State. """ - wh = self.getWorkflowHistory(document, remove_undo=1) - status_dict = wh[-2] - # Update workflow state - state_bc_id = self.getParentValue().getStateBaseCategory() - document.setCategoryMembership(state_bc_id, status_dict[state_bc_id]) - # Update workflow history - status_dict['undo'] = 1 - self.getParentValue()._updateWorkflowHistory(document, status_dict) - # XXX - LOG("State, undo", ERROR, "Variable (like DateTime) need to be updated!") + self.state_permission_roles_dict[permission] = list(roles) - def getWorkflowHistory(self, document, remove_undo=0, remove_not_displayed=0): + security.declareProtected(Permissions.AccessContentsInformation, + 'getAvailableTypeList') + def getAvailableTypeList(self): """ - Return history tuple + This is a method specific to ERP5. This returns a list of state types, + which are used for portal methods. """ - wh = document.workflow_history[self.getParentValue()._generateHistoryKey()] - result = [] - # Remove undo - if not remove_undo: - result = [x.copy() for x in wh] - else: - result = [] - for x in wh: - if x.has_key('undo') and x['undo'] == 1: - result.pop() - else: - result.append(x.copy()) - return result + return ( + 'draft_order', + 'planned_order', + 'future_inventory', + 'reserved_inventory', + 'transit_inventory', + 'current_inventory', + ) - def getVariableValue(self, document, variable_name): + security.declareProtected(Permissions.ModifyPortalContent, + 'updateCellFromCustomStorage') + def updateCellFromCustomStorage(self, cell, **kw): """ - Get current value of the variable from the object + Creates a new content as a matrix box cell. """ - status_dict = self.getParentValue().getCurrentStatusDict(document) - return status_dict[variable_name] + cell_permission = cell._getPermission() + cell_role = cell._getRole() + cell.selected = cell_role in self.getStatePermissionRolesDict()[cell_permission] diff --git a/product/ERP5Workflow/Document/Transition.py b/product/ERP5Workflow/Document/Transition.py index 5d7cd1d2d7e90c3fdbd6ad418935d954da49970c..7b61ca42effcbd7e99a41d92a874403e85732bd3 100644 --- a/product/ERP5Workflow/Document/Transition.py +++ b/product/ERP5Workflow/Document/Transition.py @@ -2,7 +2,7 @@ # # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. # Romain Courteaud -# +# 2015 Wenjie Zheng # 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 @@ -26,13 +26,29 @@ # ############################################################################## -from AccessControl import ClassSecurityInfo +import sys +from AccessControl import ClassSecurityInfo +from Acquisition import aq_base +from copy import deepcopy +from Products.DCWorkflow.DCWorkflow import ObjectDeleted, ObjectMoved from Products.ERP5Type import Permissions, PropertySheet -from Products.ERP5Type.XMLObject import XMLObject from Products.ERP5Type.Accessor.Base import _evaluateTales +from Products.ERP5Type.Globals import PersistentMapping +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.patches.DCWorkflow import ValidationFailed +from Products.ERP5Type.patches.WorkflowTool import WorkflowHistoryList +from Products.ERP5Type.Utils import convertToUpperCase, convertToMixedCase +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.mixin.guardable import GuardableMixin +from zLOG import LOG, ERROR, DEBUG, WARNING -class Transition(XMLObject): +TRIGGER_AUTOMATIC = 0 +TRIGGER_USER_ACTION = 1 +TRIGGER_WORKFLOW_METHOD = 2 + +class Transition(IdAsReferenceMixin("transition_", "prefix"), XMLObject, + GuardableMixin): """ A ERP5 Transition. """ @@ -42,7 +58,9 @@ class Transition(XMLObject): add_permission = Permissions.AddPortalContent isPortalContent = 1 isRADContent = 1 - + trigger_type = TRIGGER_USER_ACTION #zwj: type is int 0, 1, 2 + var_exprs = None # A mapping. + default_reference = '' # Declarative security security = ClassSecurityInfo() security.declareObjectProtected(Permissions.AccessContentsInformation) @@ -53,95 +71,94 @@ class Transition(XMLObject): PropertySheet.XMLObject, PropertySheet.CategoryCore, PropertySheet.DublinCore, + PropertySheet.Reference, PropertySheet.Transition, + PropertySheet.Guard, + PropertySheet.ActionInformation, ) - def execute(self, document, form_kw=None): + # following getters are redefined for performance improvements + # they use the categories paths directly and string operations + # instead of traversing from the portal to get the objects + # in order to have their id or value + + # XXX(PERF): hack to see Category Tool responsability in new workflow slowness + security.declareProtected(Permissions.AccessContentsInformation, + 'getActionType') + def getActionType(self): + prefix_length = len('action_type/') + action_type_list = [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('action_type/')] + return action_type_list[0] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeScriptList') + def getBeforeScriptList(self): + """ + returns the list of before script + """ + prefix_length = len('before_script/') + return [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('before_script/')] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getAfterScriptList') + def getAfterScriptList(self): """ - Execute transition. + returns the list of after script """ - workflow = self.getParentValue() - # Call the before script - self._executeBeforeScript(document) - - # Modify the state - self._changeState(document) - - # Get variable values - status_dict = workflow.getCurrentStatusDict(document) - status_dict['undo'] = 0 - - # Modify workflow history - state_bc_id = workflow.getStateBaseCategory() - status_dict[state_bc_id] = document.getCategoryMembershipList(state_bc_id)[0] - - state_object = document.unrestrictedTraverse(status_dict[state_bc_id]) - object = workflow.getStateChangeInformation(document, state_object, transition=self) - - # Update all variables - for variable in workflow.contentValues(portal_type='Variable'): - if variable.getAutomaticUpdate(): - # if we have it in form get it from there - # otherwise use default - variable_title = variable.getTitle() - if variable_title in form_kw: - status_dict[variable_title] = form_kw[variable_title] - else: - status_dict[variable_title] = variable.getInitialValue(object=object) - - # Update all transition variables - if form_kw is not None: - object.REQUEST.other.update(form_kw) - for variable in self.contentValues(portal_type='Transition Variable'): - status_dict[variable.getCausalityTitle()] = variable.getInitialValue(object=object) - - workflow._updateWorkflowHistory(document, status_dict) - - # Call the after script - self._executeAfterScript(document, form_kw=form_kw) - - def _changeState(self, document): + prefix_length = len('after_script/') + return [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('after_script/')] + + + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeScriptIdList') + def getBeforeScriptIdList(self): """ - Change the state of the object. + returns the list of before script ids """ - state = self.getDestination() - if state is not None: - # Some transitions don't update the state - state_bc_id = self.getParentValue().getStateBaseCategory() - document.setCategoryMembership(state_bc_id, state) + return [path.split('/')[-1] for path in self.getBeforeScriptList()] - def _executeAfterScript(self, document, form_kw=None): + security.declareProtected(Permissions.AccessContentsInformation, + 'getBeforeScriptValueList') + def getBeforeScriptValueList(self): """ - Execute post transition script. + returns the list of before script values """ - if form_kw is None: - form_kw = {} - script_id = self.getAfterScriptId() - if script_id is not None: - script = getattr(document, script_id) - script(**form_kw) - - def _executeBeforeScript(self, document, form_kw=None): + parent = self.getParentValue() + return [parent._getOb(transition_id) for transition_id + in self.getBeforeScriptIdList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getAfterScriptIdList') + def getAfterScriptIdList(self): """ - Execute pre transition script. + returns the list of after script ids """ - if form_kw is None: - form_kw = {} - script_id = self.getBeforeScriptId() - if script_id is not None: - script = getattr(document, script_id) - script(**form_kw) - - def _checkPermission(self, document): + return [path.split('/')[-1] for path in self.getAfterScriptList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getAfterScriptValueList') + def getAfterScriptValueList(self): """ - Check if transition is allowed. + returns the list of after script values """ - expr_value = self.getGuardExpression(evaluate=0) - if expr_value is not None: - # do not use 'getGuardExpression' to calculate tales because - # it caches value which is bad. Instead do it manually - value = _evaluateTales(document, expr_value) - else: - value = True - #print "CALC", expr_value, '-->', value - return value + parent = self.getParentValue() + return [parent._getOb(transition_id) for transition_id + in self.getAfterScriptIdList()] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getDestinationValue') + def getDestinationValue(self): + """ + returns the destination object + """ + + destination_path_list = [path for path in self.getCategoryList() + if path.startswith('destination/')] + if destination_path_list: + destination_id = destination_path_list[0].split('/')[-1] + parent = self.getParentValue() + return parent._getOb(destination_id) + return None diff --git a/product/ERP5Workflow/Document/Workflow.py b/product/ERP5Workflow/Document/Workflow.py index 94916759e018424cfc99b5acb5c6b7dddbe407ce..17116359d0d11fa1751929c28e636069520de9f5 100644 --- a/product/ERP5Workflow/Document/Workflow.py +++ b/product/ERP5Workflow/Document/Workflow.py @@ -2,7 +2,7 @@ # # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. # Romain Courteaud -# +# 2014 Wenjie Zheng # 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 @@ -26,31 +26,115 @@ # ############################################################################## -from AccessControl import ClassSecurityInfo +import os +import sys +from AccessControl import ClassSecurityInfo +from AccessControl.unauthorized import Unauthorized +from AccessControl.Permission import Permission +from AccessControl.SecurityManagement import getSecurityManager +from Acquisition import aq_base, aq_inner, aq_parent +from copy import deepcopy +from DateTime import DateTime +from DocumentTemplate.DT_Util import TemplateDict +from lxml import etree +from lxml.etree import Element, SubElement +from Products.CMFCore.Expression import Expression +from Products.CMFCore.WorkflowCore import WorkflowException, ObjectDeleted,\ + ObjectMoved +from Products.DCWorkflow.DCWorkflow import ValidationFailed +from Products.DCWorkflow.Expression import StateChangeInfo, createExprContext +from Products.DCWorkflow.utils import Message as _ from Products.ERP5Type import Permissions, PropertySheet -from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Type.Cache import CachingMethod from Products.ERP5Type.Globals import PersistentMapping - +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.patches.DCWorkflow import _marker +from Products.ERP5Type.patches.WorkflowTool import SECURITY_PARAMETER_ID,\ + WORKLIST_METADATA_KEY +from Products.ERP5Type.Utils import UpperCase, convertToMixedCase +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.Document.Transition import TRIGGER_AUTOMATIC,\ + TRIGGER_USER_ACTION, TRIGGER_WORKFLOW_METHOD +from Products.ERP5Workflow.Document.WorkflowScript import SCRIPT_PREFIX from tempfile import mktemp -import os -from Products.DCWorkflowGraph.config import DOT_EXE -from Products.DCWorkflowGraph.DCWorkflowGraph import bin_search, getGraph +from types import StringTypes +from zLOG import LOG, INFO, WARNING -from Acquisition import aq_base +from Products.CMFCore.Expression import getEngine -from DateTime import DateTime +userGetIdOrUserNameExpression = Expression('user/getIdOrUserName') +userGetIdOrUserNameExpression._v_compiled = getEngine().compile( + userGetIdOrUserNameExpression.text) + +ACTIVITY_GROUPING_COUNT = 100 -class Workflow(XMLObject): +def gather_permission_dict(klass, result): + for base in klass.__bases__: + if '__ac_permissions__' in base.__dict__: + for p in base.__ac_permissions__: + name=p[0] + if name in result: + continue + result[name] = () + gather_permission_dict(base, result) + return result + +def ac_all_inherited_permissions_dict(ob): + # Get all permissions not defined in ourself that are inheri ted + # This will be a sequence of tuples with a name as the first item and + # an empty tuple as the second. + permission_roles_tuple_list = getattr(ob, '__ac_permissions__', ()) + # permission_roles_tuple_list: [(permission1, (roleA, roleB)), ...] + permission_roles_dict = {p[0]: p[1] for p in permission_roles_tuple_list} + permission_roles_dict = gather_permission_dict(ob.__class__, permission_roles_dict) + if hasattr(ob, '_subobject_permissions'): + for p in ob._subobject_permissions(): + permission_name=p[0] + roles = p[1] + if not permission_roles_dict.has_key(permission_name): + permission_roles_dict[permission_name] = roles + return permission_roles_dict + +def modifyRolesForPermissionDict(ob, new_permission_roles_dict): + # copied and modified version of modifyRolesForPermission + # in Products.DCWorkflow.utils + # this has been refactored to pass a dict as parameter + # and avoid multiple expensive calls to ac_inherited_permissions + + ''' + Modifies multiple role to permission mappings. roles is a list to + acquire, a tuple to not acquire. + ''' + # This mimics what AccessControl/Role.py does. + + new_permission_roles_dict_length = len(new_permission_roles_dict) + modified = False + inherited_permission_dict = ac_all_inherited_permissions_dict(ob) + for name, new_roles in new_permission_roles_dict.iteritems(): + old_roles = inherited_permission_dict[name] + p = Permission(name, old_roles, ob) + old_roles = p.getRoles() + if type(old_roles) != type(new_roles) or sorted(old_roles) != sorted(new_roles): + p.setRoles(new_roles) + modified = True + return modified + +class Workflow(IdAsReferenceMixin("", "prefix"), XMLObject): """ A ERP5 Workflow. """ - + id = '' meta_type = 'ERP5 Workflow' portal_type = 'Workflow' + _isAWorkflow = True # DCWorkflow Tool compatibility add_permission = Permissions.AddPortalContent isPortalContent = 1 isRADContent = 1 + default_reference = '' + workflow_managed_permission = () + managed_role = () + manager_bypass = 0 # Declarative security security = ClassSecurityInfo() @@ -62,30 +146,29 @@ class Workflow(XMLObject): PropertySheet.XMLObject, PropertySheet.CategoryCore, PropertySheet.DublinCore, + PropertySheet.Reference, PropertySheet.Workflow, ) - def initializeDocument(self, document): + security.declarePrivate('notifyCreated') + def notifyCreated(self, document): """ - Set initial state on the Document + Notifies this workflow after an object has been created and added. """ - state_bc_id = self.getStateBaseCategory() - document.setCategoryMembership(state_bc_id, self.getSource()) + try: + self._changeStateOf(document, None) + except ( ObjectDeleted, ObjectMoved ): + # Swallow. + pass - object = self.getStateChangeInformation(document, self.getSourceValue()) - - # Initialize workflow history - status_dict = {state_bc_id: self.getSource()} - variable_list = self.contentValues(portal_type='Variable') - for variable in variable_list: - status_dict[variable.getTitle()] = variable.getInitialValue(object=object) - self._updateWorkflowHistory(document, status_dict) + security.declarePrivate('initializeDocument') + initializeDocument = notifyCreated def _generateHistoryKey(self): """ Generate a key used in the workflow history. """ - return self.getRelativeUrl() + return self.getReference() def _updateWorkflowHistory(self, document, status_dict): """ @@ -103,29 +186,22 @@ class Workflow(XMLObject): document.workflow_history[workflow_key] = () # Update history - document.workflow_history[workflow_key] += (status_dict, ) - # XXX this _p_changed marks the document modified, but the - # only the PersistentMapping is modified - document._p_changed = 1 + document.workflow_history[workflow_key] += (status_dict,) + # XXX this _p_changed marks the document modified, but only the + # PersistentMapping is modified + # document._p_changed = 1 # XXX this _p_changed is apparently not necessary - document.workflow_history._p_changed = 1 - - def getCurrentStatusDict(self, document): - """ - Get the current status dict. - """ - workflow_key = self._generateHistoryKey() - - # Copy is requested - result = document.workflow_history[workflow_key][-1].copy() - return result + #document.workflow_history._p_changed = 1 + security.declarePublic('getDateTime') def getDateTime(self): """ Return current date time. """ return DateTime() + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateChangeInformation') def getStateChangeInformation(self, document, state, transition=None): """ Return an object used for variable tales expression. @@ -139,57 +215,1228 @@ class Workflow(XMLObject): transition_url=transition_url, state=state) - ########### - ## Graph ## - ############ + security.declarePrivate('isWorkflowMethodSupported') + def isWorkflowMethodSupported(self, document, transition_reference, state=None): + # The optional argument state is used to avoid multiple expensive calls to + # _getWorkflowStateOf. This method should be kept private. + if state is None: + state = self._getWorkflowStateOf(document, id_only=0) - getGraph = getGraph + transition_id = self.getTransitionIdByReference(transition_reference) + if state is None: + return False - def getPOT(self, *args, **kwargs): - """ - get the pot, copy from: - "dcworkfow2dot.py":http://awkly.org/Members/sidnei/weblog_storage/blog_27014 - and Sidnei da Silva owns the copyright of the this function + if transition_id in state.getDestinationIdList(): + transition = self._getOb(transition_id, None) + if (transition is not None and + transition.getTriggerType() == TRIGGER_WORKFLOW_METHOD and + self._checkTransitionGuard(transition, document)): + return True + return False + + security.declarePrivate('isActionSupported') + def isActionSupported(self, document, action, state=None, **kw): + ''' + Returns a true value if the given action name + is possible in the current state. + ''' + if state is None: + state = self._getWorkflowStateOf(document, id_only=0) + if state is None: + return 0 + + if action in state.getDestinationIdList(): + transition = getattr(self, action, None) + if (transition is not None and + transition.getTriggerType() == TRIGGER_USER_ACTION and + self._checkTransitionGuard(transition, document, **kw)): + return 1 + return 0 + + security.declarePrivate('isInfoSupported') + def isInfoSupported(self, ob, name): + ''' + Returns a true value if the given info name is supported. + ''' + if name == self.getStateVariable(): + return True + return name in self.getVariableIdList() + + def _checkTransitionGuard(self, transition, document, **kw): + return transition.checkGuard(getSecurityManager(), self, document, **kw) + + def _findAutomaticTransition(self, document, state): + transition = None + checkTransitionGuard = self._checkTransitionGuard + for possible_transition in state.getDestinationValueList(): + if possible_transition.getTriggerType() == TRIGGER_AUTOMATIC: + if checkTransitionGuard(possible_transition, document): + transition = possible_transition + break + return transition + + security.declarePrivate('updateRoleMappingsFor') + def updateRoleMappingsFor(self, ob): + # Patch updateRoleMappingsFor so that if 2 workflows define security, then + # we should do an AND operation between each roles list for a given + # permission + # XXX(WORKFLOW): this is not tested: add a test with multiple workflows + # defining different permissions + ''' + Changes the object permissions according to the current + state. + ''' + changed = False + state = self._getWorkflowStateOf(ob) + tool = aq_parent(aq_inner(self)) + other_data_list = [] + new_permission_roles_dict = {} + + # Be carefull, permissions_roles should not change + # from list to tuple or vice-versa. (in modifyRolesForPermission, + # list means acquire roles, tuple means do not acquire) + if state is not None and self.getWorkflowManagedPermissionList(): + # apply expensive operations out of the loop (see below), for the other + # workflow associated to object ob + for other_workflow in tool.getWorkflowsFor(ob): + other_workflow_type = other_workflow.getPortalType() + if other_workflow.id == self.id or other_workflow_type not in \ + ('DCWorkflowDefinition', 'Workflow'): + continue + other_state = other_workflow._getWorkflowStateOf(ob) + if other_state is not None: + other_state_permission_roles_dict = other_state.getStatePermissionRolesDict() + if other_state_permission_roles_dict is not None: + other_data_list.append( + (other_workflow, other_state, other_state_permission_roles_dict,) + ) + + # take care of the current state of ob for this workflow (self) + state_permission_roles_dict = state.getStatePermissionRolesDict() + acquired_permission_list = state.getAcquirePermissionList() + for permission in self.getWorkflowManagedPermissionList(): + default_roles = [] + refused_roles = [] + role_type = list + other_role_type_list = [] + if state_permission_roles_dict is not None: + roles = state_permission_roles_dict.get(permission, default_roles) + # store acquisition settings + if acquired_permission_list is _marker or roles is default_roles: + role_type = type(roles) + else: + role_type = list if permission in acquired_permission_list else tuple + + roles = set(roles) + # in every other workflow activated on the current object, get the + # roles associated to permission; in case of role defined + for (other_workflow, other_state, other_state_permission_roles_dict) \ + in other_data_list: + other_acquired_permission_list = other_state.getAcquirePermissionList() + if permission in other_workflow.getWorkflowManagedPermissionList(): + other_roles = other_state_permission_roles_dict.get(permission, default_roles) + if other_acquired_permission_list is _marker: # compatibility with DCWorkflow + other_role_type_list.append(type(other_roles)) + else: # ERP5 workflows + other_role_type_list.append( + list if (other_roles is default_roles or permission in + other_acquired_permission_list) else tuple + ) + # get the common values between the roles set and the other + # workflows roles for the same permission + roles = roles.intersection(other_roles) + + roles = sorted(roles) + if role_type is tuple and list not in other_role_type_list: + # at least, one of other workflows manage security and for all are + # role_type are tuple (= no role acquisition for this permission) + roles = tuple(roles) + + new_permission_roles_dict[permission] = roles + changed = modifyRolesForPermissionDict(ob, new_permission_roles_dict) + return changed + + # This method allows to update all objects using one workflow, for example + # after the permissions per state for this workflow were modified + security.declareProtected(Permissions.ModifyPortalContent, 'updateRoleMappings') + def updateRoleMappings(self, REQUEST=None): + """ + Changes permissions of all objects related to this workflow + """ + # XXX(WORKFLOW) add test for roles update: + # - edit permission/roles on a workflow + # - check permission on an existing object of a type using this workflow + workflow_tool = aq_parent(aq_inner(self)) + type_info_list = workflow_tool._listTypeInfo() + workflow_id = self.id + # check the workflow defined on the type objects + portal_type_id_list = [ + portal_type.getId() for portal_type in type_info_list + if workflow_id in portal_type.getTypeWorkflowList() + ] + + if portal_type_id_list: + object_list = self.portal_catalog(portal_type=portal_type_id_list, limit=None) + portal_activities = self.portal_activities + object_path_list = [x.path for x in object_list] + for i in xrange(0, len(object_list), ACTIVITY_GROUPING_COUNT): + current_path_list = object_path_list[i:i+ACTIVITY_GROUPING_COUNT] + portal_activities.activate(activity='SQLQueue', + priority=3)\ + .callMethodOnObjectList(current_path_list, + 'updateRoleMappingsFor', + wf_id = self.getId()) + else: + object_list = [] + if REQUEST is not None: + message = 'No object updated.' + if object_list: + message = '%d object(s) updated: \n %s.' % (len(object_list), + ', '.join([o.getTitleOrId() + ' (' + o.getPortalType() + ')' + for o in object_list])) + return message + else: + return len(object_list) + + def getManagedRoleList(self): + return sorted(self.getPortalObject().acl_users.valid_roles()) + + security.declarePrivate('doActionFor') + def doActionFor(self, document, action, comment='', is_action_supported=_marker, **kw): + ''' + Allows the user to request a workflow action. This method + must perform its own security checks. + ''' + state = self._getWorkflowStateOf(document, id_only=0) + kw['comment'] = comment + if state is None: + raise WorkflowException(_(u'Object is in an undefined state.')) + + if is_action_supported is _marker: + is_action_supported = self.isActionSupported(document, action, + state=state, **kw) + if not is_action_supported: + # action is not allowed from the current state + raise Unauthorized(action) + + transition = self._getOb(action, None) + + if transition is None or transition.getTriggerType() != TRIGGER_USER_ACTION: + msg = _(u"Transition '${action_id}' is not triggered by a user " + u"action.", mapping={'action_id': action}) + raise WorkflowException(msg) + if not self._checkTransitionGuard(transition, document, **kw): + raise Unauthorized(action) + self._changeStateOf(document, transition, kw) + + def _changeStateOf(self, document, tdef=None, kwargs=None): + ''' + Changes state. Can execute multiple transitions if there are + automatic transitions. transition set to None means the object + was just created. + ''' + moved_exc = None + transition = tdef + while 1: + try: + state = self._executeTransition(document, transition, kwargs) + except ObjectMoved, moved_exc: + document = moved_exc.getNewObject() + state = self._getWorkflowStateOf(document, id_only=0) + # Re-raise after all transitions. + if state is None: + break + transition = self._findAutomaticTransition(document, state) + if transition is None: + # No more automatic transitions. + break + # Else continue. + if moved_exc is not None: + # Re-raise. + raise moved_exc + + security.declarePrivate('listObjectActions') + def listObjectActions(self, info): + fmt_data = None + document = info.object + sdef = self._getWorkflowStateOf(document, id_only=0) + if sdef is None: + return None + object_action_list = [] + append = object_action_list.append + + for tid in sdef.getDestinationIdList(): + tdef = self._getOb(id=tid) + if tdef is not None and tdef.getTriggerType() == TRIGGER_USER_ACTION and \ + tdef.getActionName() and self._checkTransitionGuard(tdef, document): + if fmt_data is None: + fmt_data = TemplateDict() + fmt_data._push(info) + tdef_reference = tdef.getReference() + fmt_data._push({'transition_id': tdef_reference}) + append((tid, { + 'id': tdef_reference, + 'name': tdef.getActionName() % fmt_data, + 'url': str(tdef.getAction()) % fmt_data, + 'icon': str(tdef.getIcon()) % fmt_data, + 'permissions': (), # Predetermined. + 'category': tdef.getActionType(), + 'transition': tdef})) + fmt_data._pop() + object_action_list.sort() + + return [ result[1] for result in object_action_list ] + + security.declarePrivate('getWorklistVariableMatchDict') + def getWorklistVariableMatchDict(self, info, check_guard=True): + """ + Return a dict which has an entry per worklist definition + (worklist id as key) and which value is a dict composed of + variable matches. + """ + worklist_value_list = self.getWorklistValueList() + if not worklist_value_list: + return None + expression_context = None + state_change_information = None + + portal = self.getPortalObject() + def getPortalTypeListForWorkflow(workflow_id): + return [type_info.id + for type_info in portal.portal_types.listTypeInfo() + if workflow_id in type_info.getTypeWorkflowList()] + + + _getPortalTypeListForWorkflow = CachingMethod(getPortalTypeListForWorkflow, + id='_getPortalTypeListForWorkflow', cache_factory = 'erp5_ui_long') + portal_type_list = _getPortalTypeListForWorkflow(self.id) + if not portal_type_list: + return None + variable_match_dict = {} + security_manager = getSecurityManager() + workflow_id = self.getId() + workflow_title = self.getTitle() + for worklist_value in worklist_value_list: + action_box_name = worklist_value.getActionName() + is_guarded = worklist_value.isGuarded() + guard_role_list = worklist_value.getGuardRoleList() + if action_box_name: + variable_match = {} + for key in worklist_value.getVarMatchKeys(): + var = worklist_value.getVarMatch(key) + if isinstance(var, Expression): + if state_change_information is None: + state_change_information = StateChangeInfo(portal, self, + kwargs=info.__dict__.copy()) + if expression_context is None: + expression_context = createExprContext(state_change_information) + evaluated_value = var(expression_context) + if isinstance(evaluated_value, (str, int, long)): + evaluated_value = [str(evaluated_value)] + else: + evaluated_value = [x % info for x in var] + variable_match[key] = evaluated_value + + if 'portal_type' in variable_match and len(variable_match['portal_type']): + portal_type_intersection = set(variable_match['portal_type']).intersection(portal_type_list) + # in case the current workflow is not associated with portal_types + # defined on the worklist, don't display the worklist for this + # portal_type. + variable_match['portal_type'] = list(portal_type_intersection) + variable_match.setdefault('portal_type', portal_type_list) + + if len(variable_match.get('portal_type', [])) == 0: + continue + + is_permitted_worklist = 0 + if not is_guarded: + is_permitted_worklist = 1 + elif not check_guard or worklist_value.checkGuard(security_manager, + self, portal, + check_roles=False): + is_permitted_worklist = 1 + variable_match[SECURITY_PARAMETER_ID] = guard_role_list + + if is_permitted_worklist: + fmt_data = TemplateDict() + fmt_data._push(info) + variable_match.setdefault(SECURITY_PARAMETER_ID, ()) + fmt_data._push({k: ('&%s:list=' % k).join(v) for\ + k, v in variable_match.iteritems()}) + + worklist_id = worklist_value.getReference() + variable_match[WORKLIST_METADATA_KEY] = { + 'format_data': fmt_data, + 'worklist_title': action_box_name, + 'worklist_id': worklist_id, + 'workflow_title': workflow_title, + 'workflow_id': workflow_id, + 'action_box_url': worklist_value.getAction(), + 'action_box_category': worklist_value.getActionType()} + + variable_match_dict[worklist_id] = variable_match + + if len(variable_match_dict) == 0: + return None + return variable_match_dict + + security.declarePrivate('getInfoFor') + def getInfoFor(self, ob, name, default): + ''' + Allows the user to request information provided by the + workflow. This method must perform its own security checks. + ''' + if name == self.getStateVariable(): + return self._getWorkflowStateOf(ob, 1) + vdef = self.getVariableValueById(name) + if not vdef.checkGuard(getSecurityManager(), self, ob): + return default + status = self.getCurrentStatusDict(ob) + variable_expression = vdef.getVariableExpression() + if status is not None and status.has_key(name): + value = status[name] + + # Not set yet. Use a default. + elif variable_expression is not None: + ec = createExprContext(StateChangeInfo(ob, self, status)) + value = variable_expression(ec) + else: + value = vdef.getVariableValue() + + return value + + security.declareProtected(Permissions.AccessContentsInformation, + 'getCurrentStatusDict') + def getCurrentStatusDict(self, document): + """ + Get the current status dict. It's the same as _getStatusOf. + """ + workflow_key = self._generateHistoryKey() + workflow_history = self.getParentValue().getHistoryOf(workflow_key, document) + # Copy is requested + if workflow_history: + return workflow_history[-1].copy() + return {} + + def _getStatusOf(self, ob): + tool = self.getParent() + status = tool.getStatusOf(self.getId(), ob) + if status is None: + return {} + else: + # Copy is requested + return status.copy() + + def _getWorkflowStateOf(self, ob, id_only=0): + tool = self.getParentValue() + reference = self.getReference() + status = tool.getStatusOf(reference, ob) + if status is None: + state = self.getSourceValue() + else: + state_id = 'state_' + status.get(self.getStateVariable(), None) + state = self._getOb(state_id) + if state is None: + state = self.getSourceValue() + if id_only: + return state.getReference() + else: + return state + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariableValueDict') + def getVariableValueDict(self): + return {variable.getReference(): variable + for variable in self.objectValues(portal_type="Workflow Variable")} + + security.declareProtected(Permissions.AccessContentsInformation, + 'getCurrentStatusDict') + security.declarePrivate('listObjectActions') + def getVariableValueList(self): + return self.objectValues(portal_type="Workflow Variable") + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariableIdList') + def getVariableIdList(self): + return [variable.getReference() + for variable in self.objectValues(portal_type="Workflow Variable")] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariableValueById') + def getVariableValueById(self, variable_id): + return self._getOb('variable_' + variable_id, default=None) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateValueById') + def getStateValueById(self, stated_id): + return self._getOb('state_' + stated_id, default=None) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateValueList') + def getStateValueList(self): + return self.objectValues(portal_type="State") + + security.declareProtected(Permissions.AccessContentsInformation, + 'getStateIdList') + def getStateIdList(self): + return [state.getReference() + for state in self.objectValues(portal_type="State")] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getWorklistValueList') + def getWorklistValueList(self): + return self.objectValues(portal_type="Worklist") + + security.declareProtected(Permissions.AccessContentsInformation, + 'getWorklistIdList') + def getWorklistIdList(): + return [worklist.getReference() + for worklist in self.objectValues(portal_type="Worklist")] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getTransitionIdByReference') + def getTransitionIdByReference(self, transition_reference): + return 'transition_' + transition_reference + + security.declareProtected(Permissions.AccessContentsInformation, + 'getScriptIdByReference') + def getScriptIdByReference(self, script_reference): + return SCRIPT_PREFIX + script_reference + + security.declareProtected(Permissions.AccessContentsInformation, + 'getScriptValueById') + def getScriptValueById(self, script_id): + return self._getOb(script_id, default=None) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getWorklistValueById') + def getWorklistValueById(self, worklist_reference): + return self._getOb('worklist_' + worklist_reference, None) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getTransitionValueById') + def getTransitionValueById(self, transition_reference): + return self._getOb('transition_' + transition_reference, None) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getTransitionValueList') + def getTransitionValueList(self): + return self.objectValues(portal_type="Transition") + + security.declareProtected(Permissions.AccessContentsInformation, + 'getTransitionIdList') + def getTransitionIdList(self): + return [transition.getReference() for transition + in self.objectValues(portal_type="Transition")] + + security.declareProtected(Permissions.AccessContentsInformation, + 'getScriptValueList') + def getScriptValueList(self): + return self.objectValues(portal_type='Workflow Script') + + security.declarePrivate('notifyWorkflowMethod') + def notifyWorkflowMethod(self, ob, transition_list, args=None, kw=None): + """ Execute workflow methods. + """ + if type(transition_list) in StringTypes: + method_id = transition_list + elif len(transition_list) == 1: + method_id = transition_list[0] + else: + raise ValueError('WorkflowMethod should be attached to exactly 1 transition per DCWorkflow instance.') + sdef = self._getWorkflowStateOf(ob) + if sdef is None: + raise WorkflowException, 'Object is in an undefined state' + prefix_method_id = 'transition_' + method_id + if prefix_method_id not in sdef.getDestinationIdList(): + raise Unauthorized(method_id) + tdef = self._getOb(prefix_method_id) + if tdef is None or tdef.getTriggerType() != TRIGGER_WORKFLOW_METHOD: + raise WorkflowException, ( + 'Transition %s is not triggered by a workflow method' + % method_id) + if not self._checkTransitionGuard(tdef, ob): + raise Unauthorized(method_id) + self._changeStateOf(ob, tdef, kw) + if getattr(ob, 'reindexObject', None) is not None: + if kw is not None: + activate_kw = kw.get('activate_kw', {}) + else: + activate_kw = {} + ob.reindexObject(activate_kw=activate_kw) + + security.declarePrivate('notifyBefore') + def notifyBefore(self, ob, transition_list, args=None, kw=None): + pass + + security.declarePrivate('notifySuccess') + def notifySuccess(self, ob, transition_list, result, args=None, kw=None): + pass + + security.declarePrivate('notifyException') + def notifyException(self, ob, action, exc): + ''' + Notifies this workflow that an action failed. + ''' + pass + + def _executeTransition(self, document, tdef=None, form_kw=None): + """ + Execute transition. + """ + sci = None + econtext = None + moved_exc = None + validation_exc = None + tool = self.getParentValue() + script_context = None + object_context = None + + state_var = self.getStateVariable() + status_dict = self.getCurrentStatusDict(document) + # Figure out the old and new states. + old_state = self._getWorkflowStateOf(document, id_only=0) + if not old_state: + # Do nothing if there is no initial state. We may want to create + # workflows with no state at all, only for worklists. + return + old_state_reference = old_state.getReference() + + if tdef is None: + new_state = old_state + new_state_reference = old_state_reference + former_status = {} + else: + new_state = tdef.getDestinationValue() + new_state_reference = old_state_reference if new_state is None\ + else new_state.getReference() + former_status = status_dict + + # Execute the "before" script. + before_script_success = True + + if tdef is not None: + script_value_list = tdef.getBeforeScriptValueList() + if script_value_list: + if sci is None: + sci = StateChangeInfo(document, self, former_status, tdef, old_state, + new_state, form_kw) + if script_context is None: + script_context = self._asScriptContext() + for script in script_value_list: + # Pass lots of info to the script in a single parameter. + if script.getPortalType() != 'Workflow Script': + raise NotImplementedError ('Unsupported Script %s for state %s' % + (script.id, old_state_reference)) + script = getattr(script_context, script.id) + try: + script(sci) # May throw an exception. + except ValidationFailed, validation_exc: + before_script_success = False + before_script_error_message = deepcopy(validation_exc.msg) + validation_exc_traceback = sys.exc_traceback + except ObjectMoved, moved_exc: + ob = moved_exc.getNewObject() + # Re-raise after transition + + # update variables + state_values = {} + # seems state variable is not used in new workflow. + if new_state is not None: + state_values = getattr(new_state,'var_values', None) or {} + + transition_expression_dict = {} + if tdef is not None: + transition_expression_dict = { + variable.getCausalityId(): variable.getVariableExpression() + for variable in tdef.objectValues(portal_type='Transition Variable') + } + + # Update all transition variables + if form_kw is not None: + if object_context is None: + # XXX(WORKFLOW): investigate: should I keep source value here, or can I use old_state (see test results also) + object_context = self.getStateChangeInformation(document, self.getSourceValue()) + object_context.REQUEST.other.update(form_kw) + + for vdef in self.objectValues(portal_type='Workflow Variable'): + variable_id = vdef.getId() + variable_reference = vdef.getReference() + if not vdef.getStatusIncluded(): + continue + + expr = None + if variable_reference in state_values: + value = state_values[variable_reference] + elif variable_id in transition_expression_dict: + expr = transition_expression_dict[variable_id] + elif not vdef.getAutomaticUpdate() and variable_reference in former_status: + # Preserve former value + value = former_status[variable_reference] + else: + variable_expression = vdef.getVariableExpression() + if variable_expression is not None: + # PATCH : if Default expression for 'actor' is 'user/getUserName', + # we use 'user/getIdOrUserName' instead to store user ID for ERP5 + # user. + if variable_id == 'actor' and variable_expression == 'user/getUserName': + expr = userGetIdOrUserNameExpression + else: + expr = variable_expression + else: + if object_context is None: + object_context = self.getStateChangeInformation(document, self.getSourceValue()) + value = vdef.getVariableValue(object=object_context) + + if expr not in (None, ''): + # Evaluate an expression. + if econtext is None: + # Lazily create the expression context. + if sci is None: + sci = StateChangeInfo( + document, self, former_status, tdef, + old_state, new_state, form_kw) + econtext = createExprContext(sci) + value = expr(econtext) + status_dict[variable_reference] = value + # Do not proceed in case of failure of before script + if not before_script_success: + status_dict[state_var] = old_state_reference # Remain in state + tool.setStatusOf(self.getReference(), document, status_dict) + if sci is None: + sci = StateChangeInfo( + document, self, former_status, tdef, old_state, new_state, form_kw) + # put the error message in the workflow history + sci.setWorkflowVariable(error_message=before_script_error_message) + if validation_exc : + # reraise validation failed exception + raise validation_exc, None, validation_exc_traceback + return new_state + + # update state + status_dict[state_var] = new_state_reference + + tool.setStatusOf(self.getReference(), document, status_dict) + self.updateRoleMappingsFor(document) + + # Execute the "after" script. + if tdef is not None: + script_value_list = tdef.getAfterScriptValueList() + if script_value_list: + if sci is None: + sci = StateChangeInfo(document, self, former_status, tdef, old_state, + new_state, form_kw) + old_state_destination_list = old_state.getDestinationValueList() + for script in script_value_list: + # Script can be either script or workflow method + if script in old_state_destination_list and \ + script.getTriggerType() == TRIGGER_WORKFLOW_METHOD: + getattr(document, convertToMixedCase(script.getReference()))() + else: + # Pass lots of info to the script in a single parameter. + if script.getPortalType() == 'Workflow Script': + if script_context is None: + script_context = self._asScriptContext() + script = getattr(script_context, script.id) + script(sci) # May throw an exception. + + # Return the new state object. + if moved_exc is not None: + # Propagate the notification that the object has moved. + raise moved_exc + else: + return new_state + + security.declarePrivate('wrapWorkflowMethod') + def wrapWorkflowMethod(self, ob, method_id, func, args, kw): + ''' + Allows the user to request a workflow action. This method + must perform its own security checks. + ''' + sdef = self._getWorkflowStateOf(ob) + if sdef is None: + raise WorkflowException, 'Object is in an undefined state' + if method_id not in sdef.getTransitionIdList(): + raise Unauthorized(method_id) + tdef = self.getTransitionValueById(method_id) + if tdef is None or tdef.getTriggerType() != TRIGGER_WORKFLOW_METHOD: + raise WorkflowException, ( + 'Transition %s is not triggered by a workflow method' + % method_id) + if not self._checkTransitionGuard(tdef, ob): + raise Unauthorized(method_id) + res = func(*args, **kw) + try: + self._changeStateOf(ob, tdef, kw) + except ObjectDeleted: + # Re-raise with a different result. + raise ObjectDeleted(res) + except ObjectMoved, ex: + # Re-raise with a different result. + raise ObjectMoved(ex.getNewObject(), res) + return res + + security.declareProtected(Permissions.AddPortalContent, + 'addTransition') + def addTransition(self, name): + """ + add a new transition to the workflow + """ + tr = self.newContent(portal_type='Transition') + tr.setReference(name) + + security.declareProtected(Permissions.DeleteObjects, + 'deleteTransitions') + def deleteTransitions(self, name_list): + """ + remove an set of transition + """ + for name in name_list: + self._delObject('transition_'+name) + + security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML') + def showAsXML(self, root=None): + if root is None: + root = Element('erp5') + return_as_object = False + + # Define a list of property to show to users: + workflow_prop_id_to_show = ['description', 'state_var', + 'permissions', 'initial_state'] + + # workflow as XML, need to rename DC workflow's portal_type before comparison. + workflow = SubElement(root, 'workflow', + attrib=dict(reference=self.getReference(), + portal_type=self.getPortalType())) + + for prop_id in sorted(workflow_prop_id_to_show): + # In most case, we should not synchronize acquired properties + if prop_id not in ('uid', 'workflow_history', 'id', 'portal_type',): + if prop_id == 'permissions': + value = tuple(self.getProperty('workflow_managed_permission')) + prop_type = self.getPropertyType('workflow_managed_permission') + elif prop_id == 'initial_state': + source_value = self.getSourceValue() + if source_value is not None: + value = source_value.getReference() + else: + value = '' + prop_type = 'string' + elif prop_id =='state_var': + value = self.getProperty('state_variable') + prop_type = self.getPropertyType('state_variable') + else: + value = self.getProperty(prop_id) + prop_type = self.getPropertyType(prop_id) + if value is None or value ==() or value == (): + value = '' + sub_object = SubElement(workflow, prop_id, attrib=dict(type=prop_type)) + sub_object.text = str(value) + + # 1. State as XML + state_reference_list = [] + state_list = self.getStateValueList() + # show reference instead of id + state_prop_id_to_show = ['description', + 'transitions', 'permission_roles'] + for sdef in state_list: + state_reference_list.append(sdef.getReference()) + states = SubElement(workflow, 'states', attrib=dict(state_list=str(state_reference_list), + number_of_element=str(len(state_reference_list)))) + for sdef in state_list: + state = SubElement(states, 'state', attrib=dict(reference=sdef.getReference(), portal_type=sdef.getPortalType())) + for property_id in sorted(state_prop_id_to_show): + if property_id == 'permission_roles': + property_value = sdef.getProperty('state_permission_roles_dict') + property_type = sdef.getPropertyType('state_permission_roles_dict') + elif property_id == 'transitions': + property_value = sdef.getDestinationIdList() + destination_list = [] + for tr_id in property_value: + destination_list.append(self._getOb(tr_id).getReference()) + property_value = tuple(destination_list) + property_type = 'multiple selection' + else: + property_value = sdef.getProperty(property_id) + property_type = sdef.getPropertyType(property_id) + + if property_value is None or property_value ==() or property_value == []: + property_value = '' + sub_object = SubElement(state, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # 2. Transition as XML + transition_reference_list = [] + transition_list = self.getTransitionValueList() + transition_prop_id_to_show = ['description', 'new_state_id', + 'trigger_type', 'script_name', 'after_script_name', 'action_type', + 'icon', 'action_name', 'action', 'roles', 'groups', + 'permissions', 'expr', 'transition_variable'] + for tdef in transition_list: + transition_reference_list.append(tdef.getReference()) + transitions = SubElement(workflow, 'transitions', + attrib=dict(transition_list=str(transition_reference_list), + number_of_element=str(len(transition_reference_list)))) + for tdef in transition_list: + transition = SubElement(transitions, 'transition', + attrib=dict(reference=tdef.getReference(), + portal_type=tdef.getPortalType())) + guard = SubElement(transition, 'guard', attrib=dict(type='object')) + transition_variables = SubElement(transition, 'transition_variables', attrib=dict(type='object')) + for property_id in sorted(transition_prop_id_to_show): + if property_id in ('roles', 'groups', 'permissions', 'expr',): + if property_id == 'roles': + property_value = tdef.getGuardRoleList() + if property_id == 'groups': + property_value = tdef.getGuardGroupList() + if property_id == 'permissions': + property_value = tdef.getGuardPermissionList() + if property_id == 'expr': + property_value = tdef.getGuardExpression() + if property_value is None or property_value == [] or property_value == (): + property_value = '' + elif property_id != 'expr': + property_value = tuple(property_value) + sub_object = SubElement(guard, property_id, attrib=dict(type='guard configuration')) + else: + if property_id == 'new_state_id': + if tdef.getDestinationValue() is not None: + property_value = tdef.getDestinationValue().getReference() + else: + property_value = '' + sub_object = SubElement(transition, property_id, attrib=dict(type='string')) + elif property_id == 'script_name': + property_value = tdef.getBeforeScriptIdList() + if property_value == [] or property_value is None: + property_value = '' + else: + property_value = self._getOb(tdef.getBeforeScriptIdList()[0]).getReference() + sub_object = SubElement(transition, property_id, attrib=dict(type='string')) + elif property_id == 'after_script_name': + property_value = tdef.getAfterScriptIdList() + if property_value == [] or property_value is None: + property_value = '' + else: + property_value = self._getOb(tdef.getAfterScriptIdList()[0]).getReference() + sub_object = SubElement(transition, property_id, attrib=dict(type='string')) + elif property_id =='transition_variable': + tr_var_list = tdef.objectValues(portal_type='Transition Variable') + for tr_var in tr_var_list: + reference = self._getOb(tr_var.getCausalityId()).getReference() + transition_variable = SubElement(transition_variables, property_id, attrib=dict(id=reference,type='variable')) + transition_variable.text = str(tr_var.getVariableExpressionText()) + else: + property_value = tdef.getProperty(property_id) + property_type = tdef.getPropertyType(property_id) + sub_object = SubElement(transition, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value ==() or property_value == []: + property_value = '' + sub_object.text = str(property_value) + + # 3. Variable as XML + variable_reference_list = [] + variable_list = self.objectValues(portal_type='Workflow Variable') + variable_prop_id_to_show = ['description', 'variable_expression', + 'for_catalog', 'for_status', 'automatic_update'] + for vdef in variable_list: + variable_reference_list.append(vdef.getReference()) + variables = SubElement(workflow, 'variables', attrib=dict(variable_list=str(variable_reference_list), + number_of_element=str(len(variable_reference_list)))) + for vdef in variable_list: + variable = SubElement(variables, 'variable', attrib=dict(reference=vdef.getReference(), + portal_type=vdef.getPortalType())) + for property_id in sorted(variable_prop_id_to_show): + if property_id == 'automatic_update': + property_value = vdef.getAutomaticUpdate() + sub_object = SubElement(variable, property_id, attrib=dict(type='int')) + elif property_id == 'variable_value': + property_value = vdef.getVariableValue() + sub_object = SubElement(variable, property_id, attrib=dict(type='string')) + else: + property_value = vdef.getProperty(property_id) + property_type = vdef.getPropertyType(property_id) + sub_object = SubElement(variable, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value ==() or property_value == []: + property_value = '' + sub_object.text = str(property_value) + # for a very specific case, action return the reference of transition, + # but in XML should show the same expression as in DC workflow. + if vdef.getId() == 'variable_action' and property_id == 'variable_expression' and property_value != '': + sub_object.text = str('transition/getId|nothing') + + # 4. Worklist as XML + worklist_reference_list = [] + worklist_list = self.getWorklistValueList() + worklist_prop_id_to_show = ['description', 'matched_portal_type_list', + 'matched_validation_state_list', 'matched_simulation_state_list', + 'action_type', 'action_name', 'action', 'icon', + 'roles', 'groups', 'permissions', 'expr'] + for qdef in worklist_list: + worklist_reference_list.append(qdef.getReference()) + worklists = SubElement(workflow, 'worklists', attrib=dict(worklist_list=str(worklist_reference_list), + number_of_element=str(len(worklist_reference_list)))) + for qdef in worklist_list: + worklist = SubElement(worklists, 'worklist', attrib=dict(reference=qdef.getReference(), + portal_type=qdef.getPortalType())) + guard = SubElement(worklist, 'guard', attrib=dict(type='object')) + for property_id in sorted(worklist_prop_id_to_show): + # show guard configuration: + if property_id in ('roles', 'groups', 'permissions', 'expr',): + if property_id == 'roles': + property_value = qdef.getGuardRoleList() + if property_id == 'groups': + property_value = qdef.getGuardGroupList() + if property_id == 'permissions': + property_value = qdef.getGuardPermissionList() + if property_id == 'expr': + property_value = qdef.getGuardExpression() + if property_value is not None: + property_value = tuple(property_value) + sub_object = SubElement(guard, property_id, attrib=dict(type='guard configuration')) + else: + property_value = qdef.getProperty(property_id) + state_ref_list = [] + if property_id in ('matched_validation_state_list', + 'matched_simulation_state_list',) and property_value is not None: + for sid in property_value: + state_ref = self._getOb(sid).getReference() + state_ref_list.append(state_ref) + property_value = tuple(state_ref_list) + if property_id == 'matched_portal_type_list': + if property_value is not None: + property_value = tuple(property_value) + property_type = qdef.getPropertyType(property_id) + sub_object = SubElement(worklist, property_id, attrib=dict(type=property_type)) + if property_value is None or property_value ==() or property_value == []: + property_value = '' + sub_object.text = str(property_value) + + # 5. Script as XML + script_reference_list = [] + script_list = self.getScriptValueList() + script_prop_id_to_show = sorted(['body', 'parameter_signature','proxy_roles']) + for sdef in script_list: + script_reference_list.append(sdef.getReference()) + scripts = SubElement(workflow, 'scripts', attrib=dict(script_list=str(script_reference_list), + number_of_element=str(len(script_reference_list)))) + for sdef in script_list: + script = SubElement(scripts, 'script', attrib=dict(reference=sdef.getReference(), + portal_type=sdef.getPortalType())) + for property_id in script_prop_id_to_show: + if property_id == 'proxy_roles': + property_value = tuple(sdef.getProperty('proxy_role_list')) + property_type = sdef.getPropertyType('proxy_role_list') + else: + property_value = sdef.getProperty(property_id) + property_type = sdef.getPropertyType(property_id) + sub_object = SubElement(script, property_id, attrib=dict(type=property_type)) + sub_object.text = str(property_value) + + # return xml object + if return_as_object: + return root + return etree.tostring(root, encoding='utf-8', + xml_declaration=True, pretty_print=True) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getPortalTypeListForWorkflow') + # Get list of portal types for workflow + def getPortalTypeListForWorkflow(self): + """ + Get list of portal types for workflow. + """ + workflow_id = self.getId() + return [portal_type.getId() for portal_type in self.portal_types.listTypeInfo() + if workflow_id in portal_type.getTypeWorkflowList()] + + def _executeMetaTransition(self, ob, new_state_id): + """ + Allow jumping from state to another without triggering any hooks. + Must be used only under certain conditions. + """ + sci = None + econtext = None + tdef = None + kwargs = None + new_state_id_no_prefix = new_state_id + new_state_id = 'state_' + new_state_id + # Figure out the old and new states. + old_sdef = self._getWorkflowStateOf(ob) + if old_sdef is None: + old_state = state.getReference() + else: + old_state = old_sdef.getId() + if old_state == new_state_id: + # Object is already in expected state + return + former_status = self.getCurrentStatusDict(ob) + + new_sdef = self._getOb(new_state_id, None) + if new_sdef is None: + raise WorkflowException, ('Destination state undefined: ' + new_state_id) + + # Update variables. + state_values = self.getVariableValueDict() + if state_values is None: + state_values = {} + + tdef_exprs = {} + status = {} + for id, vdef in state_values.items(): + if not vdef.getStatusIncluded(): + continue + expr = None + if state_values.has_key(id): + value = state_values[id] + elif tdef_exprs.has_key(id): + expr = tdef_exprs[id] + elif not vdef.getAutomaticUpdate() and former_status.has_key(id): + # Preserve former value + value = former_status[id] + else: + variable_expression = vdef.getVariableExpression() + if variable_expression is not None: + expr = variable_expression + else: + value = vdef.getVariableValue() + if expr is not None: + # Evaluate an expression. + if econtext is None: + # Lazily create the expression context. + if sci is None: + sci = StateChangeInfo(ob, self, former_status, tdef, old_sdef, + new_sdef, kwargs) + econtext = createExprContext(sci) + value = expr(econtext) + status[id] = value + + status['comment'] = 'Jump from %r to %r' % (self._getOb(old_state).getReference(), new_state_id_no_prefix,) + status[self.getStateVariable()] = new_state_id_no_prefix + tool = self.getParentValue() + tool.setStatusOf(self.getId(), ob, status) + + # Update role to permission assignments. + self.updateRoleMappingsFor(ob) + return new_sdef + + security.declarePrivate('allowCreate') + def allowCreate(self, container, type_name): + """Returns true if the user is allowed to create a workflow instance. + + The object passed to the guard is the prospective container. + + wenjie: This is a compatibility related patch. + + More detail see TypeTool.pyline 360. """ - out = [] - transition_dict = {} - out.append('digraph "%s" {' % self.getTitle()) - transition_with_init_state_list = [] - for state in self.contentValues(portal_type='State'): - out.append('%s [shape=box,label="%s",' \ - 'style="filled",fillcolor="#ffcc99"];' % \ - (state.getId(), state.getTitle())) - # XXX Use API instead of getDestinationValueList - for available_transition in state.getDestinationValueList(): - transition_with_init_state_list.append(available_transition.getId()) - destination_state = available_transition.getDestinationValue() - if destination_state is None: - # take care of 'remain in state' transitions - destination_state = state - # - key = (state.getId(), destination_state.getId()) - value = transition_dict.get(key, []) - value.append(available_transition.getTitle()) - transition_dict[key] = value - - # iterate also on transitions, and add transitions with no initial state - for transition in self.contentValues(portal_type='Transition'): - trans_id = transition.getId() - if trans_id not in transition_with_init_state_list: - destination_state = transition.getDestinationValue() - if destination_state is None: - dest_state_id = None + return 1 + + security.declareProtected(Permissions.AccessContentsInformation, + 'getCatalogVariablesFor') + def getCatalogVariablesFor(self, ob): + ''' + Allows this workflow to make workflow-specific variables + available to the catalog, making it possible to implement + worklists in a simple way. + Returns a mapping containing the catalog variables + that apply to ob. + ''' + initial_state = None + res = {} + status = self.getCurrentStatusDict(ob) + for variable in self.getVariableValueList(): + if variable.getForCatalog(): + variable_id = variable.getReference() + variable_expression = variable.getVariableExpression() + if status.has_key(variable_id): + value = status[variable_id] + elif variable_expression is not None: + ec = createExprContext(StateChangeInfo(ob, self, status)) + # convert string to expression before execute it. + value = variable_expression(ec) else: - dest_state_id = destination_state.getId() + value = variable.getVariableValue() + + source_value = self.getSourceValue() + try: + initial_state = source_value.getReference() + except AttributeError: + pass + + state_var = self.getStateVariable() + if state_var is not None: + res[state_var] = status.get(state_var, initial_state) + return res - key = (None, dest_state_id) - value = transition_dict.get(key, []) - value.append(transition.getTitle()) - transition_dict[key] = value + def _setWorkflowManagedPermissionList(self, permission_list): + self.workflow_managed_permission = permission_list - for k, v in transition_dict.items(): - out.append('%s -> %s [label="%s"];' % (k[0], k[1], - ',\\n'.join(v))) + # add/remove the added/removed workflow permission to each state + for state in self.getStateValueList(): + state.setCellRange(sorted(permission_list), + sorted(self.getManagedRoleList()), + base_id='cell') + # get list of (unique) acquired permissions on state + acquired_permission_set = state.getAcquirePermissionSet() - out.append('}') - return '\n'.join(out) + # get list of roles associated to each permission on state + permission_roles_dict = state.getStatePermissionRolesDict() + + # add permission from state_permission_roles_dict when added on workflow + for permission in permission_list: + if permission not in permission_roles_dict: + state.state_permission_roles_dict[permission] = [] + # a new permission should be acquired by default + acquired_permission_set.append(permission) + state.setAcquirePermissionList(list(acquired_permission_set)) + + permission_to_delete = [permission for permission in permission_roles_dict + if permission not in permission_list] + + # remove permission from state_permission_roles_dict when removed on workflow + for permission in permission_to_delete: + del state.state_permission_roles_dict[permission] + if permission in acquired_permission_set: + # in case it was acquired, remove from acquired permission list of the state + acquired_permission_set.remove(permission) + state.setAcquirePermissionList(list(acquired_permission_set)) + + def _asScriptContext(self): + """ + change the context given to the script by adding foo for script_foo to the + context dict in order to be able to call the script using its reference + (= not prefixed by script_) from another workflow script + + historically, __getattr__ method of Workflow class was overriden for + the same purpose, but it was heavyweight: doing a lot of useless + operations (each time, it was checking for script_foo, even if foo was a + transition, state, ...) + """ + script_context = self.asContext() + # asContext creates a temporary object and temporary object's "activate" + # method code is: "return self". This means that the script is not put in + # the activity queue as expected but it is instead directly executed. To fix + # this, we override the temporary object's "activate" method with the one of + # the original object. + script_context.activate = self.activate + script_prefix_len = len(SCRIPT_PREFIX) + for script_id in self.objectIds(meta_type="ERP5 Python Script"): + if script_id.startswith(SCRIPT_PREFIX): + script = getattr(script_context, script_id) + setattr(script_context, script_id[script_prefix_len:], script) + return script_context + + security.declareProtected(Permissions.AccessContentsInformation, + 'getSourceValue') + def getSourceValue(self): + """ + returns the source object + """ + # this function is redefined here for performance reasons: + # avoiding the usage of categories speeds up workflow *a lot* + source_path_list = [path for path in self.getCategoryList() + if path.startswith('source/')] + if source_path_list: + source_id = source_path_list[0].split('/')[-1] + return self._getOb(source_id) + return None diff --git a/product/ERP5Workflow/Document/WorkflowScript.py b/product/ERP5Workflow/Document/WorkflowScript.py new file mode 100644 index 0000000000000000000000000000000000000000..783053953f57b735f25a06fe0b39e127bb632648 --- /dev/null +++ b/product/ERP5Workflow/Document/WorkflowScript.py @@ -0,0 +1,67 @@ +############################################################################## +# +# Copyright (c) 2015 Nexedi SARL and Contributors. All Rights Reserved. +# Wenjie Zheng +# +# 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 AccessControl import ClassSecurityInfo +from AccessControl.class_init import InitializeClass +from App.special_dtml import HTMLFile +from Products.ERP5.Document.PythonScript import PythonScript +from Products.ERP5.Document.Ticket import Ticket +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin + +SCRIPT_PREFIX = 'script_' + +class WorkflowScript(PythonScript, IdAsReferenceMixin("script_", "prefix")): + meta_type = 'ERP5 Python Script' + portal_type = 'Workflow Script' + add_permission = Permissions.AddPortalContent + default_reference = '' + _params = '' + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + property_sheets = ( PropertySheet.Base + , PropertySheet.XMLObject + , PropertySheet.CategoryCore + , PropertySheet.DublinCore + , PropertySheet.Reference + , PropertySheet.PythonScript + ) + + security.declarePublic("execute") + execute = PythonScript.__call__ + + security.declareProtected(Permissions.AccessContentsInformation, + 'getScriptParameterList') + def getScriptParameterList(self): + ''' returns script's parameter for use by Pylint ''' + return self._params + +InitializeClass(WorkflowScript) diff --git a/product/ERP5Workflow/Document/WorkflowVariable.py b/product/ERP5Workflow/Document/WorkflowVariable.py new file mode 100644 index 0000000000000000000000000000000000000000..8d145e49170d364978a622ba46631be9fc6828a5 --- /dev/null +++ b/product/ERP5Workflow/Document/WorkflowVariable.py @@ -0,0 +1,85 @@ +############################################################################## +# +# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. +# Romain Courteaud +# 2015 Wenjie Zheng +# 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 AccessControl import ClassSecurityInfo +from Products.CMFCore.Expression import Expression +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin +from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.mixin.guardable import GuardableMixin + +class WorkflowVariable(IdAsReferenceMixin("variable_", "prefix"), XMLObject, + GuardableMixin): + """ + A ERP5 Workflow Variable. + """ + + meta_type = 'ERP5 Variable' + portal_type = 'Workflow Variable' + add_permission = Permissions.AddPortalContent + isPortalContent = True + isRADContent = True + + info_guard = None + status_included = True + variable_value = '' + variable_expression = None # Overrides variable_value if set + default_reference = '' + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + PropertySheet.Reference, + PropertySheet.Variable, + PropertySheet.Guard, + PropertySheet.WorkflowVariable, + ) + + def _setVariableExpression(self, expression): + if isinstance(expression, str) and expression != '': + self.setVariableExpressionText(expression) + elif isinstance(expression, Expression) and expression.text: + self.variable_expression = expression + else: + self.variable_expression = None + + security.declareProtected(Permissions.ModifyPortalContent, + 'setVariableExpressionText') + def setVariableExpressionText(self, text): + self.variable_expression = Expression(text) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariableExpressionText') + def getVariableExpressionText(self): + return getattr(self.variable_expression, 'text', '') diff --git a/product/ERP5Workflow/Document/Worklist.py b/product/ERP5Workflow/Document/Worklist.py index a0b3820f82e6a60d2f9fc80ccb2b2f8e92a468cb..ece31bdbe8597c50c093bc65a301da5a0efc61ed 100644 --- a/product/ERP5Workflow/Document/Worklist.py +++ b/product/ERP5Workflow/Document/Worklist.py @@ -2,6 +2,7 @@ # # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. # Romain Courteaud +# 2015 Wenjie Zheng # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential @@ -26,14 +27,26 @@ # ############################################################################## -from AccessControl import ClassSecurityInfo +import re +from AccessControl import ClassSecurityInfo +from Persistence import PersistentMapping +from Products.CMFCore.Expression import Expression from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.id_as_reference import IdAsReferenceMixin from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.mixin.guardable import GuardableMixin +from zLOG import LOG, WARNING -class Worklist(XMLObject): +tales_re = re.compile(r'(\w+:)?(.*)') + +class Worklist(IdAsReferenceMixin("worklist_", "prefix"), XMLObject, + GuardableMixin): """ A ERP5 Worklist. + Four Variable: portal_type; simulation_state; validation_state; causality_state + can be accessed directly; other dynamic variables will be accessable through + content type "Worklist Variable". """ meta_type = 'ERP5 Worklist' @@ -41,7 +54,10 @@ class Worklist(XMLObject): add_permission = Permissions.AddPortalContent isPortalContent = 1 isRADContent = 1 - + description = '' + var_matches = [] # Compared with catalog when set. + matched_portal_type = '' + default_reference = '' # Declarative security security = ClassSecurityInfo() security.declareObjectProtected(Permissions.AccessContentsInformation) @@ -52,4 +68,153 @@ class Worklist(XMLObject): PropertySheet.XMLObject, PropertySheet.CategoryCore, PropertySheet.DublinCore, + PropertySheet.Reference, + PropertySheet.Worklist, + PropertySheet.Guard, + PropertySheet.ActionInformation, ) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getAvailableCatalogVars') + def getAvailableCatalogVars(self): + parent = self.getParentValue() + res = [parent.getStateVariable()] + res += [variable.getId() for variable in self.objectValues()] + res += [variable for variable in + parent.contentValues(portal_type="Workflow Variable") + if variable.getForCatalog()] + res.sort() + return res + + security.declareProtected(Permissions.ModifyPortalContent, + 'updateDynamicVariable') + def updateDynamicVariable(self): + # Keep worklist variables updating, correspond to workflow variables. + # In the new workflow, we may not need this function for the moment. + res = [] + # XXX(WORKFLOW): is there a reason not to return self.objectValues() here? + for worklist_variable_value in self.objectValues(): + res.append(worklist_variable_value) + return res + + def _updateDynamicVariable(self): + # Keep worklist variables updating, correspond to workflow variables. + res = [] + workflow_variable_id_list = [] + default_variable_id_list = ['variable_action', 'variable_actor',\ + 'variable_comment', 'variable_error_message', 'variable_history',\ + 'variable_portal_type', 'variable_time'] + + # Check workflow variables: + for variable_value in self.getParentValue().objectValues(portal_type="Workflow Variable"): + variable_id = variable_value.getId() + workflow_variable_id_list.append(variable_id) + worklist_variable_value = self._getOb(variable_id, None) + if (worklist_variable_value is None + and variable_value.getForCatalog() == 1 + and variable_id not in default_variable_id_list): + variable_value_ref = variable_value.getReference() + worklist_variable_value = self.newContent(portal_type='Worklist Variable') + worklist_variable_value.setReference(variable_value_ref) + worklist_variable_value.setVariableExpression(variable_value.getVariableExpression()) + worklist_variable_value.setVariableValue(variable_value.getVariableValue()) + res.append(worklist_variable_value) + if (worklist_variable_value and worklist_variable_value not in res + and variable_value.getForCatalog() == 1): + res.append(worklist_variable_value) + if (worklist_variable_value in res + and variable_value.getForCatalog() == 0): + self._delObject(variable_id) + res.remove(worklist_variable_value) + + # Append user created worklist variables. + for worklist_variable_value in self.objectValues(): + if worklist_variable_value.getId() not in workflow_variable_id_list: + res.append(worklist_variable_value) + workflow_variable_id_list.append(worklist_variable_value.getId()) + return res + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVarMatchKeys') + def getVarMatchKeys(self): + key_list = [] + if self.getMatchedPortalTypeList(): + key_list.append('portal_type') + if self.getMatchedSimulationStateList(): + key_list.append('simulation_state') + if self.getMatchedValidationStateList(): + key_list.append('validation_state') + if self.getMatchedCausalityState(): + key_list.append('causality_state') + + key_list += [dynamic_variable.getReference() for dynamic_variable in self.objectValues() + if dynamic_variable.getVariableValue() or dynamic_variable.getVariableExpression()] + + return key_list + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVarMatch') + def getVarMatch(self, id): + """ return value of matched keys""" + matches = None + matches_ref_list = [] + if id == 'portal_type': + v = self.getMatchedPortalTypeList() + if v: matches = tuple(v) + elif id in ['validation_state', 'simulation_state']: + if id == 'validation_state': + matches_id_list = self.getMatchedValidationStateList() + elif id == 'simulation_state': + matches_id_list = self.getMatchedSimulationStateList() + # Get workflow state's reference: + parent = self.getParentValue() + for state_id in matches_id_list: + state = getattr(parent, state_id, None) + if state is not None: + matches_ref_list.append(state.getReference()) + else: matches_ref_list = matches_id_list + matches = tuple(matches_ref_list) + elif id == 'causality_state': + matches_id = self.getMatchedCausalityState() + matches_ref_list.append(matches_id) + matches = tuple(matches_ref_list) + elif id: + # Local dynamic variable: + dynamic_variable = self._getOb('variable_'+id) + dynamic_variable_value = dynamic_variable.getVariableValue() + if dynamic_variable_value: + matches = [dynamic_variable_value] + # Override initial value if expression set: + dynamic_variable_expression_text = dynamic_variable\ + .getVariableExpression() + if dynamic_variable_expression_text: + matches = dynamic_variable_expression_text + + if matches not in ([], None): + if not isinstance(matches, (tuple, Expression)): + # Old version, convert it. + matches = tuple(matches) + return matches + else: + return () + + security.declareProtected(Permissions.AccessContentsInformation, + 'getVarMatchText') + def getVarMatchText(self, id): + values = self.getVarMatch(id) + if isinstance(values, Expression): + return values.text + return '; '.join(values) + + # XXX(PERF): hack to see Category Tool responsability in new workflow slowness + + security.declareProtected(Permissions.AccessContentsInformation, + 'getActionType') + def getActionType(self): + prefix_length = len('action_type/') + action_type_list = [path[prefix_length:] for path in self.getCategoryList() + if path.startswith('action_type/')] + try: + return action_type_list[0] + except IndexError: + return None diff --git a/product/ERP5Workflow/Document/Variable.py b/product/ERP5Workflow/Document/WorklistVariable.py similarity index 74% rename from product/ERP5Workflow/Document/Variable.py rename to product/ERP5Workflow/Document/WorklistVariable.py index 5156793340d10ccd31ae4b51c00888a45a49834a..0a0a96ed01de2290058d166a14a6d8b43fc87b84 100644 --- a/product/ERP5Workflow/Document/Variable.py +++ b/product/ERP5Workflow/Document/WorklistVariable.py @@ -1,7 +1,7 @@ ############################################################################## # # Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved. -# Romain Courteaud +# 2015 Wenjie Zheng # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential @@ -26,24 +26,18 @@ # ############################################################################## -from AccessControl import ClassSecurityInfo -from Products.ERP5Type import Permissions, PropertySheet -from Products.ERP5Type.XMLObject import XMLObject +from Products.ERP5Workflow.Document.WorkflowVariable import WorkflowVariable +from Products.ERP5Type import PropertySheet -class Variable(XMLObject): +class WorklistVariable(WorkflowVariable): """ - A ERP5 Variable. + A ERP5 Worklist Variable which serves as dynamic variable of Worklist. + This type of object has 3 values: + - reference as Title; + - variable_value; + - variable_expression which will override default when it's set. """ - meta_type = 'ERP5 Variable' - portal_type = 'Variable' - add_permission = Permissions.AddPortalContent - isPortalContent = 1 - isRADContent = 1 - - # Declarative security - security = ClassSecurityInfo() - security.declareObjectProtected(Permissions.AccessContentsInformation) # Declarative properties property_sheets = ( @@ -51,5 +45,7 @@ class Variable(XMLObject): PropertySheet.XMLObject, PropertySheet.CategoryCore, PropertySheet.DublinCore, + PropertySheet.Reference, PropertySheet.Variable, + PropertySheet.Guard, ) diff --git a/product/ERP5Workflow/Tool/WorkflowTool.py b/product/ERP5Workflow/Tool/WorkflowTool.py new file mode 100644 index 0000000000000000000000000000000000000000..359093a2d9ff2d207aab46878dd9d745a34e0701 --- /dev/null +++ b/product/ERP5Workflow/Tool/WorkflowTool.py @@ -0,0 +1,1484 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2015 Nexedi SARL and Contributors. All Rights Reserved. +# Wenjie Zheng +# +# 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. +# +############################################################################## + +import cPickle +import os +import shutil +import sys +import subprocess +import time +import transaction +import struct +import urllib2 +import re + +from AccessControl import ClassSecurityInfo, Unauthorized +from AccessControl.SecurityInfo import ModuleSecurityInfo +from Acquisition import aq_base, Implicit, Explicit +from App.config import getConfiguration +from base64 import b64encode, b64decode, decodestring +from cStringIO import StringIO +from DateTime import DateTime +from itertools import izip +from MethodObject import Method +from MySQLdb import ProgrammingError, OperationalError +from Persistence import Persistent +from Products.CMFActivity.ActiveResult import ActiveResult +from Products.CMFCore.interfaces import IWorkflowDefinition +from Products.CMFCore.utils import Message as _ +from Products.CMFCore.utils import _getAuthenticatedUser +from Products.CMFCore.WorkflowTool import WorkflowTool as OriginalWorkflowTool +from Products.CMFCore.WorkflowCore import ObjectMoved, ObjectDeleted,\ + WorkflowException +from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition +from Products.DCWorkflow.Expression import Expression +from Products.DCWorkflow.permissions import ManagePortal +from Products.DCWorkflow.Transitions import TRIGGER_WORKFLOW_METHOD +from Products.ERP5 import _dtmldir +from Products.ERP5.Document.BusinessTemplate import BusinessTemplateMissingDependency +from Products.ERP5.genbt5list import generateInformation +from Products.ERP5Type import Permissions, PropertySheet +from Products.ERP5Type.Base import Base +from Products.ERP5Type.Cache import transactional_cached, CachingMethod +from Products.ERP5Type.Core.Folder import Folder +from Products.ERP5Type.DiffUtils import DiffFile +from Products.ERP5Type.Globals import InitializeClass, DTMLFile, PersistentMapping +from Products.ERP5Type.Message import translateString +from Products.ERP5Type.Tool.BaseTool import BaseTool +from Products.ERP5Type.UnrestrictedMethod import unrestricted_apply, UnrestrictedMethod +from Products.ERP5Type.Utils import UpperCase +from Products.ZSQLCatalog.SQLCatalog import SimpleQuery, AutoQuery, ComplexQuery, NegatedQuery +from sets import ImmutableSet +from tempfile import mkstemp, mkdtemp +from urllib import pathname2url, urlopen, splittype, urlretrieve +from xml.dom.minidom import parse +from xml.parsers.expat import ExpatError +from webdav.client import Resource +from zLOG import LOG, INFO, WARNING + +""" +Most of the code in this file has been taken from patches/WorkflowTool.py. +""" + +_marker = [] # Create a new marker object. + + +class WorkflowTool(BaseTool, OriginalWorkflowTool): + """ + A new container for DC workflow and workflow; + inherits methods from original WorkflowTool.py; + contains patches from ERP5Type/patches/WorkflowTool.py. + """ + + id = 'portal_workflow' + title = 'Workflow Tool' + meta_type = 'Workflow Tool' + portal_type = 'Workflow Tool' + allowed_types = ('Workflow', 'Interaction Workflow', 'Configuration Workflow' ) + all_meta_types = OriginalWorkflowTool.all_meta_types + + # This stores information on repositories. + repository_dict = {} + + # Declarative Security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + _product_interfaces = OriginalWorkflowTool._product_interfaces + _chains_by_type = OriginalWorkflowTool._chains_by_type + _default_chain = '' + _default_cataloging = OriginalWorkflowTool._default_cataloging + manage_options = OriginalWorkflowTool.manage_options + manage_overview = OriginalWorkflowTool.manage_overview + _manage_selectWorkflows = OriginalWorkflowTool._manage_selectWorkflows + manage_selectWorkflows = OriginalWorkflowTool.manage_selectWorkflows + + # Declarative properties + property_sheets = ( + PropertySheet.Base, + PropertySheet.XMLObject, + PropertySheet.CategoryCore, + PropertySheet.DublinCore, + ) + + def filtered_meta_types(self): + return False + + def _jumpToStateFor(self, ob, state_id, wf_id=None, *args, **kw): + """Inspired from doActionFor. + This is public method to allow passing meta transition (Jump form + any state to another in same workflow) + """ + from Products.ERP5.InteractionWorkflow import InteractionWorkflowDefinition + from Products.ERP5Workflow.Document.InteractionWorkflow import InteractionWorkflow + workflow_list = self.getWorkflowsFor(ob.getPortalType()) + if wf_id is None: + if not workflow_list: + raise WorkflowException('No workflows found.') + found = False + for workflow in workflow_list: + if not isinstance(workflow, (InteractionWorkflowDefinition, InteractionWorkflow,)) and \ + state_id in workflow.getStateIdList(): + found = True + break + if not found: + raise WorkflowException('No workflow provides the destination state %r'\ + % state_id) + else: + workflow = self.getWorkflowById(wf_id) + if workflow is None: + raise WorkflowException('Requested workflow definition not found.') + + workflow._executeMetaTransition(ob, state_id) + + def _isJumpToStatePossibleFor(self, ob, state_id, wf_id=None): + """Test if given state_id is available for ob + in at least one associated workflow + """ + from Products.ERP5.InteractionWorkflow import InteractionWorkflowDefinition + from Products.ERP5Workflow.Document.InteractionWorkflow import InteractionWorkflow + for workflow in (wf_id and (self[wf_id],) or self.getWorkflowsFor(ob.getPortalType())): + if not isinstance(workflow, InteractionWorkflowDefinition) and \ + not isinstance(workflow, InteractionWorkflow): + if state_id in workflow.getStateIdList(): + return True + return False + + security.declareProtected(Permissions.ModifyPortalContent, 'copyWorkflow') + def copyWorkflow(self, old_workflow_id, new_workflow_id): + """ + Create a copy of old_workflow_id workflow + (overwrites existing object with new_workflow_id ID if any) + """ + + # Copy old_workflow_id + copy = self.manage_copyObjects(ids=[old_workflow_id]) + pasted = self.manage_pasteObjects(copy) + pasted_workflow_id = pasted[0]['new_id'] + + # Delete possibly existing object with new_workflow_id ID + if getattr(self, new_workflow_id, None): + self.manage_delObjects(new_workflow_id) + + self.manage_renameObjects(ids=[pasted_workflow_id,], + new_ids=[new_workflow_id,]) + + security.declarePrivate('getCatalogVariablesFor') + def getCatalogVariablesFor(self, ob): + """ Get a mapping of "workflow-relevant" attributes. + original code from zope CMFCore/WorkflowTool.py + """ + wfs = self.getWorkflowsFor(ob) + if wfs is None: + return None + # Iterate through the workflows backwards so that + # earlier workflows can override later workflows. + wfs.reverse() + vars = {} + for wf in wfs: + v = wf.getCatalogVariablesFor(ob) + if v is not None: + vars.update(v) + return vars + + security.declarePublic('doActionFor') + def doActionFor(self, current_object, action_reference, + wf_id=None, *args, **kw): + workflow_id = wf_id + workflow_list = self.getWorkflowsFor(current_object.getPortalType()) + action_id = '' + if workflow_id is None: + if workflow_list == []: + raise WorkflowException(_(u'No workflows found.')) + found = False + for workflow in workflow_list: + action_id = workflow.getTransitionIdByReference(action_reference) + is_action_supported = workflow.isActionSupported(current_object, action_id, **kw) + if is_action_supported: + found = True + break + + if found: + result = workflow.doActionFor(current_object, action_id, + is_action_supported=is_action_supported, + **kw) + else: + message = "No workflow provides the %s action." % action_reference + raise WorkflowException(message) + else: + workflow = self.getWorkflowById(workflow_id) + if workflow is None: + raise WorkflowException(_(u'Requested workflow not found.')) + action_id = workflow.getTransitionIdByReference(action_reference) + result = workflow.doActionFor(current_object, action_id, **kw) + return result + + security.declareProtected(Permissions.AccessContentsInformation, + 'getWorkflowValueListFor') + def getWorkflowValueListFor(self, ob): + """ Return a list of workflows bound to selected object, this workflow + list may contain both DC Workflow and Workflow. + """ + workflow_list = [] + + if isinstance(ob, basestring): + portal_type = self.getPortalObject().portal_types.getTypeInfo(ob) + elif hasattr(aq_base(ob), 'getTypeInfo'): + portal_type = ob.getTypeInfo() + else: + portal_type = None + + portal_type_workflow_list = tuple() + if portal_type is not None: + portal_type_workflow_list = portal_type.getTypeWorkflowList() + + # get workflow assigned in portal types: + for workflow_id in portal_type_workflow_list: + workflow_value = self._getOb(workflow_id, None) + if workflow_value is not None: + workflow_list.append(workflow_value) + else: + LOG( + "getWorkflowValueListFor:", WARNING, + "workflow %s declared on portal_type %s does not exist" % + (workflow_id, portal_type.id) + ) + + return workflow_list + + getWorkflowsFor = getWorkflowValueListFor + + def getHistoryOf(self, wf_id, ob): + """ Get the history of an object for a given workflow. + """ + if hasattr(aq_base(ob), 'workflow_history'): + return ob.workflow_history.get(wf_id, None) + return () + + def _encodeWorkflowUid(self, id): + return b64encode(cPickle.dumps(id)) + + security.declareProtected(Permissions.AccessContentsInformation, + 'getWorkflowTempObjectList') + def getWorkflowTempObjectList(self, temp_obj=1): + """ Return a list of converted temporary workflows. Only necessary in + Workflow Tool to get temporarilly converted DCWorkflow. + """ + temp_workflow_list = [] + for dc_workflow in self.objectValues(): + workflow_type = dc_workflow.__class__.__name__ + if workflow_type in ['Workflow', 'Interaction Workflow', 'Configuration Workflow']: + continue + temp_workflow = self.dc_workflow_asERP5Object(dc_workflow, is_temporary=temp_obj) + temp_workflow_list.append(temp_workflow) + return temp_workflow_list + + def getScriptPathList(self, workflow, initial_script_name_list): + if not initial_script_name_list: + return [] + + script_path_list = [] + if isinstance(initial_script_name_list, str): + initial_script_name_list = [initial_script_name_list] + for script_name in initial_script_name_list: + if script_name: + script = getattr(workflow, workflow.getScriptIdByReference(script_name), None) or \ + getattr(workflow, workflow.getTransitionIdByReference(script_name), None) + script_path = script.getRelativeUrl() + script_path_list.append(script_path) + return script_path_list + + security.declareProtected(Permissions.ModifyPortalContent, + 'dc_workflow_asERP5Object') + def dc_workflow_asERP5Object(self, dc_workflow, is_temporary=False): + """ convert DC Workflow to New Workflow """ + + workflow_type_id = dc_workflow.__class__.__name__ + if workflow_type_id in ['DCWorkflowDefinition', 'InteractionWorkflowDefinition']: + # Only convert old workflow objects. + if is_temporary: + new_id = dc_workflow.id + else: + new_id = 'converting_' + dc_workflow.id + uid = self._encodeWorkflowUid(new_id) + portal_type = ('Workflow' if workflow_type_id == 'DCWorkflowDefinition' else 'Interaction Workflow') + workflow = self.newContent(id=new_id, temp_object=is_temporary, + portal_type=portal_type) + if workflow_type_id == 'DCWorkflowDefinition': + workflow.setStateVariable(dc_workflow.state_var) + workflow.setWorkflowManagedPermission(dc_workflow.permissions) + workflow.setManagerBypass(dc_workflow.manager_bypass) + + if is_temporary: + # give temp workflow an uid for form_dialog. + workflow.uid = uid + workflow.default_reference = dc_workflow.id + workflow.setTitle(dc_workflow.title) + workflow.setDescription(dc_workflow.description) + + if not is_temporary: + # create state and transitions (Workflow) + # or interactions (Interaction Workflow) + + # create scripts (portal_type = Workflow Script) + dc_workflow_script_list = dc_workflow.scripts + for script_id in dc_workflow_script_list: + script = dc_workflow_script_list.get(script_id) + # add a prefix if there is a script & method conflict + workflow_script = workflow.newContent(id=workflow.getScriptIdByReference(script_id), + portal_type='Workflow Script', + temp_object=is_temporary) + workflow_script.setTitle(script.title) + workflow_script.default_reference = script_id + workflow_script.setParameterSignature(script._params) + #workflow_script.setCallableType(script.callable_type)# not defined in python script? + workflow_script.setBody(script._body) + workflow_script.setProxyRole(script._proxy_roles) + + if workflow_type_id == 'DCWorkflowDefinition': + # remove default state and variables + for def_var in workflow.objectValues(portal_type='Workflow Variable'): + workflow._delObject(def_var.getId()) + workflow._delObject('state_draft') + dc_workflow_transition_value_list = dc_workflow.transitions + dc_workflow_transition_id_list = dc_workflow_transition_value_list.objectIds() + + # create transition (portal_type = Transition) + for tid in dc_workflow_transition_value_list: + tdef = dc_workflow_transition_value_list.get(tid) + transition = workflow.newContent(portal_type='Transition', temp_object=is_temporary) + if tdef.title == '' or tdef.title is None: + tdef.title = UpperCase(tdef.id) + transition.setTitle(tdef.title) + transition.setReference(tdef.id) + transition.setTriggerType(tdef.trigger_type) + transition.setActionType(tdef.actbox_category) + transition.setIcon(tdef.actbox_icon) + transition.setActionName(tdef.actbox_name) + transition.setAction(tdef.actbox_url) + transition.setDescription(tdef.description) + + # configure guard + if tdef.guard: + transition.setGuardRoleList(tdef.guard.roles) + transition.setGuardPermissionList(tdef.guard.permissions) + transition.setGuardGroupList(tdef.guard.groups) + if tdef.guard.expr is not None: + transition.setGuardExpression(tdef.guard.expr.text) + + for transition in workflow.objectValues(portal_type='Transition'): + # configure after/before scripts + # we have to loop again over transitions because some + # before/after/... scripts are transitions and obviously, all of + # them were not defined on the new workflow in the previous loop + old_transition = dc_workflow_transition_value_list.get(transition.getReference()) + script_path_list = self.getScriptPathList(workflow, + old_transition.script_name) + transition.setBeforeScriptValueList(script_path_list) + + script_path_list = self.getScriptPathList(workflow, + old_transition.after_script_name) + transition.setAfterScriptValueList(script_path_list) + + # create states (portal_type = State) + workflow_managed_role_list = workflow.getManagedRoleList() + for sid in dc_workflow.states: + sdef = dc_workflow.states.get(sid) + state = workflow.newContent(portal_type='State', temp_object=is_temporary) + if sdef.title == '' or sdef.title is None: + sdef.title = UpperCase(sdef.id) + if hasattr(sdef, 'type_list'): state.setStateType(sdef.type_list) + state.setTitle(sdef.title) + state.setReference(sdef.id) + state.setDescription(sdef.description) + + acquire_permission_list = [] + permission_roles_dict = {} + if sdef.permission_roles: + for (permission, roles) in sdef.permission_roles.items(): + if permission in dc_workflow.permissions: + if isinstance(roles, list): # type 'list' means acquisition + acquire_permission_list.append(permission) + permission_roles_dict[permission] = list(roles) + + state.setAcquirePermission(acquire_permission_list) + state.setStatePermissionRolesDict(permission_roles_dict) + + state.setCellRange(sorted(permission_roles_dict.keys()), + sorted(workflow_managed_role_list), + base_id='cell') + + # default state using category setter + state_path = getattr(workflow, 'state_'+dc_workflow.initial_state).getPath() + state_path = 'source/' + '/'.join(state_path.split('/')[2:]) + workflow.setCategoryList([state_path]) + # set state's possible transitions: + for sid in dc_workflow.states: + sdef = workflow._getOb('state_'+sid) + new_category = [] + for transition_id in dc_workflow.states.get(sid).transitions: + sdef.addPossibleTransition(transition_id) + # set transition's destination state: + for tid in dc_workflow_transition_value_list: + tdef = workflow.getTransitionValueById(tid) + state = getattr(workflow, 'state_'+dc_workflow_transition_value_list.get(tid).new_state_id, None) + if state is None: + # it's a remain in state transition. + continue + state_path = 'destination/' + '/'.join(state.getPath().split('/')[2:]) + tdef.setCategoryList(tdef.getCategoryList() + [state_path]) + # worklists (portal_type = Worklist) + for qid, qdef in dc_workflow.worklists.items(): + worklist = workflow.newContent(portal_type='Worklist', temp_object=is_temporary) + worklist.setTitle(qdef.title) + worklist.setReference(qdef.id) + worklist.setDescription(qdef.description) + for key, values in qdef.var_matches.items(): + if key == 'portal_type': + worklist.setMatchedPortalTypeList(values) + elif key == 'simulation_state': + state_id_list = [] + for value in values: + state_id = 'state_'+value + state_id_list.append(state_id) + worklist.setMatchedSimulationStateList(state_id_list) + elif key == 'validation_state': + state_id_list = [] + for value in values: + state_id = 'state_'+value + state_id_list.append(state_id) + worklist.setMatchedValidationStateList(state_id_list) + elif key == 'causality_state': + state_id_list = [] + for value in values: + state_id = value + worklist.setMatchedCausalityState(state_id) + else: + # dynamic variable. + worklist_variable_value = worklist.newContent(portal_type='Worklist Variable', + reference=key) + if isinstance(values, Expression): + worklist_variable_value.setVariableExpression(values) + else: + worklist_variable_value.setVariableValue(values[0]) #XXX(WORKFLOW): to be changed + + worklist.setAction(qdef.actbox_url) + worklist.setActionType(qdef.actbox_category) + worklist.setIcon(qdef.actbox_icon) + worklist.setActionName(qdef.actbox_name) + # configure guard + if qdef.guard: + worklist.setGuardRoleList(qdef.guard.roles) + worklist.setGuardPermissionList(qdef.guard.permissions) + worklist.setGuardGroupList(qdef.guard.groups) + if qdef.guard.expr is not None: + worklist.setGuardExpression(qdef.guard.expr.text) + elif workflow_type_id == 'InteractionWorkflowDefinition': + dc_workflow_interaction_value_dict = dc_workflow.interactions + # create interactions (portal_type = Interaction) + for tid in dc_workflow_interaction_value_dict: + interaction = workflow.newContent(portal_type='Interaction', temp_object=is_temporary) + tdef = dc_workflow_interaction_value_dict.get(tid) + if tdef.title: + interaction.setTitle(tdef.title) + interaction.setReference(tdef.id) + + # configure after/before/before commit/activate scripts + # no need to loop again over interactions as made for transitions + # because interactions xxx_script are not interactions + script_path_list = self.getScriptPathList(workflow, tdef.script_name) + interaction.setBeforeScriptValueList(script_path_list) + + script_path_list = self.getScriptPathList(workflow, tdef.after_script_name) + interaction.setAfterScriptValueList(script_path_list) + + script_path_list = self.getScriptPathList(workflow, tdef.activate_script_name) + interaction.setActivateScriptValueList(script_path_list) + + script_path_list = self.getScriptPathList(workflow, tdef.before_commit_script_name) + interaction.setBeforeCommitScriptValueList(script_path_list) + + # configure guard + if tdef.guard: + interaction.setGuardRoleList(tdef.guard.roles) + interaction.setGuardPermissionList(tdef.guard.permissions) + interaction.setGuardGroupList(tdef.guard.groups) + if tdef.guard.expr is not None: + # Here add expression text, convert to expression in getMatchVar. + interaction.setGuardExpression(tdef.guard.expr.text) + interaction.setPortalTypeFilter(tdef.portal_type_filter) + interaction.setPortalTypeGroupFilter(tdef.portal_type_group_filter) + if interaction.portal_type_filter == (): + interaction.portal_type_filter = None + if interaction.portal_type_group_filter == (): + interaction.portal_type_group_filter = None + + interaction.setTemporaryDocumentDisallowed(tdef.temporary_document_disallowed) + #interaction.setTransitionFormId() # this is not defined in DC interaction? + interaction.setTriggerMethodId(tdef.method_id) + interaction.setTriggerOncePerTransaction(tdef.once_per_transaction) + interaction.setTriggerType(tdef.trigger_type) + interaction.setDescription(tdef.description) + + # create variables (portal_type = Workflow Variable) + for variable_id, variable_definition in dc_workflow.variables.items(): + variable = workflow.newContent(portal_type='Workflow Variable', temp_object=is_temporary) + variable.setTitle(variable_definition.title) + variable.setReference(variable_id) + variable.setAutomaticUpdate(variable_definition.update_always) + if getattr(variable_definition, 'default_expr', None) is not None: + # for a very specific case, action return the reference of transition + # in order to generation correct workflow history. + if variable_id == 'action': + variable.setVariableExpression(Expression('transition/getReference|nothing')) + else: + variable.setVariableExpression(variable_definition.default_expr) + if variable_definition.info_guard: + variable.info_guard = variable_definition.info_guard + variable.setGuardRoleList(variable_definition.info_guard.roles) + variable.setGuardPermissionList(variable_definition.info_guard.permissions) + variable.setGuardGroupList(variable_definition.info_guard.groups) + if variable_definition.info_guard.expr is not None: + # Here add expression text, convert to expression in getMatchVar. + variable.setGuardExpression(tdef.info_guard.expr.text) + variable.setForCatalog(variable_definition.for_catalog) + variable.setStatusIncluded(variable_definition.for_status) + # setVariableValue sets the value to None if the parameter is an empty + # string. This change the expected behaviour. + # XXX(WORKFLOW): you need to be aware that if someone saves a variable + # without editing this field, variable_value may be None again + if variable_definition.default_value: + variable.setVariableValue(variable_definition.default_value) + variable.setDescription(variable_definition.description) + # Configure transition variable: + if getattr(dc_workflow, 'transitions', None) is not None: + dc_workflow_transition_value_list = dc_workflow.transitions + for tid in dc_workflow_transition_value_list: + origin_tdef = dc_workflow_transition_value_list[tid] + transition = workflow.getTransitionValueById(tid) + new_category = [] + if origin_tdef.var_exprs is None: + var_exprs = {} + else: var_exprs = origin_tdef.var_exprs + for key in var_exprs: + tr_var = transition.newContent(portal_type='Transition Variable', temp_object=is_temporary) + tr_var.setVariableExpression(var_exprs[key]) + tr_var_path = getattr(workflow, 'variable_'+key).getPath() + tr_var_path = '/'.join(tr_var_path.split('/')[2:]) + new_category.append(tr_var_path) + tr_var.setCausalityList(new_category) + # Configure interaction variable: + if getattr(dc_workflow, 'interactions', None) is not None: + dc_workflow_interaction_value_list = dc_workflow.interactions + for tid in dc_workflow_interaction_value_list: + origin_tdef = dc_workflow_interaction_value_list[tid] + interaction = workflow._getOb('interaction_'+tid) + new_category = [] + if origin_tdef.var_exprs is None: + var_exprs = {} + else: var_exprs = origin_tdef.var_exprs + for key in var_exprs: + tr_var = interaction.newContent(portal_type='Transition Variable', temp_object=is_temporary) + tr_var.setVariableExpression(var_exprs[key]) + tr_var_path = getattr(workflow, 'variable_'+key).getPath() + tr_var_path = '/'.join(tr_var_path.split('/')[2:]) + new_category.append(tr_var_path) + tr_var.setCausalityList(new_category) + # move dc workflow to trash bin + self._finalizeWorkflowConversion(dc_workflow) + # override temporary id: + workflow.setId(workflow.default_reference) + if not is_temporary: + # update translation so that the catalog contains translated states, ... + self.getPortalObject().ERP5Site_updateTranslationTable() + return workflow + + def getChainsByType(self): + # XXX(WORKFLOW): compatibility code + # get old workflow tool's chains_by_type + chains_by_type = self._chains_by_type or {} + type_workflow_dict = {} + for type_id, workflow_id_list in chains_by_type.iteritems(): + type_workflow_dict.setdefault(type_id, ()) + type_workflow_dict[type_id] = type_workflow_dict[type_id] + workflow_id_list + return type_workflow_dict + + # XXX(WORKFLOW): remove? + # For Chains By Type Repair Tool: + def addTypeCBT(self, pt, wf_id): + self._chains_by_type[pt] = self._chains_by_type[pt] + (wf_id, ) + + def delTypeCBT(self, pt, wf_id): + self._chains_by_type[pt] = tuple(wf for wf in self._chains_by_type[pt] if wf!=wf_id) + + def reassignWorkflow(self, workflow_id): + # type-workflow reassignment + type_workflow_dict = self.getChainsByType() + type_tool = self.getPortalObject().portal_types + + for portal_type_id in type_workflow_dict: + # getTypeInfo takes care of solver, whereas _getOb on Types Tool don't + portal_type = type_tool.getTypeInfo(portal_type_id) + if portal_type is not None and workflow_id in type_workflow_dict[portal_type_id]: + # 1. clean DC workflow tool "chain by type" assignement: + self.delTypeCBT(portal_type_id, workflow_id) + # 2. assign workflow to portal type: + type_workflow_list = portal_type.getTypeWorkflowList() + if workflow_id not in type_workflow_list: + portal_type.setTypeWorkflowList( + type_workflow_list + [workflow_id] + ) + + def reassignWorkflowWithoutConversion(self): + # This function should be called when a new template installed and add + # portal_types assignment with converted and non-converted workflows into + # portal_type's workflow list. + # This function only synchronize assignment information to new added portal + # type's TypeWorkflowList. + + # To trigger this function, go to portal_workflow and choose "convert DCWorkflow" + # in the action list. Reassignment happens in the background. Nothing need to + # be done, just go back to whatever you are doing. + type_workflow_dict = self.getChainsByType() + type_tool = self.getPortalObject().portal_types + for portal_type_id in type_workflow_dict: + portal_type = type_tool.getTypeInfo(portal_type_id) + if portal_type is not None: + for workflow_id in type_workflow_dict[portal_type_id]: + workflow = getattr(self, workflow_id, None) + if workflow and workflow.getPortalType() in ['Workflow', 'Interaction Workflow', 'DCWorkflowDefinition', 'InteractionWorkflowDefinition']: + # 1. clean DC workflow tool "chain by type" assignement: + self.delTypeCBT(portal_type.id, workflow.id) + # 2. assign workflow to portal type: + type_workflow_list = portal_type.getTypeWorkflowList() + if workflow_id not in type_workflow_list: + portal_type.setTypeWorkflowList( + type_workflow_list + [workflow_id] + ) + + _reindexWorkflowVariables = lambda self, ob: \ + hasattr(aq_base(ob), 'reindexObjectSecurity') and ob.reindexObjectSecurity() + + def isTransitionPossible(self, ob, transition_id, wf_id=None): + """Test if the given transition exist from the current state. + """ + for workflow in (wf_id and (self[wf_id],) or self.getWorkflowsFor(ob)): + state = workflow._getWorkflowStateOf(ob) + if state and transition_id in state.getDestinationReferenceList(): + return True + return False + + getFutureStateSetFor = lambda self, wf_id, *args, **kw: \ + self[wf_id].getFutureStateSet(*args, **kw) + + security.declarePrivate('getStatusOf') + def getStatusOf(self, workflow_id, current_object): + # code taken from CMFCore + """ Get the last element of a workflow history for a given workflow. + """ + workflow_history = self.getHistoryOf(workflow_id, current_object) + if workflow_history: + return workflow_history[-1] + return None + + def setStatusOf(self, wf_id, ob, status): + """ Append an entry to the workflow history. + o Invoked by workflow definitions. + """ + wfh = None + has_history = 0 + if getattr(aq_base(ob), 'workflow_history', None) is not None: + history = ob.workflow_history + if history is not None: + has_history = 1 + wfh = history.get(wf_id, None) + if wfh is not None and not isinstance(wfh, WorkflowHistoryList): + wfh = WorkflowHistoryList(list(wfh)) + ob.workflow_history[wf_id] = wfh + if wfh is None: + wfh = WorkflowHistoryList() + if not has_history: + ob.workflow_history = PersistentMapping() + ob.workflow_history[wf_id] = wfh + wfh.append(status) + + security.declarePrivate('getWorkflowIds') + def getWorkflowIds(self): + + """ Return the list of workflow ids. + """ + wf_ids = [obj_name for obj_name, obj in self.objectItems() + if IWorkflowDefinition.providedBy(obj) or + getattr(obj, '_isAWorkflow', 0)] + + return tuple(wf_ids) + + def refreshWorklistCache(self): + """ + Refresh worklist cache table. + - delete everything from that table + - if it fails, create the table + - insert new lines + - if it fails, recrete the table and retry + """ + # Contrary to WorkflowTool_listActions, related keys are NOT supported. + Base_zInsertIntoWorklistTable = getattr(self, 'Base_zInsertIntoWorklistTable', None) + if Base_zInsertIntoWorklistTable is not None: + # XXX: Code below is duplicated from WorkflowTool_listActions + info = self._getOAI(None) + worklist_dict = {} + wf_ids = self.getWorkflowIds() + for wf_id in wf_ids: + wf = self.getWorkflowById(wf_id) + if wf is not None: + a = wf.getWorklistVariableMatchDict(info, check_guard=False) + if a is not None: + worklist_dict[wf_id] = a + # End of duplicated code + if len(worklist_dict): + Base_zClearWorklistTable = getattr(self, 'Base_zClearWorklistTable', None) + if Base_zClearWorklistTable is None: + LOG('WorkflowTool', 100, 'Base_zClearWorklistTable cannot be found. ' \ + 'Falling back to former refresh method. Please update ' \ + 'erp5_worklist_sql business template.') + self.Base_zCreateWorklistTable() + else: + try: + self.Base_zClearWorklistTable() + except ProgrammingError, error_value: + # 1146 = table does not exist + if error_value[0] != 1146: + raise + self.Base_zCreateWorklistTable() + portal_catalog = self.getPortalObject().portal_catalog + search_result = portal_catalog.unrestrictedSearchResults + sql_catalog = portal_catalog.getSQLCatalog() + table_column_id_set = ImmutableSet( + [COUNT_COLUMN_TITLE] + self.Base_getWorklistTableColumnIDList()) + security_column_id_list = list( + sql_catalog.getSQLCatalogSecurityUidGroupsColumnsDict().values()) + \ + [x[1] for x in sql_catalog.getSQLCatalogRoleKeysList()] + \ + [x[1] for x in sql_catalog.getSQLCatalogLocalRoleKeysList()] + security_column_id_set = set(security_column_id_list) + assert len(security_column_id_set) == len(security_column_id_list), ( + security_column_id_set, security_column_id_list) + del security_column_id_list + security_column_id_set.difference_update( + self._getWorklistIgnoredSecurityColumnSet()) + for security_column_id in security_column_id_set: + assert security_column_id in table_column_id_set + (worklist_list_grouped_by_condition, worklist_metadata) = \ + groupWorklistListByCondition( + worklist_dict=worklist_dict, + sql_catalog=sql_catalog) + assert COUNT_COLUMN_TITLE in table_column_id_set + for grouped_worklist_dict in worklist_list_grouped_by_condition: + # Generate the query for this worklist_list + (total_criterion_id_list, query) = \ + 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: + assert security_column_id not in total_criterion_id_list + total_criterion_id_list.append(security_column_id) + group_by_expression = ', '.join(total_criterion_id_list) + assert COUNT_COLUMN_TITLE not in total_criterion_id_list + select_expression = 'count(*) as %s, %s' % (COUNT_COLUMN_TITLE, + group_by_expression) + search_result_kw = {'select_expression': select_expression, + 'group_by_expression': group_by_expression, + 'query': query, + 'limit': None} + #LOG('refreshWorklistCache', WARNING, 'Using query: %s' % \ + # (search_result(src__=1, **search_result_kw), )) + catalog_brain_result = search_result(**search_result_kw) + value_column_dict = {x: [] for x in table_column_id_set} + for catalog_brain_line in catalog_brain_result.dictionaries(): + for column_id, value in catalog_brain_line.iteritems(): + if column_id in value_column_dict: + value_column_dict[column_id].append(value) + if len(value_column_dict[COUNT_COLUMN_TITLE]): + try: + Base_zInsertIntoWorklistTable(**value_column_dict) + except (ProgrammingError, OperationalError), error_value: + # OperationalError 1054 = unknown column + if isinstance(error_value, OperationalError) and error_value[0] != 1054: + raise + LOG('WorkflowTool', 100, 'Insertion in worklist cache table ' \ + 'failed. Recreating table and retrying.', + error=sys.exc_info()) + self.Base_zCreateWorklistTable() + Base_zInsertIntoWorklistTable(**value_column_dict) + + def _getWorklistIgnoredSecurityColumnSet(self): + return getattr(self, + 'Base_getWorklistIgnoredSecurityColumnSet', lambda: ())() + + def listActions(self, info=None, object=None, src__=False): + """ + Returns a list of actions to be displayed to the user. + o Invoked by the portal_actions tool. + o Allows workflows to include actions to be displayed in the + actions box. + o Object actions are supplied by workflows that apply to the object. + o Global actions are supplied by all workflows. + This patch attemps to make listGlobalActions aware of worklists, + which allows factorizing them into one single SQL query. + Related keys are supported. + Warning: the worklist cache does not support them. + """ + if object is not None or info is None: + info = self._getOAI(object) + workflow_list = [] + actions = [] + worklist_dict = {} + + document = info.object + document_pt = None + if document is not None: + document_pt = document.getTypeInfo() + + if document_pt is not None: + workflow_list = document_pt.getTypeWorkflowList() + for wf_id in workflow_list: + wf = self._getOb(wf_id, None) + if wf is not None: + a = wf.listObjectActions(info) + if a is not None and a != []: + actions.extend(a) + a = wf.getWorklistVariableMatchDict(info) + if a is not None: + worklist_dict[wf_id] = a + + wf_ids = self.getWorkflowIds() + for wf_id in wf_ids: + if wf_id not in workflow_list: + wf = self.getWorkflowById(wf_id) + if wf is not None: + worklist_variable_dict = wf.getWorklistVariableMatchDict(info) + if worklist_variable_dict is not None: + worklist_dict[wf_id] = worklist_variable_dict + if worklist_dict: + portal = self.getPortalObject() + portal_url = portal.portal_url() + def _getWorklistActionList(): + is_anonymous = portal.portal_membership.isAnonymousUser() + portal_catalog = portal.portal_catalog + sql_catalog = portal_catalog.getSQLCatalog() + catalog_security_uid_groups_columns_dict = \ + sql_catalog.getSQLCatalogSecurityUidGroupsColumnsDict() + getSecurityUidDictAndRoleColumnDict = \ + portal_catalog.getSecurityUidDictAndRoleColumnDict + search_result = getattr(self, "Base_getCountFromWorklistTable", None) + use_cache = search_result is not None + if use_cache: + ignored_security_column_id_set = self._getWorklistIgnoredSecurityColumnSet() + ignored_security_uid_parameter_set = {x + for x, y in catalog_security_uid_groups_columns_dict.iteritems() + if y in ignored_security_column_id_set + } + _getSecurityUidDictAndRoleColumnDict = getSecurityUidDictAndRoleColumnDict + def getSecurityUidDictAndRoleColumnDict(**kw): + security_uid_dict, role_column_dict, local_role_column_dict = \ + _getSecurityUidDictAndRoleColumnDict(**kw) + for ignored_security_column_id in ignored_security_column_id_set: + role_column_dict.pop(ignored_security_column_id, None) + local_role_column_dict.pop(ignored_security_column_id, None) + for ignored_security_uid_parameter in \ + ignored_security_uid_parameter_set: + 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 + + (worklist_list_grouped_by_condition, worklist_metadata) = \ + groupWorklistListByCondition( + worklist_dict=worklist_dict, + sql_catalog=sql_catalog, + getSecurityUidDictAndRoleColumnDict=\ + getSecurityUidDictAndRoleColumnDict, + catalog_security_uid_groups_columns_dict=\ + catalog_security_uid_groups_columns_dict, + ) + if src__: + action_list = [] + for grouped_worklist_dict in worklist_list_grouped_by_condition: + # Generate the query for this worklist_list + (total_criterion_id_list, query) = \ + 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 + # handles column mapping properly, and build a bare select + # expression. + select_expression = select_expression_prefix + ', ' \ + + group_by_expression + catalog_brain_result = [] + try: + catalog_brain_result = search_result( + select_expression=select_expression, + group_by_expression=group_by_expression, + query=query, + limit=None, + src__=src__) + except Unauthorized: + if not is_anonymous: + raise + LOG('WorkflowTool.listActions', WARNING, + 'Exception while computing worklists: %s' + % grouped_worklist_dict.keys(), + error=sys.exc_info()) + continue + except ProgrammingError, error_value: + # 1146 = table does not exist + if not use_cache or error_value[0] != 1146: + raise + try: + self.Base_zCreateWorklistTable() + except ProgrammingError, error_value: + # 1050 = table exists (alarm run just a bit too late) + if error_value[0] != 1050: + raise + if src__: + action_list.append(catalog_brain_result) + else: + grouped_worklist_result = sumCatalogResultByWorklist( + grouped_worklist_dict=grouped_worklist_dict, + catalog_result=catalog_brain_result) + for key, value in grouped_worklist_result.iteritems(): + worklist_result_dict[key] = value + worklist_result_dict.get(key, 0) + if not src__: + action_list = sorted( + generateActionList( + worklist_metadata=worklist_metadata, + worklist_result=worklist_result_dict, + portal_url=portal_url), + key=lambda x: '/'.join((x['workflow_id'], x['worklist_id'])), + ) + return action_list + + user = _getAuthenticatedUser(self).getIdOrUserName() + if src__: + actions = _getWorklistActionList() + else: + _getWorklistActionList = CachingMethod(_getWorklistActionList, + id=('_getWorklistActionList', user, portal_url), + cache_factory = 'erp5_ui_short') + actions.extend(_getWorklistActionList()) + return actions + + def _finalizeWorkflowConversion(self, dc_wf): + trash_tool = getattr(self.getPortalObject(), 'portal_trash', None) + if trash_tool is not None: + # move old workflow to trash tool; + LOG(" | Move old workflow '%s' into a trash bin", 0, dc_wf.id) + self._delOb(dc_wf.id) + trashbin = UnrestrictedMethod(trash_tool.newTrashBin)(dc_wf.id) + trashbin._setOb(dc_wf.id, dc_wf) + +InitializeClass(WorkflowTool) + +_sql_cast_dict = { + 'i': long, + 'l': long, + 'n': float, + 'd': DateTime, +} +_sql_cast_fallback = str + +class WorkflowMethod( Method ): + + """ Wrap a method to workflow-enable it. + """ + _need__name__=1 + + def __init__(self, method, id=None, reindex=1): + self._m = method + if id is None: + id = method.__name__ + self._id = id + # reindex ignored since workflows now perform the reindexing. + + def __call__(self, instance, *args, **kw): + + """ Invoke the wrapped method, and deal with the results. + """ + wf = self.getPortalObject()._getOb('portal_workflow', None) + if wf is None or not hasattr(wf, 'wrapWorkflowMethod'): + # No workflow tool found. + try: + res = self._m(instance, *args, **kw) + except ObjectDeleted, ex: + res = ex.getResult() + else: + if hasattr(aq_base(instance), 'reindexObject'): + instance.reindexObject() + else: + res = wf.wrapWorkflowMethod(instance, self._id, self._m, + (instance,) + args, kw) + +from Products.CMFCore import WorkflowCore +# BBB: WorkflowMethod has been removed from CMFCore 2 +WorkflowCore.WorkflowAction = WorkflowMethod + +def getValidCriterionDict(worklist_match_dict, sql_catalog, workflow_worklist_key): + valid_criterion_dict = {} + metadata = None + isValidColumn = sql_catalog.isValidColumn + for criterion_id, criterion_value in worklist_match_dict.iteritems(): + if criterion_id.startswith('variable_'): + criterion_id = '_'.join(criterion_id.split('_')[1:]) + if isValidColumn(criterion_id): + if isinstance(criterion_value, tuple): + criterion_value = list(criterion_value) + elif isinstance(criterion_value, (str, int, long)): + criterion_value = [criterion_value] + assert criterion_id not in valid_criterion_dict + valid_criterion_dict[criterion_id] = criterion_value + elif criterion_id == WORKLIST_METADATA_KEY: + metadata = criterion_value + elif criterion_id == SECURITY_PARAMETER_ID: + pass + else: + LOG('WorkflowTool_listActions', WARNING, 'Worklist %r' \ + ' filters on variable %r which is not available ' \ + 'in catalog. Its value will not be checked.' % \ + (workflow_worklist_key, criterion_id)) + return valid_criterion_dict, metadata + +def updateWorklistSetDict(worklist_set_dict, workflow_worklist_key, valid_criterion_dict): + worklist_set_dict_key = valid_criterion_dict.keys() + if len(worklist_set_dict_key): + worklist_set_dict_key.sort() + worklist_set_dict_key = tuple(worklist_set_dict_key) + if worklist_set_dict_key not in worklist_set_dict: + worklist_set_dict[worklist_set_dict_key] = {} + worklist_set_dict[worklist_set_dict_key]\ + [workflow_worklist_key] = valid_criterion_dict + +def groupWorklistListByCondition(worklist_dict, sql_catalog, getSecurityUidDictAndRoleColumnDict=None, catalog_security_uid_groups_columns_dict=None,): + """ + Get a list of dict of WorklistVariableMatchDict grouped by compatible + conditions. + Strip any variable which is not a catalog column. + Returns metadata in a separate dict. + + Example: + Input: + worklist_dict: + {'workflow_A': {'worklist_AA': {'foo': (1, 2), 'bar': (3, 4)}, + 'worklist_AB': {'baz': (5, )} + } + 'workflow_B': {'worklist_BA': {'baz': (6, )} + } + } + + Allowed columns are: + sql_catalog.isValidColumn('foo') is True + sql_catalog.isValidColumn('baz') is True + sql_catalog.isValidColumn('bar') is False + + Output a 2-tuple: + ( + [{'workflow_A/worklist_AA': {'foo': (1, 2)} + }, + {'workflow_A/worklist_AB': {'baz': (5, )}, + 'workflow_B/worklist_BA': {'baz': (6, )} + } + ] + , + {} # Contains metadata information, one entry per worklist. + ) + """ + # One entry per worklist group, based on filter criterions. + worklist_set_dict = {} + metadata_dict = {} + + for workflow_id, worklist in worklist_dict.iteritems(): + for worklist_id, worklist_match_dict in worklist.iteritems(): + # creates keys for new 'metadata' dict + workflow_worklist_key = '/'.join((workflow_id, worklist_id)) + if getSecurityUidDictAndRoleColumnDict is None: + valid_criterion_dict, metadata = getValidCriterionDict( + worklist_match_dict=worklist_match_dict, + sql_catalog=sql_catalog, + workflow_worklist_key=workflow_worklist_key) + if metadata is not None: + metadata_dict[workflow_worklist_key] = metadata + updateWorklistSetDict( + worklist_set_dict=worklist_set_dict, + workflow_worklist_key=workflow_worklist_key, + valid_criterion_dict=valid_criterion_dict) + else: + security_parameter = worklist_match_dict.get(SECURITY_PARAMETER_ID, []) + security_kw = {} + if len(security_parameter): + security_kw[SECURITY_PARAMETER_ID] = security_parameter + uid_dict, role_column_dict, local_role_column_dict = \ + getSecurityUidDictAndRoleColumnDict(**security_kw) + + for key, value in local_role_column_dict.items(): + worklist_match_dict[key] = [value] + + for local_roles_group_id, uid_list in uid_dict.iteritems(): + role_column_dict[ + catalog_security_uid_groups_columns_dict[local_roles_group_id]] = uid_list + + # Make sure every item is a list - or a tuple + for security_column_id in role_column_dict.iterkeys(): + value = role_column_dict[security_column_id] + if not isinstance(value, (tuple, list)): + role_column_dict[security_column_id] = [value] + applied_security_criterion_dict = {} + # TODO: make security criterions be examined in the same order for all + # worklists if possible at all. + for security_column_id, security_column_value in \ + role_column_dict.iteritems(): + valid_criterion_dict, metadata = getValidCriterionDict( + worklist_match_dict=worklist_match_dict, + sql_catalog=sql_catalog, + workflow_worklist_key=workflow_worklist_key) + if metadata is not None: + metadata_dict[workflow_worklist_key] = metadata + valid_criterion_dict.update(applied_security_criterion_dict) + # Current security criterion must be applied to all further queries + # for this worklist negated, so the a given line cannot match multiple + # times. + applied_security_criterion_dict[security_column_id] = \ + ExclusionList(security_column_value) + valid_criterion_dict[security_column_id] = security_column_value + updateWorklistSetDict( + worklist_set_dict=worklist_set_dict, + workflow_worklist_key=workflow_worklist_key, + valid_criterion_dict=valid_criterion_dict) + + return worklist_set_dict.values(), metadata_dict + +def generateNestedQuery(getQuery, priority_list, criterion_dict, possible_worklist_id_dict=None): + assert possible_worklist_id_dict is None \ + or len(possible_worklist_id_dict) != 0 + my_priority_list = priority_list[:] + my_criterion_id = my_priority_list.pop() + query_list = [] + append = query_list.append + my_criterion_dict = criterion_dict[my_criterion_id] + if len(my_priority_list) > 0: + for criterion_value, worklist_id_dict in my_criterion_dict.iteritems(): + if possible_worklist_id_dict is not None: + criterion_worklist_id_dict = worklist_id_dict.copy() + # Do not use iterkeys since the dictionary will be modified in the + # loop + for worklist_id in criterion_worklist_id_dict.keys(): + if worklist_id not in possible_worklist_id_dict: + del criterion_worklist_id_dict[worklist_id] + else: + 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 = getQuery(comparison_operator='IN', + **{my_criterion_id: criterion_value}) + if isinstance(criterion_value, ExclusionTuple): + query = NegatedQuery(query) + query = ComplexQuery(operator='OR', + *(query, getQuery(**{my_criterion_id: None}))) + append(ComplexQuery(query, subcriterion_query, operator='AND')) + else: + possible_value_list = tuple() + impossible_value_list = tuple() + possible = True + for criterion_value, criterion_worklist_id_dict \ + in my_criterion_dict.iteritems(): + if possible_worklist_id_dict is not None: + possible = False + for worklist_id in criterion_worklist_id_dict.iterkeys(): + if worklist_id in possible_worklist_id_dict: + possible = True + break + if possible: + if isinstance(criterion_value, ExclusionTuple): + impossible_value_list += criterion_value + else: + possible_value_list += criterion_value + value_query_list = [] + if len(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 = getQuery( + comparison_operator='IN', + **{my_criterion_id: impossible_value_list} + ) + query = NegatedQuery(query) + query = ComplexQuery(operator='OR', + *(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(getQuery, grouped_worklist_dict): + """ + Return a tuple of 3 value: + - a select_expression with a count(*) and all columns used in + goup_by_expression + - a group_by_expression with all columns required for provided + grouped_worklist_dict + - a query applying all criterions contained in provided + grouped_worklist_dict + """ + query_list = [] + total_criterion_id_dict = {} + for worklist_id, worklist in grouped_worklist_dict.iteritems(): + for criterion_id, criterion_value in worklist.iteritems(): + criterion_value_to_worklist_dict_dict = \ + total_criterion_id_dict.setdefault(criterion_id, {}) + criterion_value.sort() + if isinstance(criterion_value, ExclusionList): + criterion_value = ExclusionTuple(criterion_value) + else: + criterion_value = tuple(criterion_value) + criterion_value_to_worklist_dict = \ + criterion_value_to_worklist_dict_dict.setdefault(criterion_value, {}) + 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( + 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) + +def generateActionList(worklist_metadata, worklist_result, portal_url): + """ + For each worklist generate action_list as expected by portal_actions. + """ + action_list = [] + append = action_list.append + + for key, metadata in worklist_metadata.iteritems(): + document_count = worklist_result.get(key, 0) + if document_count: + format_data = metadata['format_data'] + format_data._push({'count': document_count}) + append({'name': metadata['worklist_title'] % format_data, + 'url': (portal_url if not metadata['action_box_url'] else #in DCWorkflow: metadata['action_box_url] = 'None' (string) + '%s/%s' % (portal_url, + metadata['action_box_url'] % format_data) + ), + 'worklist_id': metadata['worklist_id'], + 'workflow_title': metadata['workflow_title'], + 'workflow_id': metadata['workflow_id'], + 'count': format_data['count'], + 'permissions': (), # Predetermined. + 'category': metadata['action_box_category']}) + return action_list + +def sumCatalogResultByWorklist(grouped_worklist_dict, catalog_result): + """ + Return a dict regrouping each worklist's result, extracting it from + catalog result. + Build a dictionnary summing up which value combination interests which + worklist, then iterate catalog result lines and give results to + corresponding worklists. + + It is better to avoid reading multiple times the catalog result from + flexibility point of view: if it must ever be changed into a cursor, this + code will keep working nicely without needing to rewind the cursor. + + This code assumes that all worklists have the same set of criterion ids, + and that when a criterion id is associated with an ExclusionList it is + also true for all worklists. + """ + worklist_result_dict = {} + if len(catalog_result) > 0: + # Transtype all worklist definitions where needed + criterion_id_list = [] + class_dict = {name: _sql_cast_dict.get(x['type'], _sql_cast_fallback) + for name, x in catalog_result.data_dictionary().iteritems()} + for criterion_dict in grouped_worklist_dict.itervalues(): + for criterion_id, criterion_value_list in criterion_dict.iteritems(): + if type(criterion_value_list) is not ExclusionList: + criterion_id_list.append(criterion_id) + expected_class = class_dict[criterion_id] + if type(criterion_value_list[0]) is not expected_class: + criterion_dict[criterion_id] = ImmutableSet([expected_class(x) for x in criterion_value_list]) + elif type(criterion_value_list) is not ImmutableSet: + criterion_dict[criterion_id] = ImmutableSet(criterion_dict[criterion_id]) + # Read catalog result and distribute to matching worklists + for result_line in catalog_result: + result_count = int(result_line[COUNT_COLUMN_TITLE]) + for worklist_id, criterion_dict in grouped_worklist_dict.iteritems(): + is_candidate = True + for criterion_id in criterion_id_list: + criterion_value_set = criterion_dict[criterion_id] + if result_line[criterion_id] not in criterion_value_set: + is_candidate = False + break + if is_candidate: + try: + worklist_result_dict[worklist_id] += result_count + except KeyError: + worklist_result_dict[worklist_id] = result_count + return worklist_result_dict + +class WorkflowHistoryList(Persistent): + _bucket_size = 16 + + def __init__(self, iterable=None, prev=None): + self._prev = prev + self._slots = [] + if iterable is not None: + for x in iterable: + self.append(x) + + def __add__(self, iterable): + return self.__class__(tuple(self) + tuple(iterable)) + + def __contains__(self, item): + return item in tuple(self) + + def __eq__(self, other): + return tuple(self) == tuple(other) + + def __getitem__(self, index): + if index == -1: + return self._slots[-1] + elif isinstance(index, (int, long)): + if index < 0: + # XXX this implementation is not so good, but rarely used. + index += len(self) + iterator = self.__iter__() + for i in xrange(index): + iterator.next() + return iterator.next() + elif isinstance(index, slice): + return self.__class__((self[x] for x in + xrange(*index.indices(len(self))))) + else: + raise TypeError, 'tuple indices must be integers' + + def __getslice__(self, start, end): + return self.__getitem__(slice(start, end)) + + def __getstate__(self): + return (self._prev, self._slots) + + def __iter__(self): + bucket = self + stack = [] + while bucket is not None: + stack.append(bucket) + bucket = bucket._prev + for i in reversed(stack): + for j in i._slots: + yield j + + def __len__(self): + length = len(self._slots) + bucket = self._prev + while bucket is not None: + length += len(bucket._slots) + bucket = bucket._prev + return length + + def __mul__(self, x): + return self.__class__(tuple(self) * x) + + def __nonzero__(self): + return len(self._slots) != 0 or self._prev is not None + + def __repr__(self): + #return '%s' % repr(tuple(self.__iter__())) + return '<%s object at 0x%x %r>' % (self.__class__.__name__, id(self), tuple(self)) + + def __rmul__(self, x): + return self.__class__(x * tuple(self)) + + def __setstate__(self, state): + self._prev, self._slots = state + + def append(self, value): + if len(self._slots) < self._bucket_size: + self._slots.append(value) + self._p_changed = 1 + else: + self._prev = self.__class__(self._slots, prev=self._prev) + self._slots = [value] + +WORKLIST_METADATA_KEY = 'metadata' +SECURITY_PARAMETER_ID = 'local_roles' +COUNT_COLUMN_TITLE = 'count' + +class ExclusionList(list): + """ + This is a dummy subclass of list. + It is only used to detect wether contained values must be negated. + It is not to be used outside of the scope of this document nor outside + of the scope of worklist criterion handling. + """ + pass + +class ExclusionTuple(tuple): + """ + This is a dummy subclass of tuple. + It is only used to detect wether contained values must be negated. + It is not to be used outside of the scope of this document nor outside + of the scope of worklist criterion handling. + """ + pass diff --git a/product/ERP5Workflow/Tool/__init__.py b/product/ERP5Workflow/Tool/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/product/ERP5Workflow/__init__.py b/product/ERP5Workflow/__init__.py index 0112e8226720821d79411df0002306fda5283d82..362e007b6faab0bcc3f39eaa49c6b4d0dc673c9a 100644 --- a/product/ERP5Workflow/__init__.py +++ b/product/ERP5Workflow/__init__.py @@ -31,6 +31,7 @@ """ # Update ERP5 Globals +from Tool.WorkflowTool import WorkflowTool from Products.ERP5Type.Utils import initializeProduct, updateGlobals import sys import Permissions @@ -40,7 +41,7 @@ document_classes = updateGlobals(this_module, globals(), # Define object classes and tools object_classes = () -portal_tools = () +portal_tools = (WorkflowTool,) content_classes = () content_constructors = () diff --git a/product/ERP5Workflow/mixin/__init__.py b/product/ERP5Workflow/mixin/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/product/ERP5Workflow/mixin/guardable.py b/product/ERP5Workflow/mixin/guardable.py new file mode 100644 index 0000000000000000000000000000000000000000..3c1ebc3c01dee164216bf660b16152044a1e0e6d --- /dev/null +++ b/product/ERP5Workflow/mixin/guardable.py @@ -0,0 +1,108 @@ +from cgi import escape + +from AccessControl.SecurityInfo import ClassSecurityInfo +from Acquisition import Explicit +from Acquisition import aq_base +from App.class_init import InitializeClass +from App.special_dtml import DTMLFile +from Persistence import Persistent + +from Products.CMFCore.Expression import Expression +from Products.CMFCore.utils import _checkPermission +from Products.ERP5Type import Permissions + +from Products.DCWorkflow.Expression import StateChangeInfo +from Products.DCWorkflow.Expression import createExprContext +from Products.DCWorkflow.utils import _dtmldir + + +class GuardableMixin(object): + ''' + code of methods and functions taken from + Products.DCWorkflow-2.2.4 > Guard.py + ''' + + guard_expression = Expression('') + guard_group = () + guard_permission = () + guard_role = () + + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.ManagePortal) + + def isGuarded(self): + # Returns True if object has at least one of the guard securities set among: + # * expression + # * group + # * permission + # * role + return self.guard_expression or self.guard_group or \ + self.guard_permission or self.guard_role + + def checkGuard(self, security_manager, workflow, current_object, check_roles=True, **kw): + # Checks conditions in this guard. + # original source code from DCWorkflow (Nexedi patched version for use of + # proxy_roles) + user_roles = None + + def getRoles(): + stack = security_manager._context.stack + if stack: + proxy_roles = getattr(stack[-1], '_proxy_roles', None) + if proxy_roles: + return proxy_roles + return security_manager.getUser().getRolesInContext(current_object) + + if workflow.manager_bypass: + # Possibly bypass. + user_roles = getRoles() + if 'Manager' in user_roles: + return True + if self.guard_permission: + for permission in self.guard_permission: + if _checkPermission(permission, current_object): + break + else: + return False + if check_roles and self.guard_role: + # Require at least one of the given roles. + if user_roles is None: + user_roles = getRoles() + for role in self.guard_role: + if role in user_roles: + break + else: + return False + if self.guard_group: + # Require at least one of the specified groups. + user = security_manager.getUser() + base = aq_base(user) + if hasattr(base, 'getGroupsInContext'): + user_groups = user.getGroupsInContext(current_object) + elif hasattr(base, 'getGroups' ): + user_groups = user.getGroups() + else: + user_groups = () + for group in self.guard_group: + if group in user_groups: + break + else: + return False + if self.guard_expression and self.guard_expression.text: + expression_context = createExprContext(StateChangeInfo(current_object, + workflow, + kwargs=kw)) + if not self.guard_expression(expression_context): + return False + return True + + def _setGuardExpression(self, text): + if text: + self.guard_expression = Expression(text) + else: + self.guard_expression = None + + def _getGuardExpression(self): + if self.guard_expression is None: + return Expression('') + return self.guard_expression diff --git a/product/ERP5Workflow/tests/testERP5Workflow.py b/product/ERP5Workflow/tests/testERP5Workflow.py index 5ac9f37c858a5597223b4b3b1d541066769e8d47..b712752926aa39147fbace6cecfe69e160065094 100644 --- a/product/ERP5Workflow/tests/testERP5Workflow.py +++ b/product/ERP5Workflow/tests/testERP5Workflow.py @@ -1,7 +1,8 @@ ############################################################################## # # Copyright (c) 2007 Nexedi SA and Contributors. All Rights Reserved. -# Jerome Perrin +# Jerome Perrin +# 2015 Wenjie ZHENG # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential @@ -49,154 +50,211 @@ class TestERP5Workflow(ERP5TypeTestCase): def afterSetUp(self): self.portal = self.getPortal() - self.workflow_module = self.portal.workflow_module + #self.portal.migrateToPortalWorkflowClass() + self.workflow_module = self.portal.portal_workflow self.login() # as Manager def test_SimpleWorkflow(self): workflow = self.workflow_module.newContent( portal_type='Workflow') - s1 = workflow.newContent(portal_type='State', + workflow.setReference('wf') + # state variable + workflow.setStateVariable('current_state') + state1 = workflow.newContent(portal_type='State', title='State 1') - s2 = workflow.newContent(portal_type='State', + state2 = workflow.newContent(portal_type='State', title='State 2') - t1 = workflow.newContent(portal_type='Transition', + state1.setReference('state1') + state2.setReference('state2') + transition1 = workflow.newContent(portal_type='Transition', title='Transition 1') - s1.setDestinationValue(t1) - t1.setDestinationValue(s2) + transition1.setReference('transition1') + state1.setDestinationValue(transition1) + transition1.setDestinationValue(state2) # set initial state - workflow.setSourceValue(s1) - # state variable - workflow.setStateBaseCategory('current_state') - + workflow.setSourceValue(state1) # create a document and associate it to this workflow + self.getPortalObject().portal_types._getOb('Folder')\ + .edit(type_workflow_list=('wf')) doc = self.portal.newContent(portal_type='Folder', id='test_doc') - workflow.initializeDocument(doc) - self.assertEqual(s1.getRelativeUrl(), - doc._getDefaultAcquiredCategoryMembership('current_state')) + self.assertEqual('state1', workflow._getWorkflowStateOf(doc, id_only=1)) # pass a transition - t1.execute(doc) - self.assertEqual(s2.getRelativeUrl(), - doc._getDefaultAcquiredCategoryMembership('current_state')) + workflow._executeTransition(doc, transition1) + self.assertEqual('state2', workflow._getWorkflowStateOf(doc, id_only=1)) def test_getAvailableTransitionList(self): - workflow = self.workflow_module.newContent( - portal_type='Workflow', - state_base_category='current_state') - s1 = workflow.newContent(portal_type='State', + workflow = self.workflow_module.newContent(portal_type='Workflow') + workflow.setReference('wf') + workflow.setStateVariable('current_state') + state1 = workflow.newContent(portal_type='State', title='State 1') - workflow.setSourceValue(s1) - t1 = workflow.newContent(portal_type='Transition', + state1.setReference('state1') + workflow.setSourceValue(state1) + transition1 = workflow.newContent(portal_type='Transition', title='Transition 1') - t2 = workflow.newContent(portal_type='Transition', + transition1.setReference('transition1') + transition2 = workflow.newContent(portal_type='Transition', title='Transition 2', guard_expression='python: False') - s1.setDestinationValueList([t1, t2]) + transition2.setReference('transition2') + state1.setDestinationValueList([transition1, transition2]) + self.getPortalObject().portal_types._getOb('Folder')\ + .edit(type_workflow_list=('wf')) doc = self.portal.newContent(portal_type='Folder', id='test_doc') - workflow.initializeDocument(doc) - self.assertEqual([t1], s1.getAvailableTransitionList(doc)) + self.assertEqual([transition1, transition2], state1.getDestinationValueList()) def test_WorkflowVariables(self): workflow = self.workflow_module.newContent( - portal_type='Workflow', - state_base_category='current_state') - s1 = workflow.newContent(portal_type='State', + portal_type='Workflow') + workflow.setReference('wf') + workflow.setStateVariable('current_state') + state1 = workflow.newContent(portal_type='State', title='State 1') - workflow.setSourceValue(s1) - t1 = workflow.newContent(portal_type='Transition', + state1.setReference('state1') + workflow.setSourceValue(state1) + transition1 = workflow.newContent(portal_type='Transition', title='Transition 1', - destination_value=s1) - s1.setDestinationValue(t1) - - v1 = workflow.newContent(portal_type='Variable', - title='actor', - initial_value='member/getIdOrUserName') - + destination_value=state1) + transition1.setReference('transition1') + state1.setDestinationValue(transition1) + + variable1 = workflow.newContent(portal_type='Workflow Variable', + title='actor') + variable1.setReference('actor') + variable1.setVariableExpression('user/getUserName') + self.getPortalObject().portal_types._getOb('Folder')\ + .edit(type_workflow_list=('wf')) doc = self.portal.newContent(portal_type='Folder', id='test_doc') - workflow.initializeDocument(doc) - t1.execute(doc) - + workflow._executeTransition(doc,transition1) current_state = workflow.getCurrentStatusDict(doc) self.assertTrue(isinstance(current_state, dict)) - self.assertEqual(s1.getRelativeUrl(), current_state.get('current_state')) + self.assertEqual(state1.getReference(), current_state.get('current_state')) self.assertEqual('ERP5TypeTestCase', current_state.get('actor')) - self.assertEqual(0, current_state.get('undo')) - # XXX workflow history is a method on State ? - history = s1.getWorkflowHistory(doc) - self.assertEqual(len(history), 2) + history = doc.workflow_history['wf'] + self.assertEqual(len(history), 2)# create, transition1 def test_afterScript(self): workflow = self.workflow_module.newContent( - portal_type='Workflow', - state_base_category='current_state') - s1 = workflow.newContent(portal_type='State', + portal_type='Workflow', + state_base_category='current_state' + ) + workflow.setReference('wf') + state1 = workflow.newContent(portal_type='State', title='State 1') - s2 = workflow.newContent(portal_type='State', + state2 = workflow.newContent(portal_type='State', title='State 2') - t1 = workflow.newContent(portal_type='Transition', - title='Transition 1', - after_script_id='Document_testAfterScript' - ) - s1.setDestinationValue(t1) - t1.setDestinationValue(s2) - workflow.setSourceValue(s1) - + state1.setReference('state1') + state2.setReference('state2') + transition1 = workflow.newContent(portal_type='Transition', + title='Transition 1') + transition1.setReference('transition1') + state1.setDestinationValue(transition1) + transition1.setDestinationValue(state2) + workflow.setSourceValue(state1) + script = workflow.newContent(portal_type='Workflow Script', + id='Document_testAfterScript') + script.setParameterSignature("state_change") + script.setParameterSignature("state_change") + script.setBody("state_change['object'].setDescription('After script was " + + "executed.')") + transition1.setCategoryList(transition1.getCategoryList() + + ['after_script/' + script.getRelativeUrl()]) + + self.getPortalObject().portal_types._getOb('Folder')\ + .edit(type_workflow_list=('wf')) doc = self.portal.newContent(portal_type='Folder', id='test_doc') - called = [] - def Document_testAfterScript(**kw): - called.append('called %s' % kw) - doc.Document_testAfterScript = Document_testAfterScript - - workflow.initializeDocument(doc) - t1.execute(doc) - self.assertEqual(['called {}'], called) + workflow._executeTransition(doc, transition1) + self.assertEqual('After script was executed.', doc.getDescription()) # FIXME: not passing parameter to an after script is probably too # restrictive - def test_BeforeScript(self): - workflow = self.workflow_module.newContent( - portal_type='Workflow', - state_base_category='current_state') - s1 = workflow.newContent(portal_type='State', - title='State 1') - s2 = workflow.newContent(portal_type='State', - title='State 2') - t1 = workflow.newContent(portal_type='Transition', - title='Transition 1', - before_script_id='Document_testBeforeScript' - ) - s1.setDestinationValue(t1) - t1.setDestinationValue(s2) - workflow.setSourceValue(s1) - + def test_beforeScript(self): + workflow = self.workflow_module.newContent(portal_type='Workflow') + workflow.setReference('wf') + workflow.setStateVariable('current_state') + state1 = workflow.newContent(portal_type='State', title='State 1') + state2 = workflow.newContent(portal_type='State', title='State 2') + state1.setReference('state1') + state2.setReference('state2') + transition1 = workflow.newContent(portal_type='Transition', title='Transition 1') + transition1.setReference('transition1') + state1.setDestinationValue(transition1) + transition1.setDestinationValue(state2) + workflow.setSourceValue(state1) + script = workflow.newContent(portal_type='Workflow Script', + id='Document_testBeforeScript') + script.setParameterSignature("state_change") + script.setBody("state_change['object'].setDescription('Before script was " + + "executed.')") + transition1.setCategoryList(transition1.getCategoryList() + + ['before_script/' + script.getRelativeUrl()]) + self.getPortalObject().portal_types._getOb('Folder')\ + .edit(type_workflow_list=('wf')) doc = self.portal.newContent(portal_type='Folder', id='test_doc') - called = [] - def Document_testBeforeScript(**kw): - called.append('called %s' % kw) - doc.Document_testBeforeScript = Document_testBeforeScript - - workflow.initializeDocument(doc) - t1.execute(doc) - self.assertEqual(['called {}'], called) + workflow._executeTransition(doc, transition1) + self.assertEqual('Before script was executed.', doc.getDescription()) # FIXME: not passing parameter to an before script is probably too # restrictive + def test_TransitionGuards(self, transition_type='Transition'): + workflow_type = 'Workflow' if transition_type == 'Transition' else \ + 'Interaction Workflow' + workflow = self.workflow_module.newContent(portal_type=workflow_type) + transition = workflow.newContent(portal_type=transition_type) + # roles + transition.setGuardRoleList([]) + self.assertEqual(transition.guard_role, ()) + transition.setGuardRoleList(['Assignor', 'Assignee']) + self.assertEqual(('Assignor', 'Assignee'), transition.guard_role) + # permissions + transition.setGuardPermissionList([]) + self.assertEqual(transition.guard_permission, ()) + transition.setGuardPermissionList(['Modify portal content']) + self.assertEqual(('Modify portal content',), transition.guard_permission) + # groups + transition.setGuardGroupList([]) + self.assertEqual(transition.guard_group, ()) + transition.setGuardGroupList(['Group1', 'Group2']) + self.assertEqual(transition.guard_group, ('Group1', 'Group2')) + # expression + transition.setGuardExpression('python: "Hello, world"') + self.assertEqual(transition.guard_expression.text, 'python: "Hello, world"') + + def test_InteractionGuards(self): + self.test_TransitionGuards(transition_type='Interaction') + + def test_Base_viewDict(self): + """ + verify that Base_viewDict view can be accessed + """ + workflow = self.workflow_module.newContent(portal_type='Workflow') + state = workflow.newContent(portal_type='State', title='Some State') + transition = workflow.newContent(portal_type='Transition', + title='Some Transition') + transition.setReference('change_something') + transition.setGuardRoleList(['Assignee', 'Assignor']) + transition.setCategoryList('destination/' + transition.getPath()) + transition.Base_viewDict() + def test_WorkflowSecurity(self): """ - Test workflow security. + Test workflow security. Should be test with other methods. To be finished. """ - workflow_module = self.portal.workflow_module + workflow_module = self.portal.portal_workflow def createWorkflowInstance(): - return workflow_module.newContent(portal_type='Workflow') + workflow = workflow_module.newContent(portal_type='Workflow') + workflow.setReference('wf') + return workflow workflow_instance = createWorkflowInstance() @@ -207,9 +265,7 @@ class TestERP5Workflow(ERP5TypeTestCase): self.assertRaises(Unauthorized, createWorkflowInstance) self.assertRaises(Unauthorized, lambda: workflow_instance.view()) - def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestERP5Workflow)) return suite - diff --git a/product/ERP5Workflow/tool.png b/product/ERP5Workflow/tool.png new file mode 100644 index 0000000000000000000000000000000000000000..681679219796ba6657aba4a13518b632ac71e05f Binary files /dev/null and b/product/ERP5Workflow/tool.png differ diff --git a/product/Formulator/StandardFields.py b/product/Formulator/StandardFields.py index ebfb65b2387035e41a1f804e7a9e1296844f0e9e..abe3509fe452167cf2666e60b203526ec186b722 100644 --- a/product/Formulator/StandardFields.py +++ b/product/Formulator/StandardFields.py @@ -184,6 +184,10 @@ class DateTimeField(ZMIField): if REQUEST.form['subfield_%s_%s' % (key, 'year')]: return None +gmt_timezones = [('GMT%s' %zone, 'GMT%s' %zone,) for zone in range(-12, 0)]\ + + [('GMT', 'GMT',),] \ + + [('GMT+%s' %zone, 'GMT+%s' %zone,) for zone in range(1, 13)] + def create_datetime_text_sub_form(): sub_form = BasicForm() @@ -234,7 +238,7 @@ def create_datetime_text_sub_form(): title = "Timezone", required = 0, default = 'GMT', - items = Widget.gmt_timezones, + items = gmt_timezones, size = 1) sub_form.add_fields([hour, minute, ampm, timezone], "time") return sub_form @@ -292,7 +296,7 @@ def create_datetime_list_sub_form(): title = "Timezone", required = 0, default = 'GMT', - items = Widget.gmt_timezones, + items = gmt_timezones, size = 1) sub_form.add_group("time") diff --git a/product/Formulator/Widget.py b/product/Formulator/Widget.py index 1ed30afe5c920f1042c440818174c737f87939f3..13994392a822de76424189db3027c9caaf26a080 100644 --- a/product/Formulator/Widget.py +++ b/product/Formulator/Widget.py @@ -1296,8 +1296,6 @@ class MultiCheckBoxWidget(MultiItemsWidget): MultiCheckBoxWidgetInstance = MultiCheckBoxWidget() -gmt_timezones = [(x, x) for x in sorted(set(Timezones()))] - class DateTimeWidget(Widget): """ Added support for key in every call to render_sub_field @@ -1379,15 +1377,6 @@ class DateTimeWidget(Widget): ("list", "list")], size=1) - default_timezone = fields.ListField('default_timezone', - title="Default Timezone", - description=( - "The default timezone display when inputing a new date"), - default="GMT", - items=gmt_timezones, - required=1, - size=1) - input_order = fields.ListField('input_order', title="Input order", description=( @@ -1415,8 +1404,8 @@ class DateTimeWidget(Widget): property_names = Widget.property_names +\ ['default_now', 'date_separator', 'time_separator', 'input_style', 'input_order', 'date_only', - 'ampm_time_style', 'timezone_style', 'default_timezone', - 'hide_day', 'hidden_day_is_last_day'] + 'ampm_time_style', 'timezone_style', 'hide_day', + 'hidden_day_is_last_day'] def getInputOrder(self, field): input_order = field.get_value('input_order') @@ -1474,7 +1463,7 @@ class DateTimeWidget(Widget): hour = None minute = None ampm = None - timezone = field.get_value("default_timezone") + timezone = None if isinstance(value, DateTime): year = "%04d" % value.year() month = "%02d" % value.month() diff --git a/product/Formulator/tests/testSerializeForm.py b/product/Formulator/tests/testSerializeForm.py index 1df549d5ddc1dd5d0d561914bf892f8af78278f4..4c331581354311f5912ab16e5915e0ec1edac7f5 100644 --- a/product/Formulator/tests/testSerializeForm.py +++ b/product/Formulator/tests/testSerializeForm.py @@ -280,7 +280,6 @@ class SerializeTestCase(unittest.TestCase): request.update(default_values) request.update( {'field_input_style': 'list', 'field_input_order': 'mdy', - 'field_default_timezone': 'GMT', 'field_date_only': '', 'field_css_class': 'test_css', 'field_time_separator': '$', diff --git a/tests/__init__.py b/tests/__init__.py index c025a4642b4e231e05706d19ebcd3c92c2621120..945db3635008de1639bc8a5bce9ab5b0622debcc 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -63,6 +63,7 @@ class PERF(_ERP5): def getTestList(self): return [x for x in self._getAllTestList() if x.find('Performance')>0] + class CloudPERF(_ERP5): def getTestList(self): @@ -122,6 +123,17 @@ class ERP5(_ERP5): status_dict['skip_count'] = int(group_dict['expected_failure']) return status_dict +class WORKFLOW(ERP5): + # new test suite running a few test related to Workflow + # (to be used instead of ERP5 class, which run all tests) + def getTestList(self): + return ['testERP5Workflow', 'testERP5Type', 'testInteractionWorkflow', + 'erp5_core_test:testSQLCachedWorklist', 'erp5_core_test:testWorklist', + 'erp5_workflow_test:testWorkflowAndDCWorkflow', 'testERP5Simulation', + 'testDmsWithPreConversion', 'testERP5BankingCashInventory', + 'testInventoryModule', 'testPackingList', 'testBase', + 'testERP5BankingUsualCashTransfer'] + class ERP5_simulation(_ERP5):