Commit 07969b44 authored by Romain Courteaud's avatar Romain Courteaud

[officejs_appstore_configurator] Simplify the appstore installation

Fix the bt5 dependencies.

Change tests so that they all use the configurator to install the bt5.

officejs_upgrader: use the same configuration than the configurator
parent 9c69501e
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Business Configuration" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Author</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>resource/workflow_module/officejs_appstore_configuration_workflow</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>officejs_appstore_configuration_workflow</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Business Configuration</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Appstore</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Workflow" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>state_variable_name</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>source/workflow_module/officejs_appstore_configuration_workflow/1</string>
</tuple>
</value>
</item>
<item>
<key> <string>configuration_after_script_id</string> </key>
<value> <string>BusinessConfiguration_invokeOfficeJSAppstorePromiseAlarmList</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The default OfficeJS Appstore configuration workflow, used to setup a OfficeJS Appstore</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>officejs_appstore_configuration_workflow</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Workflow</string> </value>
</item>
<item>
<key> <string>state_base_category</string> </key>
<value> <string>current_state</string> </value>
</item>
<item>
<key> <string>state_variable_name</string> </key>
<value> <string>current_state</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Officejs Appstore Configuration Workflow</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/56</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>State</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Start</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/64</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>11</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>State</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Download</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>after_script_id</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/11</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_expression</string> </key>
<value> <string>python: True</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>14</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Install</string> </value>
</item>
<item>
<key> <string>transition_form_id</string> </key>
<value> <string>BusinessConfiguration_displayDownloadForm</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>comment</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/14</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string>Set Customer Business Template</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>29</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>State</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Customer BT</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>after_script_id</string> </key>
<value> <string>BusinessConfiguration_setupCustomerBT5</string> </value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/29</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_expression</string> </key>
<value> <string>python: True</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>30</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Setup customer BT5</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>42</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: member.getUserName()</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>actor</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>43</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: object.getDateTime()</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>time</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>44</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: None</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>comment</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>45</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: None</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>error_message</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>46</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: request.get(\'configuration_save_url\', None)</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>configuration_save_url</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>comment</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>python: (object.transition is not None) and (object.transition.getTransitionFormId() not in [\'\', None])</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>47</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>displayed</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Id of client</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>52</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: request.get(\'client_id\', None)</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>client_id</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/30</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>55</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>State</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Standard BT5</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>comment</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>after_script_id</string> </key>
<value> <string>BusinessConfiguration_setupOfficeJSAppstoreStandardBT5</string> </value>
</item>
<item>
<key> <string>before_script_id</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/55</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string>Setup all standard bt for ERP5</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>guard_expression</string> </key>
<value> <string>python: True</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>56</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Setup standard BT5</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variable" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>automatic_update</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>59</string> </value>
</item>
<item>
<key> <string>initial_value</string> </key>
<value> <string>python: request.get(\'transition\', None)</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>transition</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="State" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>63</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>State</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>End</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Transition" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>destination/workflow_module/officejs_appstore_configuration_workflow/63</string>
</tuple>
</value>
</item>
<item>
<key> <string>guard_expression</string> </key>
<value> <string>python: True</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>64</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Transition</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Finalize</string> </value>
</item>
<item>
<key> <string>transition_form_id</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Embedded File" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts48233441.61</string> </value>
</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>
<key> <string>content_md5</string> </key>
<value> <string>bc8dab70608260a21ba040f7ef76dd37</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
B3RJTUUH4wEWCRskjvL2uwAAL9hJREFUeNrt3X14XNV9J/DvuTN6GUkzGr1Y0oxkayzHlo0MGltj
CNTgIYBNCdhDnpJskwKijUOyDbFos81unwCDTds0r4J0tyG0i00futl0WwtTGlsktSBOqR25yC00
FqmNlMSSAdUaWwa937N/jEaWbUnWjGbuuffO9/M8PBhlNPd3xo6+Pud3z7kAERERERERERERERER
ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER
ERERERERERERERERERERERERERERERHRQgnVBRAZJT/SEhBCr73068N7n3pFdW1EVsQAIdsqjLQE
ISa3SYgwpAzP91oh0CMhegRkB6D16JA9DBai+TFAyHYK795xv4TeAongYt9rZrBIiC4htd7321q7
VI+RyAwYIGQbhZGWoBSTz6YjOK5IoEtA9ACyi8FC2YoBQrZQGHmoWQp8CxJepYUI0QGgR0D26BAd
Umq9I22tPao/H6JMYICQ5RVEvhAF5GOq65jXVLAAepeE1pUntWOxttaY6rKIFoMBQpZWGHmoWQLP
qq4jJQIxQHQJyC4J2cNgIathgJBlFUU+H9YhDqquI90ubdznSu0VhgqZEQOELKvg7odeN6RhbgZC
dAB6W6507mGYkFkwQMiSLL10tRjxZa82XWqPszlPqjFAyJKyavYxByHQmiMdj3NGQqowQMhy8iMt
AQ2Tb6uuwxQEYpB44IO2b7epLoWyj6a6AKJkadAjqmswjfi+l70Fd3/hWW+kxau6HMouDBCyHAEZ
UV2D6UjZPCYmDzJEyEgMECK7kAiOicm3CyMtQdWlUHZggJD1CNQu/k1sSsIrxeRBhggZgQFCliMl
AqprMLV4iLAnQhnHACGyI4ngmND3qi6D7I0BQmRXUoYLIl9oUV0G2RcDhMjW5LfyIy0B1VWQPTFA
iGxOE3r2HflChmCAENmdlOGiyOfDqssg+2GAEGUBCdGiugayHwYIURaQwDb2QijdGCBEWYJniFG6
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
MPFLCsYAAAAASUVORK5CYII=</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>400</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>default_image</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Embedded File</string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>12500</int> </value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>400</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>business_template_skin_layer_priority</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>float</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>business_template_skin_layer_priority</string> </key>
<value> <float>51.0</float> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>officejs_appstore_configurator</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
"""
Invoke all post upgrades in order to finish the officejs appstore configuration.
All post configurations have to be placed as Constraints.
"""
with context.portal_activities.defaultActivateParameterDict({}, placeless=True):
active_process = context.portal_activities.newActiveProcess(activate_kw={})
context.ERP5Site_checkUpgraderConsistency(fixit=1,
active_process=active_process,
filter_dict={"constraint_type": "post_upgrade"})
<?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>BusinessConfiguration_invokeOfficeJSAppstorePromiseAlarmList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
configuration_save = context.restrictedTraverse(configuration_save_url)
bt5_installation_list, bt5_update_catalog_list, _ = \
context.TemplateTool_getOfficeJSAppstoreBusinessTemplateList()
for name in bt5_installation_list:
configuration_save.addConfigurationItem("Standard BT5 Configurator Item",
title=name, bt5_id=name,
update_catalog=(name in bt5_update_catalog_list))
<?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>configuration_save_url=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>BusinessConfiguration_setupOfficeJSAppstoreStandardBT5</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Setup standard ERP5 business templates</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
""" Simple place for keep the list of business template to install on this project
"""
keep_bt5_id_list = ['erp5_ui_test',
'erp5_ui_test_core',
'erp5_forge',
'erp5_l10n_fa',
'officejs_test']
bt5_update_catalog_list = ('erp5_ingestion_mysql_innodb_catalog', 'erp5_full_text_mroonga_catalog')
bt5_installation_list = bt5_update_catalog_list + ('officejs_appstore_configurator', 'officejs_meta')
return bt5_installation_list, bt5_update_catalog_list, keep_bt5_id_list
<?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>TemplateTool_getOfficeJSAppstoreBusinessTemplateList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_configurator
erp5_full_text_mroonga_catalog
\ No newline at end of file
business_configuration_module/officejs_appstore_configuration_workflow
\ No newline at end of file
business_configuration_module/officejs_appstore_configuration_workflow
workflow_module/officejs_appstore_configuration_workflow
workflow_module/officejs_appstore_configuration_workflow/**
\ No newline at end of file
officejs_appstore_configurator
\ No newline at end of file
officejs_appstore_configurator
\ No newline at end of file
erp5_officejs_appstore_website erp5_officejs_appstore_website
\ No newline at end of file officejs_credential
\ No newline at end of file
erp5_credential erp5_credential
officejs_security \ No newline at end of file
\ No newline at end of file
...@@ -29,20 +29,16 @@ ...@@ -29,20 +29,16 @@
import unittest import unittest
from Products.ERP5Type.tests.ERP5TypeFunctionalTestCase import ERP5TypeFunctionalTestCase from Products.ERP5Type.tests.ERP5TypeFunctionalTestCase import ERP5TypeFunctionalTestCase
from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
class TestOfficejSAppstoreUI(ERP5TypeFunctionalTestCase): class TestOfficejSAppstoreUI(testOfficeJSAppstoreMixin, ERP5TypeFunctionalTestCase):
foreground = 0 foreground = 0
run_only = "officejs_appstore_ui_zuite" run_only = "officejs_appstore_ui_zuite"
def getBusinessTemplateList(self):
return (
'officejs_base',
'officejs_test',
'officejs_security',
)
def afterSetUp(self): def afterSetUp(self):
super(TestOfficejSAppstoreUI, self).afterSetUp() ERP5TypeFunctionalTestCase.afterSetUp(self)
testOfficeJSAppstoreMixin.afterSetUp(self)
self.portal.portal_preferences.getActiveSystemPreference().edit( self.portal.portal_preferences.getActiveSystemPreference().edit(
preferred_credential_alarm_automatic_call=1, preferred_credential_alarm_automatic_call=1,
preferred_credential_recovery_automatic_approval=1, preferred_credential_recovery_automatic_approval=1,
......
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2019 Nexedi SA and Contributors. All Rights Reserved.
#
##############################################################################
from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
class TestSlapOSConfigurator(testOfficeJSAppstoreMixin):
def notestConfiguredModuleGeneratorIDViaConstraint(self):
""" Make sure Generator ID is well configured, in this
case we trust on promise outcome."""
self.assertEqual(self.portal.portal_ids.checkConsistency(), [])
self.portal.person_module.setIdGenerator("_Id_fake")
self.assertNotEqual(self.portal.portal_ids.checkConsistency(), [])
self.portal.portal_ids.fixConsistency()
self.assertEqual(self.portal.portal_ids.checkConsistency(), [])
self.assertEqual(self.portal.person_module.getIdGenerator(),
"_generatePerDayId")
def testConfiguredShacacheWebSite(self):
""" Make sure Shacache WebSite is setuped by Alarm
case we trust on promise outcome."""
self.assertEqual(self.portal.web_site_module.checkConsistency(), [])
def testConfiguredCacheViaConstraint(self):
""" Make sure Volitile and Persistent Cache was configured well,
invoking the consistency to check """
self.assertEqual(self.portal.portal_memcached.checkConsistency(), [])
def testConfiguredConversionServerViaConstraint(self):
""" Make sure Conversion Server was configured well,
invoking checkConsistency """
self.assertEqual(self.portal.portal_preferences.checkConsistency(), [])
def testConfiguredTemplateToolViaConstraint(self):
""" Make sure Template Tool Repositories was configured well,
invoking checkConsistency """
self.assertEqual(
[ i for i in self.portal.portal_templates.checkConsistency()
if "(reinstall)" not in i.message], [])
def testConfiguredVolatileCache(self):
""" Make sure Memcached is configured
"""
from Products.ERP5Type.tests.ERP5TypeTestCase import \
_getVolatileMemcachedServerDict
memcached_tool = self.getPortal().portal_memcached
connection_dict = _getVolatileMemcachedServerDict()
url_string = 'erp5-memcached-volatile:%(port)s' % connection_dict
self.assertEqual(memcached_tool.default_memcached_plugin.getUrlString(),
url_string)
def testConfiguredPersistentCache(self):
""" Make sure Kumofs is configured
"""
from Products.ERP5Type.tests.ERP5TypeTestCase import\
_getPersistentMemcachedServerDict
memcached_tool = self.getPortal().portal_memcached
connection_dict = _getPersistentMemcachedServerDict()
url_string = 'erp5-memcached-persistent:%(port)s' % connection_dict
self.assertEqual(memcached_tool.persistent_memcached_plugin.getUrlString(),
url_string)
def testConfiguredConversionServer(self):
""" Make sure Conversion Server (Cloudooo) is
well configured """
# set preference
preference_tool = self.portal.portal_preferences
conversion_url = "https://cloudooo.erp5.net/"
self.assertEqual(preference_tool.getPreferredDocumentConversionServerUrl(), conversion_url)
def notestModuleHasIdGeneratorByDay(self):
""" Ensure the Constraint sets appropriate id generator on all modules.
"""
module_list = [module.getId() for module in self.portal.objectValues()
if getattr(module, "getIdGenerator", None) is not None and \
module.getIdGenerator() == "_generatePerDayId"]
self.assertSameSet(module_list,
[
'access_token_module',
'account_module',
'accounting_module',
'bug_module',
'business_configuration_module',
'business_process_module',
'campaign_module',
'component_module',
'computer_model_module',
'computer_module',
'computer_network_module',
'consumption_document_module',
'credential_recovery_module',
'credential_request_module',
'credential_update_module',
'currency_module',
'cloud_contract_module',
'data_set_module',
'delivery_node_module',
'document_ingestion_module',
'document_module',
'event_module',
'external_source_module',
'glossary_module',
'hosting_subscription_module',
'image_module',
'implicit_item_movement_module',
'internal_order_module',
'internal_packing_list_module',
'internal_supply_module',
'internal_trade_condition_module',
'inventory_module',
'item_module',
'knowledge_pad_module',
'meeting_module',
'notification_message_module',
'open_internal_order_module',
'open_purchase_order_module',
'open_sale_order_module',
'organisation_module',
'person_module',
'portal_activities',
'portal_simulation',
'product_module',
'project_module',
'purchase_order_module',
'purchase_packing_list_module',
'purchase_supply_module',
'purchase_trade_condition_module',
'quantity_unit_conversion_module',
'query_module',
'regularisation_request_module',
'requirement_module',
'returned_purchase_order_module',
'returned_purchase_packing_list_module',
'returned_sale_order_module',
'returned_sale_packing_list_module',
'sale_opportunity_module',
'sale_order_module',
'sale_packing_list_module',
'sale_supply_module',
'sale_trade_condition_module',
'service_module',
'service_report_module',
'software_installation_module',
'software_instance_module',
'software_licence_module',
'software_product_module',
'software_publication_module',
'software_release_module',
'subscription_condition_module',
'subscription_request_module',
'support_request_module',
'system_event_module',
'task_module',
'task_report_module',
'transformation_module',
'trial_condition_module',
'trial_request_module',
'upgrade_decision_module',
'web_page_module',
'web_site_module',
'workflow_module',
])
def testConfiguredBusinessTemplateList(self):
""" Make sure Installed business Templates are
what it is expected. """
expected_business_template_list = [
'erp5_accounting',
'erp5_base',
'erp5_code_mirror',
'erp5_configurator',
'erp5_content_translation',
'erp5_core',
'erp5_core_proxy_field_legacy',
'erp5_credential',
'erp5_crm',
'erp5_dms',
'erp5_font',
'erp5_full_text_mroonga_catalog',
'erp5_hal_json_style',
'erp5_ingestion',
'erp5_ingestion_mysql_innodb_catalog',
'erp5_jquery',
'erp5_jquery_plugin_colorpicker',
'erp5_jquery_plugin_elastic',
'erp5_jquery_plugin_jqchart',
'erp5_jquery_plugin_mbmenu',
'erp5_jquery_plugin_sheet',
'erp5_jquery_sheet_editor',
'erp5_jquery_ui',
'erp5_knowledge_pad',
'erp5_l10n_fa',
'erp5_multimedia',
'erp5_mysql_innodb_catalog',
'erp5_notebook',
'erp5_officejs',
'erp5_officejs_appstore_base',
'erp5_officejs_appstore_website',
'erp5_pdm',
'erp5_property_sheets',
'erp5_smart_assistant',
'erp5_software_pdm',
'erp5_svg_editor',
'erp5_trade',
'erp5_upgrader',
'erp5_web',
'erp5_web_renderjs_ui',
'erp5_workflow',
'erp5_xhtml_style',
'officejs_appstore_configurator',
'officejs_base',
'officejs_credential',
'officejs_meta',
'officejs_security',
'officejs_upgrader',
# test bt5
'erp5_forge',
'erp5_ui_test',
'erp5_ui_test_core',
'officejs_test'
]
self.assertSameSet(expected_business_template_list,
self.portal.portal_templates.getInstalledBusinessTemplateTitleList())
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testOfficeJSAppstoreConfigurator</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testOfficeJSAppstoreConfigurator</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2019 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
import random
import transaction
import unittest
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
from Products.ERP5Type.tests.utils import DummyMailHost
from Products.ERP5Type.Utils import convertToUpperCase
from AccessControl.SecurityManagement import getSecurityManager, \
setSecurityManager
from App.config import getConfiguration
config = getConfiguration()
class testOfficeJSAppstoreMixin(SecurityTestCase):
abort_transaction = 0
def clearCache(self):
self.portal.portal_caches.clearAllCache()
self.portal.portal_workflow.refreshWorklistCache()
def createAlarmStep(self):
def makeCallAlarm(alarm):
def callAlarm(*args, **kwargs):
sm = getSecurityManager()
self.login()
try:
alarm.activeSense(params=kwargs)
self.commit()
finally:
setSecurityManager(sm)
return callAlarm
for alarm in self.portal.portal_alarms.contentValues():
if alarm.isEnabled():
setattr(self, 'stepCall' + convertToUpperCase(alarm.getId()) \
+ 'Alarm', makeCallAlarm(alarm))
def setupPortalAlarms(self):
if not self.portal.portal_alarms.isSubscribed():
self.portal.portal_alarms.subscribe()
self.assertTrue(self.portal.portal_alarms.isSubscribed())
def beforeTearDown(self):
self.deSetUpPersistentDummyMailHost()
if self.abort_transaction:
transaction.abort()
def getUserFolder(self):
"""
Return the user folder
"""
return getattr(self.getPortal(), 'acl_users', None)
def setUpConfiguratorOnce(self):
self.commit()
self.portal.portal_templates.updateRepositoryBusinessTemplateList(
repository_list=self.portal.portal_templates.getRepositoryList())
self.commit()
self.launchConfigurator()
def afterSetUp(self):
self.login()
self.createAlarmStep()
# Execute the business configuration if not installed
business_configuration = self.getBusinessConfiguration()
if (business_configuration.getSimulationState() != 'installed'):
self.portal.portal_caches.erp5_site_global_id = '%s' % random.random()
self.portal.portal_caches._p_changed = 1
self.commit()
self.portal.portal_caches.updateCache()
self.bootstrapSite()
self.commit()
def deSetUpPersistentDummyMailHost(self):
if 'MailHost' in self.portal.objectIds():
self.portal.manage_delObjects(['MailHost'])
self.portal.manage_addProduct['MailHost'].manage_addMailHost('MailHost')
self.commit()
def setUpPersistentDummyMailHost(self):
if 'MailHost' in self.portal.objectIds():
self.portal.manage_delObjects(['MailHost'])
self.portal._setObject('MailHost', DummyMailHost('MailHost'))
self.portal.email_from_address = 'romain@nexedi.com'
self.portal.email_to_address = 'romain@nexedi.com'
def getBusinessConfiguration(self):
return self.portal.business_configuration_module[\
"officejs_appstore_configuration_workflow"]
def launchConfigurator(self):
self.logMessage('OfficeJS Appstore launchConfigurator')
self.login()
# Create new Configuration
business_configuration = self.getBusinessConfiguration()
response_dict = {}
while response_dict.get("command", "next") != "install":
response_dict = self.portal.portal_configurator._next(
business_configuration, {})
self.tic()
self.portal.portal_configurator.startInstallation(
business_configuration,REQUEST=self.portal.REQUEST)
def bootstrapSite(self):
self.logMessage('OfficeJS Appstore bootstrapSite')
self.setupPortalAlarms()
self.clearCache()
self.tic()
self.setUpConfiguratorOnce()
self.tic()
def getBusinessTemplateList(self):
"""
Install the business templates.
"""
return [
'officejs_appstore_configurator'
]
class TestOfficeJSAppstoreDummy(testOfficeJSAppstoreMixin):
run_all_test = 1
def test(self):
"""Dummy test in order to fire up Business Template testing"""
bt5_list = self.portal.portal_templates.getInstalledBusinessTemplateTitleList()
self.assertTrue('officejs_meta' in bt5_list, bt5_list)
def getTitle(self):
return "Dummy tests in order to have tests from BT5 run"
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestOfficeJSAppstoreDummy))
return suite
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testOfficeJSAppstoreMixin</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testOfficeJSAppstoreMixin</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
import time import time
from StringIO import StringIO from StringIO import StringIO
import zipfile import zipfile
...@@ -13,16 +14,10 @@ class LocalStringIO(StringIO): ...@@ -13,16 +14,10 @@ class LocalStringIO(StringIO):
StringIO.__init__(self, *args, **kw) StringIO.__init__(self, *args, **kw)
class TestOfficeJSScenario(SecurityTestCase): class TestOfficeJSScenario(testOfficeJSAppstoreMixin):
def getTitle(self): def getTitle(self):
return "Test OfficeJS Scenario" return "Test OfficeJS Scenario"
def getBusinessTemplateList(self):
"""
Tuple of Business Templates we need to install
"""
return ('officejs_meta',)
def createNewUser(self, def createNewUser(self,
first_name="John_test", first_name="John_test",
last_name="Smith_test", last_name="Smith_test",
......
...@@ -46,10 +46,10 @@ ...@@ -46,10 +46,10 @@
<key> <string>text_content_warning_message</string> </key> <key> <string>text_content_warning_message</string> </key>
<value> <value>
<tuple> <tuple>
<string>W:113, 28: Unused variable \'api_path\' (unused-variable)</string> <string>W:108, 28: Unused variable \'api_path\' (unused-variable)</string>
<string>W:113, 38: Unused variable \'api_query\' (unused-variable)</string> <string>W:108, 38: Unused variable \'api_query\' (unused-variable)</string>
<string>W:113, 4: Unused variable \'api_scheme\' (unused-variable)</string> <string>W:108, 4: Unused variable \'api_scheme\' (unused-variable)</string>
<string>W:114, 6: Unused variable \'api_fragment\' (unused-variable)</string> <string>W:109, 6: Unused variable \'api_fragment\' (unused-variable)</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
import time import time
from StringIO import StringIO from StringIO import StringIO
import zipfile import zipfile
...@@ -11,16 +12,10 @@ class LocalStringIO(StringIO): ...@@ -11,16 +12,10 @@ class LocalStringIO(StringIO):
StringIO.__init__(self, *args, **kw) StringIO.__init__(self, *args, **kw)
class TestOfficeJSScenario(SecurityTestCase): class TestOfficeJSScenario(testOfficeJSAppstoreMixin):
def getTitle(self): def getTitle(self):
return "Test OfficeJS Scenario Appstore" return "Test OfficeJS Scenario Appstore"
def getBusinessTemplateList(self):
"""
Tuple of Business Templates we need to install
"""
return ('officejs_meta', 'officejs_credential')
def createNewUser(self, def createNewUser(self,
first_name="John_test", first_name="John_test",
last_name="Smith_test", last_name="Smith_test",
......
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
import time import time
from StringIO import StringIO from StringIO import StringIO
import zipfile import zipfile
...@@ -13,16 +14,10 @@ class LocalStringIO(StringIO): ...@@ -13,16 +14,10 @@ class LocalStringIO(StringIO):
StringIO.__init__(self, *args, **kw) StringIO.__init__(self, *args, **kw)
class TestOfficeJSScenario(SecurityTestCase): class TestOfficeJSScenario(testOfficeJSAppstoreMixin):
def getTitle(self): def getTitle(self):
return "Test OfficeJS Scenario" return "Test OfficeJS Scenario"
def getBusinessTemplateList(self):
"""
Tuple of Business Templates we need to install
"""
return ('officejs_meta',)
def createNewUser(self, def createNewUser(self,
first_name="John_test", first_name="John_test",
last_name="Smith_test", last_name="Smith_test",
......
...@@ -46,10 +46,10 @@ ...@@ -46,10 +46,10 @@
<key> <string>text_content_warning_message</string> </key> <key> <string>text_content_warning_message</string> </key>
<value> <value>
<tuple> <tuple>
<string>W:110, 28: Unused variable \'api_path\' (unused-variable)</string> <string>W:105, 28: Unused variable \'api_path\' (unused-variable)</string>
<string>W:110, 38: Unused variable \'api_query\' (unused-variable)</string> <string>W:105, 38: Unused variable \'api_query\' (unused-variable)</string>
<string>W:110, 4: Unused variable \'api_scheme\' (unused-variable)</string> <string>W:105, 4: Unused variable \'api_scheme\' (unused-variable)</string>
<string>W:111, 6: Unused variable \'api_fragment\' (unused-variable)</string> <string>W:106, 6: Unused variable \'api_fragment\' (unused-variable)</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -25,32 +25,18 @@ ...@@ -25,32 +25,18 @@
# #
############################################################################## ##############################################################################
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase from erp5.component.test.testOfficeJSAppstoreMixin import \
testOfficeJSAppstoreMixin
#from unittest import expectedFailure #from unittest import expectedFailure
#from zLOG import LOG, INFO, ERROR #from zLOG import LOG, INFO, ERROR
import time import time
TEST_USER_BASE = "test_eos_user" TEST_USER_BASE = "test_eos_user"
class TestOfficeJSSecurity(SecurityTestCase): class TestOfficeJSSecurity(testOfficeJSAppstoreMixin):
def afterSetUp(self):
"""
This is ran before anything, used to set the environment
"""
pass
def beforeTearDown(self):
pass
def getTitle(self): def getTitle(self):
return "Test OfficeJS Security" return "Test OfficeJS Security"
def getBusinessTemplateList(self):
"""
Tuple of Business Templates we need to install
"""
return ('erp5_base',)
def checkNewMember(self, person, website_id="letitseed"): def checkNewMember(self, person, website_id="letitseed"):
self.assertEqual(repr(sorted(person.getCareerRoleList())), repr(["author"])) self.assertEqual(repr(sorted(person.getCareerRoleList())), repr(["author"]))
assignment, = person.searchFolder(portal_type="Assignment", validation_state="open") # not "opened"! assignment, = person.searchFolder(portal_type="Assignment", validation_state="open") # not "opened"!
......
officejs_base erp5_ui_test
officejs_security officejs_appstore_configurator
officejs_credential \ No newline at end of file
erp5_ui_test
\ No newline at end of file
...@@ -2,4 +2,6 @@ test.erp5.testOfficeJSSecurity ...@@ -2,4 +2,6 @@ test.erp5.testOfficeJSSecurity
test.erp5.testOfficeJSScenario test.erp5.testOfficeJSScenario
test.erp5.testOfficeJSScenarioRjsUI test.erp5.testOfficeJSScenarioRjsUI
test.erp5.testFunctionalOfficeJSAppstoreUI test.erp5.testFunctionalOfficeJSAppstoreUI
test.erp5.testOfficeJSScenarioAppsore test.erp5.testOfficeJSScenarioAppsore
\ No newline at end of file test.erp5.testOfficeJSAppstoreMixin
test.erp5.testOfficeJSAppstoreConfigurator
\ No newline at end of file
bt5_list = [ bt5_id_list, bt5_update_catalog_list, keep_bt5_id_list = \
"erp5_full_text_mroonga_catalog", context.TemplateTool_getOfficeJSAppstoreBusinessTemplateList()
"officejs_meta" return bt5_id_list, keep_bt5_id_list
]
keep_bt5_id_set = [
"erp5_upgrader",
"officejs_upgrader",
# Installed by Fix Check Site Consistency
"erp5_promise",
]
return bt5_list, keep_bt5_id_set
erp5_upgrader erp5_upgrader
\ No newline at end of file officejs_appstore_configurator
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment