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
-5vDVatuW0eU0S61A7wROThySdZwbOM0WrogF4Z/6kfy+7SbdynL0m2MM2KqmWadaOKuiMcgKOqnw
-3734tguHNG/2TOWtd/tiMhrvPwHIMucOnOWbky5MfzdEeAjBU8GZ0ydp8MyzJCXmPatnQkIC7u7u
-BV5rxfJltO/QgW2nCze5nfbWVarOGkI9vdpWUoiMTBeDdEGQsE1bUSIYBTiYbOLUx9OwBAT/4/cN
-Ddbz14nrBHn55Xq8U11vfvzhe/6pHxE8Rm0I+fHRxD9x8fWkT8+gf3S+QPAktSFkx9XVtUi+CXNQ
-KY4Pn4d5xiAaeXlDUDCEhdl6GalUUCoUypTBcusWuxQHLo+ei+Li/lDs8U/9iOAREgRJpSI6NhFn
-/f3PQzJ7VJMCq4UEgidWEP5lmk9OM/2jRl7ZL5AzIxeQ+ulgmpoT0L7wAkREgIsL6PVEHTnKXp8S
-3PloMmh1D0EIbGs8/FM/IniEBMHV1Y2wyzeoUamUsIZAcD+O8F/mhs+G3USnd8NWz3OfouDpw+WJ
-S0hYMYf6Bw4T/FxjlMREThw8ypmWXUhq2fmh2SHNJCP8yBMiCKXKVODcmaOYLAqVygTh5CgWthAI
-8qNM2fJER/3zRedTDRbOXrrFlXNHqVWzOrGp/7CkoVYT3fsTtp86RPlV80lycefayEXg6fNQ7XEz
-xojwI08G0ukL15T4yJtcuHCe5KREEFU/AkERf3USOr0bVStXICAggN/PpfKvq96tFtvgtCKgoEZl
-tUrimfJuCD/yBJQQdp9PoFyAP02bFUeFVcwOKBA8HFUgNlV5MGIARSYGhdIiWUH4kSckVS5ed0LE
-nEAgEAgKntxOIBAIBEIQBAKBQPAUoSkXUlJYQSAQCASihCAQCAQCIQgCgUAgEIIgEAgEgnvRhF27
-LqwgEAgEAqSw8FQxDkEgEAgEospIIBAIBEIQBAKBQCAEQSAQCARCEAQCgUAgBEEgEAgEeZPnnLnl
-WrfJdX/Y1i25HtfonClXqQ4DB35IEz99jjAqlY4S5WryyZAhtAx0AuDznq8w+25qZpiSz81g+/Cq
-Oe5ptUTR4PkpHNo1R8SYQCAQPGxByO78C3PclBbP31sW8+HALzm26sMcYWRLKge3f867nyym5XeD
-ALhpVljxy680cM5/Hdak68twqdZVxJZAIBAUIQ+sykin96B5xwGkxe7K/UYaJ+q36osh/q/MfbdN
-VoK06gKvfWXVMar0KiNiSyAQCB4HQbAYE9n+ywxcgzrmely2pHFw++c4+7bK3HfLZGXGsHep0q4D
-LQaMZ3+8Mddzf9odxbsV3EVsCQQCQRGSb5XRve0E91YhZRyXVFrKhJSiRMmKLJvdPc8wJcrWZvan
-/TKPNW3ZmjotX2VOqAu/fz+OD0es58Bnr9qdbzVcZav8DFOdxKLdAoFA8J8JQmHbEGRLAhtOWuhY
-y/u+rjHq/fcz/36+61AGrH4HsBeE2LDl+NR/ScSUQCAQFDEPpMpIpXGnAZv4PdZwX+fJ5pTMvxXZ
-jKTS5whzcfkZar1RSsSUQCAQPA6CAOBf63VOzfqSOEvh58p7v3t3pu69glU28sePs/Aqk7Mn0fKj
-CbwX6iZiSiAQCIqY+2pDgPyqgCTe+qAcr87ZwebBLxTq5pMn9aXf9FFUmZREcPlnWDixld1xc9Ix
-DupaUVInxs8JBAJBUSOmvxYIBAIBIKauEAgEAoEQBIFA8Mg4orhYYQQhCAKB4GlGMhjwHTmQ0pWD
-UEdGCIMIQRAIBE8jbiuXEFolGI9lnwPgvGOrMMp/jBj+KxAIHiqO+3fjN3QADhfPA5BWvxGR0+dj
-KldRGEcIgkAgeCqcTfgtfEcOxGXbRgDMxYoTNXk2Ka3bC+MIQRAIBE8FViveM8bjtWAmAIpKRcyQ
-scQNGCxsIwRBIBA8TRTr/SouO2wDWhO6vkH0qMnIXt7CMI8gYmCaQCAoUnQXzlKyWR0ALp++KcTg
-EUb0MhIIBA8OkwnMZvtd5SuR0KMPAAH9e+XvkGKi8RvyPlitwpZCEAQCweOK88Y1eM6bTsD7vXFZ
-+6Pdsaix05AdHHD+83ec/tie6/me86YTWq0k7qu+xnvaWGHQ/wBRZSQQCP6dEGzdgNf08eiuX0Fl
-MCA7OGAuHsyNv0+AJGWGc1+yCL8xgzGXCOHa/rNZ529ej9+oQWgiwgFIbt2eyMmzsRYrLowrBEEg
-EDwOaG5cw3f0J7hs3wyAKSSUhNffwhIYhKlMOUyVq+U4p+QzVdBdu8Ld6fNJadGaYv17oT+wFwBj
-uYpETpuPoUEjYVwhCAKB4LERg1s3bGMKtm9GdnImatQkEnu8CYoCWm2e5zn9+TvFX2uPolIhyTIA
-srMLUWOnkZjeziD47xBtCAKB4L5x2bAGl+2bSatTnxtbdpPY613QaPIVA4DU51qQ0vSFTDGI7T+Q
-K6duCDEQgiAQCB5H1DFRuGxZD0Bil+6YQ0Lv6/zIafMy/07o3RfF0bHAc7QXLwjDC0EQCAT/Jdqr
-l/GcN93eaSQmorlzG2PFKqQ2a1VgqeBeLCVCiHvnAwAC3uuZb1jN9asEdutAyHM10abPfSQQgiAQ
-CB4iktGIz9ihhDSqis/08TgeOZB1UJZRNFq0l8OQ9Xnk7i0WNDeuoYqNQXfiCOqou2CxZB6OHjER
-q6sb+oP7cN68Ls/7l2pYGeddOwBwCDsnIkYIgkAgeJi4fbuMUlVL4PnVAgASO3fDWLGKrcEYMJcu
-i7FiFVQmE74TRqCKjbE58ZRkAJw3rcV/UD/8hg0gpEElgl5tR/ALDfH4Yn7Wmgc6HdFjpwHgN3JQ
-vvdP6NaLyxciSG73koicos4IiF5GAoEAwPHAXvyGDcDhgm2MQFq9hkROm4+pQuUcYbXXrlCiaS1U
-JhNJrV5E9vJGcXLGaec2dFcvA2D18kZRa1AcHVFHR6JKSyOp/ctEfLEq8zolmtfF4fwZosZMJbVJ
-cwL69y7U/QVCEAQCQRGgjgjHb+SgzIZii68/kdPnFzgttfvyL3D7fiWOJ48CoKjVKDodFm9fEvr0
-w1S+EubiQVj9i6H/aycBH/RBZTJx68fNpDVuahOhg/sI7tQCBcgYwmbxL0bk5FmktO0kIkcIgkAg
-eCgoCt4zJuB1T6Nx4qs9uDv3y4LPl2U0N67h/NfvSMnJWP2LITs75ykkHgtn4TtlNEmduhDx2TeZ
-+wPe6obr5nUoQMyQMcR9NEzEzX+EmP5aIHgKcVn7I76jP0ETG20TgZf/R1zfjyjZsiFuP64i7q3+
-mKpUz/8iKhWWkFDiS5ZCkiSQZVDl3SxpLhWKAlidnJGSk1BcXAGImjQTtBqiJs3C6u0rIuc/RDQq
-CwRPGa6/rKZY/15oYqMxVK3BjU1/cnfhMkxVqhPbfyAA/kMHFL6aIWO+onzEQEpNwWXrRiRAcXbJ
-FAMAa0AgEYtXCDEQgiAQCB42Sa+8hrFSVSLmfMHNbXsx1qybeSxm2HisHp44HjuEy/qfH9g99bt3
-4bTnTxStlpQWrUUkPKKINgSB4GlEUexmIrUrQfz0LQEfvo3F25erp67/61t5zZyE19xpKA4OxH4w
-mLi+H0EhRicLRAlBIBA8qI87NgYsFqS42FyyglLeJYgu3TFUqY4mJgqvTyfe933VkRFoL1/E9bvl
-hNQui/fsKSDLJHTvQ0LPd4QYiBKCQCB4WGivXMJ9+ReoY2PQXbmEotNiDipJYudumMuUxxIUXOA1
-HI4dokS75wC4cvwKVr+AAkscqrhYvKePRzKb0O/fje7aFRTAWL4SUVPnYmjQWESOEASBQPBQPubU
-VLynj8Nj6WdIsoyiVoMsI6WPMJadnDFWqkLEvCVYA4NQHBzyvV5AvzdwXf8zSe1eIuKrbwt+AFmm
-dGlvVEYjxnIVsRQLJLFzd5Jf6SoiRwiCQCB4WDge3IfPhOHojx4EIOF/r5P84ktIViumoBK4rv8J
-l22bcAg7h6FaTRJ6vFnglNPqmChKVS2JBNxcvxND3QYFP8eh/WA2gVqDoWYd0OlE5AhBEAgED+0j
-TkrEd/ww3L9bjqF6be5+utA2huCecQHaK5fwXDwHt++WYw4qwd3PlmOoXT/fa3vNmYr3pxMxVqzC
-jd8PFu6B8mmwFjzaiEZlgeBxRlHw+HqxTQxq1iVy2tysAWX3jAswh5Yh5sNhxL/5Hrqb1/Ed8XGB
-l4/9eDgWvwAczp3GbfU3hVQoIQZCEAQCwcPXA0B/YA8Aia92x1i9dr7hrUHBxAwbj7l4EA6njuO2
-ckmB94iaPAsAn3FDwWQSRheCIBAIHkU0t2+hP7Qfq4srKc1bFU5EnJyImjATCfBaOAvJYMg3fHK7
-l0ir2wB1UiI+U0YLowtBEAgEjyIO508DYKxcDYt/sUKfl/J8GwzVaqGOjsRlwy8Fho+cNh8Azy8X
-oI4IF4YXgiAQCB4aSuH6elgCg1ClJKNOiEeVnFToy0sWC8ltOiClpaG5Ew5mc77hTRWrEPf2B0TM
-/RJrQGChn0/wmJU4hQkEgkeQQjbMKmo1pjLlbVNRR4Rj8vIu3Hl6PYpWiwRoL4cVal3k6PHT7/v5
-BKKEIBAI/iFOv2+lbKATngtmFiq87O2DxdcPh7BzqKMi7+texopVbE4gLQ0pNVUYX/BklRD2nDnG
-iSsXuHY3nPjkJKyyVcTwQ0atUuPh4kqIfyDVQ8vTqHJNEYf3QcPLl5kOuM0YT/eUaNIKMbCrj0qm
-F2AY+wl7Fn1daJs77f8bgFtqiS9///Wps/nTmFYLeucnYmDanjPHWL/vDwJ9PKhVrjShgYGU9ako
-vPN/xMXoc1wJD+do2GXCo+Pp2LBZgR9bbnEY5FH2yTdWLovKBHbriPOu7SR0703kp4sKvISUmkKJ
-mqHokpL48p232BIUUqDNpeQkHF9rj//xI6x843WU7v97emyejVvxF5+6tJrfOz/2gvDtzk2E3b5M
-56aNqFeqvvDGjxgHrx7g5117KFe8NN2btyswDqsG135qbKM7fQLN7ZuYy1bAHFomq9h+/SqlGtoW
-lr/+x2FM5SsVeC33FV/hN+xDLAGB/DF7Kt9cu0WZEuVyt7nBwMVxn9B2xdekFAsg6tsNmMVC9py6
-eeSpS6v3vvNjLQjf7txEVOJdhnd+J58MmIzRkEZ8fByurm7o9U6oNaIt/WEz9ecv8XXzz/GhZcTh
-R536PDW2cNy/B7cfV6K9dQPHQ/uw+gVw7cA5uzA+Y4fi+dUC0uo/w621Owp13cBuHXDetYOUJs1J
-7NabSXJCrjY/OWEorVZ+jd7Bkcgpc0nu8AoAR44c4U7EXUDCarViVRRkq4wsK1hlGSRQq1SoJAmN
-RoVWq0GjUiMrMsWK+VOjes0nIn7mrvv6H6XVk4d24+Kkz1pBLr0AaJVBtoLFaiC0YjWcnF0e2Xd+
-bAVhz5lj/Hb0b2b0HphnmOSkBHb/tYOLYRdxcXVDkWVQzDzfphMlSpQSXvohM2TZbFrWejazeJoR
-h+NfH/BUvL/2yiW8J49Gv/sPVEYDqmyjfu/OWEBijzezAptMhFYJRp2cRPiS1aS07VhwiePcabxm
-TcF18zpkZxdiPhzKF1HXqfBsS+q7eSOlpqCZNoaAk8cBiO/1LrEDh2P18QNg584/8PZwJc1oxGyV
-sVqtWMwyFouMRbaCBBqVCo1ahZuLHgcHLRqVGq2DhojIGJo0afbExNXYlfPvO62ePLSbdq2b46hT
-A7aeuUYjJCVBYpLC3ZgLGA3g7ueBq5v7I/nOj21Wef2+P3i91XN5HjcY0vhl9QqGD7cJRppJRq2y
-KffosZN5+ZUuBJcMFV76IdK5aSNWbvsj8yMrKA6fFCSDAa+ZE/H8bA7ZO2sqajWKgyOq1BQ8v5hP
-4v/eyOr+qdMRPXYa/oP74zdyIFcLIQimilWIGTUJq68fbj99i++U0YzQaJCXfo1SrDja2zcBMLq4
-ED92Oonde9tnoFLSaNagJokpqZitMharjNVixWySMacLglalQq1Ro3fQ4uioxUGjxslJx6Wrt0Va
-vTfeJdtaQLIMFitIsRAcWIawSyfQlNWh1+sfuXd+LAVhz5ljBPp45NlmIMsyv65ZTdfXe2OVFYxm
-BUkCWVFQFJgwfgQTxk+m34AhqFSi5+3Dol6p+vzuc4I9Z47Zqjh8PJ74NgPdhbN4TR+Py7aNdmKQ
-1LEzqY2aIuv1GOo3Rhd2lsxsZXqVQ2L33ngsWYTDhbN4zptO3IdDC7yfOSSUqIkzSWnZFrdVy9Dc
-vYMl7CxGZ2eMtetx3N+b8vNXojg55Tg3Kc3EkXM3MJstgAT3DjVQ0v+RJLJXK2jVahJSzE9UvFUN
-rk3gA0qrer1NEABMcjxuHsFcDzuNX1ApPL287aqY/ut3fiwF4cSVC9QqVzrf0kFsfArBgR4YzQoy
-oAY0KglZAatVQdY4k5SUgLu7p/DUD5Fa5Upz4vKFzL+fdJy3b8Fp967MRWrS6tQncvoCTBWr2CaK
-S+9WmtcqZpHT5hP80vN4z5hAQo83kb19Cr6pRkNqs5akNm4GsszhA5s4f/0uFo2W0OplKZeLGADo
-XVxp3qw+jlqyxMCa/rcqQxCwFwrFVke+/PsYkVbzKSk46SXKlipOfIKCgwZ8vKoSEX4Jd3ePR6pN
-87HMHl+7G05oYGCex2NjoikWGJKRmUEtgVUCs1XBKiuo1RJenv4kxMcX+p7R537n3YHvUrFNa0q1
-7UTrwZPZEJZQqHODn3+B4OdfeGDhDPFnGD1xCPVe7kjICy0p06EzbQZNYOO1pIcaD4V93uyEBgZy
-7W54gXFYVFw/sI433utNlbZtqf5Kd3pO+ZKzDyB3+0WvV3Lsczh+GO9PJ6BOTkKRJJJfaEtIisom
-BunVQgXGdf1nSG7TEUlR8B3zScFacOsmxd7siioh3lb95OBAQLWqnDSmcTYlMV+by7KCXgfu1kjc
-kyJxTwvHXWfEXZOMe/Id3FOicE+Jxj05Kn2LxN0aiUs+C6+Va90mc6vY/mVaDRjF2ktJj4WfeZBp
-Va1WcNDoMUcl4BT2HTqNCxaLBZBzDV+hXWe2xxpytacQhHuIT07Kd5yBl7cPqamJqNUgqSUSJFAr
-oNNJmMwKahVotCqcC9nanxzxG899NJ2/Y0rx86pfOLVyJmXvHuKDAW/ya1Rageff3LGdmzu2P7D3
-H99/JMv/PMarw+ZzadtmNo3sSFjYCWbNXPXIx11Zn4rEJycRn5z00PtuJ1z9hQ5TNtCq10gO/bqR
-PUs+5cXAmwycseNfX/v3BFMugnAEKWOOILWa1OdaEKnV3euFUUXdRZUQj/PmdejOnER78YKt4jmj
-lDBlNgBua3/E4fjh3B/AYsF78ihK1SuPy5Zf8Zk4IvNQkEfZQtlckhSsCnBwKvLlJlh29wJZRjEb
-sR5tjnylGfKlpsiXmtm2sCbIe4enFyLy7purZEjpAAAgAElEQVQStnULYVu3cPqXVYx/0Z+xw2c8
-Fn6msHazi05rTgevKJB0+QipV1bhZNpDqdIHcUw6RWnLLlTGvDOVO6Z9g+khd/l5LAWhoBGBjo56
-7oZfIcos4aiRUGkk1BoJjSTh7qLm0G0wG2Lx8PQq1P02TlpColWh6/j3qOztjIt3GSaMa43VksCE
-qXtzzS1n/539b8WaxMI5o6nbqT2l2nSg5aDJ/BGZU1SMiUdp1LY19Yd/nyMP8XOUbZqB7jWD0ag0
-lK//Opc3/MIfC/vZEqUljnkzR1Kn44uUavsy/5u2gnirLWUlh++n36B3qdy2DaXadOCFj8fze2Qa
-ijWZ4OdfILT9e+xZMpzSrdoW6nkllYazGxdSr2Nbyr78BguOxBQq/v6LUZ3rZ/xI46FT6F6vDHqN
-ChfPQLr0msjW8W2y2f0U7w3oQ+W27Xmu30j+ysilKWYqdXybsN++oFnnjlR9uQdjN1+3pY8urQm8
-e5ceTRqxPjaJih3e5M/PhjHls89t6xpjm0xOHRdryyDsXsYzHTvwUfvORI4Zi+/44YTUKYfn2z0I
-7tCMoC5t8JkwnBotWwKwZNgHTPIrYROZTz7AnHKBjwa+TZV27Xn+o8kkrFpBaLWSeC2yCUdi525E
-j5x03zZXZMWmQxoTqkoXkDTpIidbwFFGVfEMqvLZtnIXkFQWZBkURS44l6xzov7zb2JKPZd+PyMV
-O7zJrs9HUK1dhzztbzFcpXrHN0mT06vdYjdTrnUbvs+IG9lEm04vcc5g4dKOZbz4+qtUbPsijfp8
-xPITsZn3v9dup1MtDzytpqZJJCVBSgqkpUFqKiQkQKLBFTfdIfyKHUftoCK0+AZ83FOw5uGCFdnI
-yAHB9Ps5LM975fY+92OrJ0YQClQ5lYrub7zNz1+vJEaBALVNGCQJbqTC3z8vJsDfD3X6x1pgdcBV
-WxG3d2BWicItqBMAMWE/3Nez7f9sINM37afR4MUc+7w/Yaf3MHDI5/aJwZrI4PcnEOVck18mvJoj
-kroXcwag9fujmfnTJvZeuEX2JPvXnIHM3HqQF0Z9xa6xjdm7YyVdl9rqQscOn82209eYtuQnDi/s
-w/lTu3n/oy+Q1LZrWo23+c6/Bxc2rSnk86pY6dqejdO7Yki8w4Ipix7ZdLHydgof1s6/Dv7XcdNI
-btyfoxvWMK2lwrBxO9OVT4tsjmZ6eAV+Xb2GTWNbc27+KHxHfMw7Wh3Lb15g/9WTdHR1RLHEstK7
-C8P6vm1fcp0zlVU3znF12VGuyUn8EraLqisW4bbme9QpyegVGVVaGprICDy+XsyUiKu2dLfsZ8b4
-h2Dx8sH/7Aku936H6Dpvc2b8cI7s+YI6Q/qijo/DUKMON7bt5e78JciFzOzYV2uo0WrAakzFuvd/
-YHUBlQQqDSRXx7qnK9YDXbHuexnr4d5YD/8PWVHZmhhUBX9LsiWVvzcupFjtt9IzEw4ollhWeb7C
-kQ1r8rS/xrEU/f2SWHA7BYDwPTtwCXZm7V7b3E2Jd74l2vc1KjpqeHv+Lwyc/AVnNq5jWd86LJq9
-OPP+myZMJLrO2xxe/zNjGibwwbQDDzyNadL9jCzbmoiMRrCkxKC5s5bEc0noXMGhSg00UgLGK5fR
-nVqRuyAoFtyC2vJ20tdsjs69FiK397kfW+X6/Dyh+PoFULteA6YNHYWDixcOjr5YrSl4uUjs2vkb
-Xp4uNHm2MQ5O3ijk38p/zWRzt8W0Wa5ZrfVJd6A37+u5pm63dc/7pF4gHtogrm3LuajJz7M+Yv1d
-FQtXjCZIm1Ozhy+YCvO/Zt3eI8z74iDzABf/CowcPZEeFTyY+tddAAbVDMCL3sAWLm/9Ft6ZyKxv
-fmRWZi1DG2ARKVHbgI/SazBSGdyqAhqNulDPq8gmPnymBL7qV4GVGJL2P7Jp4pZZprQuf8e19HIi
-i6bWwEGtpl7bd4lfPglom24bA2O6PYtHYgyhK3az/cyvuJ2XUJlMOKef7zNpFLJsYGinGqRQBevM
-yWji42wOUJbpGh+JesvSrNJsdluS1V4rWSwMiL7N9YvnMZetgCJJRE2cSbH+vWiy7xgbPBbg94lt
-HYNIjSPW+V+Q3KnLv8tISSDJoG6+LJsXNyLp9Khb/Zh3ycIEao0u33aEDPTelVnxZYtsNWY2W2nT
-BSUv+7d7qxI9V15kyIia7P71Fi/2b8qWRUfhxRKcWbGbmm9OtdX7O2rYtPsgQc83oly9Hhyql/Uc
-n51LYNmkOjhqVDR6aQBRP8wGGj3QNKbVgk5jE4SsTYUqMAhJH4vk7IZitaDy8EJVXAs6L/IrW9Xv
-NYaRQ5bRfEY/HFX2fiqv9ymsrZ4qQQAILhHCx0PGYjQaiIq8i7u7B84urnR+rQ+vd23PRx++x7Rp
-n+LpF4LVmndlXZBWxTWTletma6ZDsZgj0ovB99fYdCrNkkNc7mXQjnBAhTEPoXJwq8C4UTMYKxu4
-eOE0GzZ8zdzfzjN+xGx6rJlAWHpxsGbrlllVIcm27nPhB37g3c/WcvpOLBmvrCj2xceQbE6zMM8b
-oJUyXZsiP7rdD0vp1JxJM1PNKe+pnm+YrJnvr9YFYTXftTtefdlCfKaMzmobSC+aJajUuMtWXNf+
-QIBvKGUc1CioiRk1Ge9P3sv80PKSo5TnWnB1/z4qOupQJ9g6O0iA5+K5RM62lciSX3oVw1cLcT9+
-GDbaxGCiXwnGFivHhX8pBgCyItte58h8rKkXwRCLusVSFEMC8p53wcnn3iw/mOKh6UokSc63DQHA
-Ykxi77bPeXvQdxz8vGfm8TIO6gLtH1DzXRJnTMdiLceX0Y5sqdKb3THvkGx9kdmHk5g5yDbt98LP
-JrLgm3X0/2AxRq+K9O03hG7VbD0Jb5qtNGvfLlt1p+6BpzG1OmsoidUKsgKyxhNFWwHH0AuYr19D
-MclIsgpHtwASPFuSXxZFUjkxfGBp+v1wgWWvVbA7ltf7FNZWT02VUQ4H6uBIUHBJXN3cM8cdrPx+
-AwnxSUybMonU+HDIp1GsZ3oVzdKriZn7Em+tB8CjVGdbziBdvVNlBdmcdz16Rb3NNdw25f0Bbf5+
-CUEamfEjvkHJN7E4Uq5iHQZ+8ikApnSnXyn9Hmd/+y2zQfvGbxsBeGPico7fjmH+Vz9wbdu6Am1X
-mOctCjatWcWtG5e4fPhv9qxewrrBr7JnVj+2Tx/I5aP/rBTSu6QLM3dF5J+J0Km5nF4itJpuodba
-ViHT3L7FV7cu4D11TJYYAClNX+Du9Pl8HFiaq7tPErFoGckqdWY308RuvfjUNxhj2QrZ9QNT6bIk
-N2zAXP/yXN1/logFS2lapibhMz+zj2OTEVViVsNj5NQ5tqrKNh25cuwyXY+f58KWXx+MM5NUaDWA
-IQx1vYXAbZAl0DgC11DXnYu6ZvZtISq1ytabrzDVKQ6uPPtifxJurLV/x0LYX60rxsDAu8w7swJC
-euGmcWZQqMS8s99x0/91SqaLiN6nKkMGjWb7D2tY3LMak8eOscsQ7Nm4ObOR+8Lm9UWahtVq0Gps
-nck0qhQsCe6kWF5ANlhI8viY2NupqFQFW841sBXvmZez/m4q6mxjFvJ6n8La6qkVhLz49qctXLt5
-i3nzZ+OkM+UpCp0Gt0clSawZP5+TUSmkxF5h7NjtqFSODB7RBIAWLjZ1/iIsnsv7VuKSR0QPb2ZL
-4J8eDCfm6jZCWrWlxhuf2oWp4hXEoldCiL/+C4P25JzjfurH71C9QzvmHrqORZG5sP9bANxL2nKJ
-w9LvMe1QOLHXN1OqbQee/WC5zYGlNzb5u+s5tmUWHhrbc0aY5X/8vEXBtg2/cP7kEaxnt1JdOsvg
-yQPpNX4kfQe+Qdpf37BsWF+WThvD0lkT+XRwf5bPGM/Wb77k3B+/5XnN1kO7ceLzYSzdc45Ui4Ix
-JZptaxbywtCs6pB+5d2Z+OtJzLKZfes/w6usTfAd9/9Nh4SYzOkmTGXK0Sy0GuHfrSfxf2/wR0Aw
-lwODSHu2Gclqjd0CMuP9QwhfuYbwr39gkn9Jxr47nRuzFvNHh2pMaDAWS4kQZB8/Alz0fIMvFl+/
-rA80Lg7ZxZUQnYbrBgPG6rX5ulNLXm43mFRfPy7sW06TDz57MG1vEkgqUExmrLuaI1ndQdKCIiNJ
-JuQDTZAPZ98aoVisSKr0kwtsQzBwcPti9J5N8gyTl/0Bmr9dgxUzf6N2r+oA1OtdlR9nrqX+O89k
-hhn4VlcWHr6BVZHwCwhGkbN6f/Wt5MHwX49hlK0P1G4FIUmgL90EhzIDcCvVGJNzW/TFQjmlegGr
-Q+Haeur0GMPB6Utwyeax83ufwtjqqasyKpQo/LCZ7l1aM2vGNMZPmEhEjBEkewX1qdCLdR9bGbxi
-A+1eszUm+5asxrgpQ+kWaCs9TBjWlfPTfmDBkPeIfWcypRx+41SaGfM9GtPog9kMsk7jmxnvUMes
-pVzVxowY/H6O56raYzg+P7/DuunjGfLLAgKyVdl8MORNohZ+xzeT3md2qhG9ixfPNOnEqIGv2e4x
-YDafWGewcsq7rDJKlK3ckPEjuwLw1Tut6f31b3R9vSftOn/A6t4qXl99kHZ938/VPoV93gdNckoq
-xQL9adeiHaREQlwkxEahUkm81LsjL6UZIDGB5MhYEijNkbVbuHXTHbXPq3nntIq3Z+MoKyOWTWP2
-5Cg0ei9q1n2OeWNeygzTdsxwtg3/lOrLYgksW5d5k5qivXYF30mj0FjNKICxRh3uLPyaXe99YDtJ
-p2PJoJa0ea03Z9auznFfo0qFpUQIlqBiTFz4LTtecKHh5KmYPUozfnpWtd60Xs05MrEflujozA8z
-JX1wWfbrN5w5i1/HzaDO0lvofcrw/qBxD8TmMjJaQHpuAWqjCjQWUKuQ1F5Iz/4Nyr05SwV0MlqV
-XS/ZPNsQVBpHSpWrxcxP855/LDf7Z36Hld7FJf4gQyraqoC8yvVBG3eMEVWynOqQvi/Tb+EQFkUm
-4epTkn6Ds2zTdvQ4/i4CuxVOFCTUWh1oi+FR7VWMRhOSJBV6lLKkcmL44IpseHNrod6nMLbK9T6P
-4+R2b84ew3dDpjzQa77WuRVdXn2NFzu9hk6X90ib0a93YvmdFD6ctoyBtQNQSWLm1Pul2wxbH/ml
-AyfkGebV9k3o8XIHaqScp7SLClk2ExmXQlR0Imqtmht3E4hNSMHByRf3us1x9fGnVpfeRfK8Tr9v
-pfjrL2e4QOL6fUTM8AlwzwhTVWQEirML+r1/YfX2QdE5YKxcrdAfvee86XjPmoxksbXbpDRpTsSi
-5YUbnVyIb6Ygm2/YsoViAX5YrVKmv1cUq63ThSTZqobUtv8VWUFSS6iQUKEQGR1F21atnri0Whi7
-ZXDv5Hb5YTSaWLdlF9VrN0Ct0T4y7yu8WTqrftiMIsuoCuiKOnzOSG6Pnc9nI/rwuaM7Yb/+JNYh
-LQJ8fYsRVKk+8da6bE9M5NzJI0hGAyWqlMU3MBh/Rx3FVGqCQkJx8y/+QO7p/NsmsJhJadspWyZY
-AZMJ2ckZVWqKbQ3iO7dtYpC+uI3DyaM47fwN7c3rOP++DXVMFLKTM5LFTOL/3iCu/yAsxYOyrmk2
-g1aL5sY11DFR6M6dwXvuNLS3bmQ5jIpVSOzWG9nj4U2t4uPtSfjtiMw6fSVjUxSbHbB1L1UUGUVR
-kFQqVJIaRbbi7+8rEi3w09qNqAqRAVAUBa2D/pF7fiEI6ajValsrUEG5RZ+6fL1opTBYEbPoa/vx
-HU1bty+ye2mvXsZ3+Ic4/7UT2dGRy2EvZuX+JcnWKpht4JXrup9QZBlT+UroDx/A4dRxJLMps3cQ
-gDrJ1gHBfdVSNLdvcuebn21F908nAuBw9hTq6EjUsTHorl62e560qjWImjIHY+2Hu+BTw3oNRML7
-F1Sr2/ixfwchCIKnFslgwGfyKDyWZjXGqQwGvGdOJGbY+Mx9qS1aYw4pjcO501misHEt0q+/FHwP
-iwXn7Ztx2rGF1OfbYCpTnmL9e9nnFrH1tLG6uRMzeDQJb74nIkfwnyBqOwRPJW6rlhJatYSdGAAk
-dO9N7Ps5J5GLmjQLOdtkdFIerahp9RthqFIdc7GsaiwJ8PhqIZA+lqBa1spi5uCSGKvXJubj4Vw9
-clGIgUCUEASCh4Xj/t34DR2Aw8XzORx55PT5mMrlPmliWsNniRk6DpfN69AfOYii0SBZLJiLB2Mu
-EYI5JJT4Pv2wFCuOpMhobl6nRNsmdgKijgjHGhBI5NS5+IwZTNIrryH7+JJWuz7WYsVF5Aj++1Kz
-6GUkeNh0mzEC4h/uPf2SE/lw306evX7JPufv5MKcZ1qwOySX2SyzLVYDoJatuJiMVL9zi5Lxsdxy
-8+COqxvJDo7ccrfvzueelsqCTT8QEm8bpHjd3Yu3O/XAkG22U0lRUB6RxVEEgse3hBAvIu5x5qGL
-uclE8VAvpPRBZRk5oISJMzG+O4D3gBwVNek9iP4p+l9W47kua+Iyry5d+Xr0RNvyWQLBI4poQxA8
-+eh0JIydlpUzT9/S2nXK3Zn//B3FS7jh8Mc/W8PCadVSPIcOQJWSbNOjqjVJfqu/EAOBEASB4KH7
-/yMHcV662G5f8tvvYy5Vxm6fV9/X7X5rjx/B74UGeL/XC8lkwnPoBwWWPABUEeFojx3Gcf1P+DWv
-h9fAfpnzD1lKliKlRx+sxUuIiBE88ohGZcGTk7uJjsJj9Cc4/WKbPsLQpj3WwKwBYfEzFuDbJWsq
-ZoeD+3D4YzuGRs/h/eHbmedloL5xDc3lMCyhZe3aEgCcVixBc+Uimog7aK5cRDIa0WbrlgpgLhFC
-wuTZGFq2E5EjEIIgEDxM/J+riToqazJAj2EfErMia6yA8bkWpLVojf73rPlgvPv8Dyk1JXN20gwS
-PxxK4vDxebYjmKvVxOuT3LuIyjodSf0HkTR07L9qhxAIHnqmSphA8KQQP8F+Flb91g3o9v1tH2b6
-fLvfUkqynRiktelA+ImrJI6cmK8zN9eoTWqHrJk4LYFBmKrVIumt/kQcuUhSPmIiEIgSgkBQxKS9
-8hqmL+ajO34kc5/n4Pe5u/tE5m9riRCS+n2E6+K5NkHIcPClyxE7fwnmuoWfviF+yhzU166Q1vk1
-rP4BmKvXslUvCQSihCAQPAyvn5bvXMtxM+3XdNaGncP5m6/s9iWMmozs5m6f469eK18xkJKTcJs8
-ym6f7OdP1I79JPf9kLSX/ifEQCAEQSB4WLh8tZCgku64jxqEbu9fuYYxV6tFSpfudvvcxw0BgyGb
-SmhzVC85rfke3ZGDed43sGIgbvNm4LJwlogIgRAEgeC/wmHnbwTUr4jHSNvCKi7Lv8C7Vxf0q79B
-FR2VI3z8pFko2ervVSkpuE8YbhcmtVsvTJWq2u3zuGfhH4ddOzLvKxmNtjAThiMlJ4tIEQhBEAge
-NrqD+/Dt+iKabFNESxYL6vg4PEd8jNc73XM0HCueXiQOt1/QxHXJItRX7KetiJ+x0P5ep4+j37gW
-KSYan64v4vtqW7v7WkqEEL1yDYqLS+b6AAKBEASBoKi4x9Ga6jXEWL9RzmDYegg57t6F91uv4TZ1
-LJrLYZnHkz4cgiXbGAQgx0AzU72GpLZ/2W6fV783KF4xEMedWWszK+lVTBGHwzC0ejFdlcQcRAIh
-CAJB0WIy5dgV9+nCHPtkbx9M9W0LhqujInGbMxWvnl1w/H0rqphoWwlg2jy7cxz//B3HbGMQAOKn
-zLW/cHrVUAYp3XoTfv4OyX0/FHEjEIIgEDwMdAf2ElC7LN7v9shxzFKhMsk93rRPuPFxxI//lLQW
-rbH62JZv1IWdw7N/bzwGvIXqzm0MrdtjaNLc7jyPoQPshcU/gMRBIzN/Z+T7jfUaErHrCHFzv0Bx
-dRMRJBCCIBAUKYqClJqKz//a4de+KZqb19FvXo/25NEcQRMmzEDJvkCN1Yrzz98Ss3INsfO+whIY
-hKLRoI6NwWn7Zrx7v4rLwlnET7LvFaS5cQ2XxfalgsShY7GmL2Rv9QsgZun3RG38E8s9jc4CgRAE
-gaCokCQUJyc058/a7fa8p7cPgOLiSsJo+2mzXZZ8huZyGMYX2hKz4mcSB45AdnQEwOHoITwmDMd5
-5VIswSXtznOfNBIpffK5DOKnzSPxw6HcOX2DtHvaFQQCIQgCQVFxz8Cy2MXf2P3WHTuMfs33OU5L
-fncAlpBQe/H4pD9gG3+Q9MkoYr76jrRWL6JobIPwXZZ9jurWDXsdMpvxGD3Ybl9axy626SoEgqc5
-j/ZYrpg2ZgzfTRErpj12uY+7EWgunEWVmoKhdXu7Y95vvIJ+64bM31ZvH+6cvZ2jN4/Dzt/w7fqi
-3b7oZT9iyL62gcGA8+pvcF3wKeo7t5Gs1lyf587+s1hDy4iIETwe34+cgiQbkBRrkd1DzGWEgmJK
-QrakgGwR5iiKXEdiEq4rV+Jw4gSa69fRXbzI3W++wfBs48wwMaOHEpRNENQx0bhMGEjCoIF210qt
-V5G0Z59F/3fW2AOPYR9w+7naduESu7QlrVJJnNf/ivuSJbZuqhli4+5O3PDhmPwcIOmG6EIqeAS8
-vQZJ44RK55YtpWahtsQRfvsWZ06fID4uVghCUYmBnBbFlSuXOXhgH9GREciyVSTOB8izR4/T+Phx
-XFJS0VitmUldPeADFvTuaRe2bZ3aND+cNTGdx6JFzDOlkeTsbBfOq0wpRmQTBM3du5zp0Z2d9erm
-fAAXPXWfb0H1ixepcP0GO+vUYuszDZEjbsP8uSKCBP+9FqjU+PgFUK/+M1StVpM0q0OOkkH47Vsc
-PXyAZi1eoGSpUmjURVPb/1QLgmJK4srlS/y563datWlD8cDiqMSUxQ8E3d9/4zFiBNpr1+z2y+7u
-qBIS8DaaGFGqDGkvZ2vA/ciKtUYN1PFZi2YPuRlO7Fdf5bh+skqLy9Klmb/b7DtAzcVfIHt55RLR
-CqSmcic5mfL+/pQX0SN4hLBardy4cZ2dv+/Azd2VUmUqk5Jt6i1JNnDm9Ematnie0mVKF+mzPNWC
-IFtSOHTwAK3btKVSpUq4uLoiieqDfyeyaWnw+ecwYwZSRETWgTJl4J13ULm5QfXqSK6ueAJeQfaj
-iVmwAF7PWtpSv3Urxa9dg8aN7cMtWgQ//QSJibaPRlEoNn06fPutiATBY0eJkiXx9vFl04aNfFD5
-HkFQrCQmxBESUgqliKdMebqzw7KFqMg7FCtWTIjBg+LGDaRVq7LEQK9HmTMHJSwMZeBAePddaNAA
-KldGqlw55/k9ekBt+/YA+vXLGc7BAWbdM/Pod9/B4cMiDgSPJWXLliHybji51QbJsoxGoy7yZ3jq
-60dk2Yparc4Ug5RbR1j+2WzGjhrBiJFjmLVoOaei0h7a8wwbNuzxLR0kJ8P48XA0fWCZtzfKjz8i
-ffQRkiQhqQuZoBcvtv99+jQsWZIz3FtvQZUq9vv69BGeRfBYotFo/1EbplqtznUTgvAA+G7pWsq3
-7Mao8ZOZOG4YHeq68tOXG4RhCoGUnAw7d2btKFcO6tXLKRwxMShJSSgHDqBs2gRHjqBYsvXwqlsX
-unWzP2nQoFznObITjxYt4IcfREQInkgURcl1A7BYLDm2vMLnt4lup/eQZlVw8vJEq5ZA7UTZeq8w
-qk5WvZ3VcJMflv3A2ZtxuBevRLe3ulLcwabGiZd2s3Ldn9yOTcHR3Z/GHXrSvKIHimJm5Ji5vFHP
-k2/3XWPilEkY406x5Ms13Elz5NnO79CqiqfNqUpqIg5vYNnGAyQreuq1e4uO9fwfLSNdvQorV8KY
-Mfb7U1ORfH3h7l3b70uXwM0NxWxG0mpRIiORfvoJ6dIl2L3bVr3j7Y0SE4PUtatNBNqnj0+YNw++
-/z5rEFtiIgwbBrNn29+zcWNbNVSbNtCxo0jAAkE6pqRDuPm14VZiJD5aFYolngDXYmyMTKC6fIKe
-L/bk10NXCarVgdXbVlHLVStKCPfS/eUa/DR7Jit/3sjh05dItsjoVFltCydWriS5fDvGThxHh0op
-rFp9LvPY2h+3U6NzXyZNnsTb7Uuz8/vv0p28FsWayD6XJoybNB6AwyvWUazT+4x4rwV71q3Nns9m
-c0xJPh41gUE9G3Jw00+PjnHMZhg8GEJDYexY2LXLPgeT7vwz+/VHRSG1b480eDD07Qs1asDEiTB3
-blZdf0yMrSvqTz/ZwsTF2fb7+MAE+zUNmDMHrlzJ+Vyffy7EQPDUlhLy2q91qcM7vhYmXYpDURTi
-r0zG5PcOdVy0/PBKZ+62nkFUYgxzO0TRpfsGFEURgnAv3jW6MPLjnlQs5sSVozuZM3kWf1xMzDy+
-80YKXZqUR6vWUrbxyyRdzVrKseeI8TQK8UYlqShWsQ1W082siJTNtG1cBrXKVprYG53G82W8cPKr
-w4RRfbJFuIVOLargqFHhVeo5ZFP4o2Octm1h5sys3/c09ko+PkidO9uvabBjByxcCF98gXTnTlbp
-4V6sVggPtwlOBiNHQmCgfTjRRiAQ5ECr1dptGbzZtxy/zT4PwIX5Wynb1/b9TD4QydJBrdFr9Tw/
-4HMidttK3qLKKBf03kHUaRREnUbNMcaeYuKCH2k29i0AYi0y00eNyHKCUpYJEy/uZvXmvYRHJ2K2
-WHN0EfPTZulvvEXBVZ17ryYvTXo4SY2iyI+OYWbMgFq1sn6fP2+rw88uDOPGoXz3HdKNGzYnn+Hs
-M1CpbNVAFSpAQABERsLZsxnGhI0bbVVNZdKnlFi4ELKPVYiNhaQkcHERI4wFTxUWixmLJffZFFJS
-7Jd1NZls63oE93iTW/UXYjLV5ou1N3hrfzAmk5FrBgtlXRyz/JjKEZPJKAThXiJvXsYrqDSadF+j
-dSuB1fhj5nEfjYq3x03K1ZkvX7mFqq/1440yATiozIwYOd4+B53tb3eNRJxFznL+j1a5NHdnW7Mm
-9OwJ32SbjG7wYOjVC/R622+NBumrr7890vwAABJQSURBVGzjBNautXUPNRptDrx6dRQfH1v4Zs2Q
-UlJQ9Hqkhg3hwgXbfTUalJs3kTIE4aWXoHp1uHwZli6FV18ViVTw1FYXyXLuGcS89ut9X6eWaRB7
-wg/xs6Emn/k4IssyZfQaNt6Kwj9bJlWWZVFldC/7V69k5R+nSDFZkc0pHNu2CkevZzKPNyvpws97
-L2GRZe6c3cbUBb9mHivv60jxAF90ioETOzfjplFxx5i7oj/jree3czGkRh5lzKQlj5YR8st5z5kD
-Gk32rAkMGWIfpkULlO++gzVrUBYuhPnzUXbtQpk7F2ndOqROnZDc3SEwEMnTE6VJk6xzb99GcnW1
-v95vv9lKBUIMBE+5ICiynGOD/7d33+FRVHsDx7+zm0Y6JUACXAQuSr8iQoKALyBdiijSi4BcUEAv
-IYAUARFEKYEroVyRS5FLVbwQUFCKCKEImleChCI1IAnpIW2T3Z33j0l2s8kmgCavCfl9nicP2TNl
-ycyc85tzZs452E3P/Xmnsx/v7ZiJb+dplrSgVj68sfoIGdlZRITOpUG7IFSzWWoI+XUfN5Qvtn/F
-osNbycaR6k80Zti4TpblzYaN4PLG7cz9OhYnLz9eeNU6Hk/7oZ1ZFPweRhcfOvYfzVBjNCveX8AH
-8+cU+J6Ww/sQ/q8QPsh0oU2/saXjj9+5U+slPGcOTJ9uf52KFWHBApg2zZoWEgITJ2qvmebGFBcX
-7e4+p7ZRWIhRIyJQjh3TgpCqQtOmqD4+tuv7+MiFKSQgqCrmQnoqe3p5F0hLStJe0GgytTsnn1vN
-GyeaWLbvs3kr3w4Yy1/mXMHV729MXb0Vs6qW7+GvTalRrPh4OZMmT6VG/iEUys9VBnfuaK9tnj+v
-pTk7a237nkVMHVm7Nty6ZVMr4ODBh76wFUVBPXMGZexYCA/XFlStivrxxygDBkjuF+VS0KS3+HDx
-UqITrWkO2ffYsX0br48dR1a+Ob+LW7lvMtLp9IU+qCkXFAW8va3BALQ2/8DAordbudL286FDsG+f
-/QCQc3xVg0Er/I8cgcGDUVq1sgYDT08YMADyNh8JUY4YjdnodPqiawhmc4n+lO+AoHPAp6ovt6Oi
-yveV6O6udQTLa906iIgofJuePaFDB9u08eMLrhcRob0qOnkytG4NEyagdO0KW7da13F2Rp02DYKD
-UXx9pWQQ5dKVK79StZofJrO9G1cd91PTMec0G5XUT7kOCIqDKy39W3Po0EEiIyPLd03hrbesr3rm
-sjeoXF75xxy6ebNgzaFpU5QjR7TCPjwcTpwAo1GbTxm0nsmXLqHMmGH7sFqIclMzMBIZGcnO7dvo
-2Lkz6flahVRFj6enF9HR94p8eFwcP+U6B+qcPGnarDmenh7sDQ0lNubuYztBToXMTBxMJow6HRm5
-r4jmU79pY8b++qs1ISyMjT17EFG/8Gkm+zZrSptzWk1CBX6bO5eVkefJytM5plmzJgy/fRuADGcn
-ktw9iPP24ugzzblRww+WL5VSQZTfckinx6eaLz379KVBw8Yk3M8fEFxo0KgxZ04dQ/VvR7WqldDr
-SqYPjsypDLi5gKsz6B/H+lJmJso/P0Y5cQIlKRFu3kId0B+1WzfU/E0+gK5nL3QHDlgvxurVMUXd
-KnT3alwcDnXroWRoI8KqDRpgWrUK2rUtsF+1cSNo1gy1Tl14rrWUBELkMJkh3YDNPAh5chl6YyK3
-blzl0sWLpKQkF9rv4I+SOjraSbB/Iso2141r8Vw4G31CPKqioOS+srZsOaYvQ4ndcwhzNds2e/38
-j/E9YJ1TTImOJm3WAu5PnllIfdeDin0H4rZlvfb50iXiTa5kJ+Zbb+NurZeyyQR6PSTKdSfEQ963
-Y3KoRK26zvjVqInJmFViE+VIQHgMOYcdxXvqRByvXLReUqpqmWheUVUcr/+K98xAEj7danunUrsO
-98e9jcca60Nmz4/eI+21sZgrV7HzZc5gNlkCjurqiv5eNNkF68U5EUcvJ0iI38Gsc0Op4Faihbb0
-VH6M6O9EUXnYy/j07WwTDIy+NUgdPJKsZ/1t1nc5+DWO538usJ/kWQswe3jmuT8B73fetv+dt26g
-v37VUvsw1ayNoXU7ORlClEESEMo6VQVVxWvOVHyb16PCgb3WRXo9STPnE/3zdZKCVxO761uymlkH
-p1OdXdDftvN8wMmJpPcX2yS57t5JhS+2oiQnWRMNBtxXLMbldJglKa3/UFR3DzkvQpRB0mRU1uWM
-O6SPvmsbJ3Q6os9exlSjVk7o14GLC+mvDMTpnDbFpS4xAZN3Rbu7TR88ErcNn+D8vz9a0rznTMVw
-cD8G/zYoKcl4hixBl9M93uzqSkbvfqT3GyTnRAipIYg/U+KSlahOTtY4YTbjsfzDfJUJFaezp1Bz
-2vHNlavgtudzvIPeRH85EiUtzWb9pEUhGP2sQ3ro78Xg+sVWvOZMwXv+TEswUIHMjl1JCZyB2beG
-nAwhJCCIP5Pq4UnyrAU2ae4b1+JwWZvRTYmPo/Lfh+IaugslZ34CfXwc7p+uwn3Tp1QZNRD3kCU2
-22c/3YKUKbMw+LexvWgyMlB1OlTAVN2PhLX/IeHf2zE9UVdOhBBlucFB+iE8Xqq3fAqHm9ctnw0B
-bcno8iJe86bzoK4sqk5H3La9GNpbR3clKwv9nSi8PpiNw81r6G9ex/hkQ8xu7hg6diF1zASZqEYI
-CQgSEEoj58Pf4DOwZ5HrZLzQjfTer+D084+4HD+K42XrvNDZDZsQc/SngsEiOxtdSjKKyYSSZcDs
-5Y3q4SkHXIjHiDxUfswYOnYhs30nXL4rOBR1doPGJC5eSZa/NuFPxqARpP90hmrdrE1C+jtROB86
-gOGFrrZ3Do6OqJWroMohFuKxJc8QyrJCuq8nfrSiYK2gRx9ivg+3BINcWU+3ILNDZ2vBn5GOglpi
-PSGFEFJDEMXMZe+X6BLjUVQw1quPoYW/1mtYUTDVqcf9MRPwWBtiXX9/KLqEeMyVKtvsx/HqZRyu
-WQe0U93cMXtXQpHnAkJIQBClm/PRQ3jPmITjlYuoOh2K2YwKpA0cTsZL/TF07AJA8uyFuG3ZgC4t
-VbvzN5u1oSpWb7QNLIe/QRcbY/lseKYVWfWfkgMtRDkkTUZlhJKSjNe86VR5tTuOVy5irPkXUsdM
-IK3/ULJatcZ92ya83w2y9jx2diZ53iKbfbh+sRXHCG2GMv2Na1R5tTve7wahS09H1esxtAwgZcq7
-4OklB1wIqSGIUlszOHkM1x3/AQcHkqe8S8rEKShmMzg5oSQlUnHyG7iG7sJ76kTit+wGIG3Y67h/
-EoLjpQuW/VT8xzgM7drjsWqZJU0FTH95gvsTgshu0UoOthBSQxCltnYQH4fX/FnoEuJIWLKKlAlB
-KA4OkNMzucK+L3E5tF/7/eDXOOQJAImLQ2z25RQRbhMMAFJf+zsxh86Q2b23HGwhJCCI0kz/2230
-d++Q9XQLMnq/gpIzG5nTqTCq/c8zVJo0Dl16Ogb/NkQf/QnjU40s22YFtCWjRx+7+zX4tyH6+3CS
-F4WgurvLgRZCAoIo9QEhOQklJRnjX58Cdw90MXepNGoAPr074Bh5HlN1P+LW7yA29AjGhk20jfK8
-Npq4cLnN/mzWb9BYDrAQQmuNKKs9lcsT/6hrzD28l6NP1CexghuDzv2ADjAD61q05bPmAbYbqGqB
-4STePP0dAyPOstbe+kIIUVYDQnnjdDkSv0G9cbx7x5KW0rc/sfOWFJjFzOHObXxm/IP0dh1Ifn28
-TZDQJSYU6IcghBC5pMmoDMh6siGZOT2MTV7e3Np3lJiVGwpOaZmVhdu+XbgeO4zXlg3a/MV5SDAQ
-QkhAeAzEzVqA2cEBfXISTlev4HDndk4prw1foY+PpfqEUVSd+w7ZdesTO3+pdR5jkBFJhRAPJE1G
-ZYj36uVUWv4hSnYWhicbcX/AUNQKrjhF/oL3upUoZjPGKlWJmzWf+68OkSAghJCA8Ngym/H6dCXe
-m9bilGf8IdA6l6V178O9BUsxVfeTYyWEkIBQHoKC4/WruJwOw31/KNl16qEqCql9+mFo3lKOjxBC
-AkK5lZVl6bEshBB/hDxULuskGAghJCAIIYSQgCCEEKLYyfDXolQob8OR/FnWzZsnB0FIQBBSWEnQ
-laAriiZNRkIIISQgCCGEkIAghBBCAoIQQggJCEIIIQpVJt8yerK5NjfA5fATdtPsLQdQjak81bKL
-3WXF/X+L+PEEzhJuy7W929Y88jY9B46z/P7Z6oWPvP2wN6YX699gTL9EozYjLZ83ff8dAR4Fe8cX
-lbeKK99J3pKA8LuURGG/f/ZA3gq9VWKBRDx6wfCo5/1RCpRrXy/nxZk7ManqHzrnkyZNeuh1ly1b
-ViBt3iO8iju7BF4rTYnaDoD7E26k3khjy/VUAppVkrz1mNI9rgVGbubPTPyBES/3pJF/VyasOm2z
-njk7kZVzA2n7fAcaBnRl+MxPSTaqdvf3Vugty++pUcd5+/XhPBvwPA1bdaLnqBl8dzfdZpuz6+fR
-pm17/HuN4+C9DADiz4UyZtggmrdqRyP/zvQcNYNvbqTKVfg7An7ewiP/5z8q+uR61iR2xqTKuI+3
-dl0C4PlJ7QC4+HmUZVlReauoZSWRt4QEhIcSOul9Tl5PoG/weqY0CbNZdnz+m/xz9yk6LtzMgcXt
-OfXVvxkecqHIO8/L4SdYMH4hB3++xrydXxG2eRyXw79j0sgVNtvsqT2CHUt6kHj7HO9OOgDA2DeX
-cPT8TT7Ze4CTO6Zw7cIZPpy2Wq7CYlQcBcr68w1ZNLhxqfq7goODCQ4OfmBacTvy/T0ARjcdiqIo
-xJ4++lB5q6hlJZG3hAQES02gsCYEgHWXkgEY36o6tdqOtlm25OBvALzdypeaAWMBuP7fDQ/83oV7
-9vHLmeP0qOWOV51eAKTf22ezzvjna1H92dcASL66TfvXqE13uWnz55yJqcnp499wePsUuQqLUXEU
-KNPHBJTavy83AJR0IABQTelsicvAyb0xTSvWpY27Ixnxodw3qQ/MW0UtK4m8JYpHmX6GYO+hcn5R
-WdpE89UddejU6jbLfs0wAtC6VVtLmiH17AO/9+7xzUxcvJ0LtxMwqdo0lapqtFmnhpMOPVUAMGXf
-1e48PxjFxKVbOfDZGg58Bg4uPgyZtoyZL9WVK7GYLNyzj9xHsabsXkBwToEyzbZA0b0G/DenQHmp
-xP9f9p4P5HqY5wyBgYF2g0FgYGCJ/Z8z4ndrNzGpv+TJX1lsiUtnbDW3IvNWUctKIm8JqSE8lBqO
-egBiss2Ysm7bLGvgqsXDH8+GWdqhL5098sB9jpn6CeduxbPk871EnrFfZY3ONmPKjgFA71wTgJod
-R/Llvm8I27OBxZNfwZgZy+YPJstVWIzuHt9Mvz69aNSiDY38Xyi8QHH4/y1QCiv0H+Whc/7CvySD
-AcC9U98D8NcBa7kcfoIvRtTTmpHC4h6Yt4paVhJ5S0hAeCiv1fEAIOSHGG4cXWezLKhrDe2O68Rt
-Eq/uoZF/JzqPWGt3P54O2qEKT0knLafKXNXLhZ93L8TLUVsWk9MkBLAi7A6/nVoPQMUGgwGYP2II
-/u3a8wN+dOnWUbugXXzlKixGpblAyV/4P0owsNdMVNLNRhd2ag+Qn+ytzdFds0d9AG7tuvLAvFXU
-spLIW0ICwkN5aflUmvt58mXQKFZcf9Fy8WWYVQKmr+btPgF8O3M4rQctp26zNry/ZJjd/bz/0t9w
-1usY2XsIKwN7Us3diRG9XmXzvU5sHN+RKh5uvNxviFbIOHrS4+IaXg7aj0+dZ1m8tJPWVPHOEJrW
-9mXGy914pnsQdZo8x/w1C+UqLEalvUDJDQJ/JBjkrRmUZFDYdFN7A65fLTcA3H17A5By8/MH5q2i
-lpVE3hLFQ+ZUFqXC6NmzH3n4a3sdEC9s/4ixIV+TYHan27AgRlc4zOvrTqJUqkLszZvoHT3516gW
-TF5/DKcaT7N43WKeq+hsd7/5PeqrrXu3rXnkfgj5O6bl9kPILfjtBYPctNmzZxfZMe33HGNRvsh8
-CKLMsldANxowjWMDpuVJac+JEQW3PTPu0fb7Z7P3vKCknyGI8kc6gAshhJAaghAlrajXTR/GbJnl
-TEhAEKLsy/s84Pco7oHqhHgQaTISQgghAUEIIYQEBCGEEBIQhBBC2FMmHyqPljcvhJC8I4qd9FQW
-QggBSJOREEIICQhCCCEkIAghhJCAIIQQQgKCEEIICQhCCCEkIAghhHgo/wfRhtoeu8ntPAAAAABJ
-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
-
-
-
-
-
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=
+ 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
+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
-
-
-
-
-
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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
+ 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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 @@
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
+
+
+
+
+ -
+ _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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+
+
+
+
+ -
+ actor
+ zope
+
+ -
+ comment
+
+
+ -
+ error_message
+
+
+ -
+ time
+
+
+
+
+ -
+ user_account_state
+ draft
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+ validate
+
+ -
+ actor
+ zope
+
+ -
+ comment
+
+
+ -
+ error_message
+
+
+ -
+ time
+
+
+
+
+ -
+ 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
+
+
+
+
+ -
+ validation_state
+ draft
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+ edit
+
+ -
+ actor
+ zope
+
+ -
+ comment
+
+
+
+
+ -
+ error_message
+
+
+ -
+ serial
+ 942.10090.25961.26606
+
+ -
+ state
+ current
+
+ -
+ time
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+ -
+ stop_date
+
+
+
+
+ -
+ title
+ Developer Group
+
+ -
+ workflow_history
+
+ AAAAAAAAAAQ=
+
+
+
+
+
+
+
+
+
+
+
+ -
+ data
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ data
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ data
+
+
+
-
+ assignment_workflow
+
+ AAAAAAAAAAU=
+
+
+ -
+ edit_workflow
+
+ AAAAAAAAAAY=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+ open
+
+ -
+ actor
+ zope
+
+ -
+ comment
+
+
+ -
+ error_message
+
+
+ -
+ time
+
+
+
+
+ -
+ validation_state
+ open
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+ edit
+
+ -
+ actor
+ zope
+
+ -
+ comment
+
+
+
+
+ -
+ error_message
+
+
+ -
+ serial
+ 942.10105.27094.39236
+
+ -
+ state
+ current
+
+ -
+ time
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ action
+ validate
+
+ -
+ actor
+ ERP5TypeTestCase
+
+ -
+ comment
+
+
+ -
+ error_message
+
+
+ -
+ time
+
+
+
+
+ -
+ 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
+
+
+
+
+ -
+ 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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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
+
+
+
+
+ -
+ _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):