From 5e49155a6d628575b9d74f65805a34d570fa89d6 Mon Sep 17 00:00:00 2001 From: Arnaud Fontaine <arnaud.fontaine@nexedi.com> Date: Fri, 20 Jan 2012 16:11:44 +0900 Subject: [PATCH] Allow to erase an existing Component before importing from filesystem. --- product/ERP5Type/Core/ExtensionComponent.py | 19 ++++++++++++++----- product/ERP5Type/Tool/ComponentTool.py | 6 ++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/product/ERP5Type/Core/ExtensionComponent.py b/product/ERP5Type/Core/ExtensionComponent.py index 6700f741e7..50a6a962a6 100644 --- a/product/ERP5Type/Core/ExtensionComponent.py +++ b/product/ERP5Type/Core/ExtensionComponent.py @@ -47,7 +47,7 @@ class ExtensionComponent(DocumentComponent): security.declareProtected(Permissions.ModifyPortalContent, 'importAllFromFilesystem') @classmethod - def importAllFromFilesystem(cls, context): + def importAllFromFilesystem(cls, context, erase_existing=False): """ Try to import all Extensions as found in INSTANCEHOME/Extensions and returns error as a dict if any @@ -64,7 +64,7 @@ class ExtensionComponent(DocumentComponent): failed_import_dict = {} for extension_path in glob.iglob(extension_path_pattern): try: - cls.importFromFilesystem(context, extension_path) + cls.importFromFilesystem(context, extension_path, erase_existing) except Exception, e: failed_import_dict[extension_path] = str(e) else: @@ -76,11 +76,21 @@ class ExtensionComponent(DocumentComponent): security.declareProtected(Permissions.ModifyPortalContent, 'importFromFilesystem') @classmethod - def importFromFilesystem(cls, context, path): + def importFromFilesystem(cls, context, path, erase_existing=False): """ Import an Extension from the given path into ZODB after checking that the source code is valid """ + class_name = os.path.basename(path).replace('.py', '') + id = 'erp5.component.extension.%s' % class_name + + # XXX-arnau: not efficient at all + if id in context: + if not erase_existing: + return + + context.deleteContent(id) + with open(path) as extension_file: source_code = extension_file.read() @@ -88,8 +98,7 @@ class ExtensionComponent(DocumentComponent): namespace_dict = {} exec source_code in namespace_dict - class_name = os.path.basename(path).replace('.py', '') - return context.newContent(id='erp5.component.extension.%s' % class_name, + return context.newContent(id=id, # XXX-arnau: useless field? reference=class_name, text_content=source_code, diff --git a/product/ERP5Type/Tool/ComponentTool.py b/product/ERP5Type/Tool/ComponentTool.py index 517fff43da..813a9ebbab 100644 --- a/product/ERP5Type/Tool/ComponentTool.py +++ b/product/ERP5Type/Tool/ComponentTool.py @@ -95,8 +95,10 @@ class ComponentTool(BaseTool): for content_portal_type in getattr(type_tool, self.portal_type).getTypeAllowedContentTypeList(): try: - failed_import_dict.update(getattr(erp5.portal_type, - content_portal_type).importAllFromFilesystem(self)) + failed_import_dict.update( + getattr(erp5.portal_type, + content_portal_type).importAllFromFilesystem(self, + erase_existing=erase_existing)) except AttributeError: LOG("ERP5Type.Tool.ComponentTool", WARNING, "Could not import %ss" % \ content_portal_type) -- 2.30.9