Commit 532085c2 authored by Rafael Monnerat's avatar Rafael Monnerat

BusinessTemplate: Allow set individual Mixins on Portal Types

  Allow the developer associate a Mixin on Business template level
without require to overwrite the portal type itself

  Include mixins can be done in the same way, allowed content types or
property sheets are set.
parent 63f5d165
...@@ -168,6 +168,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): ...@@ -168,6 +168,8 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
self.getWorkflowTool().manage_delObjects(['geek_workflow']) self.getWorkflowTool().manage_delObjects(['geek_workflow'])
if 'custom_geek_workflow' in self.getWorkflowTool().objectIds(): if 'custom_geek_workflow' in self.getWorkflowTool().objectIds():
self.getWorkflowTool().manage_delObjects(['custom_geek_workflow']) self.getWorkflowTool().manage_delObjects(['custom_geek_workflow'])
if 'mixin.erp5.GeekMixin' in self.portal.portal_components.objectIds():
self.portal.portal_components.manage_delObjects(['mixin.erp5.GeekMixin'])
for business_template in self.getTemplateTool().contentValues(): for business_template in self.getTemplateTool().contentValues():
if business_template.getTitle() == 'geek template': if business_template.getTitle() == 'geek template':
self.getTemplateTool().manage_delObjects([business_template.getId()]) self.getTemplateTool().manage_delObjects([business_template.getId()])
...@@ -432,6 +434,40 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): ...@@ -432,6 +434,40 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
bt_id = sequence.get('import_bt').getId() bt_id = sequence.get('import_bt').getId()
self.assertNotIn(bt_id, trash_ids[0]) self.assertNotIn(bt_id, trash_ids[0])
# Components
def stepCreateMixinComponent(self, sequence=None, **kw):
document_id = 'mixin.erp5.GeekMixin'
component = self.portal.portal_components.newContent(
id=document_id,
version='erp5',
reference='GeekMixin',
text_content='''class GeekMixin:
def getGeekMessage(self):
return 'Geek Message'
''',
portal_type='Mixin Component')
component.validate()
sequence.edit(mixin_reference=component.getReference())
def stepSetPortalTypeMixin(self, sequence=None, **kw):
pt = self.getTypeTool()
object_id = sequence.get('object_ptype_id')
object_pt = pt._getOb(object_id)
object_pt.setTypeMixinList((sequence.get('mixin_reference'),))
def stepCheckPortalTypeMixinIsSet(self, sequence=None, **kw):
"""
Check presence of portal type
"""
pt = self.getTypeTool()
object_id = sequence.get('object_ptype_id')
object_type = pt._getOb(object_id, None)
self.assertTrue(object_type is not None)
self.assertTrue(object_type.getTypeMixinList())
self.assertEqual(object_type.getTypeMixinList(),
(sequence.get('mixin_reference'),))
# portal types # portal types
def stepCreatePortalType(self, sequence=None, **kw): def stepCreatePortalType(self, sequence=None, **kw):
""" """
...@@ -2764,6 +2800,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor): ...@@ -2764,6 +2800,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
'template_portal_type_hidden_content_type_list', 'template_portal_type_hidden_content_type_list',
'template_portal_type_property_sheet_list', 'template_portal_type_property_sheet_list',
'template_portal_type_base_category_list', 'template_portal_type_base_category_list',
'template_portal_type_type_mixin',
# test_20_checkUpdateTool recreates portal_simulation # test_20_checkUpdateTool recreates portal_simulation
'template_tool_component_id_list', 'template_tool_component_id_list',
'template_keep_path_list', 'template_keep_path_list',
...@@ -5818,6 +5855,46 @@ class TestBusinessTemplate(BusinessTemplateMixin): ...@@ -5818,6 +5855,46 @@ class TestBusinessTemplate(BusinessTemplateMixin):
sequence_list.addSequenceString(sequence_string) sequence_list.addSequenceString(sequence_string)
sequence_list.play(self) sequence_list.play(self)
def test_36_CheckPortalTypeMixin(self):
"""Test Portal Type Mixin"""
sequence_list = SequenceList()
sequence_string = '\
CreatePortalType \
CreateMixinComponent \
SetPortalTypeMixin \
CreateNewBusinessTemplate \
UseExportBusinessTemplate \
CheckModifiedBuildingState \
CheckNotInstalledInstallationState \
AddPortalTypeToBusinessTemplate \
BuildBusinessTemplate \
CheckBuiltBuildingState \
CheckNotInstalledInstallationState \
CheckObjectPropertiesInBusinessTemplate \
SaveBusinessTemplate \
CheckBuiltBuildingState \
CheckNotInstalledInstallationState \
RemoveBusinessTemplate \
RemoveAllTrashBins \
RemovePortalType \
ImportBusinessTemplate \
UseImportBusinessTemplate \
CheckBuiltBuildingState \
CheckNotInstalledInstallationState \
InstallBusinessTemplate \
Tic \
CheckInstalledInstallationState \
CheckBuiltBuildingState \
CheckPortalTypeExists \
CheckPortalTypeMixinIsSet \
UninstallBusinessTemplate \
CheckBuiltBuildingState \
CheckNotInstalledInstallationState \
CheckPortalTypeRemoved \
'
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
def test_37_UpdatePortalType(self): def test_37_UpdatePortalType(self):
"""Test Update Portal Type""" """Test Update Portal Type"""
sequence_list = SequenceList() sequence_list = SequenceList()
...@@ -8702,6 +8779,7 @@ class TestExtensionTemplateItem(_LocalTemplateItemMixin, ...@@ -8702,6 +8779,7 @@ class TestExtensionTemplateItem(_LocalTemplateItemMixin,
component_id_prefix = ExtensionComponent.getIdPrefix() component_id_prefix = ExtensionComponent.getIdPrefix()
component_portal_type = ExtensionComponent.portal_type component_portal_type = ExtensionComponent.portal_type
from Products.ERP5Type.Core.TestComponent import TestComponent from Products.ERP5Type.Core.TestComponent import TestComponent
# bt5 (instancehome (legacy) and ZODB Component) and Products # bt5 (instancehome (legacy) and ZODB Component) and Products
class TestTestTemplateItem(_LocalTemplateItemMixin, class TestTestTemplateItem(_LocalTemplateItemMixin,
......
...@@ -2933,6 +2933,12 @@ class PortalTypeBaseCategoryTemplateItem(PortalTypeAllowedContentTypeTemplateIte ...@@ -2933,6 +2933,12 @@ class PortalTypeBaseCategoryTemplateItem(PortalTypeAllowedContentTypeTemplateIte
class_property = 'base_category_list' class_property = 'base_category_list'
business_template_class_property = '_portal_type_base_category_item' business_template_class_property = '_portal_type_base_category_item'
class PortalTypeTypeMixinTemplateItem(PortalTypeAllowedContentTypeTemplateItem):
name = 'Type Mixin'
xml_tag = 'type_mixin'
class_property = 'type_mixin'
business_template_class_property = '_portal_type_type_mixin_item'
class CatalogMethodTemplateItem(ObjectTemplateItem): class CatalogMethodTemplateItem(ObjectTemplateItem):
"""Template Item for catalog methods. """Template Item for catalog methods.
...@@ -5300,6 +5306,15 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -5300,6 +5306,15 @@ Business Template is a set of definitions, such as skins, portal types and categ
MixinTemplateItem(self.getTemplateMixinIdList()) MixinTemplateItem(self.getTemplateMixinIdList())
self._tool_component_item = \ self._tool_component_item = \
ToolComponentTemplateItem(self.getTemplateToolComponentIdList()) ToolComponentTemplateItem(self.getTemplateToolComponentIdList())
try:
self._portal_type_type_mixin_item = \
PortalTypeTypeMixinTemplateItem(
self.getTemplatePortalTypeTypeMixinList())
# This property may not be defined if erp5_property_sheets has not been
# upgraded yet
except AttributeError:
self._portal_type_type_mixin_item = PortalTypeTypeMixinTemplateItem(())
security.declareProtected(Permissions.ManagePortal, 'build') security.declareProtected(Permissions.ManagePortal, 'build')
def build(self, no_action=0, update_revision=True): def build(self, no_action=0, update_revision=True):
...@@ -5630,6 +5645,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -5630,6 +5645,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
'template_local_role_list', 'template_local_role_list',
'template_message_translation_list', 'template_message_translation_list',
'template_mixin_id_list', 'template_mixin_id_list',
'template_portal_type_type_mixin',
'template_module_component_id_list', 'template_module_component_id_list',
'template_module_id_list', 'template_module_id_list',
'template_path_list', 'template_path_list',
...@@ -5938,6 +5954,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -5938,6 +5954,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
'PortalHiddenAllowedContentType' : '_portal_type_hidden_content_type_item', 'PortalHiddenAllowedContentType' : '_portal_type_hidden_content_type_item',
'PortalTypePropertySheet' : '_portal_type_property_sheet_item', 'PortalTypePropertySheet' : '_portal_type_property_sheet_item',
'PortalTypeBaseCategory' : '_portal_type_base_category_item', 'PortalTypeBaseCategory' : '_portal_type_base_category_item',
'PortalTypeTypeMixin' : '_portal_type_type_mixin_item',
'Category' : '_category_item', 'Category' : '_category_item',
'Module' : '_module_item', 'Module' : '_module_item',
'Skin' : '_skin_item', 'Skin' : '_skin_item',
...@@ -6030,6 +6047,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6030,6 +6047,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
'_portal_type_property_sheet_item', '_portal_type_property_sheet_item',
'_portal_type_roles_item', '_portal_type_roles_item',
'_portal_type_base_category_item', '_portal_type_base_category_item',
'_portal_type_type_mixin',
'_local_roles_item', '_local_roles_item',
'_portal_type_workflow_chain_item',] '_portal_type_workflow_chain_item',]
...@@ -6123,6 +6141,8 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6123,6 +6141,8 @@ Business Template is a set of definitions, such as skins, portal types and categ
self.getTemplatePortalTypePropertySheetList()) self.getTemplatePortalTypePropertySheetList())
bt_base_category_list = list( bt_base_category_list = list(
self.getTemplatePortalTypeBaseCategoryList()) self.getTemplatePortalTypeBaseCategoryList())
bt_type_mixin_list = list(
self.getTemplatePortalTypeTypeMixinList())
bt_action_list = list(self.getTemplateActionPathList()) bt_action_list = list(self.getTemplateActionPathList())
bt_portal_types_id_list = list(self.getTemplatePortalTypeIdList()) bt_portal_types_id_list = list(self.getTemplatePortalTypeIdList())
bt_portal_type_roles_list = list(self.getTemplatePortalTypeRoleList()) bt_portal_type_roles_list = list(self.getTemplatePortalTypeRoleList())
...@@ -6141,6 +6161,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6141,6 +6161,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
property_sheet_list = [] property_sheet_list = []
base_category_list = [] base_category_list = []
action_list = [] action_list = []
type_mixin_list = []
if hasattr(portal_type, 'allowed_content_types'): if hasattr(portal_type, 'allowed_content_types'):
allowed_content_type_list = portal_type.allowed_content_types allowed_content_type_list = portal_type.allowed_content_types
if hasattr(portal_type, 'hidden_content_type_list'): if hasattr(portal_type, 'hidden_content_type_list'):
...@@ -6149,6 +6170,8 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6149,6 +6170,8 @@ Business Template is a set of definitions, such as skins, portal types and categ
property_sheet_list = portal_type.property_sheet_list property_sheet_list = portal_type.property_sheet_list
if hasattr(portal_type, 'base_category_list'): if hasattr(portal_type, 'base_category_list'):
base_category_list = portal_type.base_category_list base_category_list = portal_type.base_category_list
if hasattr(portal_type, 'type_mixin'):
type_mixin_list = portal_type.type_mixin
for action in portal_type.getActionInformationList(): for action in portal_type.getActionInformationList():
action_list.append(action.getReference()) action_list.append(action.getReference())
...@@ -6172,6 +6195,11 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6172,6 +6195,11 @@ Business Template is a set of definitions, such as skins, portal types and categ
if base_cat_id not in bt_base_category_list: if base_cat_id not in bt_base_category_list:
bt_base_category_list.append(base_cat_id) bt_base_category_list.append(base_cat_id)
for tm_id in type_mixin_list:
type_mixin_id = id+' | '+tm_id
if type_mixin_id not in type_mixin_list:
bt_type_mixin_list.append(type_mixin_id)
for act_id in action_list: for act_id in action_list:
action_id = id+' | '+act_id action_id = id+' | '+act_id
if action_id not in bt_action_list: if action_id not in bt_action_list:
...@@ -6189,6 +6217,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6189,6 +6217,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
bt_base_category_list.sort() bt_base_category_list.sort()
bt_action_list.sort() bt_action_list.sort()
bt_wf_chain_list.sort() bt_wf_chain_list.sort()
bt_type_mixin_list.sort()
self.setTemplatePortalTypeWorkflowChainList(bt_wf_chain_list) self.setTemplatePortalTypeWorkflowChainList(bt_wf_chain_list)
self.setTemplatePortalTypeRoleList(bt_portal_type_roles_list) self.setTemplatePortalTypeRoleList(bt_portal_type_roles_list)
...@@ -6197,7 +6226,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6197,7 +6226,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
self.setTemplatePortalTypePropertySheetList(bt_property_sheet_list) self.setTemplatePortalTypePropertySheetList(bt_property_sheet_list)
self.setTemplatePortalTypeBaseCategoryList(bt_base_category_list) self.setTemplatePortalTypeBaseCategoryList(bt_base_category_list)
self.setTemplateActionPathList(bt_action_list) self.setTemplateActionPathList(bt_action_list)
self.setTemplatePortalTypeTypeMixin(bt_type_mixin_list)
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'guessPortalTypes') 'guessPortalTypes')
...@@ -6278,6 +6307,7 @@ Business Template is a set of definitions, such as skins, portal types and categ ...@@ -6278,6 +6307,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
""" """
setattr(self, 'template_portal_type_id', ()) setattr(self, 'template_portal_type_id', ())
setattr(self, 'template_portal_type_allowed_content_type', ()) setattr(self, 'template_portal_type_allowed_content_type', ())
setattr(self, 'template_portal_type_type_mixin', ())
setattr(self, 'template_portal_type_hidden_content_type', ()) setattr(self, 'template_portal_type_hidden_content_type', ())
setattr(self, 'template_portal_type_property_sheet', ()) setattr(self, 'template_portal_type_property_sheet', ())
setattr(self, 'template_portal_type_base_category', ()) setattr(self, 'template_portal_type_base_category', ())
......
...@@ -87,6 +87,7 @@ item_name_list = ( ...@@ -87,6 +87,7 @@ item_name_list = (
'portal_type_hidden_content_type', 'portal_type_hidden_content_type',
'portal_type_property_sheet', 'portal_type_property_sheet',
'portal_type_base_category', 'portal_type_base_category',
'portal_type_type_mixin',
'category', 'category',
'module', 'module',
'portal_type_roles', 'portal_type_roles',
......
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
<string>my_template_portal_type_hidden_content_type_list</string> <string>my_template_portal_type_hidden_content_type_list</string>
<string>my_template_portal_type_property_sheet_list</string> <string>my_template_portal_type_property_sheet_list</string>
<string>my_template_portal_type_base_category_list</string> <string>my_template_portal_type_base_category_list</string>
<string>my_template_portal_type_type_mixin_list</string>
<string>my_template_action_path_list</string> <string>my_template_action_path_list</string>
</list> </list>
</value> </value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="LinesField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>my_template_portal_type_type_mixin_list</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>line_too_long</string> </key>
<value> <string>A line was too long.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>You entered too many characters.</string> </value>
</item>
<item>
<key> <string>too_many_lines</string> </key>
<value> <string>You entered too many lines.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_linelength</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_lines</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>width</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_linelength</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_lines</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>width</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>height</string> </key>
<value> <int>10</int> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_linelength</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_lines</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Mixins</string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string encoding="cdata"><![CDATA[
<br />
]]></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>width</string> </key>
<value> <int>80</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>mode</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/lines</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>template_portal_type_type_mixin_property</string> </value>
</item>
<item>
<key> <string>mode</string> </key>
<value> <string>w</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
<item>
<key> <string>property_default</string> </key>
<value> <string>python: ()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
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