Commit 77df78a2 authored by Arnaud Fontaine's avatar Arnaud Fontaine

RFC: Configurator Workflow.

* Rename WorkflowConfigurator PropertySheet to ConfiguratorWorkflow.
* Add ConfiguratorWorkflowTransition PropertySheet for transition_form_id.
  => Should it be moved to standard 'action' instead?
* Avoid defining Configurator-specific API in Workflow API, such as
  initializeDocument(). TODO: What about:
  - state.getAvailableTransitionList()
  - state.executeTransition()
  - state.getWorkflowHistory()
  - state.undoTransition()
  => erp5_configurator_standard:testStandardConfigurationWorkflow
parent f5374810
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>configurator_settings</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>10.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Configurator</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/WorkflowTransition_viewConfigurator</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -41,6 +41,55 @@ INITIAL_STATE_TITLE = 'Start'
DOWNLOAD_STATE_TITLE = 'Download'
END_STATE_TITLE = 'End'
## TODO-ERP5Workflow: Initially part of Workflow implementation done for
## ERP5Configurator but not used by ERP5 Workflow...
def _generateHistoryKey(workflow):
"""
Generate a key used in the workflow history.
"""
return workflow.getReference()
def getWorkflowHistory(state, document, remove_undo=0, remove_not_displayed=0):
"""
Return history tuple
"""
wh = document.workflow_history[_generateHistoryKey(state.getParentValue())]
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 _checkPermission(transition, document):
"""
Check if transition is allowed.
"""
expr_value = transition.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
from Products.ERP5Type.Accessor.Base import _evaluateTales
value = _evaluateTales(document, expr_value)
else:
value = True
#print "CALC", expr_value, '-->', value
return value
def getAvailableTransitionList(state, document):
"""
Return available transitions only if they are accessible for the current document.
"""
result_list = []
for transition in state.getDestinationValueList():
value = _checkPermission(transition, document)
if value:
result_list.append(transition)
return result_list
class BusinessConfiguration(Item):
"""
BusinessConfiguration store the values enter by the wizard.
......@@ -101,7 +150,17 @@ class BusinessConfiguration(Item):
if len(self.objectValues("ERP5 Configuration Save")) > 0:
raise ValueError("Business Configuration Cannot be initialized, \
it contains one or more Configurator Save")
workflow.initializeDocument(self)
# TODO-BEFORE-MERGE: initializeDocument() in workflow_module
# implementation: Without this getCurrentState() is None and nothing
# happens because getNextTransition() returns None in such case. But
# there is no field to modify 'state_base_category' which is sets to
# 'current_state' and BusinessConfiguration uses getCurrentState() so is
# 'state_base_category' really needed?
self.setCategoryMembership(workflow.getStateBaseCategory(),
workflow.getSource())
workflow.notifyCreated(self)
security.declareProtected(Permissions.View, 'getNextTransition')
def getNextTransition(self):
......@@ -109,7 +168,7 @@ class BusinessConfiguration(Item):
current_state = self.getCurrentStateValue()
if current_state is None:
return None
transition_list = current_state.getAvailableTransitionList(self)
transition_list = getAvailableTransitionList(current_state, self)
transition_number = len(transition_list)
if transition_number > 1:
raise TypeError("More than one transition is available.")
......@@ -240,7 +299,7 @@ class BusinessConfiguration(Item):
security.declarePrivate('_displayPreviousForm')
def _displayPreviousForm(self):
""" Render previous form using workflow history. """
workflow_history = self.getCurrentStateValue().getWorkflowHistory(self, remove_undo=1)
workflow_history = getWorkflowHistory(self.getCurrentStateValue(), self, remove_undo=1)
workflow_history.reverse()
for wh in workflow_history:
## go one step back
......@@ -251,7 +310,7 @@ class BusinessConfiguration(Item):
transition = self.unrestrictedTraverse(wh['transition'])
conf_save = self.unrestrictedTraverse(wh['configuration_save_url'])
## check if this transition can be shown to user ...
if transition._checkPermission(self) and \
if _checkPermission(transition, self) and \
transition.getTransitionFormId() is not None:
return self._displayNextForm(context=conf_save, transition=transition)
......@@ -269,7 +328,7 @@ class BusinessConfiguration(Item):
current_state = self.getCurrentStateValue()
transition = self.getNextTransition()
next_state = self.unrestrictedTraverse(transition.getDestination())
for wh in current_state.getWorkflowHistory(self):
for wh in getWorkflowHistory(current_state, self):
if next_state == self.unrestrictedTraverse(wh['current_state']):
configuration_save = self.unrestrictedTraverse(wh['configuration_save_url'])
return configuration_save
......@@ -277,11 +336,11 @@ class BusinessConfiguration(Item):
security.declarePrivate('_isAlreadyConfSaveInWorkflowHistory')
def _isAlreadyConfSaveInWorkflowHistory(self, transition):
""" check if we have an entry in worklow history for this state """
workflow_history = self.getCurrentStateValue().getWorkflowHistory(self, remove_undo=1)
workflow_history = getWorkflowHistory(self.getCurrentStateValue(), self, remove_undo=1)
workflow_history.reverse()
for wh in workflow_history:
wh_state = self.unrestrictedTraverse(wh['current_state'])
for wh_transition in wh_state.getAvailableTransitionList(self):
for wh_transition in getAvailableTransitionList(wh_state, self):
if wh_transition.getTransitionFormId() is not None and \
wh_transition != transition:
return True
......
def titleToReference(title):
reference = title.replace(' ', '_').lower()
return reference
def migrateToERP5Workflow(portal_workflow, configurator_workflow):
"""
Convert Configurator Workflow (workflow_module/*) to ERP5 Workflow.
"""
workflow_id = configurator_workflow.getId()
relative_url = "%s/%s" % (portal_workflow.getRelativeUrl(), workflow_id)
def getCategoryList(prefix, category_value_list):
return ['%s/%s%s' % (relative_url, prefix, titleToReference(o.getTitle()))
for o in category_value_list ]
workflow = portal_workflow.newContent(
id=workflow_id,
portal_type='Workflow',
reference=configurator_workflow.getId(),
comment=configurator_workflow.getComment(),
description=configurator_workflow.getDescription(),
source_list=getCategoryList('state_', configurator_workflow.getSourceValueList()),
# ConfiguratorWorkflow PropertySheet
configuration_after_script_id=configurator_workflow.getConfigurationAfterScriptId(),
state_base_category=configurator_workflow.getStateBaseCategory())
for business_configuration in configurator_workflow.getRelatedValueList(
portal_type='Business Configuration'):
business_configuration.setResourceValue(workflow)
for subobject in configurator_workflow.objectValues():
title = subobject.getTitle()
reference = titleToReference(title)
if subobject.getPortalType() == 'State':
state = workflow.newContent(
id='state_' + reference,
portal_type='State',
reference=reference,
title=title,
destination_list=getCategoryList('transition_', subobject.getDestinationValueList()),
comment=subobject.getComment(),
description=subobject.getDescription())
for business_configuration in subobject.getRelatedValueList(
portal_type='Business Configuration'):
business_configuration.setCurrentStateValue(state)
elif subobject.getPortalType() == 'Transition':
workflow.newContent(
id='transition_' + reference,
portal_type='Transition',
reference=reference,
title=title,
destination_list=getCategoryList('state_', subobject.getDestinationValueList()),
comment=subobject.getComment(),
description=subobject.getDescription(),
before_script_value=subobject.getProperty('before_script_id'),
after_script_value=subobject.getProperty('after_script_id'),
guard_expression=subobject.getProperty('guard_expression'),
# ConfiguratorWorkflowTransition Property Sheet
transition_form_id=subobject.getProperty('transition_form_id'))
# XXX: Transition Variable: Not used in erp5.git, used elsewhere?
elif subobject.getPortalType() == 'Variable':
if reference in ('action',
'actor',
'comment',
'error_message',
'history',
'portal_type',
'time'):
continue
workflow.newContent(
id='variable_' + reference,
portal_type='Workflow Variable',
reference=reference,
title=title,
description=subobject.getDescription(),
automatic_update=subobject.getAutomaticUpdate(),
variable_default_expression=subobject.getProperty('initial_value', evaluate=0),
comment=subobject.getComment())
# default_image
elif subobject.getPortalType() == 'Embedded File':
copy_data = configurator_workflow.manage_copyObjects([subobject.getId()])
workflow.manage_pasteObjects(copy_data)
else:
raise NotImplementedError(
"%s: Portal Type '%s'" % (subobject.getRelativeUrl(),
subobject.getPortalType()))
return workflow
def migrateWorkflowModuleToPortalWorkflow(self, recreate=False):
"""
Migrate workflow_module to new-style ERP5Workflows: workflow_module was implemented
for Configurators, based on DCWorkflow (portal_workflow), and a step towards migrating
DCWorkflows to ERP5 Objects. Now that portal_workflow is a real ERP5 Object, these must
be migrated to portal_workflow.
"""
portal = self.getPortalObject()
try:
workflow_module = portal.workflow_module
except AttributeError:
return "Nothing to do as workflow_module does not exist."
portal_workflow = portal.portal_workflow
assert portal_workflow.getPortalType() == 'Workflow Tool'
from zLOG import LOG
for configurator_workflow in workflow_module.objectValues():
id_ = configurator_workflow.getId()
if id_ in portal_workflow:
if not recreate:
continue
portal_workflow._delOb(id_)
new_workflow = migrateToERP5Workflow(portal_workflow, configurator_workflow)
LOG("migrateWorkflowModuleToPortalWorkflow", 0,
"Migrated %s to %s" % (configurator_workflow.getRelativeUrl(),
new_workflow.getRelativeUrl()))
return 'Done'
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Extension Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>migrateWorkflowModuleToPortalWorkflow</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>extension.erp5.migrateWorkflowModuleToPortalWorkflow</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Extension Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<property_sheet_list>
<portal_type id="Transition">
<item>ConfiguratorWorkflowTransition</item>
</portal_type>
<portal_type id="Workflow">
<item>ConfiguratorWorkflow</item>
<item>DefaultImage</item>
<item>WorkflowConfigurator</item>
</portal_type>
</property_sheet_list>
\ No newline at end of file
......@@ -32,7 +32,7 @@
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WorkflowConfigurator</string> </value>
<value> <string>ConfiguratorWorkflow</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>state_base_category</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>state_base_category_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Property Sheet" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ConfiguratorWorkflowTransition</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Property Sheet</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>transition_form_id</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>transition_form_id_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -114,6 +114,7 @@
<string>my_empty_mode_default_address_region</string>
<string>my_empty_mode_default_address_zip_code</string>
<string>my_view_mode_reference</string>
<string>my_view_mode_transition_form_id</string>
</list>
</value>
</item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>display_width</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_view_mode_transition_form_id</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>extra_context</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_context</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>display_width</string> </key>
<value> <int>40</int> </value>
</item>
<item>
<key> <string>extra_context</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_string_field</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Transition Form ID</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Base_edit</string> </value>
</item>
<item>
<key> <string>action_title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string>multipart/form-data</string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list>
<string>my_transition_form_id</string>
</list>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WorkflowTransition_viewConfigurator</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>WorkflowTransition_viewConfigurator</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_view</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Configurator Settings</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>display_width</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_transition_form_id</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_transition_form_id</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewConfiguratorFieldLibrary</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -27,6 +27,7 @@ Site Property Configurator Item | view
Solver Configurator Item | view
Standard BT5 Configurator Item | view
System Preference Configurator Item | view
Transition | configurator_settings
Workflow | configurator_settings
Workflow | launch_configuration
portal_actions | use_configurator
\ No newline at end of file
extension.erp5.ConfigurationTemplate_readOOoCalcFile
extension.erp5.migrateWorkflowModuleToPortalWorkflow
\ No newline at end of file
Transition | ConfiguratorWorkflowTransition
Workflow | ConfiguratorWorkflow
Workflow | DefaultImage
\ No newline at end of file
Workflow | WorkflowConfigurator
\ No newline at end of file
WorkflowConfigurator
\ No newline at end of file
ConfiguratorWorkflow
ConfiguratorWorkflowTransition
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment