Commit 9f06248e authored by Romain Courteaud's avatar Romain Courteaud

[HARDCODED] [romain_dev] wip tools

parent f70b8aa7
def getObjectByOid(self, oid):#XXXYYY
ob = self._p_jar[oid]
#return ob
result = [ob.__class__,]
n = 1
for k,v in ob.iteritems():
result.append((k, k.__class__,v, v.__class__))
n += 1
if n > 100:
break
return result
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Extension Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>test_kaz</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>extension.erp5.test_kaz</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Extension Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
def testrc(self):
result = ''
portal = self.getPortalObject()
selection = portal.portal_selections.getSelectionFor('person_module_selection')
key_list = selection.__dict__.keys()
key_list.sort()
for key in key_list:
result += '%s: %s\n' % (key, selection.__dict__[key])
return result
return str(selection.__dict__)
print selection.checked_uids
print selection.domain_path
print selection.domain_list
if selection.domain is not None:
print selection.domain.asDomainDict()
return printed
return 'couscous'
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Extension Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_recorded_property_dict</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testrc</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>extension.erp5.testrc</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Extension Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>validate</string> </value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>validated</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>3c07e11f695f1b835e35c40ad9053921</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>abstract.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>Abstract-Background-PNG-Background.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>811</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_abstract</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>abstract wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>1000</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1570031850.28</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>978.55869.33097.28450</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1570031865.37</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>8793a163fd5752913f4955ee05429103</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>autumn.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>kissclipart-leaf-autumn-png-clipart-autumn-desktop-wallpaper-b109dc9b0688af64.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>900</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_automn</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Autumn wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>900</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1574439611.96</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>979.63793.28759.15121</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1574439606.56</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>63b8a650f482bb9658c4f11ca90a1074</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/jpeg</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>complex.jpg</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>2724.jpg</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>720</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_complex</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Complex wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>1280</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1574436883.19</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>979.63750.47190.38195</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1574436911.02</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>categories</string> </key>
<value>
<tuple>
<string>publication_section/romain_pub</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value> <string>0902777a614513139cc299ba6f1c4e9c</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>grumpy.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>30251-grumpy-cat-1920x1200-meme-wallpaper.jpg.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>1200</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_grumpy</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value> <string>Grumpy wallpaper</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Grumpy wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>1920</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1567673769.31</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>984.42594.65315.33826</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1592482746.8</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>2d3df245db0395fb3ab10e45fd9253ce</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>hobbes.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>Download-Calvin-And-Hobbes-PNG-Pic.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>800</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_hobbes</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Hobbes wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>1280</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1570615836.3</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>979.64.7806.57088</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1570615726.62</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>bc3cfa98569409f740865db09f48a841</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>noel.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>tOE6gh.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>900</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_noel</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Noel wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>1600</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1574438027.23</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>979.63769.51607.43554</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1574438036.32</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>9309540502bd63fce275cd35ba892202</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>spiro.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>téléchargement.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>960</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_spiro</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>spiro wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>960</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1570178217.71</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>978.58308.63059.29644</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1570178230.57</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Image" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</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>e8a3742b8e736deed9840baa61bab611</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>waves.png</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>Waves.png</string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>795</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_wallpaper_waves</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Image</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>waves wallpaper</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>979</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</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>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish_alive</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</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>1570178971.23</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published_alive</string> </value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>978.58321.34125.43554</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</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>1570178983.55</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>https://alpha.iodide.io/notebooks/34/?viewMode=report</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_1</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% md\n
# The Lorenz Attractor in Iodide\n
\n
This notebook is inspired by the [demo notebook](https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/18a9793b58ba86660b5ab964e1aeaf7324d667c8?urlpath=lab%2Ftree%2Fdemo%2FLorenz.ipynb) featured at the top of the ["JupyterLab is ready for users"](https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906) announcement on the [Jupyter blog](https://blog.jupyter.org/).\n
\n
Having access to browser APIs and live computation alongside an analysis opens up a few opportunities when it comes to telling certain [computational narratives](https://blog.jupyter.org/project-jupyter-computational-narratives-as-the-engine-of-collaborative-data-science-2b5fb94c3c58). In this case the browser gives us richer real-time interactivity and much greater responsiveness than is typically possible with a remotely hosted kernel, and access to the media APIs offered by the web platform (particularly WebGL) allow us to create 3d graphics that are highly portable.\n
\n
%% js\n
// this is a hack to allow the ode45-cash-karp lib to import as expected.\n
// need to browserify this module.\n
module = {}\n
\n
%% fetch\n
js: https://cdn.jsdelivr.net/npm/ode45-cash-karp@1.1.0/lib/index.min.js\n
js: https://cdnjs.cloudflare.com/ajax/libs/plotly.js/1.36.1/plotly.min.js\n
js: https://d3js.org/d3.v5.min.js\n
js: https://code.jquery.com/jquery-1.12.4.js\n
%% js\n
ode45 = module.exports\n
\n
%% js\n
function integrateLorenz(t0, tmax, dt0, S0, sigma, beta, rho) {\n
const lorenzSystem = function(dSdt, S, t) {\n
const [x,y,z] = S\n
dSdt[0] = sigma*(y-x)\n
dSdt[1] = x*(rho-z) - y\n
dSdt[2] = x*y - beta*z\n
}\n
const integrator = ode45( S0.slice(), lorenzSystem, t0, dt0 )\n
// Integrate up to tmax:\n
const t = [], S = []\n
while( integrator.step( tmax ) ) {\n
// while( t.length < 2000 ) {\n
// Store the solution at this timestep:\n
// integrator.step()\n
t.push( integrator.t )\n
S.push( integrator.y.slice() )\n
}\n
return [S,t]\n
}\n
\n
%% js\n
sigma = 10\n
beta = 2.67\n
rho = 28\n
\n
var t0 = 0, tmax = 4, dt0 = 1e-3\n
S0random = () => [50*(Math.random()-.5), 50*(Math.random()-.5), 40*Math.random()+10]\n
var S0 = S0random()\n
\n
var numTraces = 10\n
tracesS0 = []\n
traceData = []\n
traces = []\n
for (let i=0; i<numTraces; i++){\n
tracesS0.push(S0random())\n
traceData.push(integrateLorenz(t0, tmax, dt0, tracesS0[i].slice(), sigma, beta, rho))\n
traces.push({\n
type: \'scatter3d\',\n
mode: \'lines\',\n
x: traceData[i][0].map(s => s[0]),\n
y: traceData[i][0].map(s => s[1]),\n
z: traceData[i][0].map(s => s[2]),\n
// opacity: .5,\n
name: "line-"+i,\n
line: {width: 4, color: d3.interpolateRainbow(i/numTraces)}\n
})\n
}\n
\n
%% js\n
function initPlot(targetDiv){\n
targetDiv.innerHTML = \'\'\n
Plotly.newPlot(\n
targetDiv,\n
traces,\n
{\n
showlegend: false,\n
height: 550,\n
width: 800,\n
autosize: false,\n
scene:{\n
xaxis: {range: [-30, 30], autorange: false, tickmode: \'linear\', tick0: 0, dtick: 5},\n
yaxis: {range: [-30, 30], autorange: false, tickmode: \'linear\', tick0: 0, dtick: 5},\n
zaxis: {range: [0, 70], autorange: false, tickmode: \'linear\', tick0: 0, dtick: 5},\n
aspectratio: {x: 1, y: 1, z: 1}\n
},\n
margin: { l: 0, r: 0, b: 0, t: 0, pad: 0},\n
} \n
)\n
}\n
\n
%% js\n
function updateTraces(tracesS0, sigma, beta, rho){\n
const traceUpdates = []\n
for (let i=0; i<numTraces; i++){\n
traceUpdates.push(integrateLorenz(t0, tmax, dt0, tracesS0[i].slice(), sigma, beta, rho))\n
}\n
var data_update = {\n
x: traceUpdates.map(tr => tr[0].map(s => s[0])),\n
y: traceUpdates.map(tr => tr[0].map(s => s[1])),\n
z: traceUpdates.map(tr => tr[0].map(s => s[2])),\n
}\n
Plotly.restyle(\'lorenz-graph\', data_update)\n
}\n
\n
%% js\n
// jQuery is out of fashion for building gigantic web apps, but it\'s extremely well-documented \n
// and quite well-suited for doing interactive manipulations of the DOM in smaller code bases,\n
// like an Iodide notebook.\n
\n
// In the future, we may wrap this functionality into a "widgets" section of our standard lib,\n
// but because we\'re close to the DOM and there are already so many libs that do this, it\'s not\n
// a pressing need.\n
\n
function initControls(){ \n
props = {\n
sigma: {min:0, max:50, value:10, step: .01},\n
beta: {min:-2, max:10, value:2.67, step: .01},\n
rho: {min:0, max:50, value:28, step: .01},\n
}\n
\n
$("#lorenz-controls").empty();\n
// set up sliders\n
["sigma","beta","rho"].forEach( (param) => {\n
controlDiv = $(`<div><input id="${param}-slider" type="range" step="0.01"></input>\n
${param} (<span id="${param}-val">${props[param].value}</span>)<div>`)\n
$("#lorenz-controls").append(controlDiv)\n
\n
const thisSlider = $(`#${param}-slider`)\n
thisSlider.prop(props[param]) \n
thisSlider.on("input", () => {\n
const [sigma, beta, rho] = getUiParamVals()\n
updateTraces(tracesS0, sigma, beta, rho)\n
setUiParamVals({sigma, beta, rho})\n
}) \n
})\n
\n
// set up reset button\n
const buttonDiv = $(\'<div><input id="reset-button" type="button" value="Reset parameters"></div>)\')\n
$("#lorenz-controls").append(buttonDiv)\n
$("#reset-button").on("click", () => {\n
const [sigma,beta,rho] = [10, 2.67, 28]\n
setUiParamVals({sigma, beta, rho})\n
setSliderVals({sigma, beta, rho})\n
updateTraces(tracesS0, sigma, beta, rho)\n
})\n
}\n
\n
function getUiParamVals(){\n
return ["sigma","beta","rho"].map( param => \n
$(`#${param}-slider`).prop("value")\n
)\n
}\n
\n
function setUiParamVals(paramObj){\n
["sigma","beta","rho"].forEach( param => $(`#${param}-val`).html(paramObj[param]) )\n
}\n
\n
function setSliderVals(paramObj){\n
["sigma","beta","rho"].forEach( param => $(`#${param}-slider`).prop("value", paramObj[param]) )\n
}\n
\n
%% md\n
### The Lorenz system\n
\n
Let\'s explore the Lorenz system of differential equations:\n
\n
$$\n
\\begin{aligned}\n
\\dot{x} & = \\sigma(y-x) \\\\\n
\\dot{y} & = \\rho x - y - xz \\\\\n
\\dot{z} & = -\\beta z + xy\n
\\end{aligned}\n
$$\n
\n
Below we plot the evolution of this system for several different randomly chosen initial conditions (the trajectory for each initial condition is shown in a different color). You can rotate, pan, and zoom to gain a better understanding of the three-dimensional structure of the attractor. Additionally, you can adjust the sliders below to change the parameters of the system.\n
\n
<div id="lorenz-graph" style="text-align:center">\n
(loading Plotly graphing lib)\n
</br></br>\n
<img src="https://cdnjs.cloudflare.com/ajax/libs/galleriffic/2.0.1/css/loader.gif"></img>\n
</div>\n
\n
<div id="lorenz-controls"> </div>\n
\n
%% js\n
initPlot(document.getElementById(\'lorenz-graph\'))\n
initControls()\n
\n
%% css\n
/* let\'s add a fine border around the plot canvas to make it clearer when the plot gets cut off at the edge of the canvas*/\n
canvas { border: 1px solid #eee }\n
\n
%% js
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>The Lorenz Attractor in Iodide</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>https://alpha.iodide.io/notebooks/193/?</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_2</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% raw\n
To view the notebook in presentation mode, click on \'Run All Cells\' followed by the \'View\' button\n
\n
%% md\n
# World Happiness Report\n
\n
%% md\n
The World Happiness Report is an annual publication of the United Nations Sustainable Development Solutions Network which contains rankings of national happiness.\n
\n
This notebook uses the dataset available on the website [World Happiness Report 2018](http://worldhappiness.report/ed/2018/) to demonstrate the various aspects which affect the happiness of a country through exploratory analysis. Only 7 main factors have been considered. There were other supporting factors such as Life Ladder, Democratic Quality etc. which are not included in this notebook. The contribution of these supporting factors has been noted down as a Residual score.\n
\n
%% fetch\n
js: https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.2/d3.js\n
js: https://cdn.plot.ly/plotly-latest.min.js\n
text: happinessData=https://gist.githubusercontent.com/djbarnwal/521eb8da9f6546c18f2b7d6d0f365549/raw/f9f39e0e58fdbcf4bbd66a8cbfec5df497ae1b79/happiness_data.csv\n
\n
%% md\n
<svg class=\'ranking\'></svg>\n
\n
The above visualization ranks the countries based on Happiness score. Scoring 7.632, **Finland** is at the top while **Burundi** is at the very bottom with a score of 2.905. The Scandinavian countries have taken the top four spots.\n
\n
%% js\n
var dataset;\n
var keys;\n
\n
var width = 1080,\n
height = 1800;\n
\n
var svg = d3.select(".ranking").attr("width", width).attr("height", height),\n
margin = {top: 20, right: 20, bottom: 30, left: 150},\n
width = +svg.attr("width") - margin.left - margin.right,\n
height = +svg.attr("height") - margin.top - margin.bottom,\n
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");\n
\n
var y = d3.scaleBand()\n
.rangeRound([0, height])\n
.paddingInner(0.05)\n
.align(0.1);\n
\n
var x = d3.scaleLinear()\n
.rangeRound([0, width]);\n
\n
var z = d3.scaleOrdinal()\n
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);\n
\n
var data = d3.csvParse(happinessData)\n
dataset = data \n
keys = data.columns.slice(3);\n
\n
// Sort row on basis of Happiness Score\n
data.sort(function(a, b) { return b[\'Happiness score\'] - a[\'Happiness score\']; });\n
y.domain(data.map(function(d) { return d.Country; }));\n
x.domain([0, d3.max(data, function(d) { return d[\'Happiness score\']; })]).nice();\n
z.domain(keys);\n
\n
g.append("g")\n
.selectAll("g")\n
.data(d3.stack().keys(keys)(data))\n
.enter().append("g")\n
.attr("fill", function(d) { return z(d.key); })\n
.selectAll("rect")\n
.data(function(d) { return d; })\n
.enter().append("rect")\n
.attr("y", function(d) { return y(d.data.Country); })\n
.attr("x", function(d) { return x(d[0]); })\n
.attr("width", function(d) { return x(d[1]) - x(d[0]); })\n
.attr("height", y.bandwidth());\n
\n
g.append("g")\n
.attr("class", "axis")\n
.attr("transform", "translate(0,0)")\n
.call(d3.axisLeft(y));\n
\n
g.append("g")\n
.attr("class", "axis")\n
.attr("transform", "translate(0,"+height+")")\n
.call(d3.axisBottom(x).ticks(null, "s"))\n
.append("text")\n
.attr("y", 2)\n
.attr("x", x(x.ticks().pop()) + 0.5)\n
.attr("dy", "0.32em")\n
.attr("fill", "#dddddd")\n
.attr("font-weight", "bold")\n
.attr("text-anchor", "start")\n
.text("Happiness Score")\n
.attr("transform", "translate("+ (-width) +",-10)");\n
\n
var legend = g.append("g")\n
.attr("font-family", "sans-serif")\n
.attr("font-size", 10)\n
.attr("font-weight", "bold")\n
.attr("text-anchor", "end")\n
.selectAll("g")\n
.data(keys.slice().reverse())\n
.enter().append("g")\n
//.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });\n
.attr("transform", function(d, i) { return "translate(-50," + (300 + i * 20) + ")"; });\n
\n
legend.append("rect")\n
.attr("x", width - 19)\n
.attr("width", 19)\n
.attr("height", 19)\n
.attr("fill", z);\n
\n
legend.append("text")\n
.attr("x", width - 24)\n
.attr("y", 9.5)\n
.attr("fill", "#dddddd")\n
.attr("dy", "0.32em")\n
.text(function(d) { return d; });\n
\n
%% js\n
dataset\n
\n
%% js\n
function unpack(key, data) {\n
return data.map(function(object) { return object[key]; });\n
}\n
\n
%% md\n
<div id=\'choropleth\'/>\n
\n
%% js\n
var data = [{\n
type: \'choropleth\',\n
locationmode: \'country names\',\n
locations: unpack(\'Country\', dataset),\n
z: unpack(\'Happiness score\', dataset),\n
text: unpack(\'Country\', dataset),\n
colorscale: [\n
[0, \'rgb(254,235,226)\'], [0.2, \'rgb(252,197,192)\'],\n
[0.4, \'rgb(250,159,181)\'], [0.6, \'rgb(247,104,161)\'],\n
[0.8, \'rgb(197,27,138)\'], [1, \'rgb(122,1,119)\']\n
]\n
// autocolorscale: true\n
}];\n
\n
var layout = {\n
title: \'Happiness Score 2018\',\n
colorbar: {\n
tickfont: {\n
color: \'#ccc\'\n
}\n
},\n
plot_bgcolor: \'transparent\',\n
paper_bgcolor: \'transparent\',\n
width: 1080,\n
geo: {\n
projection: {\n
type: \'equirectangular\'\n
}\n
},\n
margin: {\n
l: 0,\n
r: 0,\n
b: 0,\n
t: 0,\n
pad: 2\n
},\n
marker: {\n
line:{\n
color: \'rgb(255,255,255)\',\n
width: 2\n
}\n
}\n
};\n
\n
Plotly.plot(choropleth, data, layout, {showLink: false});\n
\n
%% js\n
keys\n
\n
%% md\n
## Happiness Score\n
\n
<div class=\'stats\'>\n
<div class=\'count\'><span class=\'max\'></span>Max</div>\n
<div class=\'count\'><span class=\'mean\'></span>Mean</div>\n
<div class=\'count\'><span class=\'min\'></span>Min</div>\n
</div>\n
\n
%% css\n
.stats {\n
display: flex;\n
padding: 15px 15px 30px;\n
}\n
\n
.count {\n
text-align: center;\n
font-size: 20px;\n
border-radius: 50%;\n
width: 150px;\n
height: 150px;\n
padding: 25px;\n
}\n
\n
.count span {\n
display: block;\n
font-size: 34px;\n
font-weight: 100;\n
}\n
\n
%% js\n
var hapMax = d3.max(dataset, function(d) {return d[\'Happiness score\']})\n
var hapMin = d3.min(dataset, function(d) {return d[\'Happiness score\']})\n
var hapMean = d3.mean(dataset, function(d) {return d[\'Happiness score\']}).toFixed(3)\n
\n
var hapColors = [\'#f0675c\', \'#375d81\',\'#d4273e\'];\n
\n
d3.select(\'.max\').text(hapMax);\n
d3.select(\'.mean\').text(hapMean);\n
d3.select(\'.min\').text(hapMin);\n
\n
d3.select(\'.stats\')\n
.selectAll(\'.count\')\n
.data(hapColors)\n
.style(\'background\', function(d) {return d});\n
\n
%% js\n
keys\n
\n
%% md\n
The scores for various factors are in different scales and thus not suitable for individual comparison. We will normalize the dataset using the below formula in order to achieve uniformity throughout our dataset for a more natural comparison and analysis.\n
\n
$$\n
X_{norm} = \\dfrac{X - X_{min}}{X_{max} - X_{min}}\n
$$\n
\n
The **mean** value for the various parameters after normalizing them are -\n
\n
%% js\n
// Deep cloning array of objects for later use\n
var unscaled_dataset = JSON.parse(JSON.stringify(dataset));\n
\n
var extendedKeys = [\'Happiness score\', ...keys];\n
var scales = {};\n
\n
for (key of extendedKeys) {\n
scales[key] = d3.scaleLinear().domain(d3.extent(unpack(key, dataset)))\n
}\n
\n
function normalize(value, property) {\n
return scales[property](value);\n
}\n
\n
\n
dataset.forEach(function(d){\n
for(var property in d) {\n
if(extendedKeys.indexOf(property) >=0) {\n
d[property] = normalize(d[property], property).toFixed(3)\n
}\n
}\n
});\n
\n
%% js\n
dataset\n
\n
%% md\n
<div class=\'meanStats\'></div>\n
\n
%% md\n
Some interesting observations -\n
\n
1. Perceptions of corruption are bad throughout the world. With **Singapore** at the top, the rest of the world averages with a score of only **0.246**.\n
2. The world average for Social Support is reasonably close to the global maximum. **8** out of the bottom **10** countries in this category are **African**. The exceptions being Afghanistan and Georgia.\n
3. **Myanmar** is the most generous country whereas **Greece** is the least.\n
\n
%% css\n
.meanCount {\n
height: 150px;\n
width: 150px;\n
border-radius: 50%;\n
flex-direction: column-reverse;\n
font-size: 13px;\n
text-align: center;\n
justify-content: flex-end;\n
padding: 0 11px;\n
display: flex;\n
margin: 10px 25px;\n
}\n
\n
.meanCount h {\n
font-size: 30px;\n
margin-top: 30px;\n
font-weight: 100;\n
}\n
\n
.meanStats {\n
display: flex;\n
flex-wrap: wrap;\n
justify-content: center;\n
}\n
\n
%% js\n
var mean = [];\n
for(var key of keys) {\n
mean.push(d3.mean(dataset, function(d) {return d[key]}).toFixed(3))\n
}\n
\n
d3.select(\'.meanStats\')\n
.selectAll(\'g\')\n
.data(keys)\n
.enter()\n
.append(\'g\')\n
.attr(\'class\', \'meanCount\')\n
.text(function(d) {return d})\n
.append(\'h\')\n
.data(mean)\n
.text(function(d) {return d});\n
\n
var hapColors = [\'#c9283e\', \'#c42f59\', \'#0091ff\', \'#e88e34\', \'#5670d6\', \'#9d3bc0\', \'#006f67\'];\n
\n
d3.select(\'.meanStats\')\n
.selectAll(\'.meanCount\')\n
.data(hapColors)\n
.style(\'background\', function(d) {return d});\n
\n
%% md\n
## What makes a country happy?\n
\n
What are the things that make a country happy? Below we have a plot consisting of the top 5 and bottom 5 nations ranked according to their Happiness score.\n
\n
%% md\n
<div id=\'top5\'/>\n
<div id=\'bottom5\'/>\n
\n
%% js\n
var topTrace = [],\n
bottomTrace = [];\n
\n
var top5 = dataset.slice(0,5);\n
var bottom5 = dataset.slice(-5);\n
\n
for(var key of keys) {\n
topTrace.push({\n
x: unpack(\'Country\',top5),\n
y: unpack(key,top5),\n
name: key,\n
type: \'bar\'\n
})\n
\n
bottomTrace.push({\n
x: unpack(\'Country\',bottom5),\n
y: unpack(key,bottom5),\n
name: key,\n
type: \'bar\'\n
})\n
}\n
\n
var layout = {\n
height: 280,\n
width: 1080,\n
margin: {\n
t: 10,\n
},\n
xaxis: {\n
tickfont: {\n
color: \'#fefefe\'\n
},\n
},\n
yaxis: {\n
domain: [0, 1],\n
tickfont: {\n
color: \'#fefefe\'\n
},\n
gridcolor: \'#555\',\n
},\n
legend: {\n
font: {\n
color: \'#fefefe\'\n
}\n
},\n
plot_bgcolor: \'#302f33\',\n
paper_bgcolor: \'#302f33\'\n
};\n
\n
Plotly.newPlot(\'top5\', topTrace, layout, {displayModeBar: false});\n
Plotly.newPlot(\'bottom5\', bottomTrace, layout, {displayModeBar: false});\n
\n
%% md\n
Happy Countries share in common a high GDP, great Social Support, a good life expectancy and a relatively high Freedom to make life choices. Countries with a bad happy score are in general poor and rank low on perceptions of corruption.\n
\n
%% md\n
## Are Happiness and Money correlated?\n
\n
Happiness and Money are two states which are often compared. Let\'s see if they are correlated or not. Before we begin, we would need to remove the component of **GDP Per Capita** from **Happiness Score** for an unbiased comparison. Thus, we create a new parameter defined as -\n
\n
$$HapScore_{new} = HapScore_{original} - GDPPerCapita$$\n
\n
The below visualization depicts the spread of **Happiness** (new) with the change in **GDP Per capita** (un-normalized)\n
\n
%% js\n
var hap_new = [];\n
var GDP = unpack(\'GDP per capita\', unscaled_dataset)\n
\n
unscaled_dataset.forEach(function(d){\n
hap_new.push((d[\'Happiness score\'] - d[\'GDP per capita\']).toFixed(3))\n
});\n
\n
%% md\n
<div id=\'hapGDP\'/>\n
\n
%% js\n
var HapTrace = [{\n
x: GDP,\n
y: hap_new,\n
mode: \'markers\',\n
text: unpack(\'Country\', dataset),\n
marker: {\n
color: \'rgb(255, 217, 102)\',\n
size: 12\n
},\n
type: \'scatter\'\n
}];\n
\n
\n
var layout = {\n
width: 1080,\n
margin: {\n
t: 10,\n
},\n
xaxis: {\n
title: \'GDP per Capita\',\n
showgrid: false,\n
zeroline: false,\n
color: \'#fefefe\',\n
},\n
yaxis: {\n
title: \'Happiness\',\n
color: \'#fefefe\',\n
showline: false,\n
gridcolor: \'#555\',\n
},\n
plot_bgcolor: \'#302f33\',\n
paper_bgcolor: \'#302f33\'\n
};\n
\n
Plotly.newPlot(\'hapGDP\', HapTrace, layout,{displayModeBar: false});\n
\n
%% md\n
The data points are spread throughout the plot. We can observe that on average happiness increases as GDP per Capita increases. There are outliers such as **Somalia** and **Qatar**, both having similar Happiness score but are on the opposite end of the spectrum in terms of GDP Per Capita.\n
\n
On average countries with higher GDP Per Capita have higher happiness and countries with lower GDP Per Capita have lower happiness. The spread is very diverse for nations having GDP Per Capita in the mid range.\n
\n
%% md\n
## Does region affect Happiness?\n
\n
It is quite evident from the Choropleth map (at the beginning of this report) that some areas are more happy than the others. The below tables shows us the disparities between different regions of the world.\n
\n
%% js\n
var regions = [...new Set(unpack(\'Region indicator\', dataset))];\n
\n
var dataByRegion = d3.nest()\n
.key(function(d) { return d[\'Region indicator\']; })\n
.rollup(function(v) {\n
var regData = {};\n
for(key of keys) {\n
regData[key] = d3.mean(v, function(d) { return d[key]; }).toFixed(3)\n
}\n
return {...regData, \'Happiness score\': d3.mean(v, function(d) { return d[\'Happiness score\']; }).toFixed(3)}; })\n
.entries(dataset);\n
\n
dataByRegion\n
\n
%% css\n
#regionTable {\n
font: 13px\n
}\n
\n
#regionTable th {\n
text-align: right;\n
padding-right: 6px;\n
min-width: 43px;\n
text-align: left;\n
}\n
\n
#regionTable thead td {\n
cursor: s-resize;\n
}\n
\n
#regionTable tbody tr:first-child td {\n
padding-top: 2px;\n
}\n
\n
.user-markdown table th, .user-markdown table td {\n
border: none !important;\n
}\n
\n
#regionTable thead tr:first-child th {\n
text-align: center;\n
}\n
\n
#regionTable tbody td {\n
padding: 0;\n
border-left: solid 1px #000;\n
width: 110px;\n
}\n
\n
/* #regionTable tbody circle {\n
fill: steelblue;\n
} */\n
\n
.toolTip {\n
position: absolute;\n
display: none;\n
min-width: 80px;\n
height: auto;\n
background: none repeat scroll 0 0 #ffffff;\n
border: 1px solid #6F257F;\n
padding: 14px;\n
text-align: center;\n
}\n
\n
%% js\n
extendedKeys\n
\n
%% md\n
<table id=\'regionTable\'>\n
<thead>\n
<tr>\n
<td>Region</td>\n
<th>Happiness Score</th>\n
</tr>\n
</thead>\n
<tbody>\n
</tbody>\n
</table>\n
\n
%% md\n
North America and ANZ is the happiest region. They are doing considerably better than the other regions in almost all the categories. Sub-Saharan Africa and South Asia are lagging behind the others. Perceptions of corruption are bad in most of the regions. There is a great resemblance between Western Europe and North America with the current scoring parameters.\n
\n
%% js\n
d3.select("#regionTable thead tr").selectAll("th")\n
.data(extendedKeys)\n
.enter().append("th")\n
.text(function(d) { return d });\n
\n
var regColors = [\'#600ce8\', \'#c42f59\', \'#0574ab\', \'#5f4bb6\', \'#86a5d9\', \'#499f68\', \'#34515f\', \'#73c2be\', \'#d7907b\', \'#27476e\'];\n
\n
var tooltip = d3.select("body").append("div").attr("class", "toolTip");\n
\n
var tr = d3.select("#regionTable tbody").selectAll("th")\n
.data(dataByRegion)\n
.enter().append("tr");\n
\n
tr.append("th")\n
.text(function(d) { return d.key; });\n
\n
tr.selectAll("td")\n
.data(function(d) { return extendedKeys.map(function(k) { return d.value[k]}); })\n
.enter().append("td").append("svg")\n
.attr("width", 110)\n
.attr("height", 50)\n
.append("circle")\n
.attr("r", function(d) { return d * 25; })\n
.attr("cx", 55)\n
.attr("cy", 25)\n
.on("mousemove", function(d){\n
tooltip\n
.style("left", d3.event.pageX - 50 + "px")\n
.style("top", d3.event.pageY - 70 + "px")\n
.style("display", "inline-block")\n
.html(\'Value\' + "<br>" + (d));\n
})\n
.on("mouseout", function(d){ tooltip.style("display", "none");});\n
// .attr("width", function(d) { return d * 50; });\n
\n
d3.select("#regionTable tbody")\n
.selectAll("tr")\n
.data(regColors)\n
.style("fill", function(d) {return d});\n
\n
%% css\n
/* Notebook Presentation view settings */\n
@import url(\'https://fonts.googleapis.com/css?family=Roboto:700,900\');\n
.user-markdown h1, .user-markdown h2, .user-markdown h3, .user-markdown h4, .user-markdown h5, .user-markdown h6 {\n
font-family: \'Roboto\';\n
text-transform: uppercase;\n
text-align: center;\n
}\n
\n
.user-markdown p, .user-markdown h1, .user-markdown h2, .user-markdown h3, .user-markdown h4, .user-markdown h5, .user-markdown h6, .user-markdown ol, .user-markdown ul, .user-markdown pre, .user-markdown address, .user-markdown blockquote, .user-markdown dl, .user-markdown div, .user-markdown fieldset, .user-markdown form, .user-markdown hr, .user-markdown noscript, .user-markdown table {\n
max-width: 1080px;\n
}\n
\n
.pane-content {\n
background: #302f33;\n
}\n
.user-markdown a {\n
color: #f0675c;\n
}\n
\n
.user-markdown h1 {\n
font-size: 50px;\n
padding: 30px 0;\n
letter-spacing: 2px;\n
font-weight: 900;\n
}\n
\n
.user-markdown h2 {\n
font-size: 35px;\n
letter-spacing: 2px;\n
padding-top: 35px;\n
}\n
\n
.user-markdown {\n
color: #fefefe;\n
}\n
\n
.tick line {\n
stroke: #ddd;\n
}\n
\n
.tick text{\n
fill: #ddd;\n
}\n
\n
.axis .domain {\n
stroke: #ddd;\n
}\n
\n
#choropleth .cbaxis.crisp text {\n
fill: #fefefe !important;\n
}\n
\n
#choropleth .layer.bg rect {\n
fill-opacity: 0 !important;\n
}\n
\n
.user-markdown table tr {\n
background-color: transparent !important;\n
border-color: #444;\n
}\n
\n
%% js
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>World Happiness Report</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_3</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% fetch\n
js: https://cdnjs.cloudflare.com/ajax/libs/three.js/88/three.min.js\n
blob: rawbrain = https://devinbayly.github.io/host_brain/flatbrain.raw\n
\n
%% md \n
<div id="content">\n
<h1 id="peering-into-the-unknown">Peering into the Unknown</h2>\n
<p>Can you tell what I\'m thinking right now? If you could you would know that I\'m hoping I don\'t have to rewrite this introduction for the third time, but that would make you an uncommon individual. Most people don\'t have the ability to read someone\'s mind let alone the purely physical process of looking into another person\'s head. Those lucky enough to belong to the latter category probably have access to medical imaging technology and someone willing to crawl inside it. The rest of us -- at least for now -- must settle for looking inside my head.</p>\n
<p>Briefly lets tangent into a light background on one particular sort of medical imaging known as MRI. MRI stands for Magnetic Resonance Imaging and you can see a cartoon of one scanner here. The parts of an MRI are roughly as follows: the patient table, which shifts the body part to be scanned into the center of the scanner; the magnetic and radiofrequency transmitter coils; radiofrequency receiver antenna coils.<br />\n
\n
<img src="https://drive.google.com/uc?export=view&id=1ZrwNFCjKlTkc-lC3uJLZSC3h3LkmHn3_" alt="machine" /></p>\n
<p>When the superconducting electromagnet is turned on the hydrogen atoms in the magnetic field align along the axis running through the machine </p><img src="https://drive.google.com/uc?export=view&id=1G9f5lOPDgF5MK8n2ZtvtazEmviOpcow1" alt="machine on" />. \n
<p>The hydrogens are excited by the radio transmitter pulses and flip direction. The hydrogens return to their original direction and emit a radiofrequency signal that\'s picked up by the receivers within the scanner. </p>\n
<img src="https://drive.google.com/uc?export=view&id=1H8BT1w0Od8NF1GyHNIT1G8v0bSYLRKpq" alt="Radio excitation" />\n
<p>The tissue to which the hydrogen belongs influences the rate at which this happens and gives rise to Image contrast. </p>\n
<img src="https://drive.google.com/uc?export=view&id=1EK5PS6T9PEnq_hZDqFejbiErzs2HTgdc" alt="Image Contrast" />\n
</div>\n
\n
## For more educational neuroscience web content explore the [mental landscapes](mental-landscapes.cs.arizona.edu) project. \n
%% md\n
\n
<body>\n
<div id="container">\n
</div>\n
</body>\n
\n
%% js\n
var vShaderText = `\n
#ifdef GL_ES\n
precision highp float;\n
#endif\n
attribute float displacement;\n
varying vec2 vUv;\n
varying vec3 worldcoords;\n
varying vec4 projcoords;\n
void main()\n
{\n
vUv =uv;\n
vec3 newPos = position;\n
//worldcoords = (modelViewMatrix*vec4(position + vec3(0.5,0.5,0.5),1.0)).xyz; //changed slightly from first pass\n
worldcoords =position; //changed slightly from first pass\n
projcoords = projectionMatrix * modelViewMatrix * vec4(newPos,1.0);// this makes it screen coordinates\n
gl_Position = projectionMatrix * modelViewMatrix * vec4(newPos,1.0);\n
}\n
\n
`\n
\n
var fShaderText = `\n
#ifdef GL_ES\n
precision highp float;\n
#endif\n
varying vec2 vUv; \n
varying vec3 worldcoords;\n
varying vec4 projcoords;\n
uniform float shift;\n
uniform float scale;\n
uniform float xshift;\n
uniform sampler2D textyah;\n
uniform vec3 dir;\n
uniform float delta;\n
uniform float alphaCorrection;// not sure what alpha correction is\n
// lebarba code from github volumetric rendering\n
const int MAX_STEPS = 800;\n
// again lebarba code, but with some changes in the z indexing\n
//Acts like a texture3D using Z slices and trilinear filtering.\n
\n
//cpos was originally -6.5 to 6.5\n
vec4 marcher(vec3 cpos) { // cpos is the current position\n
vec3 colorCoords = cpos + shift; // takes position makesonly positive\n
//transforms (13,13,13) to 0-1 ranges\n
colorCoords /=scale;\n
\n
// convinced the problem is teh x\n
colorCoords.x += mod(floor(colorCoords.z*256.0),16.0); // 16 is the number of images on each axis\n
colorCoords.y += floor(colorCoords.z*256.0/16.0);\n
colorCoords/= 16.0;\n
vec4 colorSample = texture2D(textyah,colorCoords.xy);\n
return colorSample;\n
}\n
void main( void ) {\n
//!! I don\'t have the same setup for my alpha because I didn\'t alpha the background image\n
// worldcoords /16.0 will range 0-176 for height 0-240 for width a total of 256 slices so z will only go that high\n
// for each slice we have to move x up by 240 and after 16 of these go down (canvas is zero in top) \n
//gl_FragColor =vec4(colorCoords,1.0);\n
vec4 deepColor = vec4(0.0);// this is the total color through the cube\n
vec4 marchColor;// this is the color at part\n
float alphaSum;\n
//! unsure if this factor allows stepping through from all angles\n
const float mod_factor = sqrt(pow(13.0,2.0) + pow(13.0,2.0))/float(MAX_STEPS); // the sqrt part should be the longest len within the cube\n
vec3 pos = worldcoords;\n
vec3 mod_dir =normalize(pos -dir); // this may need to change depending on the direction we face\n
float dbg;\n
for (float i = 0.0; i < float(MAX_STEPS); i++) {\n
// stop marchin at sides of cube\n
if (pos.x < -6.5|| pos.x > 6.5||\n
pos.y < -6.5|| pos.y > 6.5||\n
pos.z < -6.5|| pos.z > 6.5 ) {\n
break;\n
}\n
\n
marchColor = marcher(pos);\n
if (marchColor.r > .1) { // prevents the black from taking over too much\n
alphaSum += marchColor.a*alphaCorrection;\n
deepColor += marchColor*alphaCorrection;\n
}\n
pos += mod_dir*mod_factor;\n
}\n
gl_FragColor =vec4(deepColor.r,deepColor.g,deepColor.b,alphaSum);\n
//gl_FragColor= vec4(dbg,0,0,1);\n
//gl_FragColor= vec4(mod_dir,1);\n
}\n
`\n
%% fetch\n
js: https://threejs.org/examples/js/controls/OrbitControls.js\n
\n
%% js\n
function changeScale (val) {\n
uniforms.scale.value = new THREE.Vector2(val,val)\n
uniforms.scale.value.needsUpdate = true\n
}\n
var WIDTH = 800,\n
HEIGHT = 600;\n
// set some camera attributes\n
var VIEW_ANGLE = 45,\n
ASPECT = WIDTH / HEIGHT,\n
NEAR = 1,\n
FAR = 1000;\n
// get the DOM element to attach to\n
// - assume we\'ve got jQuery to hand\n
var container = document.getElementById(\'container\');\n
// create a WebGL renderer, camera\n
// and a scene\n
var renderer = new THREE.WebGLRenderer();\n
var camera = new THREE.PerspectiveCamera(\n
VIEW_ANGLE,\n
ASPECT,\n
NEAR,\n
FAR );\n
\n
var scene_first_pass = new THREE.Scene();\n
var scene_second_pass = new THREE.Scene();\n
// the camera starts at 0,0,0 so pull it back\n
// start the renderer\n
renderer.setSize(WIDTH, HEIGHT);\n
// attach the render-supplied DOM element\n
container.append(renderer.domElement);\n
var uniforms ={} \n
var w = 100,\n
h = 100,\n
wsegs= 1,\n
hsegs= 1,\n
halfh = h/2,\n
halfw = w/2\n
var piecew = w/wsegs;\n
var pieceh = h/hsegs;\n
var uvs = []\n
for (var iy = 0;iy < hsegs+1 ;iy++) {\n
for (var ix = 0;ix < wsegs+1;ix++) {\n
uvs.push(ix/wsegs)\n
uvs.push(1-(iy/hsegs))\n
}\n
}\n
var loader = new THREE.TextureLoader()\n
var geo\n
\n
var boxDim = 13\n
var upscale = boxDim\n
var size =(boxDim)**3;\n
var dataDim = [2816,3840]\n
var totalDatapoints =dataDim[0]*dataDim[1] \n
var data = new Uint8Array(totalDatapoints);\n
console.log(size)\n
\n
function rawFetch() {\n
return fetch(\'https://cdn.glitch.com/105e4c0c-a685-402d-9aad-40fb3f0ad94b%2Fflatbrain%20(copy)?1551628542895\')\n
.then(function (res) {\n
return res.arrayBuffer()\n
})\n
.then(function(buf) {\n
return {buf}\n
})\n
}\n
\n
new Response(rawbrain).arrayBuffer().then(texturedata=> {\n
\n
var arr = new Uint8Array(texturedata)\n
texture = new THREE.DataTexture( arr, 240*16,176*16,THREE.LuminanceFormat, THREE.UnsignedByteType );\n
// create the sphere\'s material\n
// not sure yet why this is necessary, maybe backface tells us when to stop the marching?\n
// this connects the first pass and the second passes\n
rtTexture = new THREE.WebGLRenderTarget(HEIGHT,WIDTH,{ minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, wrapS: THREE.ClampToEdgeWrapping, wrapT: THREE.ClampToEdgeWrapping, type: THREE.FloatType, generateMipmaps: false} ); \n
\n
uniforms.textyah = {type:\'t\',value:texture}\n
uniforms.dir = {type:\'v3\',value:camera.position}\n
uniforms.delta = {type:\'1f\',value: .01}\n
uniforms.scale = {type:\'1f\',value:boxDim} // 733 is the ratio for the larger dimension to the smaller\n
uniforms.xshift = {type:\'1f\',value:.5} \n
\n
uniforms.scale.value.needsUpdate = true\n
uniforms.alphaCorrection = {type:\'1f\',value: 0.0080 }\n
uniforms.shift = {type:\'1f\',value:boxDim/2}\n
uniforms.shift.value.needsUpdate = true\n
var shaderMatSecondPass = new THREE.ShaderMaterial({\n
uniforms:uniforms,\n
vertexShader: vShaderText,\n
fragmentShader: fShaderText,\n
side: THREE.FrontSide,\n
transparent:true\n
\n
})\n
// create a new mesh with sphere geometry -\n
// we will cover the sphereMaterial next!\n
// create my uvs\n
geo2 = new THREE.BoxBufferGeometry(boxDim,boxDim,boxDim)\n
var boxmat = new THREE.MeshBasicMaterial({color:\'blue\'})\n
var bufbox2= new THREE.Mesh(geo2,shaderMatSecondPass)\n
// create axis tool to assist in sanity checks\n
// x axis is red, y axis is green z is blue\n
var axis = new THREE.AxesHelper(20)\n
bufbox2.add(axis)\n
//var bufbox2= new THREE.Mesh(geo2,boxmat)// sanity check for secondpass\n
scene_second_pass.add(bufbox2);\n
scene_second_pass.background = new THREE.Color(\'white\')\n
uniforms.textyah.value.needsUpdate = true\n
//scene_first_pass.add(camera);\n
//scene_second_pass.add(camera);\n
// create a rendering loop\n
var frame = 0;\n
//checking rendered textures\n
//bufbox2.rotation.y += 2.5\n
var range = 30\n
camera.position.set(0, -42, 0) // set first view upright\n
function update() {\n
frame += 1\n
camera.position.x =Math.cos(frame * .01)*range; \n
//camera.position.y =(Math.cos(frame * .01)*range + Math.sin(frame*.01)*range)/2; \n
camera.position.z =Math.sin(frame * .01)*range; \n
camera.lookAt(new THREE.Vector3(0,0,0))\n
//bufbox2.rotation.z += .01\n
//bufbox2.rotation.x += .01\n
//renderer.render(scene_first_pass, camera,rtTexture,true);// this will make nothing appear on screen from first render\n
renderer.render(scene_second_pass,camera)\n
uniforms.textyah.value.needsUpdate = true\n
uniforms.dir = {type:\'v3\',value:camera.position}\n
//console.log(camera.position)\n
uniforms.dir.value.needsUpdate = true\n
requestAnimationFrame(update)\n
}\n
requestAnimationFrame(update)\n
})
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Peering into the Unknown</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_4</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% md\n
# Eviction Notices by SF Neighborhood, 1997-present\n
\n
<div id=\'sit-tight\'>\n
<i class="fa fa-circle-o-notch fa-spin fa-5x"></i> \n
<div>Loading the data - sit tight!</div>\n
</div>\n
\n
%% md\n
<canvas id=\'lat-lon\' height=700></canvas>\n
\n
%% fetch\n
js: https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.2/d3.js\n
css: https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\n
js: https://raw.githubusercontent.com/hamilton/ply.js/master/dist/ply.js\n
text: rawData =https://data.sfgov.org/api/views/5cei-gny5/rows.csv?accessType=DOWNLOAD\n
\n
%% fetch\n
// depends on d3 to be loaded first.\n
js: https://cdnjs.cloudflare.com/ajax/libs/metrics-graphics/2.15.6/metricsgraphics.js\n
css: https://cdnjs.cloudflare.com/ajax/libs/metrics-graphics/2.15.6/metricsgraphics.css\n
js: https://gist.githubusercontent.com/hamilton/316c9af12dfbe0ab9b653ecc20dae7f0/raw/mg-smallmultiple.js\n
\n
%% css\n
\n
div#sit-tight {\n
\tmargin-top:30px;\n
\tcolor: lightgray;\n
\tdisplay: block;\n
\ttext-align:center;\n
\ttransition: 100ms;\n
}\n
\n
div#sit-tight div {\n
\tfont-style: italic;\n
\ttext-align:center;\n
}\n
\n
%% js\n
\n
// let\'s clear our little spinner, now that the fetch chunks above have loaded.\n
document.getElementById(\'sit-tight\').innerHTML = \'\'\n
\n
%% css\n
\n
.user-markdown h1 {\n
text-align:center\n
}\n
\n
.small-multiple .mg-y-axis text {\n
font-size:10px;\n
}\n
\n
.small-multiple .mg-x-axis text {\n
font-size:10px;\n
}\n
\n
.small-multiple g.mg-active-datapoint-container tspan {\n
font-size:10px;\n
}\n
\n
.small-multiple .mg-line-legend-color {\n
font-size:10px;\n
}\n
\n
.small-multiple .mg-marker-text {\n
font-size:10px;\n
}\n
\n
.small-multiple g.mg-active-datapoint-container {\n
transform: translate(0px, -20px);\n
}\n
\n
.description {\n
margin: auto;\n
background-color: rgb(245,245,245);\n
text-align:center;\n
padding:8px;\n
font-weight:300;\n
font-style: italic;\n
font-size:12px;\n
}\n
\n
#evictions-by-neighborhood {\n
\tmargin-top:30px;\n
\tmargin-bottom:30px !important;\n
}\n
\n
#lat-lon {\n
margin-top:-90px;\n
margin-bottom:30px;\n
}\n
\n
#padding {\n
\tmargin-bottom: 100px !important;\n
}\n
\n
%% md\n
<div id=\'evictions-by-neighborhood\'>\n
</div>\n
\n
%% md\n
## Motivation\n
\n
The above visualization demonstrates the volume of eviction notices San Francisco, yearly, from 1997 onward, by neighborhood.\n
\n
The dataset is made available by [DataSF](https://data.sfgov.org/Housing-and-Buildings/Eviction-Notices/5cei-gny5), the City of San Francisco\'s data portal. The data updates monthly, maintained by the Rent Arbitration Board.\n
\n
There are many legal reasons for eviction notices - a tenant may fall behind in rent, or perhaps has violated their lease in a way that, to the property owner or manager, merits eviction. In many cases, however, owners pursue various legal means to push out tenants to charge more in rent for a property, or to demolish a building to make way for more dense or more upscale housing. It is no secret that housing prices in San Francisco have skyrocketed past what many residents were previously able to pay, and the consequence of this increased demand and unmatched supply often takes the form of evictions.\n
\n
## Articles that inspired this analysis\n
\n
- [Why S.F. evictions are on the rise](https://www.sfchronicle.com/politics/article/Why-S-F-evictions-are-on-the-rise-6408950.php) (2015)\n
- [San Francisco\'s new pro-tenant rules increased evictions](https://www.bizjournals.com/sanfrancisco/morning_call/2015/07/san-francisco-rent-control-buyout-rules-evictions.html) (2015)\n
- [San Francisco evictions continue to rise each year since 2010](http://www.sfexaminer.com/san-francisco-evictions-continue-rise-year-since-2010/) (2016)\n
\n
<!-- please fix this. I shouldn\'t have to create padding to make this report readable. -->\n
<div id=\'padding\'></div>\n
\n
%% js\n
\n
rawData = d3.csvParse(rawData)\n
\n
%% js\n
var data = rawData.map(d=>{\n
d[\'File Date\'] = d3.timeParse(\'%m/%d/%Y\')(d[\'File Date\'])\n
d.neighborhood = d[\'Neighborhoods - Analysis Boundaries\']\n
delete d[\'Neighborhoods - Analysis Boundaries\']\n
d.fileDate = d[\'File Date\']\n
delete d[\'File Date\']\n
d.supervisorDistrict = d[\'Supervisor District\']\n
delete d[\'Supervisor District\']\n
return d\n
}).filter(d => d.fileDate < new Date(\'2018-06-02\'))\n
\n
%% js\n
var DATA = new Ply(data)\n
\n
%% js\n
\n
var getYear = d => {\n
d.date = new Date(d.fileDate.getFullYear(), 0, 1)\n
return d\n
}\n
\n
var countAndDate = \t{\n
count: arr=>arr.length,\n
date: arr=>arr[0].date\n
}\n
\n
var byYear = DATA.clear()\n
\t.map(getYear)\n
\t.filter((d) => d.neighborhood !== \'\')\n
\t.group(\'neighborhood\', \'date\')\n
\t.reduce(countAndDate)\n
\t.group(\'neighborhood\')\n
\t.transform()\n
\n
var latLon = DATA.clear()\n
\t.filter(d=>d.Location.length)\n
\t.map(d=>{\n
let d2 = {}\n
let location = d.Location.split(\', \')\n
d2.lat = +location[0].slice(1)\n
d2.lon = +location[1].slice(0, -1)\n
return d2\n
}).transform()\n
\n
\n
%% js\n
\n
Object.keys(byYear).forEach(n=> {\n
byYear[n] = byYear[n].map(d=> {\n
d.date = new Date(d.date)\n
return d\n
})\n
})\n
%% raw\n
overall\n
// eviction rates by neighborhood\n
// eviction rates by supervisor\n
block most likely to have evictions\n
eviction rates by type\n
\n
%% js\n
var sm = new SmallMultiple({\n
width: 800,\n
target: \'#evictions-by-neighborhood\',\n
label: \'evictions-by-neighborhood\',\n
cols: 5,\n
left:30,\n
titleFontSize: 12,\n
cellHeaderHeight: 16,\n
showOnlyFirstXAxis: true,\n
titleTextAlign:\'center\'\n
})\n
\n
var neighborhoods = Object.keys(byYear).map(d=>{\n
let sum = Ply.sum(\'count\')(byYear[d])\n
return [sum, d]\n
})\n
neighborhoods.sort((a,b)=>{\n
return b[0] - a[0]\n
})\n
neighborhoods = neighborhoods.map(d=>d[1]).slice(0,15)\n
\n
var maxY = Math.max(...neighborhoods.map(d=> Math.max(...byYear[d].map(di=>di.count)) )) * 1.1\n
\n
neighborhoods.forEach(neighborhood=>{\n
let yearData = byYear[neighborhood]\n
sm.plot({\n
titleText: neighborhood,\n
//mainNumber: Ply.sum(\'count\')(yearData),\n
data: yearData,\n
x_accessor: \'date\',\n
y_accessor: \'count\',\n
xax_count:3,\n
max_y: maxY,\n
area: false,\n
\tlinked: true,\n
min_x: new Date(\'1996-12-31\'),\n
mouseover_align:\'center\',\n
x_rollover_format: \'%Y \',\n
y_rollover_format: function(d) { return d.count + \' notices\'},\n
})\n
})\n
\n
%% js\n
var PIXEL_RATIO = (function () {\n
var ctx = document.createElement("canvas").getContext("2d"),\n
dpr = window.devicePixelRatio || 1,\n
bsr = ctx.webkitBackingStorePixelRatio ||\n
ctx.mozBackingStorePixelRatio ||\n
ctx.msBackingStorePixelRatio ||\n
ctx.oBackingStorePixelRatio ||\n
ctx.backingStorePixelRatio || 1;\n
\n
return dpr / bsr;\n
})();\n
\n
var canvas = document.getElementById(\'lat-lon\')\n
var w = 700\n
var h = 700\n
\n
canvas.width = w * PIXEL_RATIO;\n
canvas.height = h * PIXEL_RATIO;\n
canvas.style.width = w + "px";\n
canvas.style.height = h + "px";\n
canvas.getContext("2d").setTransform(PIXEL_RATIO, 0, 0, PIXEL_RATIO, 0, 0);\n
\n
var pl = (ar, f) => ar.map((d)=>d[f])\n
var dom = (ar, f) => [Math.min(...pl(ar, f)), Math.max(...pl(ar, f))]\n
\n
var latDom = dom(latLon, \'lat\')\n
latDom.reverse()\n
var lonDom = dom(latLon, \'lon\')\n
\n
//var xs = d3.scaleLinear().domain([-123.51+.7, -122.56+.7]).range([0,w])\n
//var ys = d3.scaleLinear().domain([37.90, 37.35]).range([0,h])\n
var xs = d3.scaleLinear().domain(lonDom).range([0,w])\n
var ys = d3.scaleLinear().domain(latDom).range([0,h])\n
\n
var ctx = canvas.getContext(\'2d\')\n
ctx.imageSmoothingEnabled = true;\n
let noise = (amt=4) => (Math.random() -.5) * amt\n
function circle(x,y,group) {\n
ctx.beginPath()\n
ctx.arc(x + noise(), y + noise(), 1, 0, Math.PI * 2, true)\n
ctx.fillStyle = \'rgba(250,0,0,.5)\'\n
ctx.fill()\n
ctx.closePath()\n
}\n
\n
function draw() {\n
\tctx.clearRect(0, 0, w, h)\n
\tlatLon.forEach((d)=>{ \n
circle(xs(d.lon), ys(d.lat)) \n
}) \n
}\n
draw()\n
dom(latLon, \'lon\')
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Eviction Notices by SF Neighborhood, 1997-present</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_5</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% md\n
# Pyodide 🐍\n
\n
Pyodide brings the Python runtime to the browser via WebAssembly, along with NumPy, Pandas, Matplotlib, parts of SciPy, and NetworkX.\n
\n
press `shift+enter` to step through this notebook.\n
\n
%% raw\n
\n
As you can see, some basic parts of Python work as you might expect. To use Python, just use the `%% py` delimiter in your editor, and hit `shift+enter` to evaluate. Your browser will then go off to grab Python & initialize it.\n
\n
%% py\n
# python\n
import sys\n
sys.version\n
\n
%% raw\n
\n
It also does the parts you might be surprised by! Try evaluating the chunk below (`shift+enter`).\n
\n
%% py\n
import antigravity\n
\n
%% raw\n
\n
Pyodide performs quick translation of data types into javascript, so there is one clear interface for accessing data and representing it.\n
\n
%% py\n
[0, 1, 32.0, \'foo\', {\'a\': 10, \'b\': \'20\'}]\n
\n
%% raw\n
## Using Javascript from Python\n
\n
We\'ve built ways of importing anything from javascript land into python. Here, we\'ll import `document`, which should be familiar to javascript web developers everywhere, and use its APIs to manipulate a DOM element.\n
\n
Note that Markdown allows embedding of inline HTML, so we\'ll add target element in a Markdown block.\n
\n
%% md\n
#### Here\'s a DOM element to manipulate:\n
<div id="targetElement">Change me!</div>\n
\n
%% py\n
from js import document\n
elt = document.getElementById("targetElement")\n
elt.innerText = "I am changed!"\n
elt.style.backgroundColor = \'#ffcccc\'\n
\n
%% py\n
# let\'s switch it back\n
elt.style.backgroundColor = \'#ffffff\'\n
\n
%% raw\n
\n
Because we _have_ direct access to the DOM, we can do fun things like make UI widgets.\n
\n
Run the code chunk below (`shift+enter`) and then click on the "Report Preview" tab on the top right. This report preview should render everything you see in these `%% md` chunks, as well as a button. The code you just ran below generated that button. Take a look at what the code does, and then click the button.\n
\n
Don\'t forget to switch back to the "Console" view when you\'re finished here - we have more to show you.\n
\n
%% py\n
from js import iodide\n
button = iodide.output.element(\'button\')\n
button.textContent = "Click me!"\n
count = 0\n
def onclick(evt):\n
global count\n
if elt.style.backgroundColor == \'rgb(255, 255, 255)\':\n
elt.style.backgroundColor = \'#ffcccc\'\n
elt.innerText = "I\'ve been changed " + str(count) + " times!"\n
else:\n
elt.style.backgroundColor = \'#ffffff\'\n
elt.innerText = "I\'ve been changed " + str(count) + " times!"\n
count += 1\n
button.addEventListener(\'click\', onclick)\n
\n
%% raw\n
Or really make use of event callbacks to build a simple painting canvas...\n
\n
%% css\n
canvas {\n
border: 2px solid #ddd;\n
}\n
\n
%% py\n
from js import document, iodide\n
\n
canvas = iodide.output.element(\'canvas\')\n
canvas.setAttribute(\'width\', 450)\n
canvas.setAttribute(\'height\', 300)\n
context = canvas.getContext("2d")\n
context.strokeStyle = "#df4b26"\n
context.lineJoin = "round"\n
context.lineWidth = 8\n
pen = False\n
lastPoint = (0, 0)\n
\n
def onmousemove(e):\n
global lastPoint\n
if pen:\n
newPoint = (e.offsetX, e.offsetY)\n
context.beginPath()\n
context.moveTo(lastPoint[0], lastPoint[1])\n
context.lineTo(newPoint[0], newPoint[1])\n
context.closePath()\n
context.stroke()\n
lastPoint = newPoint\n
\n
def onmousedown(e):\n
global pen, lastPoint\n
pen = True\n
lastPoint = (e.offsetX, e.offsetY)\n
\n
def onmouseup(e):\n
global pen\n
pen = False\n
\n
canvas.addEventListener(\'mousemove\', onmousemove)\n
canvas.addEventListener(\'mousedown\', onmousedown)\n
canvas.addEventListener(\'mouseup\', onmouseup)\n
\n
%% raw\n
Using Python from Javascript\n
\n
So far so good, but wouldn\'t it be great to use Python from within Javascript as well? When you load Pyodide, you\'ll get `pyodide` in the JS namespace, which lets you import anything on the Py side.\n
\n
%% py\n
# python\n
class Foo:\n
\tdef __init__(self, val):\n
\t\tself.val = val\n
foo = Foo(42)\n
foo\n
%% js\n
// javascript\n
var foo = pyodide.pyimport("foo")\n
foo.val\n
\n
%% raw\n
## The Scientific libraries\n
\n
The real power of Pyodide comes from its scientific computing libraries. So far we\'ve compiled numpy, pandas, matplotlib, parts of scipy, and networkx. At the top of any py chunk, simply write something like `import numpy as np` and run the chunk, and it\'ll begin the process of grabbing numpy.\n
\n
\n
%% py\n
import numpy as np\n
x = np.linspace(0, 2.0 * np.pi, 100)\n
y = np.sin(x)\n
y\n
\n
%% raw\n
\n
Matplotlib defaults to printing into the report preview, so you can run the code chunk below and see the plot. It\'s easy to drag around the plot, zoom in, and zoom out, all pretty effortlessly.\n
\n
%% py\n
from matplotlib import pyplot as plt\n
plt.figure()\n
plt.plot(x, y)\n
plt.show()\n
\n
%% raw\n
\n
It should be clear by now that Pyodide makes it so you don\'t have to choose only one library, nor do you have to choose one language to do your data science. Let\'s download Plotly and create the same graph, but send Plotly over to Python and plot it from within python itself.\n
\n
Switch back to the console, and run the `%% fetch` chunk below (which fetches Plotly from a cdn), then run the `%% py` chunk below that, and switch back to the report view.\n
\n
%% fetch\n
js: https://cdn.plot.ly/plotly-latest.min.js\n
\n
\n
%% py\n
from js import Plotly\n
from js import iodide\n
Plotly.plot(\n
iodide.output.element(\'div\'),\n
[{ \'y\': y, \'x\': x }],\n
)
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>A Brief Tour through Pyodide</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_6</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% raw\n
__ __ ___ _ ___ ___ __ __ ___ \n
\\ \\ / / | __| | | / __| / _ \\ | \\/ | | __|\n
\\ \\/\\/ / | _| | |__ | (__ | (_) | | |\\/| | | _| \n
\\_/\\_/ |___| |____| \\___| \\___/ |_| |_| |___|\n
\n
_____ ___ \n
|_ _| / _ \\ \n
| | | (_) |\n
|_| \\___/ \n
\n
___ ___ ___ ___ ___ ___ \n
|_ _| / _ \\ | \\ |_ _| | \\ | __|\n
| | | (_) | | |) | | | | |) | | _| \n
|___| \\___/ |___/ |___| |___/ |___|\n
\n
\n
\n
Let\'s get started! You can just start trying things out, or you can follow the steps described below to get a quick introduction. Just read along and click or enter keystrokes when instructed.\n
\n
The first thing you\'ll need to know is how to navigate within the notebook. An iodide notebook is one flat text file in a format we call JSMD. Each cell is delimited by `%%`, and that means you can easily add cells just by typing those two characters on a new line. This cell, for instance, has `%% raw`, which means it\'s a raw cell. Raw cells are useful for taking notes and leaving comments in your notebook.\n
\n
Right below this is `%% js` which is a javascript cell.\n
\n
Click somewhere in the javascript cell right below this one, and hit `shift+enter`. This will evaluate whatever chunk your cursor is on. Notice in the console to the right, you\'ll see the code and the output.\n
\n
%% js\n
\n
var tableSize = 10\n
var range = []\n
for (let i=0; i<tableSize; i++){range.push(i)}\n
var A = range.map( (x,i) => range.map( (y,j) => (Math.random() + i + j )))\n
A\n
\n
%% raw\n
\n
This entire buffer is a single text editor, so you can add `%% js` or `%% raw` (or any of our cell types) at any point (starting with a new line) and that automatically creates a new cell.\n
\n
%% raw\n
\n
There is another kind of cell - `%% md`, the _Markdown cell_. The contents of this cell renders in the "Report Preview" pane. You don\'t have to evaluate it the way you did the `js` cell. \n
\n
Click the tab next to "Console", titled "Report Preview" in the top right to see that pane. \n
\n
Markdown cells are where the output of your data analysis will live. It\'s your way of separating your exploratory code with your final explanation.\n
\n
Try editing parts of the markdown cell directly below, and watch it live-update in the Report Preview. When you\'re done, click on the "Console" tab again - we\'re going to need it in a minute.\n
\n
%% md \n
\n
# My First Iodide Notebook ~~~\n
\n
Try editing this line. It\'s easy!\n
\n
<img src=\'https://media.giphy.com/media/lcjNHIJilbfGOdqIkd/giphy.gif\' width=250 style="display: block; margin: auto; margin-bottom:20px" />\n
\n
Markdown cells support the full range of normal markdown formatting, like _multiple_ **levels** of ***emphasis***,\n
## headings \n
### of different\n
#### sizes\n
\n
```\n
and multiline raw text blocks\n
```\n
\n
Markdown cells also support LaTeX, like this:\n
\n
$$\n
\\left[\\begin{array}{c}\n
\\mathbf{x}_{t,i}\\\\\n
\\mathbf{v}_{t,i}\\\\\n
\\theta_{t,i}\\\\\n
\\omega_{t,i}\n
\\end{array}\\right] = \\left[\\begin{array}{c}\n
\\mathbf{x}_{t-1,i}\\\\\n
\\mathbf{v}_{t-1,i}\\\\\n
\\theta_{t-1,i}\\\\\n
\\omega_{t-1,i}\n
\\end{array}\\right]+\\Delta\\left[\\begin{array}{c}\n
\\mathbf{v}_{t-1,i}\\\\\n
\\left(T_{t,i}+\\epsilon_{T}\\right)cos\\left(\\theta_{t-1,i}\\right)-\\rho_{\\mathbf{v}}\\left\\Vert \\mathbf{v}_{t-1,i}\\right\\Vert ^{2}\\frac{\\mathbf{v}_{t-1,i}}{\\left\\Vert \\mathbf{v}_{t-1,i}\\right\\Vert }\\\\\n
\\left(T_{t,i}+\\epsilon_{T}\\right)sin\\left(\\theta_{t-1,i}\\right)-\\rho_{\\mathbf{v}}\\left\\Vert \\mathbf{v}_{t-1,i}\\right\\Vert ^{2}\\frac{\\mathbf{v}_{t-1,i}}{\\left\\Vert \\mathbf{v}_{t-1,i}\\right\\Vert }\\\\\n
\\omega_{t-1,i}\\\\\n
Y_{t,i}-\\rho_{\\omega}\\omega_{t-1,i}^{2}+\\epsilon_{Y}\n
\\end{array}\\right]\n
$$\n
\n
%% raw\n
\n
The cell below this is an fetch cell, which allows you to load external libraries, css, and even data. It can be evaluated just like any other cell with `ctrl+enter` or `shift+enter`.\n
\n
When a resource is successfully loaded, you will see `SUCCESS` printed in the console. If a resource fails to load, then you will see `ERROR`.\n
\n
Let\'s go ahead and load the library "three.js", which we\'ll use a little farther below.\n
\n
%% fetch\n
// click inside this chunk and hit shift+enter to load the resource\n
js: https://cdnjs.cloudflare.com/ajax/libs/three.js/88/three.min.js\n
\n
%% raw\n
\n
Ok! Time to do something interesting with three.js.\n
\n
%% md\n
\n
You can also use in-line html, which is very handy for creating DOM elements within the flow of a narrative that you can then manipulate. This is great for adding plots and figures.\n
\n
Let\'s create a `div` right below:\n
\n
<div id="totalRows"></div>\n
<div id="spinningThing"></div>\n
\n
...in a moment, we\'ll put something fancy right above this line.\n
\n
%% js\n
// We\'ll now define a real JS function that does something cool.\n
// Go ahead and evaluate this cell.\n
\n
// first off, let\'s clear the div where we draw, just in case.\n
document.getElementById(\'spinningThing\').innerHTML = \'\'\n
\n
function spinCubeInTarget(targetSelector) {\n
//\'use strict\';\n
var width = 600, height = 400\n
var scene = new THREE.Scene();\n
var camera = new THREE.PerspectiveCamera(75, \n
\t\twidth/height, 0.1, 100);\n
var renderer = new THREE.WebGLRenderer();\n
renderer.setSize(width, height);\n
\tconst COLOR = 0xFFFFFF\n
const LIGHT = 0xFFFFFF\n
\n
\tdocument.body\n
\t\t.querySelector(targetSelector)\n
\t\t.appendChild(renderer.domElement);\n
var geometry = new THREE.CubeGeometry(5, 5, 5);\n
var material = new THREE.MeshLambertMaterial({color: COLOR });\n
var cube = new THREE.Mesh(geometry, material);\n
scene.add(cube);\n
camera.position.z = 12; \n
var pointLight = new THREE.PointLight(LIGHT);\n
pointLight.position.z = 130;\n
scene.add(pointLight);\n
var reqAnimFrame = window.requestAnimationFrame\n
var render = function() {\n
reqAnimFrame(render);\n
var delta = (Math.random()/10) * (0.06 - 0.02) + 0.03;\n
cube.rotation.x += delta;\n
cube.rotation.y += delta;\n
renderer.render(scene, camera);\n
};\n
render();\n
}\n
\n
spinCubeInTarget("#spinningThing")\n
\n
%% raw\n
If you followed all the steps described, you should now see a cube spinning in the markdown cell above!\n
\n
Note that if you make any changes to that markdown cell, you will have to re-run the function `spinCubeInTarget("#targetDiv")`, because each time you change a markdown cell it\'s contents have to be regenerated, which will overwrite changes you\'ve made to it with code.\n
\n
%% raw\n
\n
One last cell type - `%% css`. This lets you change the styles of your presentation in realtime. Select the "Report Preview" tab on the top right, and then uncomment the css in the code below.\n
\n
%% css\n
/* remove the comments here */\n
/* \n
.user-markdown {\n
\tfont-style: italic;\n
} \n
*/\n
\n
%% md\n
\n
## to summarize:\n
\n
Ok! Let\'s end this notebook with a markdown cell. With all of these tools, you\'re ready to get started! For review, we covered the following tools:\n
\n
1. `raw` cells - make notes, add comments\n
2. `js` cells - run javascript code\n
3. `fetch` cells - grab libraries, external stylesheets, and data sets\n
4. `md` cells - write your report, add DOM elements, etc.\n
5. `css` cells - style your report\n
\n
For next steps, try these:\n
\n
- [JSMD Docs](https://iodide-project.github.io/docs/jsmd/)\n
- [Using Python in Iodide](https://github.com/iodide-project/pyodide/tree/master/docs)\n
- [Check out our example data analysis notebooks](https://iodide.io)
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>A Tour of an Iodide Notebook</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Notebook" 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>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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</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>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>romain_notebook_svg</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Notebook</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
%% md\n
# SVG Creator\n
\n
%% fetch\n
js: ./domsugar.js\n
js: ./jiodev.js\n
\n
%% js\n
\n
var SVG_NS = "http://www.w3.org/2000/svg",\n
TEXT_COLOR = \'#FFF\';\n
\n
function createBoxTemplateElement(id, width, height, text_height) {\n
return domsugar(document.createElementNS(SVG_NS, \'svg\'), {\n
id: id,\n
width: width + \'em\',\n
height: height + \'em\'\n
}, [\n
domsugar(document.createElementNS(SVG_NS, \'g\'), {\n
stroke: "#000",\n
"stroke-width": 3,\n
}, [\n
domsugar(document.createElementNS(SVG_NS, \'rect\'), {\n
width: width + \'em\',\n
height: height + \'em\',\n
fill: "#FFFFCC"\n
}),\n
domsugar(document.createElementNS(SVG_NS, \'rect\'), {\n
width: width + \'em\',\n
height: text_height + \'em\',\n
fill: "#333366"\n
})\n
])\n
]);\n
}\n
\n
function createPortalTypeTemplateElement(portal_type, template_id, element_id, width, height) {\n
var element;\n
element = domsugar(document.createElementNS(SVG_NS, \'svg\'), {\n
id: element_id,\n
width: width + \'em\',\n
height: height + \'em\'\n
}, [\n
domsugar(document.createElementNS(SVG_NS, \'g\'), {\n
}, [\n
domsugar(document.createElementNS(SVG_NS, \'use\'), {\n
"xlink:href": "#" + template_id,\n
// "fill": "#00F",\n
// "stroke": "orange",\n
// "stroke-width": "5px"\n
}),\n
domsugar(document.createElementNS(SVG_NS, \'text\'), {\n
// textLength: TEXT_WIDTH + \'em\',\n
y: \'1.8em\',\n
x: \'0.5em\',\n
"font-size": "1em",\n
text: portal_type,\n
fill: TEXT_COLOR\n
}),\n
])\n
]);\n
return element;\n
}\n
\n
function useTemplateElement(template_id, x, y) {\n
return domsugar(document.createElementNS(SVG_NS, \'use\'), {\n
"xlink:href": "#" + template_id,\n
x: x + \'em\',\n
y: y + \'em\'\n
});\n
}\n
\n
function drawArrow(source_x, source_y, destination_x, destination_y,\n
box_side, arrow_location, text, width, height) {\n
var x1,\n
y1,\n
x2,\n
y2,\n
x3,\n
y3,\n
tx = 1,\n
ty = 1,\n
margin = 0.1,\n
text_margin = 0.25,\n
element_list = [],\n
marker_end,\n
stroke_options;\n
\n
if (box_side === \'top\') {\n
x1 = source_x + 0.5;\n
y1 = source_y;\n
x2 = x1;\n
if (source_x === destination_x) {\n
x3 = x1;\n
// Always put the end line at the bottom\n
y2 = destination_y + 1 + margin;\n
} else if (source_x < destination_x) {\n
// End arrow on the left side of the destination\n
x3 = destination_x - margin;\n
y2 = destination_y + 0.5;\n
} else {\n
// End arrow on the right side of the destination\n
x3 = destination_x + 1 + margin;\n
y2 = destination_y + 0.5;\n
}\n
y3 = y2;\n
y1 -= margin;\n
tx = x1 + margin;\n
ty = y2 + text_margin;\n
} else if (box_side === \'bottom\') {\n
x1 = source_x + 0.5;\n
y1 = source_y + 1;\n
x2 = x1;\n
if (source_x === destination_x) {\n
x3 = x1;\n
// Always put the end line at the bottom\n
y2 = destination_y - margin;\n
} else if (source_x < destination_x) {\n
x3 = destination_x - margin;\n
y2 = destination_y + 0.5;\n
} else {\n
x3 = destination_x + 1 + margin;\n
y2 = destination_y + 0.5;\n
}\n
y3 = y2;\n
y1 += margin;\n
tx = x1 + margin;\n
ty = y2 - text_margin;\n
} else if (box_side === \'right\') {\n
x1 = source_x + 1;\n
y1 = source_y + 0.5;\n
y2 = y1;\n
if (source_y === destination_y) {\n
y3 = y1;\n
// Always put the end line at the bottom\n
x2 = destination_x - margin;\n
} else if (source_y < destination_y) {\n
// End arrow on the left side of the destination\n
y3 = destination_y - margin;\n
x2 = destination_x + 0.5;\n
} else {\n
// End arrow on the left side of the destination\n
y3 = destination_y + 1 + margin;\n
x2 = destination_x + 0.5;\n
}\n
x3 = x2;\n
x1 += margin;\n
tx = x1 + margin;\n
ty = y1 + margin;\n
} else if (box_side === \'left\') {\n
x1 = source_x;\n
y1 = source_y + 0.5;\n
y2 = y1;\n
if (source_y === destination_y) {\n
y3 = y1;\n
// Always put the end line at the bottom\n
x2 = destination_x + 1 + margin;\n
} else if (source_y < destination_y) {\n
// End arrow on the left side of the destination\n
y3 = destination_y - margin;\n
x2 = destination_x + 0.5;\n
} else {\n
// End arrow on the left side of the destination\n
y3 = destination_y + 1 + margin;\n
x2 = destination_x + 0.5;\n
}\n
x3 = x2;\n
x1 -= margin;\n
tx = x2 + margin;\n
ty = y1 + margin;\n
} else {\n
throw new Error(\'not supported box side \' + box_side);\n
}\n
\n
if (arrow_location === \'end\') {\n
marker_end = "url(#arrowhead)";\n
stroke_options = {\n
stroke: "#4C1900",\n
"stroke-width": "4",\n
"stroke-dasharray": "10,5"\n
};\n
} else if (arrow_location === \'parent\') {\n
marker_end = null;\n
stroke_options = {\n
stroke: "black",\n
"stroke-width": "2",\n
};\n
} else {\n
throw new Error(\'Unsupported arrow_location: \' + arrow_location);\n
}\n
\n
if ((x2 === x3) && (y2 === y3)) {\n
element_list = [\n
domsugar(document.createElementNS(SVG_NS, \'line\'), {\n
x1: x1 * width + \'em\',\n
y1: y1 * height + \'em\',\n
x2: x2 * width + \'em\',\n
y2: y2 * height + \'em\',\n
"marker-end": marker_end\n
})\n
];\n
} else {\n
element_list = [\n
domsugar(document.createElementNS(SVG_NS, \'line\'), {\n
x1: x1 * width + \'em\',\n
y1: y1 * height + \'em\',\n
x2: x2 * width + \'em\',\n
y2: y2 * height + \'em\',\n
}),\n
domsugar(document.createElementNS(SVG_NS, \'line\'), {\n
x1: x2 * width + \'em\',\n
y1: y2 * height + \'em\',\n
x2: x3 * width + \'em\',\n
y2: y3 * height + \'em\',\n
"marker-end": marker_end\n
})\n
];\n
}\n
\n
// Display the related text\n
if (text) {\n
element_list.push(\n
domsugar(document.createElementNS(SVG_NS, \'text\'), {\n
// textLength: TEXT_WIDTH + \'em\',\n
// y: ty * width + \'em\',\n
// x: tx * width + \'em\',\n
"font-size": "1em",\n
// text: text,\n
stroke: \'none\'\n
}, text.split(\' \').map(function (word, i) {\n
return domsugar(document.createElementNS(SVG_NS, \'tspan\'), {\n
text: word,\n
x: tx * width + \'em\',\n
y: (ty * height) + i + \'em\'\n
});\n
}))\n
);\n
}\n
\n
return domsugar(document.createElementNS(SVG_NS, \'g\'), stroke_options, element_list);\n
}\n
\n
function createSVG(definition) {\n
var xml_document,\n
i,\n
max_string_length,\n
element_list,\n
BOX_TEMPLATE_ID = \'box_template\',\n
// grid_cell_size = PORTAL_TYPE_WIDTH,\n
node_list = definition.node_list,\n
arrow_list = definition.arrow_list,\n
box_width,\n
box_heigth,\n
max_grid_x,\n
max_grid_y,\n
NODE_ID_PREFIX = \'node_template_\',\n
node_location_dict = {},\n
IMAGE_MARGIN = 0.25;\n
\n
// calculate the max length\n
max_string_length = 0;\n
for (i = 0; i < node_list.length; i += 1) {\n
max_string_length = Math.max(max_string_length, node_list[i][0].length);\n
}\n
\n
// create all node boxes as SVG templates\n
// The idea is to be able to reuse a box multiple time on the drawing\n
// without increasing the svg size too much\n
// Add 2 as left/right padding for the text\n
box_width = (max_string_length / 2) + 2;\n
box_height = 8;\n
element_list = [\n
createBoxTemplateElement(BOX_TEMPLATE_ID, box_width, box_height, 3)\n
];\n
for (i = 0; i < node_list.length; i += 1) {\n
element_list.push(\n
createPortalTypeTemplateElement(node_list[i][0], BOX_TEMPLATE_ID,\n
NODE_ID_PREFIX + i, box_width, box_height)\n
);\n
}\n
// Create arrow markers\n
element_list.push(\n
domsugar(document.createElementNS(SVG_NS, \'marker\'), {\n
id: "arrowhead",\n
markerWidth: "10",\n
markerHeight: "7",\n
refX: "8",\n
refY: "3.5",\n
orient: "auto",\n
stroke: "#4C1900",\n
fill: "#4C1900",\n
}, [\n
domsugar(document.createElementNS(SVG_NS, \'polygon\'), {\n
points: "0 0, 10 3.5, 0 7"\n
})\n
]),\n
);\n
\n
// Create the defs part\n
element_list = [\n
domsugar(document.createElementNS(SVG_NS, \'defs\'), element_list),\n
];\n
\n
// Draw boxes\n
max_grid_x = 0;\n
max_grid_y = 0\n
for (i = 0; i < node_list.length; i += 1) {\n
max_grid_x = Math.max(max_grid_x, node_list[i][1]);\n
max_grid_y = Math.max(max_grid_y, node_list[i][2]);\n
node_location_dict[node_list[i][0]] = [node_list[i][1], node_list[i][2]];\n
element_list.push(\n
useTemplateElement(NODE_ID_PREFIX + i, (node_list[i][1] + IMAGE_MARGIN) * box_width,\n
(node_list[i][2] + IMAGE_MARGIN) * box_height)\n
);\n
}\n
\n
// Draw arrows before the boxes, so they are "behind"\n
for (i = arrow_list.length - 1; i >= 0; i -= 1) {\n
element_list.unshift(\n
drawArrow(\n
node_location_dict[arrow_list[i][1]][0] + IMAGE_MARGIN,\n
node_location_dict[arrow_list[i][1]][1] + IMAGE_MARGIN,\n
node_location_dict[arrow_list[i][3]][0] + IMAGE_MARGIN,\n
node_location_dict[arrow_list[i][3]][1] + IMAGE_MARGIN,\n
arrow_list[i][0],\n
arrow_list[i][2],\n
arrow_list[i][4],\n
box_width,\n
box_height\n
)\n
);\n
}\n
\n
// Background\n
element_list.unshift(\n
domsugar(document.createElementNS(SVG_NS, \'rect\'), {\n
width: "100%",\n
height: "100%",\n
fill: "white"\n
})\n
);\n
\n
xml_document = document.createElementNS("http://www.w3.org/2000/svg",\n
"svg");\n
domsugar(xml_document, {\n
width: box_width * (max_grid_x + 1 + 2 * IMAGE_MARGIN) + \'em\',\n
height: box_height * (max_grid_y + 1 + 2 * IMAGE_MARGIN) + \'em\',\n
baseProfile: \'full\',\n
version: \'1.1\',\n
"xmlns:xlink": "http://www.w3.org/1999/xlink"\n
}, element_list);\n
\n
return (new XMLSerializer()).serializeToString(xml_document);\n
}\n
\n
function attachSVG(id, definition) {\n
return new RSVP.Queue(jIO.util.readBlobAsDataURL(\n
new Blob([createSVG(definition)],\n
{type : \'image/svg+xml\'})\n
))\n
.push(function (evt) {\n
var data_url = evt.target.result;\n
domsugar(document.querySelector(\'#\' + id), {src: data_url});\n
});\n
}\n
\n
\n
%% md\n
\n
## Cloud\n
\n
<img id=\'img_cloud\'/>\n
\n
%% js\n
\n
attachSVG(\'img_cloud\', {\n
node_list: [\n
["Person", 2, 0],\n
["Software Installation", 0, 1],\n
["Computer", 2, 2],\n
["Computer Partition", 2, 4],\n
["Hosting Subscription", 4, 0],\n
["Software/Slave Instance", 5, 2]\n
],\n
arrow_list: [\n
["top", "Software Installation", "end", "Person", "destination_section"],\n
["top", "Computer", "end", "Person", "source_administration"],\n
["left", "Hosting Subscription", "end", "Person", "destination_section"],\n
["bottom", "Software Installation", "end", "Computer", "aggregate"],\n
["bottom", "Software/Slave Instance", "end", "Computer Partition", "aggregate"],\n
["top", "Software/Slave Instance", "end", "Hosting Subscription", "specialise"],\n
["bottom", "Hosting Subscription", "end", "Software/Slave Instance", "predecessor"],\n
["top", "Computer Partition", "parent", "Computer"],\n
// TODO ["bottom", "Software/Slave Instance", "end", "Software/Slave Instance", "predecessor"],\n
]\n
});\n
\n
%% md\n
\n
## Consumption Eco\n
\n
<img id=\'img_consumption_eco\'/>\n
\n
%% js\n
\n
attachSVG(\'img_consumption_eco\', {\n
node_list: [\n
["Computer", 0, 0],\n
["Consumption Document", 0, 2],\n
["Sale Packing List", 2, 1],\n
["Sale Packing List Line", 2, 3],\n
["Person", 4, 2],\n
["Organisation", 4, 0]\n
],\n
arrow_list: [\n
["top", "Consumption Document", "end", "Computer", "contribution"],\n
["right", "Sale Packing List", "end", "Person", "destination_decision destination"],\n
["right", "Sale Packing List Line", "end", "Person", "destination_decision destination_section"],\n
["top", "Sale Packing List Line", "parent", "Sale Packing List"],\n
["top", "Sale Packing List", "end", "Organisation", "source source_section destination_section"],\n
]\n
});\n
\n
%% md\n
\n
## CRM\n
\n
<img id=\'img_crm\'/>\n
\n
%% js\n
\n
attachSVG(\'img_crm\', {\n
node_list: [\n
["Person (user)", 0, 0],\n
["Person (agent)", 2, 0],\n
["Organisation", 4, 0],\n
["Hosting Subscription", 6, 0],\n
["Support Request", 4, 2],\n
["Notification Message", 0, 3],\n
["Event", 2, 3],\n
["Incident Response", 6, 4],\n
],\n
arrow_list: [\n
["left", "Support Request", "end", "Person (user)", "destination_decision"],\n
["left", "Support Request", "end", "Person (agent)", "source_decision"],\n
["top", "Support Request", "end", "Organisation", "source source_section source_trade"],\n
["right", "Support Request", "end", "Hosting Subscription", "aggregate"],\n
["right", "Event", "end", "Support Request", "follow_up"],\n
["bottom", "Support Request", "end", "Incident Response", "follow_up"],\n
]\n
});\n
\n
%% md\n
\n
## Invoicing\n
\n
<img id=\'img_invoicing\'/>\n
\n
%% js\n
\n
attachSVG(\'img_invoicing\', {\n
node_list: [\n
["Organisation", 0, 0],\n
["Person", 2, 0],\n
["Sale Packing List", 0, 2],\n
["Sale Invoice Transaction", 3, 2],\n
["Payment", 5, 2],\n
["Applied Rule", 0, 4],\n
],\n
arrow_list: [\n
["top", "Sale Packing List", "end", "Organisation", "source_section"],\n
["right", "Sale Packing List", "end", "Person", "source destination destination_section"],\n
["top", "Applied Rule", "end", "Sale Packing List", "causality"],\n
]\n
});\n
\n
%% md\n
\n
## Subscription\n
\n
<img id=\'img_subscription\'/>\n
\n
%% js\n
\n
attachSVG(\'img_subscription\', {\n
node_list: [\n
["Business Process", 6, 0],\n
["Sale Trade Condition", 4, 0],\n
["Person", 0, 0],\n
["Organisation", 0, 2],\n
["Open Sale Order", 2, 2],\n
["Open Sale Order Line", 2, 4],\n
["Hosting Subscription", 4, 4],\n
["Applied Rule", 4, 6],\n
["Subscription Item Root Sim. Rule", 2, 6],\n
["Simulation Movement", 6, 6],\n
["Sale Packing List", 6, 2],\n
["Sale Packing List Line", 6, 4],\n
\n
\n
\n
],\n
arrow_list: [\n
["right", "Sale Trade Condition", "end", "Business Process", "specialise"],\n
["top", "Open Sale Order", "end", "Person", "destination destination_decision"],\n
["left", "Open Sale Order", "end", "Organisation", "source source_section destination_section"],\n
["right", "Open Sale Order", "end", "Sale Trade Condition", "specialise"],\n
["top", "Open Sale Order Line", "parent", "Open Sale Order"],\n
["right", "Open Sale Order Line", "end", "Hosting Subscription", "aggregate"],\n
["top", "Applied Rule", "end", "Hosting Subscription", "causality"],\n
["left", "Applied Rule", "end", "Subscription Item Root Sim. Rule", "specialise"],\n
["left", "Simulation Movement", "parent", "Applied Rule"],\n
["top", "Sale Packing List Line", "parent", "Sale Packing List"],\n
["top", "Simulation Movement", "end", "Sale Packing List Line", "delivery"],\n
["left", "Sale Packing List Line", "end", "Hosting Subscription", "aggregate"],\n
["left", "Sale Packing List", "end", "Sale Trade Condition", "specialise"],\n
\n
]\n
});\n
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Generate SVG</string> </value>
</item>
</dictionary>
</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>romain_dev</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5_update_catalog_list = ('erp5_ingestion_mysql_innodb_catalog', 'erp5_full_text_mroonga_catalog')
bt5_installation_list = bt5_update_catalog_list + ('erp5_xhtml_style',
'romain_dev',
# 'erp5_officejs', 'erp5_web_jabber_client',
# 'erp5_officejs_ooffice',
'erp5_upgrader',
'erp5_hal_json_style',
'erp5_ods_style',
'erp5_odt_style',
'erp5_deferred_style',
# 'erp5_officejs_ui_test',
'erp5_crm_renderjs_ui_test',
'erp5_trade_renderjs_ui_test',
'erp5_web_renderjs_ui_test',
'erp5_pdm_renderjs_ui_test',
'erp5_accounting_renderjs_ui_test',
'erp5_item_renderjs_ui_test',
'erp5_officejs_ui_test',
'erp5_officejs_support_request_ui_test',
# 'erp5_calendar',
# 'erp5_crm',
# 'erp5_mrp',
'erp5_project',
'erp5_bank_reconciliation',
# test dependencies
# 'erp5_configurator_standard_trade_template',
# 'erp5_simulation_test',
# 'erp5_accounting',
'erp5_monaco_editor_ui_test',
# 'erp5_gadget_interface_validator_ui_test',
'erp5_forge',
# 'erp5_web_jabber_client',
'erp5_web_ui_test',
'erp5_officejs_afs_directory_ui_test',
'erp5_accounting_ui_test',
'erp5_dms_ui_test',
# 'erp5_travel_expense', 'erp5_travel_expense_ui_test',
# 'officejs_olapy_demo',
'erp5_discussion',
'erp5_hr',
'erp5_item',
'erp5_mrp',
'erp5_payroll',
'erp5_authentication_policy',
'erp5_l10n_fr',
'erp5_mrp_item',
'erp5_discount_resource',
'erp5_administration',
'erp5_document_scanner_ui_test',
# Graph url fix
'erp5_graph_editor',
'erp5_multimedia',
'erp5_officejs_appstore_base',
'erp5_officejs',
'erp5_officejs_connector',
'erp5_officejs_jquery_app',
'erp5_officejs_ooffice',
'erp5_project',
'erp5_simulation_fast_input',
'erp5_test_result',
'erp5_trade',
'erp5_web_project_ui',
'erp5_officejs_jquery_app',
'erp5_web_manifest_test',
'erp5_officejs_afs_directory_data',
'erp5_officejs_afs_directory_ui_test',
'erp5_travel_expense_ui_test',
'erp5_http_proxy',
'erp5_corporate_identity_test',
# 'erp5_run_my_doc',
'erp5_run_my_doc_renderjs_ui_test',
# 'erp5_no_style'
'erp5_web_js_style',
'erp5_web_js_style_test',
'erp5_officejs_appstore_base',
# 'erp5_oauth2_authorization',
# 'erp5_oauth2_resource',
)
return bt5_installation_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>Base_getUpgradeBusinessTemplateList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
can_delete = False
document_id = context.getId()
try:
can_delete = (document_id == str(int(document_id)))
except:
pass
if can_delete:
context.getParentValue().manage_delObjects(ids=[document_id])
return 'deleted'
return 'not deleted'
<?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>Couscous_deleteIfExpectedId</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
portal = portal = context.getPortalObject()
module_business_application_map = {'base': ('currency_module',
'organisation_module',
'person_module',),
'accounting': ('accounting_module',
'account_module',),
'forge': ('bug_module', 'glossary_module', 'test_result_module', 'test_suite_module'),
'dev': ('foo_module', 'bar_module', 'foo_bar_module'),
'project': ('project_module', 'task_module', 'task_report_module'),
'crm': ('campaign_module',
'event_module',
'meeting_module',
'sale_opportunity_module',
'support_request_module',),
'dms': ('document_module',
'image_module',
'document_ingestion_module',
'web_page_module',),
'trade': ('internal_packing_list_module',
'inventory_module',
'purchase_order_module',
'purchase_packing_list_module',
'purchase_trade_condition_module',
'returned_sale_packing_list_module',
'sale_order_module',
'sale_packing_list_module',
'sale_trade_condition_module'),
'pdm': ('component_module',
'product_module',
'purchase_supply_module',
'sale_supply_module',
'service_module',
'transformation_module',),
}
base_category = portal.portal_categories.business_application
for business_application_category_id, module_ids in module_business_application_map.items():
business_application_category = getattr(base_category, business_application_category_id, None)
if business_application_category is None:
business_application_category = base_category.newContent(
id=business_application_category_id,
title=business_application_category_id.capitalize(),
portal_type='Category'
)
for module_id in module_ids:
module = getattr(portal, module_id, None)
if module is not None:
module.edit(business_application_value = business_application_category)
return 'ok'
<?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>ERP5Site_setupModuleList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
portal = context.getPortalObject()
selection = portal.portal_selections.getSelectionFor('person_module_selection')
print selection.checked_uids
print selection.domain_path
print selection.domain_list
if selection.domain is not None:
print selection.domain.asDomainDict()
return printed
for _, obj in portal.portal_skins.ZopeFind(portal.portal_skins.erp5_core, obj_metatypes=('ERP5 Form',), search_sub=1):
if (obj.pt == 'form_view') and (obj.action == '') and ('FieldLibrary' not in obj.id):
print obj.id
return printed
return
portal_object = portal = context.getPortalObject()
module = portal.person_module
i = counter
while i <= min(counter + 100, 80000):
# module.newContent(portal_type='Person', title='test %i' % i)
i += 1
if i != counter:
module.activate(activity='SQLQueue', priority=5).testromain(i)
return 'couscous'
raise NotImplementedError('nutnut')
return '%s\n' % context.absolute_url()
from base64 import urlsafe_b64encode, urlsafe_b64decode
return 'data:text/css;base64,%s' % urlsafe_b64encode('couscous');
kw = {
# 'select_dict': {'count': 'select 1;drop table catalog;', 'portal_type': None},
'select_dict': {'count': 'count(*)', 'portal_type': None},
# 'select_list': ['count(*)', 'portal_type'],
# 'select_list': ['portal_type'],
'limit': None,
'group_by': ["portal_type"],
# 'sort_on': [('portal_type', 'ASC')]
}
print context.portal_catalog(src__=1, **kw)
"""
for x in context.portal_catalog(**kw):
print x.portal_type, x['count']
"""
print '---'
return printed
cp = context.manage_copyObjects(uids=uids)
context.manage_pasteObjects(cb_copy_data=cp)
return "couscous"
"""
result_list = context.portal_catalog.countResults(select_dict={'date': 'DATE_FORMAT(creation_date, "%s")' % sql_format, 'portal_type': None},
portal_type=portal_type_list,limit=None,
owner=reference,
group_by=['DATE_FORMAT(creation_date, "%s")' % sql_format, 'portal_type'],
**count_kw)
"""
<?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>copy_of_testromain</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
domain_list = [] # [<Temporary Domain at /erp5/portal_domains/my_module_domain/sub_domain>, ...]
##### Get parents' criterions ######
parents_criterion_dict = {} # {"portal_type": {"identity": ["Task Report"]}), ...}
parents_membership_criterion_category_set = set() # ["follow_up/project_module/xxx", ...]
sub_parent = parent
while depth > 0:
for criterion in sub_parent.getCriterionList():
property_id = criterion.property
if property_id not in parents_criterion_dict:
parents_criterion_dict[property_id] = {"min": criterion.min, "max": criterion.max, "identity": criterion.identity}
sub_parent_membership_criterion_category_list = sub_parent.getMembershipCriterionCategoryList()
# sub_parent.getMultimembershipCriterionBaseCategoryList() seems to return empty list...
parents_membership_criterion_category_set.update(sub_parent_membership_criterion_category_list)
depth -= 1
sub_parent = sub_parent.getParentValue()
##### Define domain_list.append helper #####
def appendNewTempDomain(id, criterion_dict=None, membership_criterion_category_list=None, **kw):
if criterion_dict is None:
criterion_dict = parents_criterion_dict
else:
criterion_dict.update(parents_criterion_dict)
if membership_criterion_category_list is None:
membership_criterion_category_list = list(parents_membership_criterion_category_set)
else:
membership_criterion_category_list = list(parents_membership_criterion_category_set.union(membership_criterion_category_list))
multimembership_criterion_base_category_list = list(set([c[:c.index("/")] for c in membership_criterion_category_list]))
domain = parent.generateTempDomain(id=id)
domain.edit(
criterion_property_list=criterion_dict.keys(),
multimembership_criterion_base_category_list=multimembership_criterion_base_category_list,
membership_criterion_category_list=membership_criterion_category_list,
domain_generator_method_id=script.id,
**kw
)
for property_id, criterion_kw in criterion_dict.items():
domain.setCriterion(property_id, **criterion_kw)
domain_list.append(domain)
##### Provide sub domains #####
# Don't define domain that provides criterions already used by parents
if "delivery.start_date" not in parents_criterion_dict:
now = DateTime()
for time_frame in (1, 7, 30, 365):
appendNewTempDomain(
id="sub_time_frame_{}".format(time_frame),
title="Last {} days".format(time_frame),
criterion_dict={"delivery.start_date": {"min": now - time_frame}},
)
person = context.getPortalObject().portal_membership.getAuthenticatedMember().getUserValue()
if person is not None:
category_relative_url = "source/" + person.getRelativeUrl()
if category_relative_url not in parents_membership_criterion_category_set:
appendNewTempDomain(
id="sub_assigned_to_me_1",
title="Assigned to me",
membership_criterion_category_list=(category_relative_url,),
)
return domain_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>parent, depth</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>generateTristanDomain</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_function</string> </key>
<value> <string>getObjectByOid</string> </value>
</item>
<item>
<key> <string>_module</string> </key>
<value> <string>test_kaz</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>getObjectByOid</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
# you can pass oid like "?oid=0x123456"
if oid.startswith('0x'):
oid = ('\x00'*8 + oid[2:].decode('hex'))[-8:]
ob = context.getObjectByOid(oid)
print repr(ob)[:10*1024]
return printed
<?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>oid</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>printObjectByOid</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_function</string> </key>
<value> <string>testrc</string> </value>
</item>
<item>
<key> <string>_module</string> </key>
<value> <string>testrc</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testrc</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>testrc</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from AccessControl import getSecurityManager
from pprint import pformat
# vgetattr = context.test_vincent_getattr
user = getSecurityManager().getUser()
print 'User :', repr(user)
# print '__dict__:', vgetattr(user, '__dict__')
print 'Id :', repr(user.getId())
print 'Name :', repr(user.getUserName())
print 'Roles :', repr(user.getRoles())
print 'Groups :', repr(getattr(user, 'getGroups', lambda: None)())
print 'Document:', repr(user.getUserValue())
print 'Login :', repr(user.getLoginValue())
"""
print 'Properties:', pformat({
x: user.getPropertysheet(x).propertyItems()
for x in getattr(user, 'listPropertysheets', lambda: ())()
})
"""
return printed
from DateTime import DateTime
context.edit(start_date=DateTime())
return "ok"
sql_catalog = context.getPortalObject().portal_catalog.getSQLCatalog()
invalid_column_list = []
def isValidColumnOrRaise(column_id):
is_valid_column = sql_catalog.isValidColumn(column_id)
if not is_valid_column:
invalid_column_list.append(column_id)
return is_valid_column
result = sql_catalog.parseSearchText(
'couscous AND taboulet AND a:"b" AND title:"couscous" AND lalala',
search_key='FullTextKey',
# is_valid=lambda x: False)
is_valid=isValidColumnOrRaise)
return str(invalid_column_list)
# return context.portal_catalog(search_text='couscous AND taboulet AND a:"b" AND title:"couscous"', src__=1)
return context.portal_catalog(full_text='couscous AND taboulet AND a:"b" AND title:"couscous"', src__=1)
portal = context.getPortalObject()
bug_module = portal.task_module
for i in range(10000):
task = bug_module.newContent(
portal_type='Task',
source_project='project_module/1'
)
task.newContent(portal_type='Task Line')
task.newContent(portal_type='Task Line')
return 'ok'
result = ''# '---<br>'
i = 0
for brain in context.getPortalObject().portal_catalog(
portal_type='Action Information',
sort_on=[['relative_url', 'ASC']]
):
action = brain.getObject()
action_type = action.getActionType()
"""
if not action.isVisible():
continue
if ('Template' in action.getParentTitle()):
continue
if (action_type in ['object_button']):
continue
# if (action_type in ['object_report', 'object_exchange']):
# continue
if ('web' in action_type) or ('jio' in action_type) or (action_type in ['object_view', 'object_list', 'object_sort', 'object_ui', 'object_search']):
continue
"""
if 'Base_viewDocumentList' not in (action.getActionText() or ''):
continue
if 'only' in action.getActionType():
continue
"""
action.setActionType('object_onlyxhtml_view')
action.getParentValue().newContent(
portal_type='Action Information',
reference='jump_to_document',
title='Documents',
action="string:${object_url}/Base_jumpToRelatedDocumentList",
action_type='object_onlyjio_jump',
visible=True,
priority=1,
condition="python:portal.Base_checkPermission('document_module', 'View')"
)
"""
i += 1
result += '%s %s %s %s' % (action.getParentTitle(), '<a href="https://softinst114089.host.vifib.net/erp5/web_site_module/renderjs_runner/#/%s?editable=true">%s</a>' % (action.getRelativeUrl(), action.getTitle()), action.getActionType(), '<br>')
result = '--- %i<br>%s' % (i, result)
print result
return printed
#####################################
from DateTime import DateTime
return DateTime()
alarm = context.getPortalObject().portal_alarms.promise_check_upgrade
# return alarm.getLastActiveProcess().getResultList()
return context.getPortalObject().portal_activities['2096'].getResultList()[0].detail
from DateTime import DateTime
return DateTime()
return "OK %s" % str(context.WebSection_getSiteMapTree(depth=99, include_subsection=1, include_document=1))
context.edit(preferred_event_resource=None)
return "ok"
context.getPortalObject().web_site_module.renderjs_runner.edit()
return 'OK'
return context.portal_catalog(reference= {'query': 'aa', 'key':'ExactMatch'}, src__=1)
# return context.getPortalObject().portal_catalog(reference='', src__=1)
# return 'ok'
context.log('--- traverse')
section = context.getPortalObject().restrictedTraverse('web_site_module/3/1')
context.log('--- document')
result = section.getDefaultDocumentValue()
context.log('--- result: %s', result)
return 'couscous'
raise NotImplementedError(context.getPortalObject().restrictedTraverse('web_site_module/3/2//'))
REQUEST = context.REQUEST
raise NotImplementedError(REQUEST.environ.get('HTTP_USER_AGENT'))
from urlparse import urlparse
parse_dict = urlparse(REQUEST.other.get('ACTUAL_URL'))
print parse_dict
print "%s %s %s %s" % (parse_dict.scheme, parse_dict.port, parse_dict.hostname, parse_dict.path)
import urllib
print REQUEST.other.get('SERVER_URL')
print '---'
# request.other
for key, value in REQUEST.items():
if key.startswith('HTTP') or key.startswith('BASE') or key.startswith('REMOTE') or key.startswith('SERVER') or ('PORT' in key) or ('PATH' in key) or ('URL' in key):
print "%s: %s" % (key, value)
return printed
return "host%s \n%s %s" % (REQUEST.environ.get('HTTP_HOST'), '', '')
result = ''# '---<br>'
i = 0
for brain in context.getPortalObject().portal_catalog(portal_type='Action Information', sort_on=[['relative_url', 'ASC']]):
action = brain.getObject()
action_type = action.getActionType()
if not action.isVisible():
continue
if ('Template' in action.getParentTitle()):
continue
if (action_type in ['object_button']):
continue
# if (action_type in ['object_report', 'object_exchange']):
# continue
if ('web' in action_type) or ('jio' in action_type) or (action_type in ['object_view', 'object_list', 'object_sort', 'object_ui', 'object_search']):
continue
i += 1
result += '%s %s %s %s' % (action.getParentTitle(), '<a href="%s">%s</a>' % (action.getRelativeUrl(), action.getTitle()), action.getActionType(), '<br>')
result = '--- %i<br>%s' % (i, result)
print result
return printed
return context.getPortalObject().portal_catalog(source_project_title='1234', src__=1)
return context.getPortalObject().portal_catalog(source_project_uid='1234', src__=1)
parameter_list = field.getTemplateField().get_value('default_params')
# Some document subobjects have a workflow, and so, can be only be deleted from some state
# If the listbox does not display them, do not add the state filter parameter
filter_portal_type_list = [x[1] for x in parameter_list if x[0] == 'portal_type']
if filter_portal_type_list:
if sametype(filter_portal_type_list, ''):
filter_portal_type_list = [filter_portal_type_list]
else:
filter_portal_type_list = None
return parameter_list + context.Module_listWorkflowTransitionItemList(filter_portal_type_list=filter_portal_type_list)
# check selection content
portal = context.getPortalObject()
print '---'
for selection_id in ('bar_selection', 'foo_selection'):
print selection_id
params = portal.portal_selections.getSelectionParamsFor(selection_id)
print '%s' % str(params)
print portal.portal_selections.getSelectionColumns(selection_id)
print 'ok'
return printed
# delete all persons
context.portal_catalog.searchAndActivate(
portal_type='Person',
parent_uid=context.getUid(),
method_id='Couscous_deleteIfExpectedId'
)
return 'ok'
context.getPortalObject().notebook_module.olapy_notebook.edit(title="olapy_notebook.jsmd", reference="olapy_notebook.jsmd")
return "ok"
import time
time.sleep(360)
return 'cosucous'
portal_object = portal = context.getPortalObject()
module = portal.person_module
i = 0
while i < 80000:
module.newContent(portal_type='Person', title='test %i' % i)
i += 1
return 'couscous'
return 'ok'
from DateTime import DateTime
portal = context.getPortalObject()
token = portal.access_token_module.newContent(
id='%s-%s' % (DateTime().strftime('%Y%m%d'), portal.Base_generateAccessTokenHalID()),
portal_type='HAL Access Token',
agent='person_module/160295'
)
token.validate()
return token.getRelativeUrl()
from DateTime import DateTime
i = 0
while i < 700:
context.newContent(
portal_type='Test Result Line',
string_index=i,
title=i,
start_date=DateTime(),
duration=i,
all_tests=i,
errors=1,
failures=2,
skip=3,
)
i += 1
return 'ok'
context.portal_catalog.searchAndActivate(
portal_type='Person',
parent_uid=context.getUid(),
method_id='testromain2'
)
return 'ok'
context.portal_catalog.searchAndActivate(
portal_type='Person',
parent_uid=context.getUid(),
method_id='testromain2'
)
return 'ok'
return 'ok'
# python: here.Module_listWorkflowTransitionItemList()['form_id_dict'].get(request.get("field_your_mass_workflow_action", ""), '')
result = None
form_id_dict = context.Module_listWorkflowTransitionItemList()['form_id_dict']
# During rendering, this variable has been set into the request
# Render what user selected
action = request.get("mass_workflow_action", "")
if action:
return form_id_dict.get(action, '')
# Validate only if user didn't change the possible action
action = request.get("field_your_mass_workflow_action", "")
if (action and action == request.get("field_your_previous_mass_workflow_action", "")):
return form_id_dict.get(action, '')
return ''
portal_object = portal = context.getPortalObject()
module = portal.foo_module
i = 0
while i < 80000:
module.newContent(portal_type='Foo', title='test %i' % i)
i += 1
return 'couscous'
raise NotImplementedError(context.REQUEST)
return '%s %s %s %s' % (portal.portal_url(), portal.absolute_url(), portal.absolute_url_path(), context.REQUEST.physicalPathToURL(portal.getPhysicalPath() + ("",)))
return portal_object.portal_preferences.getPreference('preferred_foo_use', None)
domain_tool = portal_object.portal_domains
base_domain = domain_tool.foo_domain
url_domain = portal_object.portal_url
def generateRecur(domain, depth, result_list):
if depth:
result_list.append(('/'.join(url_domain.getRelativeContentPath(domain)[2:]), domain.getTitle()))
new_depth = depth + 1
for sub_domain in domain_tool.getChildDomainValueList(domain, depth=depth):
generateRecur(sub_domain, new_depth, result_list)
value_list = []
generateRecur(base_domain, 0, value_list)
print value_list
value_list = []
print value_list
return printed
def getDomainSelection(domain_list):
root_dict = {}
if len(domain_list) > 0:
category_tool = portal.portal_categories
domain_tool = portal.portal_domains
preference_tool = portal.portal_preferences
for base_domain_id in domain_list:
domain = None
if category_tool is not None:
domain = category_tool.restrictedTraverse(base_domain_id, None)
if domain is not None :
root_dict[base_domain_id] = getattr(
domain,
preference_tool.getPreference(
'preferred_category_child_item_list_method_id',
'getCategoryChildCompactLogicalPathItemList'
)
)(local_sort_id=('int_index', 'translated_title'), checked_permission='View',
filter_node=0, display_none_category=0)
elif domain_tool is not None:
try:
domain = domain_tool.getDomainByPath(base_domain_id, None)
except KeyError:
domain = None
if domain is not None:
# XXX Implement recursive fetch
root_dict[base_domain_id] = [(x.getTitle(), x.getId()) for x in domain_tool.getChildDomainValueList(domain, depth=0)]
return root_dict
return getDomainSelection(['foo_domain'])
return portal_object.portal_catalog(selection_domain={'region': 'france'}, src__=1)
return portal_object.portal_catalog(selection_domain={'region': portal_object.portal_categories.region.france}, src__=1)
domain = portal_object.portal_domains.getDomainByPath('validated_project_domain')
sql_catalog = portal_object.portal_catalog.getSQLCatalog()
return portal_object.portal_catalog(src__=1, full_text='title:"nutnut" AND validated_project_domain:"sub1" AND selection_domain:"region:france"')
query_kw = dict(selection_domain={
'validated_project_domain': domain.getChildDomainValueList(domain, depth=0)[0],
'region': portal_object.portal_categories.region.france
})
return sql_catalog.buildQuery(query_kw).asSearchTextExpression(sql_catalog)
return portal_object.portal_catalog(src__=1, **query_kw)
return portal_object.portal_catalog(selection_domain={'region': portal_object.portal_categories.region.france}, src__=1)
from Products.ERP5Form.Selection import Selection, DomainSelection
def getDomainSelection(self, domain_list):
"""Return a DomainSelection object wrapped with the context.
"""
portal_object = self.getPortalObject()
root_dict = {}
if len(domain_list) > 0:
category_tool = portal_object.portal_categories
domain_tool = portal_object.portal_domains
preference_tool = portal_object.portal_preferences
for domain in domain_list:
root = None
base_domain = domain.split('/', 1)[0]
if category_tool is not None:
root = category_tool.restrictedTraverse(domain, None)
if root is not None :
root_dict[base_domain] = getattr(
root,
preference_tool.getPreference(
'preferred_category_child_item_list_method_id',
'getCategoryChildCompactLogicalPathItemList'
)
)(local_sort_id=('int_index', 'translated_title'), checked_permission='View',
filter_node=0, display_none_category=0)
elif domain_tool is not None:
try:
root = domain_tool.getDomainByPath(domain, None)
except KeyError:
root = None
if root is not None:
root_dict[base_domain] = [(x.getTitle(), x.getId()) for x in root.getChildDomainValueList(root, depth=0)]
if root is None:
root = portal_object.restrictedTraverse(domain, None)
if root is not None:
root_dict[None] = (None, domain)
return root_dict
# return DomainSelection(domain_dict = root_dict)#.__of__(self.getContext())
return getDomainSelection(context, ['parent', 'region', 'validated_project_domain', 'preferred_group_person_list_domain', 'ledger'])#.asDomainItemDict(portal=context.getPortalObject())
return context.getPortalObject().TaskModule_viewTaskList.listbox.getDomainSelection()
# from Products.ERP5Form.Tool.SelectionTool import makeTreeList
# return makeTreeList()
# return context.getPortalObject().portal_selections.
return context.getPortalObject().portal_catalog(selection_domain={'group': context}, src__=1)
return "couscous"
context.setContentType(None)
context.edit(content_type=None)
# delete content.content_type
return "ok"
# Example code:
# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
response = request.response
# Return a string identifying this script.
print "This is the", script.meta_type, '"%s"' % script.getId(),
if script.title:
print "(%s)" % html_quote(script.title),
print "in", container.absolute_url()
return printed
<?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>**kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testromain</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_dms
erp5_notebook
erp5_full_text_mroonga_catalog
erp5_upgrader
\ No newline at end of file
extension.erp5.test_kaz
extension.erp5.testrc
\ No newline at end of file
1
\ No newline at end of file
image_module/romain_wallpaper_*
\ No newline at end of file
image_module/romain_wallpaper_*
\ No newline at end of file
image_module/romain_wallpaper_*
notebook_module/romain_notebook_*
\ No newline at end of file
romain_dev
\ No newline at end of file
romain_dev
\ No newline at end of file
0.1
\ 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