Commit 5b20c274 authored by Arnaud Fontaine's avatar Arnaud Fontaine

Merge remote-tracking branch 'origin/master' into zope4py2

parents cb7680fe 1c57528b
...@@ -50,12 +50,6 @@ ...@@ -50,12 +50,6 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -89,17 +83,4 @@ ...@@ -89,17 +83,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: context.isAccountingTransactionType()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -65,12 +65,6 @@ InternalInvoiceTransaction_statInternalTransactionLineList\n ...@@ -65,12 +65,6 @@ InternalInvoiceTransaction_statInternalTransactionLineList\n
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -104,17 +98,4 @@ InternalInvoiceTransaction_statInternalTransactionLineList\n ...@@ -104,17 +98,4 @@ InternalInvoiceTransaction_statInternalTransactionLineList\n
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: context.isAccountingTransactionType()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -36,4 +36,3 @@ for (section_value, node_uid, mirror_section_uid) in ( ...@@ -36,4 +36,3 @@ for (section_value, node_uid, mirror_section_uid) in (
grouping_reference=grouping_reference grouping_reference=grouping_reference
) or []) ) or [])
return list(ungrouped_line_set) return list(ungrouped_line_set)
...@@ -113,14 +113,6 @@ ...@@ -113,14 +113,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>error_message</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</list>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
...@@ -132,36 +124,4 @@ ...@@ -132,36 +124,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="Message" module="Products.ERP5Type.Message"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default</string> </key>
<value> <string>ID is invalid, should be \'${id_prefix}.VERSION.REFERENCE\'</string> </value>
</item>
<item>
<key> <string>domain</string> </key>
<value> <string>erp5_ui</string> </value>
</item>
<item>
<key> <string>mapping</string> </key>
<value>
<dictionary>
<item>
<key> <string>id_prefix</string> </key>
<value> <string>test</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>message</string> </key>
<value> <string>ID is invalid, should be \'${id_prefix}.VERSION.REFERENCE\'</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -39,7 +39,6 @@ document.erp5.QuantitySignMovementGroup ...@@ -39,7 +39,6 @@ document.erp5.QuantitySignMovementGroup
document.erp5.RequirementMovementGroup document.erp5.RequirementMovementGroup
document.erp5.RoleDefinition document.erp5.RoleDefinition
document.erp5.RootAppliedRuleCausalityMovementGroup document.erp5.RootAppliedRuleCausalityMovementGroup
document.erp5.RoundingModel
document.erp5.SimulatedDeliveryBuilder document.erp5.SimulatedDeliveryBuilder
document.erp5.SplitMovementGroup document.erp5.SplitMovementGroup
document.erp5.Supply document.erp5.Supply
......
...@@ -2,4 +2,3 @@ interface.erp5.ICoordinate ...@@ -2,4 +2,3 @@ interface.erp5.ICoordinate
interface.erp5.IEncryptedPassword interface.erp5.IEncryptedPassword
interface.erp5.ILoginAccountProvider interface.erp5.ILoginAccountProvider
interface.erp5.IMovementGroup interface.erp5.IMovementGroup
interface.erp5.IRoundingTool
\ No newline at end of file
portal_components/document.erp5.RoundingModel
portal_components/document.erp5.RoundingTool
portal_components/interface.erp5.IRoundingTool
portal_introspections portal_introspections
portal_memcached/persistent_memcached_plugin portal_memcached/persistent_memcached_plugin
portal_solver_processes portal_solver_processes
......
tool.erp5.RoundingTool
\ No newline at end of file
<property_sheet_list> <property_sheet_list>
<portal_type id="Workflow Transition">
<item>ConfiguratorWorkflowTransition</item>
</portal_type>
<portal_type id="Workflow"> <portal_type id="Workflow">
<item>ConfiguratorWorkflow</item> <item>ConfiguratorWorkflow</item>
<item>DefaultImage</item> <item>DefaultImage</item>
</portal_type> </portal_type>
<portal_type id="Workflow Transition">
<item>ConfiguratorWorkflowTransition</item>
</portal_type>
</property_sheet_list> </property_sheet_list>
\ No newline at end of file
...@@ -27,7 +27,7 @@ Site Property Configurator Item | view ...@@ -27,7 +27,7 @@ Site Property Configurator Item | view
Solver Configurator Item | view Solver Configurator Item | view
Standard BT5 Configurator Item | view Standard BT5 Configurator Item | view
System Preference Configurator Item | view System Preference Configurator Item | view
Workflow Transition | configurator_settings
Workflow | configurator_settings Workflow | configurator_settings
Workflow | launch_configuration Workflow | launch_configuration
Workflow Transition | configurator_settings
portal_actions | use_configurator portal_actions | use_configurator
\ No newline at end of file
Workflow Transition | ConfiguratorWorkflowTransition
Workflow | ConfiguratorWorkflow Workflow | ConfiguratorWorkflow
Workflow | DefaultImage Workflow | DefaultImage
\ No newline at end of file
Workflow Transition | ConfiguratorWorkflowTransition
\ No newline at end of file
...@@ -184,10 +184,6 @@ ...@@ -184,10 +184,6 @@
<none/> <none/>
</value> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>3</string> </value>
</item>
<item> <item>
<key> <string>modification_date</string> </key> <key> <string>modification_date</string> </key>
<value> <value>
......
...@@ -99,10 +99,6 @@ ...@@ -99,10 +99,6 @@
<key> <string>int_index</string> </key> <key> <string>int_index</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>1</string> </value>
</item>
<item> <item>
<key> <string>portal_type</string> </key> <key> <string>portal_type</string> </key>
<value> <string>Category</string> </value> <value> <string>Category</string> </value>
......
...@@ -89,10 +89,6 @@ ...@@ -89,10 +89,6 @@
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>trade</string> </value> <value> <string>trade</string> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>5</string> </value>
</item>
<item> <item>
<key> <string>portal_type</string> </key> <key> <string>portal_type</string> </key>
<value> <string>Category</string> </value> <value> <string>Category</string> </value>
......
...@@ -52,6 +52,24 @@ ...@@ -52,6 +52,24 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<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> <item>
<key> <string>categories</string> </key> <key> <string>categories</string> </key>
<value> <value>
...@@ -71,13 +89,35 @@ ...@@ -71,13 +89,35 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -90,13 +130,13 @@ ...@@ -90,13 +130,13 @@
<item> <item>
<key> <string>edit_workflow</string> </key> <key> <string>edit_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
<key> <string>validation_workflow</string> </key> <key> <string>validation_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -105,7 +145,7 @@ ...@@ -105,7 +145,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="6" aka="AAAAAAAAAAY=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
...@@ -168,7 +208,7 @@ ...@@ -168,7 +208,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="7" aka="AAAAAAAAAAc=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
......
...@@ -52,6 +52,24 @@ ...@@ -52,6 +52,24 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<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> <item>
<key> <string>categories</string> </key> <key> <string>categories</string> </key>
<value> <value>
...@@ -71,13 +89,35 @@ ...@@ -71,13 +89,35 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -90,13 +130,13 @@ ...@@ -90,13 +130,13 @@
<item> <item>
<key> <string>edit_workflow</string> </key> <key> <string>edit_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
<key> <string>validation_workflow</string> </key> <key> <string>validation_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -105,7 +145,7 @@ ...@@ -105,7 +145,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="6" aka="AAAAAAAAAAY=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
...@@ -168,7 +208,7 @@ ...@@ -168,7 +208,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="7" aka="AAAAAAAAAAc=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
......
...@@ -162,6 +162,14 @@ ...@@ -162,6 +162,14 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>AcceptSolver</string> </value> <value> <string>AcceptSolver</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -155,6 +155,14 @@ ...@@ -155,6 +155,14 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>AdoptSolver</string> </value> <value> <string>AdoptSolver</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -220,6 +220,14 @@ ...@@ -220,6 +220,14 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>AcceptSolver</string> </value> <value> <string>AcceptSolver</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -169,6 +169,14 @@ ...@@ -169,6 +169,14 @@
<none/> <none/>
</value> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -124,10 +124,6 @@ ...@@ -124,10 +124,6 @@
<none/> <none/>
</value> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item> <item>
<key> <string>line_exclusive</string> </key> <key> <string>line_exclusive</string> </key>
<value> <int>0</int> </value> <value> <int>0</int> </value>
...@@ -150,6 +146,14 @@ ...@@ -150,6 +146,14 @@
<key> <string>solver_action_title</string> </key> <key> <string>solver_action_title</string> </key>
<value> <string>Cancel Quantity</string> </value> <value> <string>Cancel Quantity</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -178,6 +178,14 @@ ...@@ -178,6 +178,14 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>QuantitySplitSolver</string> </value> <value> <string>QuantitySplitSolver</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -231,6 +231,14 @@ ...@@ -231,6 +231,14 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>QuantitySplitSolver</string> </value> <value> <string>QuantitySplitSolver</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -155,10 +155,6 @@ ...@@ -155,10 +155,6 @@
<none/> <none/>
</value> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item> <item>
<key> <string>line_exclusive</string> </key> <key> <string>line_exclusive</string> </key>
<value> <int>0</int> </value> <value> <int>0</int> </value>
...@@ -193,6 +189,14 @@ ...@@ -193,6 +189,14 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -159,10 +159,6 @@ ...@@ -159,10 +159,6 @@
<none/> <none/>
</value> </value>
</item> </item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item> <item>
<key> <string>line_exclusive</string> </key> <key> <string>line_exclusive</string> </key>
<value> <int>0</int> </value> <value> <int>0</int> </value>
...@@ -189,6 +185,14 @@ ...@@ -189,6 +185,14 @@
<key> <string>solver_action_title</string> </key> <key> <string>solver_action_title</string> </key>
<value> <string>Unify value</string> </value> <value> <string>Unify value</string> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<list>
<string>solver_workflow</string>
</list>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -225,5 +225,5 @@ class TestDedup(ERP5TypeTestCase): ...@@ -225,5 +225,5 @@ class TestDedup(ERP5TypeTestCase):
new_obj_length, = deduped # pylint: disable=unbalanced-tuple-unpacking new_obj_length, = deduped # pylint: disable=unbalanced-tuple-unpacking
# The exact boundary does not matter much, but it should be greater than # The exact boundary does not matter much, but it should be greater than
# some arbitrary value considered satisfying. # some arbitrary value considered satisfying.
self.assertGreaterEqual(new_obj_length, 24) self.assertGreaterEqual(new_obj_length, 30)
self.assertEqual(len(list(whl)), new_obj_length + 1) self.assertEqual(len(list(whl)), new_obj_length + 1)
...@@ -145,11 +145,13 @@ Thank you ...@@ -145,11 +145,13 @@ Thank you
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -232,7 +234,9 @@ Thank you ...@@ -232,7 +234,9 @@ Thank you
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
<list> <list>
<string>listbox_destination_title</string> <string>listbox_destination_title</string>
<string>listbox_delivery_start_date</string> <string>listbox_delivery_start_date</string>
<string>listbox_delivery_stop_date</string>
</list> </list>
</value> </value>
</item> </item>
......
...@@ -357,6 +357,10 @@ ...@@ -357,6 +357,10 @@
<string>delivery.start_date</string> <string>delivery.start_date</string>
<string>Date</string> <string>Date</string>
</tuple> </tuple>
<tuple>
<string>delivery.stop_date</string>
<string>End Date</string>
</tuple>
<tuple> <tuple>
<string>source_title</string> <string>source_title</string>
<string>Sender or Caller</string> <string>Sender or Caller</string>
...@@ -524,6 +528,10 @@ ...@@ -524,6 +528,10 @@
<list/> <list/>
</value> </value>
</item> </item>
<item>
<key> <string>global_search_column</string> </key>
<value> <string></string> </value>
</item>
<item> <item>
<key> <string>hidden</string> </key> <key> <string>hidden</string> </key>
<value> <int>0</int> </value> <value> <int>0</int> </value>
...@@ -556,6 +564,10 @@ ...@@ -556,6 +564,10 @@
<key> <string>page_navigation_mode</string> </key> <key> <string>page_navigation_mode</string> </key>
<value> <string>slider</string> </value> <value> <string>slider</string> </value>
</item> </item>
<item>
<key> <string>page_navigation_template</string> </key>
<value> <string>ListBox_viewSliderPageNavigationRenderer</string> </value>
</item>
<item> <item>
<key> <string>page_template</string> </key> <key> <string>page_template</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DateTimeField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_delivery_stop_date</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>datetime_out_of_range</string> </key>
<value> <string>The date and time you entered were out of range.</string> </value>
</item>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>not_datetime</string> </key>
<value> <string>You did not enter a valid date and time.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>allow_empty_time</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>timezone_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>sub_form</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>allow_empty_time</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default_timezone</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>timezone_style</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>allow_empty_time</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string>date_field</string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string>/</string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The Date</string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value> <string>ymd</string> </value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string>text</string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string>:</string> </value>
</item>
<item>
<key> <string>timezone_style</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Date</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="BasicForm" module="Products.Formulator.Form"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>fields</string> </key>
<value>
<dictionary>
<item>
<key> <string>ampm</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>day</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>hour</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
<item>
<key> <string>minute</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
<item>
<key> <string>month</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
</value>
</item>
<item>
<key> <string>timezone</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAo=</string> </persistent>
</value>
</item>
<item>
<key> <string>year</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAs=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>Default</string>
<string>date</string>
<string>time</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>Default</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>date</string> </key>
<value>
<list>
<string>year</string>
<string>month</string>
<string>day</string>
</list>
</value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<list>
<string>hour</string>
<string>minute</string>
<string>ampm</string>
<string>timezone</string>
</list>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>ISO-8859-1</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Basic Form</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: cell.hasStopDate() and cell.getStopDate() or None</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>preferences/getPreferredDateOrder | string:ymd</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<tuple>
<global name="StringField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>ampm</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>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>Too much input was given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>am/pm</string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<tuple>
<global name="IntegerField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>day</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Day</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<tuple>
<global name="IntegerField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>hour</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Hour</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="8" aka="AAAAAAAAAAg=">
<pickle>
<tuple>
<global name="IntegerField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>minute</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Minute</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="9" aka="AAAAAAAAAAk=">
<pickle>
<tuple>
<global name="IntegerField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>month</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Month</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="10" aka="AAAAAAAAAAo=">
<pickle>
<tuple>
<global name="ListField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>timezone</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>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>unknown_selection</string> </key>
<value> <string>You selected an item that was not in the list.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>first_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>items</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>first_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>items</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string>GMT</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>first_item</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>items</string> </key>
<value>
<list>
<tuple>
<string>GMT-12</string>
<string>GMT-12</string>
</tuple>
<tuple>
<string>GMT-11</string>
<string>GMT-11</string>
</tuple>
<tuple>
<string>GMT-10</string>
<string>GMT-10</string>
</tuple>
<tuple>
<string>GMT-9</string>
<string>GMT-9</string>
</tuple>
<tuple>
<string>GMT-8</string>
<string>GMT-8</string>
</tuple>
<tuple>
<string>GMT-7</string>
<string>GMT-7</string>
</tuple>
<tuple>
<string>GMT-6</string>
<string>GMT-6</string>
</tuple>
<tuple>
<string>GMT-5</string>
<string>GMT-5</string>
</tuple>
<tuple>
<string>GMT-4</string>
<string>GMT-4</string>
</tuple>
<tuple>
<string>GMT-3</string>
<string>GMT-3</string>
</tuple>
<tuple>
<string>GMT-2</string>
<string>GMT-2</string>
</tuple>
<tuple>
<string>GMT-1</string>
<string>GMT-1</string>
</tuple>
<tuple>
<string>GMT</string>
<string>GMT</string>
</tuple>
<tuple>
<string>GMT+1</string>
<string>GMT+1</string>
</tuple>
<tuple>
<string>GMT+2</string>
<string>GMT+2</string>
</tuple>
<tuple>
<string>GMT+3</string>
<string>GMT+3</string>
</tuple>
<tuple>
<string>GMT+4</string>
<string>GMT+4</string>
</tuple>
<tuple>
<string>GMT+5</string>
<string>GMT+5</string>
</tuple>
<tuple>
<string>GMT+6</string>
<string>GMT+6</string>
</tuple>
<tuple>
<string>GMT+7</string>
<string>GMT+7</string>
</tuple>
<tuple>
<string>GMT+8</string>
<string>GMT+8</string>
</tuple>
<tuple>
<string>GMT+9</string>
<string>GMT+9</string>
</tuple>
<tuple>
<string>GMT+10</string>
<string>GMT+10</string>
</tuple>
<tuple>
<string>GMT+11</string>
<string>GMT+11</string>
</tuple>
<tuple>
<string>GMT+12</string>
<string>GMT+12</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Timezone</string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="11" aka="AAAAAAAAAAs=">
<pickle>
<tuple>
<global name="IntegerField" module="Products.Formulator.StandardFields"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>year</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Year</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -50,11 +50,11 @@ ...@@ -50,11 +50,11 @@
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>image_data, image_path</string> </value> <value> <string></string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>Zuite_updateReferenceImage</string> </value> <value> <string>Event_hasDuration</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -100,6 +100,7 @@ ...@@ -100,6 +100,7 @@
<string>my_title</string> <string>my_title</string>
<string>my_reference</string> <string>my_reference</string>
<string>my_start_date</string> <string>my_start_date</string>
<string>my_stop_date</string>
<string>my_translated_portal_type</string> <string>my_translated_portal_type</string>
<string>my_resource</string> <string>my_resource</string>
<string>my_causality_title</string> <string>my_causality_title</string>
......
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
<item> <item>
<key> <string>delegated_list</string> </key> <key> <string>delegated_list</string> </key>
<value> <value>
<list/> <list>
<string>title</string>
</list>
</value> </value>
</item> </item>
<item> <item>
...@@ -62,6 +64,12 @@ ...@@ -62,6 +64,12 @@
<key> <string>target</string> </key> <key> <string>target</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
</item> </item>
<item>
<key> <string>title</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary> </dictionary>
</value> </value>
</item> </item>
...@@ -81,10 +89,27 @@ ...@@ -81,10 +89,27 @@
<key> <string>target</string> </key> <key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value> <value> <string>Click to edit the target</string> </value>
</item> </item>
<item>
<key> <string>title</string> </key>
<value> <string>Date</string> </value>
</item>
</dictionary> </dictionary>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: context.getTypeBasedMethod(\'hasDuration\')() and context.Base_translateString("Begin Date") or context.Base_translateString("Date")</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </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>default</string>
<string>default_now</string>
<string>enabled</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_stop_date</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>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</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>default</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_event_start_date</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewCRMFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>End Date</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: context.hasStopDate() and context.getStopDate() or None</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: context.getTypeBasedMethod(\'hasDuration\')()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<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>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>PhoneCall_hasDuration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<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>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Visit_hasDuration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -109,6 +109,20 @@ class TestCRM(BaseTestCRM): ...@@ -109,6 +109,20 @@ class TestCRM(BaseTestCRM):
self.assertTrue(event.isMovement(), self.assertTrue(event.isMovement(),
"%s is not a movement" % portal_type) "%s is not a movement" % portal_type)
def test_Event_stop_date_field_enabled(self):
"""
Checks if Event_view display stop_date to Phone calls and visits
"""
phone_call = self.portal.event_module.newContent(
portal_type="Phone Call", temp_object=True)
self.assertTrue(phone_call.Event_view.my_stop_date.get_value("enabled"))
visit = self.portal.event_module.newContent(
portal_type="Visit", temp_object=True)
self.assertTrue(visit.Event_view.my_stop_date.get_value("enabled"))
mail_message = self.portal.event_module.newContent(
portal_type="Mail Message", temp_object=True)
self.assertFalse(mail_message.Event_view.my_stop_date.get_value("enabled"))
def test_Event_CreateRelatedEvent(self): def test_Event_CreateRelatedEvent(self):
# test workflow to create a related event from responded event # test workflow to create a related event from responded event
event_module = self.portal.event_module event_module = self.portal.event_module
......
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>default_reference</string> </key> <key> <string>default_reference</string> </key>
<value> <string>testCRM</string> </value> <value> <string>testCRM</string> </value>
...@@ -53,13 +59,28 @@ ...@@ -53,13 +59,28 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <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> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -72,7 +93,7 @@ ...@@ -72,7 +93,7 @@
<item> <item>
<key> <string>component_validation_workflow</string> </key> <key> <string>component_validation_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -81,7 +102,7 @@ ...@@ -81,7 +102,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -472,6 +472,19 @@ ...@@ -472,6 +472,19 @@
<td tal:content="python: response_configuration['field_my_portal_type']"></td> <td tal:content="python: response_configuration['field_my_portal_type']"></td>
<td></td> <td></td>
</tr> </tr>
<tal:block tal:condition="python: response_configuration['field_my_portal_type'] not in ('Visit', 'Phone Call')">
<tr>
<td>assertElementPresent</td>
<td>//div[@class="field date_field"]/label[contains(text(),"Date")]</td>
<td></td>
</tr>
<tr>
<td>assertElementNotPresent</td>
<td>//label[contains(text(),"Stop Date")]</td>
<td></td>
</tr>
</tal:block>
<tr> <tr>
<td>verifyValue</td> <td>verifyValue</td>
<td>field_my_resource</td> <td>field_my_resource</td>
......
...@@ -25,6 +25,7 @@ with portal.Localizer.translationContext(localizer_language): ...@@ -25,6 +25,7 @@ with portal.Localizer.translationContext(localizer_language):
report_request = portal.ERP5Site_filterRequestForDeferredStyle(request) report_request = portal.ERP5Site_filterRequestForDeferredStyle(request)
active_process = portal.portal_activities.newActiveProcess() active_process = portal.portal_activities.newActiveProcess()
inner_tag = tag + '-render'
for idx, report_section in enumerate(report_section_list): for idx, report_section in enumerate(report_section_list):
if report_section.getPath(): if report_section.getPath():
...@@ -34,7 +35,7 @@ for idx, report_section in enumerate(report_section_list): ...@@ -34,7 +35,7 @@ for idx, report_section in enumerate(report_section_list):
doc.activate(activity='SQLQueue', doc.activate(activity='SQLQueue',
node=portal.portal_preferences.getPreferredDeferredReportActivityFamily(), node=portal.portal_preferences.getPreferredDeferredReportActivityFamily(),
active_process=active_process, active_process=active_process,
tag=tag, tag=inner_tag,
priority=priority, priority=priority,
).Base_renderReportSection(skin_name=skin_name, ).Base_renderReportSection(skin_name=skin_name,
localizer_language=localizer_language, localizer_language=localizer_language,
...@@ -51,7 +52,8 @@ if activity_context == portal: ...@@ -51,7 +52,8 @@ if activity_context == portal:
activity_context.activate( activity_context.activate(
activity='SQLQueue', activity='SQLQueue',
node=portal.portal_preferences.getPreferredDeferredReportActivityFamily(), node=portal.portal_preferences.getPreferredDeferredReportActivityFamily(),
after_tag=tag, after_tag=inner_tag,
tag=tag,
priority=priority, priority=priority,
).Base_report( ).Base_report(
active_process_url=active_process.getRelativeUrl(), active_process_url=active_process.getRelativeUrl(),
......
...@@ -5,7 +5,7 @@ The code is a modified version of Folder_delete. We split into two files not to ...@@ -5,7 +5,7 @@ The code is a modified version of Folder_delete. We split into two files not to
further complicate the mentioned script. further complicate the mentioned script.
""" """
from ZODB.POSException import ConflictError from Products.ERP5Type.Errors import UnsupportedWorkflowMethod
portal = context.getPortalObject() portal = context.getPortalObject()
translate = portal.Base_translateString translate = portal.Base_translateString
...@@ -31,13 +31,15 @@ if context.isDeletable(check_relation=True): ...@@ -31,13 +31,15 @@ if context.isDeletable(check_relation=True):
"portal_status_message": translate("Document deleted") "portal_status_message": translate("Document deleted")
}) })
except ConflictError: except UnsupportedWorkflowMethod:
raise
except Exception:
# XXX Catch-them-all expression is never a good idea
pass pass
request = portal.REQUEST request = portal.REQUEST
request.RESPONSE.setStatus(400) request.RESPONSE.setStatus(400)
form = getattr(context,form_id) return context.Base_renderForm(
return context.ERP5Document_getHateoas(form=form, REQUEST=request, mode='form') dialog_id,
keep_items={
'portal_status_message': translate("You are not authorised to delete the document"),
'portal_status_level': 'warning'
}
)
...@@ -551,6 +551,10 @@ def renderField(traversed_document, field, form, value=MARKER, meta_type=None, ...@@ -551,6 +551,10 @@ def renderField(traversed_document, field, form, value=MARKER, meta_type=None,
if meta_type in ("StringField", "FloatField", "EmailField", "TextAreaField", if meta_type in ("StringField", "FloatField", "EmailField", "TextAreaField",
"LinesField", "ImageField", "FileField", "IntegerField", "LinesField", "ImageField", "FileField", "IntegerField",
"PasswordField", "EditorField", "HyperLinkField", "LinkField"): "PasswordField", "EditorField", "HyperLinkField", "LinkField"):
if meta_type in ("StringField", "EmailField"):
result.update({
"maxlength": field.get_value("display_maxwidth"),
})
if meta_type == "FloatField": if meta_type == "FloatField":
result.update({ result.update({
"precision": field.get_value("precision"), "precision": field.get_value("precision"),
......
...@@ -26,12 +26,6 @@ ...@@ -26,12 +26,6 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -57,17 +51,4 @@ ...@@ -57,17 +51,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: context.getPortalType() in (\'Email\', \'Fax\', \'Telephone\',)</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -28,12 +28,6 @@ getPortalType</string> </value> ...@@ -28,12 +28,6 @@ getPortalType</string> </value>
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -59,17 +53,4 @@ getPortalType</string> </value> ...@@ -59,17 +53,4 @@ getPortalType</string> </value>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: context.getPortalType() in (\'Email\', \'Fax\', \'Telephone\')</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844632.42</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -6,6 +6,24 @@ ...@@ -6,6 +6,24 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <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> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>portal_inotify</string> </value> <value> <string>portal_inotify</string> </value>
...@@ -13,4 +31,26 @@ ...@@ -13,4 +31,26 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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> </ZopeData>
...@@ -335,11 +335,13 @@ ...@@ -335,11 +335,13 @@
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -434,7 +436,9 @@ ...@@ -434,7 +436,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
......
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
</item> </item>
<item> <item>
<key> <string>preferred_password</string> </key> <key> <string>preferred_password</string> </key>
<value> <string/> </value> <value> <string></string> </value>
</item> </item>
<item> <item>
<key> <string>preferred_rss_feed</string> </key> <key> <string>preferred_rss_feed</string> </key>
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
</item> </item>
<item> <item>
<key> <string>preferred_username</string> </key> <key> <string>preferred_username</string> </key>
<value> <string/> </value> <value> <string></string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
...@@ -53,6 +53,24 @@ ...@@ -53,6 +53,24 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<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> <item>
<key> <string>categories</string> </key> <key> <string>categories</string> </key>
<value> <value>
...@@ -82,4 +100,26 @@ ...@@ -82,4 +100,26 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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> </ZopeData>
...@@ -638,11 +638,13 @@ ...@@ -638,11 +638,13 @@
</record> </record>
<record id="10" aka="AAAAAAAAAAo="> <record id="10" aka="AAAAAAAAAAo=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<persistent> <string encoding="base64">AAAAAAAAAAs=</string> </persistent> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -1232,16 +1234,36 @@ ...@@ -1232,16 +1234,36 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
<item>
<key> <string>_next</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAs=</string> </persistent>
</value>
</item>
<item>
<key> <string>_prev</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAs=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tail_count</string> </key>
<value> <int>16</int> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="11" aka="AAAAAAAAAAs="> <record id="11" aka="AAAAAAAAAAs=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -1966,7 +1988,21 @@ ...@@ -1966,7 +1988,21 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
<item>
<key> <string>_next</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAo=</string> </persistent>
</value>
</item>
<item>
<key> <string>_prev</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/1</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -62,7 +117,7 @@ ...@@ -62,7 +117,7 @@
<item> <item>
<key> <string>_count</string> </key> <key> <string>_count</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -74,7 +129,7 @@ ...@@ -74,7 +129,7 @@
<item> <item>
<key> <string>_mt_index</string> </key> <key> <string>_mt_index</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -86,7 +141,7 @@ ...@@ -86,7 +141,7 @@
<item> <item>
<key> <string>_tree</string> </key> <key> <string>_tree</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -165,12 +220,20 @@ ...@@ -165,12 +220,20 @@
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="Length" module="BTrees.Length"/> <global name="Length" module="BTrees.Length"/>
</pickle> </pickle>
<pickle> <int>0</int> </pickle> <pickle> <int>0</int> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
...@@ -178,7 +241,7 @@ ...@@ -178,7 +241,7 @@
<none/> <none/>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
......
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/1</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/2</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/2</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -62,7 +117,7 @@ ...@@ -62,7 +117,7 @@
<item> <item>
<key> <string>_count</string> </key> <key> <string>_count</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -74,7 +129,7 @@ ...@@ -74,7 +129,7 @@
<item> <item>
<key> <string>_mt_index</string> </key> <key> <string>_mt_index</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -86,7 +141,7 @@ ...@@ -86,7 +141,7 @@
<item> <item>
<key> <string>_tree</string> </key> <key> <string>_tree</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -159,12 +214,20 @@ ...@@ -159,12 +214,20 @@
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="Length" module="BTrees.Length"/> <global name="Length" module="BTrees.Length"/>
</pickle> </pickle>
<pickle> <int>0</int> </pickle> <pickle> <int>0</int> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
...@@ -172,7 +235,7 @@ ...@@ -172,7 +235,7 @@
<none/> <none/>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
......
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/1</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/2</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/3</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -62,7 +117,7 @@ ...@@ -62,7 +117,7 @@
<item> <item>
<key> <string>_count</string> </key> <key> <string>_count</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -74,7 +129,7 @@ ...@@ -74,7 +129,7 @@
<item> <item>
<key> <string>_mt_index</string> </key> <key> <string>_mt_index</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -86,7 +141,7 @@ ...@@ -86,7 +141,7 @@
<item> <item>
<key> <string>_tree</string> </key> <key> <string>_tree</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -159,12 +214,20 @@ ...@@ -159,12 +214,20 @@
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="Length" module="BTrees.Length"/> <global name="Length" module="BTrees.Length"/>
</pickle> </pickle>
<pickle> <int>0</int> </pickle> <pickle> <int>0</int> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
...@@ -172,7 +235,7 @@ ...@@ -172,7 +235,7 @@
<none/> <none/>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="OOBTree" module="BTrees.OOBTree"/> <global name="OOBTree" module="BTrees.OOBTree"/>
</pickle> </pickle>
......
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/1</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/2</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -136,4 +191,12 @@ ...@@ -136,4 +191,12 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -53,6 +53,61 @@ ...@@ -53,6 +53,61 @@
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/forum</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item> <item>
<key> <string>__translation_dict</string> </key> <key> <string>__translation_dict</string> </key>
<value> <value>
...@@ -62,13 +117,13 @@ ...@@ -62,13 +117,13 @@
<item> <item>
<key> <string>_identity_criterion</string> </key> <key> <string>_identity_criterion</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
<key> <string>_range_criterion</string> </key> <key> <string>_range_criterion</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -138,13 +193,21 @@ ...@@ -138,13 +193,21 @@
<item> <item>
<key> <string>workflow_history</string> </key> <key> <string>workflow_history</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -168,7 +231,7 @@ ...@@ -168,7 +231,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -183,7 +246,7 @@ ...@@ -183,7 +246,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="PersistentMapping" module="Persistence.mapping"/> <global name="PersistentMapping" module="Persistence.mapping"/>
</pickle> </pickle>
...@@ -196,7 +259,7 @@ ...@@ -196,7 +259,7 @@
<item> <item>
<key> <string>edit_workflow</string> </key> <key> <string>edit_workflow</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value> </value>
</item> </item>
</dictionary> </dictionary>
...@@ -205,7 +268,7 @@ ...@@ -205,7 +268,7 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="6" aka="AAAAAAAAAAY=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
...@@ -247,7 +310,7 @@ ...@@ -247,7 +310,7 @@
<value> <value>
<object> <object>
<klass> <klass>
<global id="5.1" name="DateTime" module="DateTime.DateTime"/> <global id="6.1" name="DateTime" module="DateTime.DateTime"/>
</klass> </klass>
<tuple> <tuple>
<none/> <none/>
...@@ -293,7 +356,7 @@ ...@@ -293,7 +356,7 @@
<key> <string>time</string> </key> <key> <string>time</string> </key>
<value> <value>
<object> <object>
<klass> <reference id="5.1"/> </klass> <klass> <reference id="6.1"/> </klass>
<tuple> <tuple>
<none/> <none/>
</tuple> </tuple>
...@@ -338,7 +401,7 @@ ...@@ -338,7 +401,7 @@
<key> <string>time</string> </key> <key> <string>time</string> </key>
<value> <value>
<object> <object>
<klass> <reference id="5.1"/> </klass> <klass> <reference id="6.1"/> </klass>
<tuple> <tuple>
<none/> <none/>
</tuple> </tuple>
......
...@@ -164,7 +164,7 @@ ...@@ -164,7 +164,7 @@
<key> <string>membership_criterion_category</string> </key> <key> <string>membership_criterion_category</string> </key>
<value> <value>
<tuple> <tuple>
<string/> <string></string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<com:AddressLine5 tal:content="python: recipient_address_line_list[4]" tal:condition="python: recipient_address_line_list[4]"></com:AddressLine5> <com:AddressLine5 tal:content="python: recipient_address_line_list[4]" tal:condition="python: recipient_address_line_list[4]"></com:AddressLine5>
<com:AddressLine6 tal:content="python: recipient_address_line_list[5]" tal:condition="python: recipient_address_line_list[5]"></com:AddressLine6> <com:AddressLine6 tal:content="python: recipient_address_line_list[5]" tal:condition="python: recipient_address_line_list[5]"></com:AddressLine6>
</com:AddressLines> </com:AddressLines>
<com:Country tal:content="recipient_region/getTitle"></com:Country> <com:Country tal:content="recipient_region/getTranslatedTitle"></com:Country>
<com:CountryCode tal:content="recipient_region/getCodification"></com:CountryCode> <com:CountryCode tal:content="recipient_region/getCodification"></com:CountryCode>
</com:PaperAddress> </com:PaperAddress>
<com:DigitalAddress> <com:DigitalAddress>
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
<pjs:RequestOption> <pjs:RequestOption>
<spec:DigitalOption> <spec:DigitalOption>
<spec:FoldOption> <spec:FoldOption>
<spec:PostageClass>ECOPLI_GRAND_COMPTE</spec:PostageClass> <spec:PostageClass tal:content="python: 'ECOPLI_GRAND_COMPTE' if recipient_region.getCodification() == 'FR' else 'STANDARD'"></spec:PostageClass>
<spec:DepositTitle tal:content="here/getTitle"></spec:DepositTitle> <spec:DepositTitle tal:content="here/getTitle"></spec:DepositTitle>
<spec:DepositDescription tal:content="here/getTitle"></spec:DepositDescription> <spec:DepositDescription tal:content="here/getTitle"></spec:DepositDescription>
<spec:UseFlyLeaf>true</spec:UseFlyLeaf> <spec:UseFlyLeaf>true</spec:UseFlyLeaf>
......
...@@ -62,12 +62,6 @@ getVariationText</string> </value> ...@@ -62,12 +62,6 @@ getVariationText</string> </value>
</tuple> </tuple>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -101,17 +95,4 @@ getVariationText</string> </value> ...@@ -101,17 +95,4 @@ getVariationText</string> </value>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: context.providesIMovement()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Manufacturing Execution Line | item_creation
Manufacturing Execution Line | select_item_fast_input
Manufacturing Execution | aggregate_item
Production Order Line | item_creation Production Order Line | item_creation
Production Order Line | select_item_fast_input Production Order Line | select_item_fast_input
Production Order | aggregate_item Production Order | aggregate_item
Production Packing List Line | item_creation Production Packing List Line | item_creation
Production Packing List Line | select_item_fast_input Production Packing List Line | select_item_fast_input
Production Packing List | aggregate_item Production Packing List | aggregate_item
\ No newline at end of file
Manufacturing Execution Line | item_creation
Manufacturing Execution Line | select_item_fast_input
Manufacturing Execution | aggregate_item
\ No newline at end of file
erp5_base
\ No newline at end of file
...@@ -163,11 +163,13 @@ ...@@ -163,11 +163,13 @@
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -211,16 +213,20 @@ ...@@ -211,16 +213,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -270,16 +276,20 @@ ...@@ -270,16 +276,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -327,7 +337,9 @@ ...@@ -327,7 +337,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -223,8 +223,10 @@ ...@@ -223,8 +223,10 @@
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -274,7 +276,9 @@ ...@@ -274,7 +276,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844561.74</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844561.74</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844535.24</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
"""At first call, this script prefill values for all tasks that are """At first call, this script prefills values for all tasks that are
going to be created. If values are already there, this script check if going to be created. If values are already there, this script check that
informations are correct. information is correct.
""" """
context.log('source_project_title', source_project_title)
portal = context.getPortalObject() portal = context.getPortalObject()
line_portal_type = "Sale Order Line" line_portal_type = "Sale Order Line"
request = context.REQUEST request = context.REQUEST
from string import zfill from string import zfill
from Products.ERP5Type.Document import newTempBase from Products.PythonScripts.standard import Object
from Products.ERP5Type.Message import translateString from Products.ERP5Type.Message import translateString
context.log('original listbox', listbox)
initial_value_dict = {} initial_value_dict = {}
for line in (listbox or []): for line in (listbox or []):
initial_value_dict[line['listbox_key']] = line initial_value_dict[line['listbox_key']] = line
...@@ -19,7 +17,7 @@ listbox = [] ...@@ -19,7 +17,7 @@ listbox = []
validation_errors = {} validation_errors = {}
def getRecursiveLineList(current, line_list): def getRecursiveLineList(current, line_list):
# We parse recursively all delivery line and we keep only ones # We parse recursively all delivery line and we keep only ones
# without childs # without child
sub_line_list = current.objectValues(portal_type=line_portal_type) sub_line_list = current.objectValues(portal_type=line_portal_type)
if len(sub_line_list) == 0: if len(sub_line_list) == 0:
if current.getPortalType() == line_portal_type: if current.getPortalType() == line_portal_type:
...@@ -29,13 +27,10 @@ def getRecursiveLineList(current, line_list): ...@@ -29,13 +27,10 @@ def getRecursiveLineList(current, line_list):
getRecursiveLineList(sub_line, line_list) getRecursiveLineList(sub_line, line_list)
line_list = [] line_list = []
getRecursiveLineList(context, line_list) getRecursiveLineList(context, line_list)
context.log("line_list", line_list)
i = 1 i = 1
project_search_dict = {} project_search_dict = {}
portal = context.getPortalObject()
for line in line_list: for line in line_list:
line_dict = {} line_dict = {}
#line_dict['listbox_key'] = "%s" % line_id
key = zfill(i,3) key = zfill(i,3)
for property_name in ('title', 'quantity_unit_title', 'quantity', for property_name in ('title', 'quantity_unit_title', 'quantity',
'resource_title', 'total_price', 'price', 'resource_title', 'total_price', 'price',
...@@ -65,13 +60,13 @@ for line in line_list: ...@@ -65,13 +60,13 @@ for line in line_list:
else: else:
line_dict['source_project_relative_url'] = result[0].getRelativeUrl() line_dict['source_project_relative_url'] = result[0].getRelativeUrl()
if error_message: if error_message:
error = newTempBase(context, key) validation_errors['listbox_source_project_title_new_%s' % key] = Object(
error.edit(error_text=error_message) field_id='listbox_source_project_title_new_%s' % key,
validation_errors['listbox_source_project_title_new_%s' % key] = error getMessage=lambda translateString, message=error_message: translateString(message),
)
listbox.append(line_dict) listbox.append(line_dict)
i += 1 i += 1
context.log('listbox', listbox)
context.Base_updateDialogForm(listbox=listbox,update=1,kw=kw) context.Base_updateDialogForm(listbox=listbox,update=1,kw=kw)
if len(validation_errors): if len(validation_errors):
...@@ -101,6 +96,5 @@ if create and len(validation_errors) == 0: ...@@ -101,6 +96,5 @@ if create and len(validation_errors) == 0:
destination_section=delivery_line.getDestinationSection(), destination_section=delivery_line.getDestinationSection(),
destination_decision=delivery_line.getDestinationDecision()) destination_decision=delivery_line.getDestinationDecision())
return context.Base_redirect(form_id, keep_items=dict( return context.Base_redirect(form_id, keep_items=dict(
portal_status_message=translateString('%s Tasks Created.' %(len(listbox),)))) portal_status_message=translateString('${task_count} Tasks Created.', mapping={'task_count': len(listbox)})))
return context.Delivery_viewTaskFastInputDialog(listbox=listbox, **kw) return context.Delivery_viewTaskFastInputDialog(listbox=listbox, **kw)
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -48,12 +48,6 @@ ...@@ -48,12 +48,6 @@
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -87,17 +81,4 @@ ...@@ -87,17 +81,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: getattr(context, \'getOutcomeDescription\', None) is not None</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -49,12 +49,6 @@ uid</string> </value> ...@@ -49,12 +49,6 @@ uid</string> </value>
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item>
<key> <string>expression_instance</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>filtered</string> </key> <key> <string>filtered</string> </key>
<value> <int>1</int> </value> <value> <int>1</int> </value>
...@@ -88,17 +82,4 @@ uid</string> </value> ...@@ -88,17 +82,4 @@ uid</string> </value>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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>python: getattr(context, \'getOutcomeDescription\', None) is not None</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -119,14 +119,6 @@ ...@@ -119,14 +119,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>error_message</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</list>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
...@@ -138,36 +130,4 @@ ...@@ -138,36 +130,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="Message" module="Products.ERP5Type.Message"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default</string> </key>
<value> <string>ID is invalid, should be \'${id_prefix}.VERSION.REFERENCE\'</string> </value>
</item>
<item>
<key> <string>domain</string> </key>
<value> <string>erp5_ui</string> </value>
</item>
<item>
<key> <string>mapping</string> </key>
<value>
<dictionary>
<item>
<key> <string>id_prefix</string> </key>
<value> <string>test</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>message</string> </key>
<value> <string>ID is invalid, should be \'${id_prefix}.VERSION.REFERENCE\'</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -113,33 +113,6 @@ ...@@ -113,33 +113,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>seb</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1385030033.93</float>
<string>GMT+1</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -2,4 +2,3 @@ portal = context.getPortalObject() ...@@ -2,4 +2,3 @@ portal = context.getPortalObject()
portal.sale_order_module.setIdGenerator('_generatePerNodeId') portal.sale_order_module.setIdGenerator('_generatePerNodeId')
portal.person_module.setIdGenerator('_generatePerNodeId') portal.person_module.setIdGenerator('_generatePerNodeId')
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844663.46</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -74,33 +74,6 @@ ...@@ -74,33 +74,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1377844644.1</float>
<string>GMT+9</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -6,6 +6,24 @@ ...@@ -6,6 +6,24 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <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> <item>
<key> <string>description</string> </key> <key> <string>description</string> </key>
<value> <value>
...@@ -27,4 +45,26 @@ ...@@ -27,4 +45,26 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </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> </ZopeData>
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
<string>non_discountable_additional_price</string> <string>non_discountable_additional_price</string>
<string>priced_quantity</string> <string>priced_quantity</string>
<string>base_unit_price</string> <string>base_unit_price</string>
<string>quantity_unit</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
erp5_base
erp5_ui_test_core erp5_ui_test_core
erp5_l10n_fa erp5_l10n_fa
\ No newline at end of file
from StringIO import StringIO
portal = context.getPortalObject()
image_file = StringIO(image_data.replace('data:image/png;base64,', '').decode('base64'))
image_path = [p for p in image_path.split('/') if p]
existing = portal.restrictedTraverse(image_path, None)
if existing is None:
container = portal.restrictedTraverse(image_path[:-1])
container.manage_addProduct['OFSP'].manage_addImage(
image_path[-1],
image_file,
'')
else:
existing.manage_upload(image_file)
return "reference image at {} updated".format('/'.join(image_path))
...@@ -209,74 +209,6 @@ function generateElement(tagName, childList, attributeDict, textContent) { ...@@ -209,74 +209,6 @@ function generateElement(tagName, childList, attributeDict, textContent) {
return element; return element;
} }
/**
* Generate an HTML form to update the reference snapshot
*
* @param {string} referenceImageURL relative URL of the reference image
* @param {string} newImageData the new image data, base64 encoded
* @return {Promise<string>} the base64 encoded html form
*/
function generateUpdateForm(referenceImageURL, newImageData) {
return new Promise((resolve, reject) => {
var fr = new FileReader();
fr.onerror = reject;
fr.onload = () => resolve(fr.result);
fr.readAsDataURL(
new Blob(
[
generateElement('html', [
generateElement('body', [
generateElement('p', [
document.createTextNode('Replacing this old snapshot:'),
generateElement('br'),
generateElement('img', [], {
src: location.origin + referenceImageURL,
alt: 'reference image'
}),
generateElement('br'),
document.createTextNode('with this new snapshot:'),
generateElement('br'),
generateElement('img', [], {
src: newImageData,
alt: 'new image'
})
]),
generateElement(
'form',
[
generateElement('input', [], {
type: 'hidden',
name: 'image_data',
value: newImageData
}),
generateElement('input', [], {
type: 'hidden',
name: 'image_path',
value: referenceImageURL
}),
generateElement('input', [], {
type: 'submit',
value: 'Update Reference Snapshot'
})
],
{
action:
location.origin +
'/' +
referenceImageURL.split('/')[1] + // ERP5 portal
'/Zuite_updateReferenceImage',
method: 'POST'
}
)
])
]).innerHTML
],
{ type: 'text/html' }
)
);
});
}
/** /**
* verify that the rendering of the element `locator` matches the previously saved reference. * verify that the rendering of the element `locator` matches the previously saved reference.
* *
...@@ -360,8 +292,6 @@ Selenium.prototype.doVerifyImageMatchSnapshot = ( ...@@ -360,8 +292,6 @@ Selenium.prototype.doVerifyImageMatchSnapshot = (
}) })
.then(diff => { .then(diff => {
if (diff.rawMisMatchPercentage > misMatchToleranceFloat) { if (diff.rawMisMatchPercentage > misMatchToleranceFloat) {
return generateUpdateForm(referenceImageURL, actual).then(
updateReferenceImageForm => {
htmlTestRunner.currentTest.currentRow.trElement htmlTestRunner.currentTest.currentRow.trElement
.querySelector('td') .querySelector('td')
.appendChild( .appendChild(
...@@ -374,22 +304,22 @@ Selenium.prototype.doVerifyImageMatchSnapshot = ( ...@@ -374,22 +304,22 @@ Selenium.prototype.doVerifyImageMatchSnapshot = (
}), }),
generateElement('br'), generateElement('br'),
document.createTextNode('Click '), document.createTextNode('Click '),
generateElement( generateElement('a', [document.createTextNode('here')], {
'a', href: actual,
[document.createTextNode('here')], download: referenceImageURL.split('/').pop(),
{ }),
href: updateReferenceImageForm document.createTextNode(' to download actual image for '),
} generateElement('code', [
), generateElement('a', [
document.createTextNode( document.createTextNode(referenceImageURL),
' to update reference snapshot.' ],
{ href: referenceImageURL + '/manage_main' }
) )
]) ])
])
); );
throw new Error('Images are ' + diff.misMatchPercentage + '% different'); throw new Error('Images are ' + diff.misMatchPercentage + '% different');
} }
);
}
}); });
})); }));
......
erp5_base
erp5_upgrader erp5_upgrader
\ No newline at end of file
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
error_text: field_json.error_text, error_text: field_json.error_text,
type: 'email', type: 'email',
hidden: field_json.hidden, hidden: field_json.hidden,
maxlength: field_json.maxlength,
// Force calling subfield render // Force calling subfield render
// as user may have modified the input value // as user may have modified the input value
render_timestamp: new Date().getTime() render_timestamp: new Date().getTime()
......
/*jslint indent: 2, maxerr: 3, nomen: true */ /*jslint indent: 2, maxerr: 3, nomen: true */
/*global window, document, rJS, RSVP, domsugar, JSON*/ /*global window, rJS, RSVP, domsugar, JSON*/
/** MatrixBox renders a N-dimensional cube of editable values based on axes description. /** MatrixBox renders a N-dimensional cube of editable values based on axes description.
* *
* Example JSON returned from HATEOAS where cell_range format is * Example JSON returned from HATEOAS where cell_range format is
...@@ -33,36 +33,15 @@ ...@@ -33,36 +33,15 @@
see around https://lab.nexedi.com/nexedi/erp5/blob/feature/renderjs-matrixbox/product/ERP5Form/MatrixBox.py#L427 see around https://lab.nexedi.com/nexedi/erp5/blob/feature/renderjs-matrixbox/product/ERP5Form/MatrixBox.py#L427
* *
*/ */
(function (window, document, rJS, RSVP, domsugar, JSON) { (function (window, rJS, RSVP, domsugar, JSON) {
"use strict"; "use strict";
/** Recursively introspect an object if it is empty */
function is_empty_recursive(data) {
var item;
if (typeof data === 'object') {
for (item in data) {
if (data.hasOwnProperty(item) && !item.startsWith("_")) {
if (is_empty_recursive(data[item]) === false) {return false; } // one non-empty element is enough
}
}
return true;
}
return !data && true; // convert basic types to boolean
}
function copy(obj) { function copy(obj) {
return JSON.parse(JSON.stringify(obj)); return JSON.parse(JSON.stringify(obj));
} }
rJS(window) rJS(window)
.ready(function () {
this.props = {
gadget_dict: {} // holds references to initialized gadgets
};
})
.setState({ .setState({
data: '', data: '',
template_field_dict: '', template_field_dict: '',
...@@ -71,50 +50,33 @@ ...@@ -71,50 +50,33 @@
key: '' key: ''
}) })
/** Render constructs and saves gadgets into `props.gadget_dict` if they don not exist yet.
*/
.declareMethod('render', function (options) { .declareMethod('render', function (options) {
var gadget = this, return this.changeState({
data = options.field_json.data, 'table_list': JSON.stringify(options.field_json.data),
// note we make COPY of data in their original form - important since
// data.shift used later modify the structure inplace!
new_state = {
'data': JSON.stringify(options.field_json.data),
'template_field_dict': JSON.stringify(options.field_json.template_field_dict), 'template_field_dict': JSON.stringify(options.field_json.template_field_dict),
'editable': options.field_json.editable, 'editable': options.field_json.editable,
'hidden': options.field_json.hidden, 'hidden': options.field_json.hidden,
'key': options.field_json.key 'key': options.field_json.key
}; });
}, {mutex: 'render'})
if (is_empty_recursive(data)) {
return;
}
if (!is_empty_recursive(gadget.props.gadget_dict)) {
return this.changeState(new_state);
}
return new RSVP.Queue()
.push(function () {
return RSVP.all(data.map(function (table, table_index) {
var header = table.shift(), // first item of table is the header
table_title = header.shift(); // first item of header is the table (tab) title
return new RSVP.Queue() .onStateChange(function () {
.push(function () { var gadget = this,
return RSVP.all(table.map(function (row, row_index) { template_field_dict = JSON.parse(gadget.state.template_field_dict),
var row_element = document.createElement('tr'), table_list = JSON.parse(gadget.state.table_list);
row_id = new_state.key + "T" + table_index + "R" + row_index;
row.shift(); // drop the row label definition because it is not usable now return new RSVP.Queue(RSVP.all(table_list.map(function (table,
row_element.setAttribute('id', row_id); table_index) {
row_element.appendChild(document.createElement('th')); // first item of table is the header
var header_list = table.shift(),
// first item of header is the table (tab) title
table_title = header_list.shift();
return new RSVP.Queue() return new RSVP.Queue(RSVP.all(table.map(function (row, row_index) {
.push(function () { // drop the row label definition because it is not usable now
var row_label = row.shift();
return RSVP.all(row.map(function (column) { return new RSVP.Queue(RSVP.all(row.map(function (column) {
// transform all cell-definitions into actual gadgets // transform all cell-definitions into actual gadgets
return gadget.declareGadget('gadget_erp5_label_field.html', { return gadget.declareGadget('gadget_erp5_label_field.html', {
scope: column.key, scope: column.key,
...@@ -122,26 +84,54 @@ ...@@ -122,26 +84,54 @@
sandbox: "public" sandbox: "public"
}) })
.push(function (sub_gadget) { .push(function (sub_gadget) {
gadget.props.gadget_dict[column.key] = sub_gadget; // Rendering of embedded field is prescribed by another field
return sub_gadget.element; // in the form (usually in "hidden" group). Therefor we have a
// reference for the template field included in state (field)
var template_field = template_field_dict[column.field_id],
field_json = copy(template_field);
// we copy (unknown) structure of template_field and carefully
// add known attributes from `column`
field_json['default'] = column.value;
field_json.key = "field_" + column.key;
field_json.hidden = gadget.state.hidden || template_field.hidden; // any hidden will hide the element
field_json.editable = gadget.state.editable && template_field.editable; // any non-editable will disable editation
field_json.error_text = column.error_text;
return RSVP.hash({
_: sub_gadget.render({
label: false,
development_link: false,
field_type: column.type,
field_json: field_json
}),
sub_gadget: sub_gadget
}); });
}));
}) })
.push(function (column_element_list) { .push(function (hash) {
column_element_list.forEach(function (column_element) { return hash.sub_gadget.element;
row_element.appendChild(column_element);
}); });
return row_element; })))
.push(function (column_element_list) {
// return row_element
return domsugar('tr', {
id: gadget.state.key + "T" + table_index + "R" + row_index
}, [
domsugar('th', {text: row_label}),
domsugar(null, column_element_list)
]);
}); });
})); })))
})
.push(function (row_element_list) { .push(function (row_element_list) {
var th_dom_list = [ var th_dom_list = [
domsugar('th', {text: table_title}) domsugar('th', {text: table_title})
], ],
i; i;
for (i = 0; i < header.length; i += 1) { for (i = 0; i < header_list.length; i += 1) {
th_dom_list.push(domsugar('th', {html: header[i]})); // XXX used to be html instead of text
// But as unsecure, try to restrict
th_dom_list.push(domsugar('th', {text: header_list[i]}));
} }
return domsugar('table', [ return domsugar('table', [
domsugar('thead', [ domsugar('thead', [
...@@ -150,99 +140,56 @@ ...@@ -150,99 +140,56 @@
domsugar('tbody', row_element_list) domsugar('tbody', row_element_list)
]); ]);
}); });
})); })))
})
.push(function (table_element_list) { .push(function (table_element_list) {
domsugar(gadget.element.querySelector('div.document_table'), domsugar(gadget.element.querySelector('div.document_table'),
table_element_list); table_element_list);
return gadget.changeState(new_state);
}); });
}) })
/** Changes state of existing gadgets inside `props.gadget_dict`. */ .declareMethod("getContent", function (options) {
.onStateChange(function (modification_dict) {
var gadget = this, var gadget = this,
template_field_dict = JSON.parse(gadget.state.template_field_dict), table_list = JSON.parse(gadget.state.table_list),
promise_queue = new RSVP.Queue(), promise_list = [],
data; // result dictionary with values
result_dict = {};
if (modification_dict.hasOwnProperty('data')) {
data = JSON.parse(modification_dict.data); table_list.map(function (table) {
if (is_empty_recursive(data)) { // first item of table is the header
table.shift();
table.map(function (row) {
// drop the row label definition because it is not usable now
row.shift();
row.map(function (column) {
var field_key = column.key;
if (field_key.startsWith("_")) {
return; return;
} }
data.forEach(function (table, table_index) { promise_list.push(
table.shift(); // drop the header gadget.getDeclaredGadget(field_key)
table.forEach(function (row, row_index) { .push(function (sub_gadget) {
var row_id = gadget.state.key + 'T' + table_index + 'R' + row_index, return sub_gadget.getContent(options);
row_label_element = gadget.element.querySelector('tr#' + row_id + ' th');
row_label_element.textContent = row.shift() || ''; // pop-up the row label from data
// then handle all inputs within the row
row.forEach(function (column) {
promise_queue
.push(function () {
// Rendering of embedded field is prescribed by another field
// in the form (usually in "hidden" group). Therefor we have a
// reference for the template field included in state (field)
var template_field = template_field_dict[column.field_id],
field_json = copy(template_field),
sub_gadget = gadget.props.gadget_dict[column.key];
// we copy (unknown) structure of template_field and carefully
// add known attributes from `column`
field_json.default = column.value;
field_json.key = "field_" + column.key;
field_json.hidden = gadget.state.hidden || template_field.hidden; // any hidden will hide the element
field_json.editable = gadget.state.editable && template_field.editable; // any non-editable will disable editation
field_json.error_text = column.error_text;
return sub_gadget.render({
label: false,
development_link: false,
field_type: column.type,
field_json: field_json
});
});
});
});
});
} // end: if modification_dict.data
return promise_queue;
}) })
.push(function (field_data) {
.declareMethod("getContent", function (options) {
var gadget = this,
data = {}, // result dictionary with values
field_key_list = [],
field_key;
function extendData(field_data) {
var key; var key;
for (key in field_data) { for (key in field_data) {
if (field_data.hasOwnProperty(key) && !key.startsWith("_")) { if (field_data.hasOwnProperty(key) && !key.startsWith("_")) {
data[key] = field_data[key]; result_dict[key] = field_data[key];
}
}
}
for (field_key in gadget.props.gadget_dict) {
if (gadget.props.gadget_dict.hasOwnProperty(field_key) && !field_key.startsWith("_")) {
field_key_list.push(field_key);
} }
} }
})
);
});
});
});
return new RSVP.Queue() return new RSVP.Queue(RSVP.all(promise_list))
.push(function () { .push(function () {
return RSVP.all(field_key_list.map(function (field_key) { return result_dict;
return gadget.props.gadget_dict[field_key].getContent(options);
}));
})
.push(function (field_value_list) {
field_value_list.forEach(extendData);
return data;
}); });
}) }, {mutex: 'render'})
.allowPublicAcquisition("notifyInvalid", function () { .allowPublicAcquisition("notifyInvalid", function () {
return; return;
...@@ -254,6 +201,6 @@ ...@@ -254,6 +201,6 @@
.declareMethod("checkValidity", function () { .declareMethod("checkValidity", function () {
return true; return true;
}); }, {mutex: 'render'});
}(window, document, rJS, RSVP, domsugar, JSON)); }(window, rJS, RSVP, domsugar, JSON));
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>990.15674.6574.27784</string> </value> <value> <string>999.25959.13616.26538</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -258,7 +258,7 @@ ...@@ -258,7 +258,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1614297317.85</float> <float>1649344500.27</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -145,7 +145,12 @@ ...@@ -145,7 +145,12 @@
var gadget = this, var gadget = this,
sub_gadget; sub_gadget;
return gadget.getDeclaredGadget(scope) // Propage the notification before maybe dropping the subgadget
// which will cancel the current call
return gadget.notifyChange("change")
.push(function () {
return gadget.getDeclaredGadget(scope);
})
.push(function (result) { .push(function (result) {
sub_gadget = result; sub_gadget = result;
return sub_gadget.getContent(); return sub_gadget.getContent();
...@@ -162,9 +167,6 @@ ...@@ -162,9 +167,6 @@
gadget.element.removeChild(sub_gadget.element); gadget.element.removeChild(sub_gadget.element);
} }
} }
})
.push(function () {
return gadget.notifyChange();
}); });
}) })
......
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>986.32404.49746.11571</string> </value> <value> <string>999.26016.41426.50124</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -252,7 +252,7 @@ ...@@ -252,7 +252,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1609253179.35</float> <float>1649347332.58</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
/*global window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray */ /*global window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray, console */
/*jslint nomen: true, indent: 2, maxerr: 3 */ /*jslint nomen: true, indent: 2, maxerr: 3 */
/** /**
Page Form is a top-level gadget (a "Page") taking care of rendering form Page Form is a top-level gadget (a "Page") taking care of rendering form
and handling data send&receive. and handling data send&receive.
*/ */
(function (window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray) { (function (window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray, console) {
"use strict"; "use strict";
/*jslint regexp: true*/ /*jslint regexp: true*/
...@@ -515,7 +515,7 @@ and handling data send&receive. ...@@ -515,7 +515,7 @@ and handling data send&receive.
.push(null, function (error) { .push(null, function (error) {
/** Fail branch of the JIO call. */ /** Fail branch of the JIO call. */
var error_text = 'Encountered an unknown error. Try to resubmit.'; var error_text = 'Encountered an unknown error. Try to resubmit.';
console.warn(error_text, error);
if (error instanceof RSVP.CancellationError) { if (error instanceof RSVP.CancellationError) {
// CancellationError is thrown on "redirect" to cancel any pending // CancellationError is thrown on "redirect" to cancel any pending
// promises. Since it is not a failure we rethrow. // promises. Since it is not a failure we rethrow.
...@@ -666,4 +666,4 @@ and handling data send&receive. ...@@ -666,4 +666,4 @@ and handling data send&receive.
}); });
}(window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray)); }(window, document, rJS, URI, RSVP, jIO, Blob, URL, asBoolean, ensureArray, console));
\ No newline at end of file \ No newline at end of file
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>991.63595.43060.43997</string> </value> <value> <string>999.25844.45625.48025</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -252,7 +252,7 @@ ...@@ -252,7 +252,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1620724931.09</float> <float>1649336938.64</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
title: field_json.description, title: field_json.description,
hidden: field_json.hidden, hidden: field_json.hidden,
trim: true, trim: true,
maxlength: field_json.maxlength,
// Force calling subfield render // Force calling subfield render
// as user may have modified the input value // as user may have modified the input value
render_timestamp: new Date().getTime() render_timestamp: new Date().getTime()
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
step: options.step, step: options.step,
hidden: options.hidden, hidden: options.hidden,
trim: options.trim || false, trim: options.trim || false,
maxlength: options.maxlength,
multiple: options.multiple, multiple: options.multiple,
accept: options.accept, accept: options.accept,
capture: options.capture, capture: options.capture,
...@@ -89,6 +90,9 @@ ...@@ -89,6 +90,9 @@
if (this.state.accept) { if (this.state.accept) {
textarea.setAttribute('accept', this.state.accept); textarea.setAttribute('accept', this.state.accept);
} }
if (this.state.maxlength) {
textarea.setAttribute('maxlength', this.state.maxlength);
}
if (this.state.multiple) { if (this.state.multiple) {
textarea.multiple = true; textarea.multiple = true;
......
...@@ -86,33 +86,6 @@ ...@@ -86,33 +86,6 @@
<key> <string>action</string> </key> <key> <string>action</string> </key>
<value> <string>validate</string> </value> <value> <string>validate</string> </value>
</item> </item>
<item>
<key> <string>actor</string> </key>
<value> <string>ERP5TypeTestCase</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1384353676.1</float>
<string>GMT+1</string>
</tuple>
</state>
</object>
</value>
</item>
<item> <item>
<key> <string>validation_state</string> </key> <key> <string>validation_state</string> </key>
<value> <string>validated</string> </value> <value> <string>validated</string> </value>
......
...@@ -70,6 +70,10 @@ ...@@ -70,6 +70,10 @@
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value> </value>
</item> </item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>workflow_development</string> </value>
</item>
<item> <item>
<key> <string>description</string> </key> <key> <string>description</string> </key>
<value> <value>
...@@ -98,10 +102,6 @@ ...@@ -98,10 +102,6 @@
<key> <string>portal_type</string> </key> <key> <string>portal_type</string> </key>
<value> <string>Person</string> </value> <value> <string>Person</string> </value>
</item> </item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>workflow_development</string> </value>
</item>
<item> <item>
<key> <string>user_id</string> </key> <key> <string>user_id</string> </key>
<value> <string>workflow_development</string> </value> <value> <string>workflow_development</string> </value>
...@@ -193,11 +193,13 @@ ...@@ -193,11 +193,13 @@
</record> </record>
<record id="7" aka="AAAAAAAAAAc="> <record id="7" aka="AAAAAAAAAAc=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -247,16 +249,20 @@ ...@@ -247,16 +249,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="8" aka="AAAAAAAAAAg="> <record id="8" aka="AAAAAAAAAAg=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -302,16 +308,20 @@ ...@@ -302,16 +308,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="9" aka="AAAAAAAAAAk="> <record id="9" aka="AAAAAAAAAAk=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -355,7 +365,9 @@ ...@@ -355,7 +365,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -144,11 +144,13 @@ ...@@ -144,11 +144,13 @@
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -194,16 +196,20 @@ ...@@ -194,16 +196,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="6" aka="AAAAAAAAAAY="> <record id="6" aka="AAAAAAAAAAY=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -253,7 +259,9 @@ ...@@ -253,7 +259,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -179,11 +179,13 @@ ...@@ -179,11 +179,13 @@
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -227,16 +229,20 @@ ...@@ -227,16 +229,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="6" aka="AAAAAAAAAAY="> <record id="6" aka="AAAAAAAAAAY=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -286,7 +292,9 @@ ...@@ -286,7 +292,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -97,11 +97,13 @@ ...@@ -97,11 +97,13 @@
</record> </record>
<record id="3" aka="AAAAAAAAAAM="> <record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -151,16 +153,20 @@ ...@@ -151,16 +153,20 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -204,7 +210,9 @@ ...@@ -204,7 +210,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -130,11 +130,13 @@ ...@@ -130,11 +130,13 @@
</record> </record>
<record id="5" aka="AAAAAAAAAAU="> <record id="5" aka="AAAAAAAAAAU=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -180,7 +182,9 @@ ...@@ -180,7 +182,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -78,16 +78,6 @@ ...@@ -78,16 +78,6 @@
<tuple/> <tuple/>
</value> </value>
</item> </item>
<item>
<key> <string>workflow_list</string> </key>
<value>
<tuple>
<string>testing_erp5_workflow</string>
<string>testing_erp5_interaction_workflow</string>
<string>edit_workflow</string>
</tuple>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -100,11 +100,13 @@ ...@@ -100,11 +100,13 @@
</record> </record>
<record id="4" aka="AAAAAAAAAAQ="> <record id="4" aka="AAAAAAAAAAQ=">
<pickle> <pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle> </pickle>
<pickle> <pickle>
<tuple> <dictionary>
<none/> <item>
<key> <string>_log</string> </key>
<value>
<list> <list>
<dictionary> <dictionary>
<item> <item>
...@@ -117,7 +119,9 @@ ...@@ -117,7 +119,9 @@
</item> </item>
</dictionary> </dictionary>
</list> </list>
</tuple> </value>
</item>
</dictionary>
</pickle> </pickle>
</record> </record>
</ZopeData> </ZopeData>
...@@ -4256,10 +4256,11 @@ class _ZodbComponentTemplateItem(ObjectTemplateItem): ...@@ -4256,10 +4256,11 @@ class _ZodbComponentTemplateItem(ObjectTemplateItem):
continue continue
wf_history = obj.workflow_history[wf_id][-1] wf_history = obj.workflow_history[wf_id][-1]
# Remove useless modifcation 'time' and 'actor' (conflicts with VCSs) # Remove useless workflow entries that are always different and cause conflicts with VCS
wf_history.pop('time', None)
wf_history.pop('actor', None) wf_history.pop('actor', None)
wf_history.pop('comment', None) wf_history.pop('comment', None)
wf_history.pop('error_message', None)
wf_history.pop('time', None)
obj.workflow_history[wf_id] = WorkflowHistoryList([wf_history]) obj.workflow_history[wf_id] = WorkflowHistoryList([wf_history])
......
...@@ -110,9 +110,7 @@ ...@@ -110,9 +110,7 @@
</item> </item>
<item> <item>
<key> <string>default</string> </key> <key> <string>default</string> </key>
<value> <value> <string></string> </value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item> </item>
<item> <item>
<key> <string>description</string> </key> <key> <string>description</string> </key>
...@@ -141,7 +139,7 @@ ...@@ -141,7 +139,7 @@
<item> <item>
<key> <string>items</string> </key> <key> <string>items</string> </key>
<value> <value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value> </value>
</item> </item>
<item> <item>
...@@ -246,19 +244,6 @@ ...@@ -246,19 +244,6 @@
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: context.getAcquirePermissionList() or [x for x in context.getWorkflowManagedPermissionList()]</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle> <pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/> <global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle> </pickle>
......
...@@ -12,6 +12,6 @@ ...@@ -12,6 +12,6 @@
<script src="gadget_activity_watcher.js" type="text/javascript"></script> <script src="gadget_activity_watcher.js" type="text/javascript"></script>
</head> </head>
<body> <body>
<div class="activity_watcher_gadget"></div> <div data-gadget-url="gadget_html_viewer.html" data-gadget-scope="html_viewer"></div>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -9,11 +9,23 @@ ...@@ -9,11 +9,23 @@
for (i = 0; i < data[string].line_list.length; i += 1) { for (i = 0; i < data[string].line_list.length; i += 1) {
array.push(domsugar('tr', [ array.push(domsugar('tr', [
domsugar('td', {text: messagetype}), domsugar('td', {text: messagetype}),
domsugar('td', {text: data[string].line_list[i].count}), domsugar('td', {
text: data[string].line_list[i].count,
style: 'text-align: right;'
}),
domsugar('td', {text: data[string].line_list[i].method_id}), domsugar('td', {text: data[string].line_list[i].method_id}),
domsugar('td', {text: data[string].line_list[i].node}), domsugar('td', {
domsugar('td', {text: data[string].line_list[i].min_pri}), text: data[string].line_list[i].node,
domsugar('td', {text: data[string].line_list[i].max_pri}) style: 'text-align: right;'
}),
domsugar('td', {
text: data[string].line_list[i].min_pri,
style: 'text-align: right;'
}),
domsugar('td', {
text: data[string].line_list[i].max_pri,
style: 'text-align: right;'
})
])); ]));
} }
} }
...@@ -25,10 +37,22 @@ ...@@ -25,10 +37,22 @@
for (i = 0; i < data[string].line_list.length; i += 1) { for (i = 0; i < data[string].line_list.length; i += 1) {
array.push(domsugar('tr', [ array.push(domsugar('tr', [
domsugar('td', {text: messagetype}), domsugar('td', {text: messagetype}),
domsugar('td', {text: data[string].line_list[i].pri}), domsugar('td', {
domsugar('td', {text: data[string].line_list[i].min}), text: data[string].line_list[i].pri,
domsugar('td', {text: data[string].line_list[i].avg}), style: 'text-align: right;'
domsugar('td', {text: data[string].line_list[i].max}) }),
domsugar('td', {
text: data[string].line_list[i].min,
style: 'text-align: right;'
}),
domsugar('td', {
text: data[string].line_list[i].avg,
style: 'text-align: right;'
}),
domsugar('td', {
text: data[string].line_list[i].max,
style: 'text-align: right;'
})
])); ]));
} }
} }
...@@ -49,29 +73,32 @@ ...@@ -49,29 +73,32 @@
} }
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return jIO.util.ajax( return RSVP.hash({
{ evt: jIO.util.ajax({
"type": "GET", "type": "GET",
"url": form_gadget.state.read_activity_list_url, "url": form_gadget.state.read_activity_list_url,
"xhrFields": { "xhrFields": {
withCredentials: true withCredentials: true
} }
} }),
); html_viewer: form_gadget.getDeclaredGadget('html_viewer')
});
}) })
.push(function (evt) { .push(function (hash) {
var data = JSON.parse(evt.target.response), var data = JSON.parse(hash.evt.target.response),
tbody1_content_list = [], tbody1_content_list = [],
tbody2_content_list = []; tbody2_content_list = [];
putMessageType(data, 'dict', 'SQLDict', tbody1_content_list); putMessageType(data, 'dict', 'SQLDict', tbody1_content_list);
putMessageType(data, 'queue', 'SQLQueue', tbody1_content_list); putMessageType(data, 'queue', 'SQLQueue', tbody1_content_list);
putMessageType2(data, 'dict', 'SQLDict2', tbody2_content_list); putMessageType2(data, 'dict', 'SQLDict2', tbody2_content_list);
putMessageType2(data, 'queue', 'SQLQueue2', tbody2_content_list); putMessageType2(data, 'queue', 'SQLQueue2', tbody2_content_list);
domsugar(form_gadget.element.querySelector(".activity_watcher_gadget"), [ return hash.html_viewer.render({value: domsugar('div',
{'class': 'page'}, [
'Date : ', 'Date : ',
new Date().toTimeString(), new Date().toTimeString(),
domsugar('table', [ domsugar('table', [
domsugar('caption', {text: 'Current Activities'}),
domsugar('thead', [domsugar('tr', [ domsugar('thead', [domsugar('tr', [
domsugar('th', {text: 'Type'}), domsugar('th', {text: 'Type'}),
domsugar('th', {text: 'Count'}), domsugar('th', {text: 'Count'}),
...@@ -84,6 +111,7 @@ ...@@ -84,6 +111,7 @@
]), ]),
domsugar('table', [ domsugar('table', [
domsugar('caption', {text: 'Statistics'}),
domsugar('thead', [domsugar('tr', [ domsugar('thead', [domsugar('tr', [
domsugar('th', {text: 'Type'}), domsugar('th', {text: 'Type'}),
domsugar('th', {text: 'Priority'}), domsugar('th', {text: 'Priority'}),
...@@ -93,14 +121,18 @@ ...@@ -93,14 +121,18 @@
])]), ])]),
domsugar('tbody', tbody2_content_list) domsugar('tbody', tbody2_content_list)
]) ])
]); ]).outerHTML});
}, function (error) { }, function (error) {
//Exception is raised if network is lost for some reasons, //Exception is raised if network is lost for some reasons,
//in this case, try patiently until network is back. //in this case, try patiently until network is back.
console.warn("Unable to fetch activities from ERP5", error); console.warn("Unable to fetch activities from ERP5", error);
form_gadget.element.querySelector(".activity_watcher_gadget") return form_gadget.getDeclaredGadget('html_viewer')
.textContent = "Unable to fetch activities from ERP5"; .push(function (html_viewer) {
return html_viewer.render({
value: "Unable to fetch activities from ERP5"
});
});
}); });
}, 1000); }, 1000);
......
...@@ -96,7 +96,8 @@ ...@@ -96,7 +96,8 @@
rowspan: true, rowspan: true,
align: true, align: true,
scope: true, scope: true,
summary: true summary: true,
download: true
}, },
style_list: { style_list: {
background: true, background: true,
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>for_catalog</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variable_error_message</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow Variable</string> </value>
</item>
<item>
<key> <string>status_included</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -31,6 +31,7 @@ document.erp5.Path ...@@ -31,6 +31,7 @@ document.erp5.Path
document.erp5.PredicateGroup document.erp5.PredicateGroup
document.erp5.PredicateMatrix document.erp5.PredicateMatrix
document.erp5.Project document.erp5.Project
document.erp5.RoundingModel
document.erp5.ScriptConstraint document.erp5.ScriptConstraint
document.erp5.SimulationMovement document.erp5.SimulationMovement
document.erp5.TextDocument document.erp5.TextDocument
\ No newline at end of file
...@@ -43,6 +43,7 @@ interface.erp5.IMovementList ...@@ -43,6 +43,7 @@ interface.erp5.IMovementList
interface.erp5.IProductionMovement interface.erp5.IProductionMovement
interface.erp5.IReferenceable interface.erp5.IReferenceable
interface.erp5.IRoundable interface.erp5.IRoundable
interface.erp5.IRoundingTool
interface.erp5.IRule interface.erp5.IRule
interface.erp5.ISendable interface.erp5.ISendable
interface.erp5.ISimilarityProvider interface.erp5.ISimilarityProvider
......
...@@ -11,6 +11,7 @@ tool.erp5.NotificationTool ...@@ -11,6 +11,7 @@ tool.erp5.NotificationTool
tool.erp5.OrderTool tool.erp5.OrderTool
tool.erp5.PasswordTool tool.erp5.PasswordTool
tool.erp5.RuleTool tool.erp5.RuleTool
tool.erp5.RoundingTool
tool.erp5.SessionTool tool.erp5.SessionTool
tool.erp5.SimulationTool tool.erp5.SimulationTool
tool.erp5.TestTool tool.erp5.TestTool
\ No newline at end of file
...@@ -447,16 +447,16 @@ fieldset.bottom > .field > label { ...@@ -447,16 +447,16 @@ fieldset.bottom > .field > label {
padding: revert; padding: revert;
} }
.content .field label { .content .field > label {
width: 30%; width: 30%;
} }
.content .field label, .content .field > label,
.content .field .input { .content .field .input {
float: left; float: left;
} }
body[dir="rtl"] .content .field label, body[dir="rtl"] .content .field > label,
body[dir="rtl"] .content .field .input { body[dir="rtl"] .content .field .input {
float: right; float: right;
} }
...@@ -473,7 +473,7 @@ fieldset.bottom .field .input, ...@@ -473,7 +473,7 @@ fieldset.bottom .field .input,
vertical-align: middle; vertical-align: middle;
} }
.content .required label { .content .required > label {
font-weight: bold; font-weight: bold;
} }
......
...@@ -358,6 +358,9 @@ class InteractionWorkflow(Workflow): ...@@ -358,6 +358,9 @@ class InteractionWorkflow(Workflow):
def getStateValueList(self): def getStateValueList(self):
return [] return []
def _checkConsistency(self, fixit=False):
return []
security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML') security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML')
def showAsXML(self, root=None): def showAsXML(self, root=None):
from lxml import etree from lxml import etree
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
## Used in Products.ERP5Type.patches.DCWorkflow so this needs to go first... ## Used in Products.ERP5Type.patches.DCWorkflow so this needs to go first...
from Acquisition import aq_parent, aq_inner from Acquisition import aq_parent, aq_inner
from Products.PageTemplates.Expressions import SecureModuleImporter from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.ERP5Type.ConsistencyMessage import ConsistencyMessage
from AccessControl import getSecurityManager from AccessControl import getSecurityManager
from Products.PageTemplates.Expressions import getEngine from Products.PageTemplates.Expressions import getEngine
from six import reraise from six import reraise
...@@ -785,6 +786,17 @@ class Workflow(XMLObject): ...@@ -785,6 +786,17 @@ class Workflow(XMLObject):
tool = self.getParentValue() tool = self.getParentValue()
state_var = self.getStateVariable() state_var = self.getStateVariable()
# `status_dict` will hold the new status.
# Unlike DCWorkflow implementation, we don't start with an empty dict, but start
# by making a copy of the current status dict, this way the string used as keys
# will be the same string instances and this will reduce the pickle size:
# Copying existing dict saves space: when __setitem__(key, value) points at an
# existing key, python will just keep the existing string as key, which then
# means if both history entries are pickled together, the keys will be stored
# just once instead of once per dict.
# This is especially important with ERP5's WorkflowVariable implemented with
# IdAsReferenceMixin, because every call to getReference return a different string.
status_dict = self.getCurrentStatusDict(ob) status_dict = self.getCurrentStatusDict(ob)
if tdef is None: if tdef is None:
...@@ -947,6 +959,26 @@ class Workflow(XMLObject): ...@@ -947,6 +959,26 @@ class Workflow(XMLObject):
raise ObjectMoved(ex.getNewObject(), res) raise ObjectMoved(ex.getNewObject(), res)
return res return res
def _checkConsistency(self, fixit=False):
"""Checks the workflow definition.
"""
consistency_message_list = []
# make sure we have necessary variables
variable_reference_set = {
v.getReference()
for v in self.contentValues(portal_type='Workflow Variable')
}
for variable_reference in 'error_message', :
if variable_reference not in variable_reference_set:
consistency_message_list.append(
ConsistencyMessage(
self,
object_relative_url=self.getRelativeUrl(),
message=
'Required variable {variable_reference} missing in workflow.'.
format(variable_reference=variable_reference)))
return consistency_message_list
security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML') security.declareProtected(Permissions.AccessContentsInformation, 'showAsXML')
def showAsXML(self, root=None): def showAsXML(self, root=None):
from lxml import etree from lxml import etree
......
...@@ -32,6 +32,7 @@ import unittest ...@@ -32,6 +32,7 @@ import unittest
from glob import glob from glob import glob
from Products.ERP5.tests import testXHTML from Products.ERP5.tests import testXHTML
from Products.ERP5.Document.BusinessTemplate import BusinessTemplateMissingDependency
from Products.ERP5Type.tests.utils import addUserToDeveloperRole from Products.ERP5Type.tests.utils import addUserToDeveloperRole
from Products.ERP5Type.tests.CodingStyleTestCase import CodingStyleTestCase from Products.ERP5Type.tests.CodingStyleTestCase import CodingStyleTestCase
...@@ -43,23 +44,19 @@ class CodingStyleTest(CodingStyleTestCase, testXHTML.TestXHTMLMixin): ...@@ -43,23 +44,19 @@ class CodingStyleTest(CodingStyleTestCase, testXHTML.TestXHTMLMixin):
""" """
def getBusinessTemplateList(self): def getBusinessTemplateList(self):
# install erp5_upgrader for CodingStyleTestCase.test_run_upgrader # note: more business templates will be installed by
# XXX also install erp5_full_text_myisam_catalog to workaround missing test # _installBusinessTemplateList
# dependencies and the fact that test dependencies are not checked return (self.tested_business_template, )
# recursively.
return (
'erp5_upgrader',
'erp5_full_text_myisam_catalog',
self.tested_business_template)
def _installBusinessTemplateList(self, def _installBusinessTemplateList(self,
bt_list, bt_list,
update_repository_bt_list=True, update_repository_bt_list=True,
*args, *args,
**kwargs): **kwargs):
"""Install depencencies automatically """Install dependencies automatically and also install erp5_upgrader,
which is needed for CodingStyleTestCase.test_run_upgrader
taken from runUnitTest._ZodbTestComponentBootstrapOnly. the resolution approach is taken from runUnitTest._ZodbTestComponentBootstrapOnly.
""" """
template_tool = self.portal.portal_templates template_tool = self.portal.portal_templates
...@@ -74,11 +71,36 @@ class CodingStyleTest(CodingStyleTestCase, testXHTML.TestXHTMLMixin): ...@@ -74,11 +71,36 @@ class CodingStyleTest(CodingStyleTestCase, testXHTML.TestXHTMLMixin):
template_tool.updateRepositoryBusinessTemplateList(bt5_path_list) template_tool.updateRepositoryBusinessTemplateList(bt5_path_list)
bt_to_install_title_set = set(x[1] for x in bt_list)
bt_to_install_title_set.add('erp5_core')
# Install the tested business template.
try:
url_bt_tuple_list = [ url_bt_tuple_list = [
('%s/%s' % (repository, bt_title), bt_title) for repository, bt_title in ('%s/%s' % (repository, bt_title), bt_title) for repository, bt_title in
template_tool.resolveBusinessTemplateListDependency( template_tool.resolveBusinessTemplateListDependency(
[x[1] for x in bt_list], bt_to_install_title_set,
with_test_dependency_list=True)] with_test_dependency_list=True)]
except BusinessTemplateMissingDependency as e:
# it may have a virtual dependency on erp5_full_text_catalog, if that's
# the case, we choose erp5_full_text_mroonga_catalog
if str(e).startswith('Unable to resolve dependencies for erp5_full_text_catalog,'):
url_bt_tuple_list = [
('%s/%s' % (repository, bt_title), bt_title) for repository, bt_title in
template_tool.resolveBusinessTemplateListDependency(
bt_to_install_title_set | set(('erp5_full_text_mroonga_catalog',)),
with_test_dependency_list=True)]
if 'erp5_upgrader' not in bt_to_install_title_set:
upgrader_url_bt_tuple_list = [
('%s/%s' % (repository, bt_title), bt_title) for repository, bt_title in
template_tool.resolveBusinessTemplateListDependency(
['erp5_upgrader'],
# We don't actually run erp5_upgrader test, so we don't want to install
# erp5_upgrader test dependencies
with_test_dependency_list=False)]
for url, bt in upgrader_url_bt_tuple_list:
if bt not in bt_to_install_title_set:
url_bt_tuple_list.append((url, bt))
return super(CodingStyleTest, return super(CodingStyleTest,
self)._installBusinessTemplateList(url_bt_tuple_list, self)._installBusinessTemplateList(url_bt_tuple_list,
......
...@@ -28,9 +28,13 @@ ...@@ -28,9 +28,13 @@
############################################################################## ##############################################################################
import collections import collections
import difflib
import filecmp
import fnmatch
import glob import glob
import os import os
import tarfile import shutil
import tempfile
from Acquisition import aq_base from Acquisition import aq_base
from Testing import ZopeTestCase from Testing import ZopeTestCase
...@@ -105,29 +109,84 @@ class CodingStyleTestCase(ERP5TypeTestCase): ...@@ -105,29 +109,84 @@ class CodingStyleTestCase(ERP5TypeTestCase):
for business_template in self._getTestedBusinessTemplateValueList(): for business_template in self._getTestedBusinessTemplateValueList():
self.assertEqual(business_template.BusinessTemplate_getPythonSourceCodeMessageList(), []) self.assertEqual(business_template.BusinessTemplate_getPythonSourceCodeMessageList(), [])
# Paths for which we ignore differences when re-exporting business templates
rebuild_business_template_ignored_path = """
# portal_transforms seem to be always different
erp5_core/ToolTemplateItem/portal_transforms.xml
# Empty messages are exported in message catalog, so they can be different because of
# empty messages. Reindexing during creation for example insert entries for all workflow
# states, so this change often.
*/MessageTranslationTemplateItem/*/*/translation.po
# This seem to be a copy of
# bt5/erp5_configurator_standard/PathTemplateItem/business_configuration_module/default_standard_configuration.xml
# that was modified. When re-exporting it is different, but since this is test data we ignore it for now.
erp5_scalability_test/PathTemplateItem/business_configuration_module/default_standard_configuration.xml
erp5_scalability_test/PathTemplateItem/business_configuration_module/default_standard_configuration/*
# This is different for some unknown reason, because it's test data we ignore for now
erp5_payroll_l10n_fr_test/PathTemplateItem/accounting_module/trainee_january.xml
erp5_payroll_l10n_fr_test/PathTemplateItem/accounting_module/trainee_january/*
"""
def test_rebuild_business_template(self): def test_rebuild_business_template(self):
"""Try to rebuild business template to catch packaging errors. """Try to rebuild business template to catch packaging errors and make sur output is stable.
""" """
self.maxDiff = None
template_tool = self.portal.portal_templates template_tool = self.portal.portal_templates
for bt_title in self.getTestedBusinessTemplateList(): for bt_title in self.getTestedBusinessTemplateList():
bt = template_tool.getInstalledBusinessTemplate(bt_title, strict=True) bt = template_tool.getInstalledBusinessTemplate(bt_title, strict=True)
# make sure we can rebuild # make sure we can rebuild
bt.build() bt.build()
# check we don't add or remove members. # Compute the differences between the reference business template
# first, build a set of files that were on the original business template repository # from the working copy and the newly exported business template.
base_path, local_path = self.portal.portal_templates.getLastestBTOnRepos(bt_title) bt_base_path, bt_local_path = self.portal.portal_templates.getLastestBTOnRepos(bt_title)
existing_files = set([os.path.relpath(y, base_path) bt_dir = os.path.join(bt_base_path, bt_local_path)
for x in os.walk(os.path.join(base_path, local_path)) export_base_path = tempfile.mkdtemp()
for y in glob.glob(os.path.join(x[0], '*')) if os.path.isfile(y)]) self.addCleanup(shutil.rmtree, export_base_path)
export_dir = os.path.join(export_base_path, bt_local_path)
bt.export(export_dir, local=True)
# then compare this with the files in the newly exported business template. ignored_paths = {
bt_file = bt.export() p.strip() for p in self.rebuild_business_template_ignored_path.splitlines()
bt_file.seek(0) # XXX this StringIO was already read... if p and not p.strip().startswith("#")}
new_files = set(tarfile.open(fileobj=bt_file, mode='r:gz').getnames())
diff_line_list = []
def get_differences(dcmp, base):
for name in dcmp.left_only:
yield 'removed: ' + os.path.join(base, name)
for name in dcmp.right_only:
yield 'added: ' + os.path.join(base, name)
for name in dcmp.funny_files:
yield 'funny: ' + os.path.join(base, name)
for name in dcmp.diff_files:
path = os.path.join(base, name)
if not any(fnmatch.fnmatch(path, ignored_path) for ignored_path in ignored_paths):
yield 'modified: ' + path
with open(os.path.join(bt_base_path, path)) as ff, \
open(os.path.join(export_base_path, path)) as tf:
diff_line_list.extend(
difflib.unified_diff(
ff.readlines(),
tf.readlines(),
os.path.join('git', path),
os.path.join('bt5', path),
))
diff_line_list.append('\n')
for sub_path, sub_dcmp in dcmp.subdirs.iteritems():
for diff in get_differences(sub_dcmp, os.path.join(base, sub_path)):
yield diff
diff_files = list(get_differences(filecmp.dircmp(bt_dir, export_dir), bt_local_path))
# dump a diff in log directory, to help debugging
from Products.ERP5Type.tests.runUnitTest import log_directory
if log_directory and diff_line_list:
with open(os.path.join(log_directory, '%s.diff' % self.id()), 'w') as f:
f.writelines(diff_line_list)
self.assertEqual(diff_files, [])
self.maxDiff = None
self.assertEqual(existing_files, new_files)
def test_run_upgrader(self): def test_run_upgrader(self):
# Check that pre and post upgrade do not raise problems. # Check that pre and post upgrade do not raise problems.
...@@ -195,3 +254,16 @@ class CodingStyleTestCase(ERP5TypeTestCase): ...@@ -195,3 +254,16 @@ class CodingStyleTestCase(ERP5TypeTestCase):
'action_name': action_name, 'action_name': action_name,
}) })
self.assertEqual(duplicate_action_list, []) self.assertEqual(duplicate_action_list, [])
def test_workflow_consistency(self):
self.maxDiff = None
workflow_id_set = set()
for business_template in self._getTestedBusinessTemplateValueList():
workflow_id_set.update(business_template.getTemplateWorkflowIdList())
message_list = []
for workflow_id in workflow_id_set:
message_list.extend(
self.portal.portal_workflow[workflow_id].checkConsistency())
self.assertEqual(message_list, [])
...@@ -1659,6 +1659,38 @@ class TestZodbModuleComponent(SecurityTestCase): ...@@ -1659,6 +1659,38 @@ class TestZodbModuleComponent(SecurityTestCase):
self.tic() self.tic()
self.assertEqual(component.checkConsistency(), []) self.assertEqual(component.checkConsistency(), [])
def testWorkflowErrorMessage(self):
"""Check that validation error messages are stored in workflow
"""
component = self._newComponent(self._generateReference('WorkflowErrorMessage'))
valid_id = component.getId()
self.tic()
component.setId('wrong')
from Products.ERP5Type.Core.Workflow import ValidationFailed
with self.assertRaises(ValidationFailed):
self.portal.portal_workflow.doActionFor(component, 'validate_action')
last_error_message = str(
self.portal.portal_workflow.getInfoFor(
component, 'history',
wf_id='component_validation_workflow')[-1]['error_message'][0])
self.assertEqual(
last_error_message,
self.portal.Base_translateString(
ComponentMixin._message_invalid_id,
mapping={'id_prefix': self._document_class.getIdPrefix()}))
self.tic()
# non-regression test: when there is no error the error is no longer
# in workflow history
component.setId(valid_id)
component.validate()
self.tic()
last_error_message = self.portal.portal_workflow.getInfoFor(
component, 'history',
wf_id='component_validation_workflow')[-1]['error_message']
self.assertEqual(last_error_message, '')
def testReferenceWithReservedKeywords(self): def testReferenceWithReservedKeywords(self):
""" """
Check whether checkConsistency has been properly implemented for checking Check whether checkConsistency has been properly implemented for checking
......
...@@ -1277,21 +1277,25 @@ class RadioWidget(SingleItemsWidget): ...@@ -1277,21 +1277,25 @@ class RadioWidget(SingleItemsWidget):
return string.join(rendered_items, "<br />") return string.join(rendered_items, "<br />")
def render_item(self, text, value, key, css_class, extra_item): def render_item(self, text, value, key, css_class, extra_item):
return self.render_element('input', return render_element(
'label',
contents=self.render_element('input',
type="radio", type="radio",
css_class=css_class, css_class=css_class,
name=key, name=key,
value=value, value=value,
extra=extra_item) + text extra=extra_item) + text)
def render_selected_item(self, text, value, key, css_class, extra_item): def render_selected_item(self, text, value, key, css_class, extra_item):
return self.render_element('input', return render_element(
'label',
contents=self.render_element('input',
type="radio", type="radio",
css_class=css_class, css_class=css_class,
name=key, name=key,
value=value, value=value,
checked=None, checked=None,
extra=extra_item) + text extra=extra_item) + text)
RadioWidgetInstance = RadioWidget() RadioWidgetInstance = RadioWidget()
...@@ -1322,21 +1326,26 @@ class MultiCheckBoxWidget(MultiItemsWidget): ...@@ -1322,21 +1326,26 @@ class MultiCheckBoxWidget(MultiItemsWidget):
return string.join(rendered_items, "<br />") return string.join(rendered_items, "<br />")
def render_item(self, text, value, key, css_class, extra_item): def render_item(self, text, value, key, css_class, extra_item):
return self.render_element('input', return render_element(
'label',
contents=self.render_element('input',
type="checkbox", type="checkbox",
css_class=css_class, css_class=css_class,
name=key, name=key,
value=value, value=value,
extra=extra_item) + text extra=extra_item) + text)
def render_selected_item(self, text, value, key, css_class, extra_item): def render_selected_item(self, text, value, key, css_class, extra_item):
return self.render_element('input', return render_element(
'label',
contents=self.render_element('input',
type="checkbox", type="checkbox",
css_class=css_class, css_class=css_class,
name=key, name=key,
value=value, value=value,
checked=None, checked=None,
extra=extra_item) + text extra=extra_item) + text)
MultiCheckBoxWidgetInstance = MultiCheckBoxWidget() MultiCheckBoxWidgetInstance = MultiCheckBoxWidget()
......
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