Commit c8915cf7 authored by Ayush Tiwari's avatar Ayush Tiwari

bt5_prototype: Add removable_property parameter while building BP for path items

This will help in neglecting the properties and then save them in ObjectPropertyTempaltePackageItem.
This saves us from exporting properties twice, once with object and other with object path.

For ex:
BP5 erp5_mysql_innodb_catalog can be saved as
erp5_mysql_innodb.xml (but without all properties)
object_property_list.xml (keeping track of specific properties for erp5_mysql_innodb)
parent ca34801d
...@@ -154,15 +154,18 @@ class BusinessPackage(XMLObject): ...@@ -154,15 +154,18 @@ class BusinessPackage(XMLObject):
return {} return {}
security.declareProtected(Permissions.ManagePortal, 'build') security.declareProtected(Permissions.ManagePortal, 'build')
def build(self, no_action=False): def build(self, no_action=False, **kw):
""" """
Should also export the objects from PathTemplateItem to their xml format Should also export the objects from PathTemplateItem to their xml format
""" """
if not no_action: if not no_action:
self.storePathData() self.storePathData()
# XXX: Explicitly calling build for items. Needs to be changed # XXX: Explicitly calling build for items. Needs to be changed
self._path_item.build(self) self._path_item.build(self, **kw)
self._object_property_item.build(self) try:
self._object_property_item.build(self)
except Exception:
import pdb; pdb.set_trace()
pass pass
security.declareProtected(Permissions.ManagePortal, 'storePathData') security.declareProtected(Permissions.ManagePortal, 'storePathData')
...@@ -186,7 +189,7 @@ class BusinessPackage(XMLObject): ...@@ -186,7 +189,7 @@ class BusinessPackage(XMLObject):
return result return result
security.declareProtected(Permissions.ManagePortal, 'export') security.declareProtected(Permissions.ManagePortal, 'export')
def export(self, path=None, local=0, bpa=None): def export(self, path=None, local=0, bpa=None, **kw):
""" """
Export the object Export the object
XXX: Are we planning to use something like archive for saving the exported XXX: Are we planning to use something like archive for saving the exported
...@@ -194,9 +197,9 @@ class BusinessPackage(XMLObject): ...@@ -194,9 +197,9 @@ class BusinessPackage(XMLObject):
""" """
if not self.getBuildingState() == 'built': if not self.getBuildingState() == 'built':
raise BusinessPackageException, 'Package not built properly' raise BusinessPackageException, 'Package not built properly'
return self._export(path, local, bpa) return self._export(path, local, bpa, **kw)
def _export(self, path=None, local=0, bpa=None): def _export(self, path=None, local=0, bpa=None, **kw):
if bpa is None: if bpa is None:
if local: if local:
# we export into a folder tree # we export into a folder tree
...@@ -227,7 +230,7 @@ class BusinessPackage(XMLObject): ...@@ -227,7 +230,7 @@ class BusinessPackage(XMLObject):
for item_name in item_name_list: for item_name in item_name_list:
item = getattr(self, item_name, None) item = getattr(self, item_name, None)
if item is not None: if item is not None:
item.export(context=self, bpa=bpa) item.export(context=self, bpa=bpa, **kw)
return bpa.finishCreation() return bpa.finishCreation()
...@@ -499,6 +502,7 @@ class PathTemplatePackageItem(Implicit, Persistent): ...@@ -499,6 +502,7 @@ class PathTemplatePackageItem(Implicit, Persistent):
def removeProperties(self, def removeProperties(self,
obj, obj,
export, export,
properties=[],
keep_workflow_history=False, keep_workflow_history=False,
keep_workflow_history_last_history_only=False): keep_workflow_history_last_history_only=False):
""" """
...@@ -507,10 +511,14 @@ class PathTemplatePackageItem(Implicit, Persistent): ...@@ -507,10 +511,14 @@ class PathTemplatePackageItem(Implicit, Persistent):
obj._p_activate() obj._p_activate()
klass = obj.__class__ klass = obj.__class__
classname = klass.__name__ classname = klass.__name__
attr_set = {'_dav_writelocks', '_filepath', '_owner', '_related_index', attr_set = {'_dav_writelocks', '_filepath', '_owner', '_related_index',
'last_id', 'uid', 'last_id', 'uid',
'__ac_local_roles__', '__ac_local_roles_group_id_dict__'} '__ac_local_roles__', '__ac_local_roles_group_id_dict__'}
if properties:
for prop in properties:
if prop.endswith('_list'):
prop = prop[:-5]
attr_set.add(prop)
if export: if export:
if keep_workflow_history_last_history_only: if keep_workflow_history_last_history_only:
self._removeAllButLastWorkflowHistory(obj) self._removeAllButLastWorkflowHistory(obj)
...@@ -572,6 +580,9 @@ class PathTemplatePackageItem(Implicit, Persistent): ...@@ -572,6 +580,9 @@ class PathTemplatePackageItem(Implicit, Persistent):
keys = self._path_archive.keys() keys = self._path_archive.keys()
keys.sort() keys.sort()
hash_func = hashlib.sha1 hash_func = hashlib.sha1
# Check for properties_removed in kwargs
removable_property_dict = kw.get('removable_property', {})
removable_property_obj_list = removable_property_dict.keys()
for path in keys: for path in keys:
include_subobjects = 0 include_subobjects = 0
if path.endswith("**"): if path.endswith("**"):
...@@ -582,8 +593,12 @@ class PathTemplatePackageItem(Implicit, Persistent): ...@@ -582,8 +593,12 @@ class PathTemplatePackageItem(Implicit, Persistent):
obj = obj.__of__(context) obj = obj.__of__(context)
_recursiveRemoveUid(obj) _recursiveRemoveUid(obj)
id_list = obj.objectIds() id_list = obj.objectIds()
# Create list of properties which needed to be removed before export
removable_property_list = []
if path in removable_property_obj_list:
removable_property_list = removable_property_dict.get(path)
# XXX: This doesn't take care of workflow objects # XXX: This doesn't take care of workflow objects
obj = self.removeProperties(obj, 1) obj = self.removeProperties(obj, 1, properties=removable_property_list)
if hasattr(aq_base(obj), 'groups'): if hasattr(aq_base(obj), 'groups'):
# we must keep groups because it's ereased when we delete subobjects # we must keep groups because it's ereased when we delete subobjects
groups = deepcopy(obj.groups) groups = deepcopy(obj.groups)
......
...@@ -596,6 +596,7 @@ class TemplateTool (BaseTool): ...@@ -596,6 +596,7 @@ class TemplateTool (BaseTool):
portal_path = self.getPortalObject() portal_path = self.getPortalObject()
template_path_list = [] template_path_list = []
property_path_list = []
# For modules, we don't need to create path for the module # For modules, we don't need to create path for the module
module_list = import_template.getTemplateModuleIdList() module_list = import_template.getTemplateModuleIdList()
...@@ -666,26 +667,83 @@ class TemplateTool (BaseTool): ...@@ -666,26 +667,83 @@ class TemplateTool (BaseTool):
template_catalog_security_uid_column = import_template.getTemplateCatalogSecurityUidColumnList() template_catalog_security_uid_column = import_template.getTemplateCatalogSecurityUidColumnList()
template_catalog_topic_key = import_template.getTemplateCatalogTopicKeyList() template_catalog_topic_key = import_template.getTemplateCatalogTopicKeyList()
catalog_property_list = [
template_catalog_datetime_key,
template_catalog_full_text_key,
template_catalog_keyword_key,
template_catalog_local_role_key,
template_catalog_multivalue_key,
template_catalog_related_key,
template_catalog_request_key,
template_catalog_result_key,
template_catalog_result_table,
template_catalog_role_key,
template_catalog_scriptable_key,
template_catalog_search_key,
template_catalog_security_uid_column,
template_catalog_topic_key,
]
is_property_added = any(catalog_property_list)
properties_removed = [
'sql_catalog_datetime_search_keys_list',
'sql_catalog_full_text_search_keys_list',
'sql_catalog_keyword_search_keys_list',
'sql_catalog_local_role_keys_list',
'sql_catalog_multivalue_keys_list',
'sql_catalog_related_keys_list',
'sql_catalog_request_keys_list',
'sql_search_result_keys_list',
'sql_search_tables_list',
'sql_catalog_role_keys_list',
'sql_catalog_scriptable_keys_list',
'sql_catalog_search_keys_list',
'sql_catalog_security_uid_columns_list',
'sql_catalog_topic_search_keys_list'
]
removable_property = {}
if is_property_added:
if catalog_method_path_list:
catalog_path = catalog_method_path_list[0].rsplit('/', 1)[0]
else:
catalog_path = 'portal_catalog/erp5_mysql_innodb'
template_path_list.append(catalog_path)
removable_property[catalog_path] = properties_removed
for prop in properties_removed:
property_path_list.append(catalog_path + ' | ' + prop)
# Add these catalog items in the object_property instead of adding # Add these catalog items in the object_property instead of adding
# dummy path item for them # dummy path item for them
property_path_list = []
if import_template.getTitle() == 'erp5_mysql_innodb_catalog': if import_template.getTitle() == 'erp5_mysql_innodb_catalog':
template_path_list.extend('portal_catalog/erp5_mysql_innodb') template_path_list.extend('portal_catalog/erp5_mysql_innodb')
# Check if any catalog property exists and if yes, then we export the # Add portal_property_sheets
# erp5_mysql_innodb object and use it for installation property_sheet_id_list = import_template.getTemplatePropertySheetIdList()
property_sheet_path_list = []
for property_sheet in property_sheet_id_list:
property_sheet_path_list.append('portal_property_sheets/' + property_sheet)
property_sheet_path_list.append('portal_property_sheets/' + property_sheet + '/**')
template_path_list.extend(property_sheet_path_list)
# Create new objects for business package # Create new objects for business package
bp5_package = self.newContent( bp5_package = self.newContent(
portal_type='Business Package', portal_type='Business Package',
title=import_package.getTitle() title=import_template.getTitle()
) )
bp5_package.edit(template_path_list=template_path_list)
bp5_package.build() bp5_package.edit(
template_path_list=template_path_list,
template_object_property_list=property_path_list
)
kw['removable_property'] = removable_property
bp5_package.build(**kw)
# Export the newly built business package to the export directory # Export the newly built business package to the export directory
bp5_package.export(path=export_dir, local=True) bp5_package.export(path=export_dir, local=True)
if is_installed: if is_installed:
import_package.uninstall() import_template.uninstall()
security.declareProtected( 'Import/Export objects', 'migrateBTListToBP') security.declareProtected( 'Import/Export objects', 'migrateBTListToBP')
def migrateBTListToBP(self, repository_list, REQUEST=None, **kw): def migrateBTListToBP(self, repository_list, REQUEST=None, **kw):
......
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