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):
self.getWorkflowTool().manage_delObjects(['geek_workflow'])
if 'custom_geek_workflow' in self.getWorkflowTool().objectIds():
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():
if business_template.getTitle() == 'geek template':
self.getTemplateTool().manage_delObjects([business_template.getId()])
......@@ -432,6 +434,40 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
bt_id = sequence.get('import_bt').getId()
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
def stepCreatePortalType(self, sequence=None, **kw):
"""
......@@ -2764,6 +2800,7 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
'template_portal_type_hidden_content_type_list',
'template_portal_type_property_sheet_list',
'template_portal_type_base_category_list',
'template_portal_type_type_mixin',
# test_20_checkUpdateTool recreates portal_simulation
'template_tool_component_id_list',
'template_keep_path_list',
......@@ -5818,6 +5855,46 @@ class TestBusinessTemplate(BusinessTemplateMixin):
sequence_list.addSequenceString(sequence_string)
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):
"""Test Update Portal Type"""
sequence_list = SequenceList()
......@@ -8702,6 +8779,7 @@ class TestExtensionTemplateItem(_LocalTemplateItemMixin,
component_id_prefix = ExtensionComponent.getIdPrefix()
component_portal_type = ExtensionComponent.portal_type
from Products.ERP5Type.Core.TestComponent import TestComponent
# bt5 (instancehome (legacy) and ZODB Component) and Products
class TestTestTemplateItem(_LocalTemplateItemMixin,
......
......@@ -2933,6 +2933,12 @@ class PortalTypeBaseCategoryTemplateItem(PortalTypeAllowedContentTypeTemplateIte
class_property = 'base_category_list'
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):
"""Template Item for catalog methods.
......@@ -5300,6 +5306,15 @@ Business Template is a set of definitions, such as skins, portal types and categ
MixinTemplateItem(self.getTemplateMixinIdList())
self._tool_component_item = \
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')
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
'template_local_role_list',
'template_message_translation_list',
'template_mixin_id_list',
'template_portal_type_type_mixin',
'template_module_component_id_list',
'template_module_id_list',
'template_path_list',
......@@ -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',
'PortalTypePropertySheet' : '_portal_type_property_sheet_item',
'PortalTypeBaseCategory' : '_portal_type_base_category_item',
'PortalTypeTypeMixin' : '_portal_type_type_mixin_item',
'Category' : '_category_item',
'Module' : '_module_item',
'Skin' : '_skin_item',
......@@ -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_roles_item',
'_portal_type_base_category_item',
'_portal_type_type_mixin',
'_local_roles_item',
'_portal_type_workflow_chain_item',]
......@@ -6123,6 +6141,8 @@ Business Template is a set of definitions, such as skins, portal types and categ
self.getTemplatePortalTypePropertySheetList())
bt_base_category_list = list(
self.getTemplatePortalTypeBaseCategoryList())
bt_type_mixin_list = list(
self.getTemplatePortalTypeTypeMixinList())
bt_action_list = list(self.getTemplateActionPathList())
bt_portal_types_id_list = list(self.getTemplatePortalTypeIdList())
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
property_sheet_list = []
base_category_list = []
action_list = []
type_mixin_list = []
if hasattr(portal_type, 'allowed_content_types'):
allowed_content_type_list = portal_type.allowed_content_types
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
property_sheet_list = portal_type.property_sheet_list
if hasattr(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():
action_list.append(action.getReference())
......@@ -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:
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:
action_id = id+' | '+act_id
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
bt_base_category_list.sort()
bt_action_list.sort()
bt_wf_chain_list.sort()
bt_type_mixin_list.sort()
self.setTemplatePortalTypeWorkflowChainList(bt_wf_chain_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
self.setTemplatePortalTypePropertySheetList(bt_property_sheet_list)
self.setTemplatePortalTypeBaseCategoryList(bt_base_category_list)
self.setTemplateActionPathList(bt_action_list)
self.setTemplatePortalTypeTypeMixin(bt_type_mixin_list)
security.declareProtected(Permissions.AccessContentsInformation,
'guessPortalTypes')
......@@ -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_allowed_content_type', ())
setattr(self, 'template_portal_type_type_mixin', ())
setattr(self, 'template_portal_type_hidden_content_type', ())
setattr(self, 'template_portal_type_property_sheet', ())
setattr(self, 'template_portal_type_base_category', ())
......
......@@ -87,6 +87,7 @@ item_name_list = (
'portal_type_hidden_content_type',
'portal_type_property_sheet',
'portal_type_base_category',
'portal_type_type_mixin',
'category',
'module',
'portal_type_roles',
......
......@@ -80,6 +80,7 @@
<string>my_template_portal_type_hidden_content_type_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_type_mixin_list</string>
<string>my_template_action_path_list</string>
</list>
</value>
......
<?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