From 098a9c697567a66ed9b4a8a72ab4ff3ecf9b9bc2 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Wed, 8 Jul 2020 12:21:16 +0900
Subject: [PATCH] WIP: ZODB Components: Migrate ERP5OOo Product from
 filesystem.

OOoUtils + OOoTemplate
---
 ...5.ConfigurationTemplate_readOOoCalcFile.py |   2 +-
 .../portal_components/test.erp5.testDms.py    |   2 +-
 .../erp5_ooo_import/Base_importFile.py        |   2 +-
 .../module.erp5.OOoTemplate.py}               |  76 ++--
 .../module.erp5.OOoTemplate.xml               | 110 ++++++
 .../module.erp5.OOoUtils.py}                  |  33 +-
 .../module.erp5.OOoUtils.xml                  | 110 ++++++
 .../Base_getCategoriesSpreadSheetMapping.py   |   2 +-
 .../bt/template_module_component_id_list      |   2 +
 product/ERP5/tests/testAccounting.py          |   2 +-
 .../testBusinessTemplateTwoFileExport.py      |   2 +-
 product/ERP5/tests/testInvoice.py             |   2 +-
 product/ERP5Form/tests/testOOoChart.py        |   4 +-
 product/ERP5OOo/Core/__init__.py              |   0
 product/ERP5OOo/Document/__init__.py          |   0
 product/ERP5OOo/GPL.txt                       | 340 ------------------
 product/ERP5OOo/MAINTAINERS.txt               |   2 -
 product/ERP5OOo/PropertySheet/__init__.py     |   0
 product/ERP5OOo/Tool/__init__.py              |   1 -
 product/ERP5OOo/VERSION.txt                   |   1 -
 product/ERP5OOo/readme.txt                    |  66 ----
 21 files changed, 278 insertions(+), 481 deletions(-)
 rename product/{ERP5OOo/OOoTemplate.py => ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.py} (92%)
 create mode 100644 product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.xml
 rename product/{ERP5OOo/OOoUtils.py => ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.py} (95%)
 create mode 100644 product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.xml
 delete mode 100644 product/ERP5OOo/Core/__init__.py
 delete mode 100644 product/ERP5OOo/Document/__init__.py
 delete mode 100644 product/ERP5OOo/GPL.txt
 delete mode 100644 product/ERP5OOo/MAINTAINERS.txt
 delete mode 100644 product/ERP5OOo/PropertySheet/__init__.py
 delete mode 100644 product/ERP5OOo/Tool/__init__.py
 delete mode 100644 product/ERP5OOo/VERSION.txt
 delete mode 100644 product/ERP5OOo/readme.txt

diff --git a/bt5/erp5_configurator/ExtensionTemplateItem/portal_components/extension.erp5.ConfigurationTemplate_readOOoCalcFile.py b/bt5/erp5_configurator/ExtensionTemplateItem/portal_components/extension.erp5.ConfigurationTemplate_readOOoCalcFile.py
index 3b5349b509..9195e203d9 100644
--- a/bt5/erp5_configurator/ExtensionTemplateItem/portal_components/extension.erp5.ConfigurationTemplate_readOOoCalcFile.py
+++ b/bt5/erp5_configurator/ExtensionTemplateItem/portal_components/extension.erp5.ConfigurationTemplate_readOOoCalcFile.py
@@ -74,7 +74,7 @@ def getIdFromString(string):
   return clean_id
 
 def convert(self, filename, data=None):
-  from Products.ERP5OOo.OOoUtils import OOoParser
+  from erp5.component.module.OOoUtils import OOoParser
   OOoParser = OOoParser()
   import_file = read(self, filename, data)
 
diff --git a/bt5/erp5_dms/TestTemplateItem/portal_components/test.erp5.testDms.py b/bt5/erp5_dms/TestTemplateItem/portal_components/test.erp5.testDms.py
index 1c80e39146..bf5a18e638 100644
--- a/bt5/erp5_dms/TestTemplateItem/portal_components/test.erp5.testDms.py
+++ b/bt5/erp5_dms/TestTemplateItem/portal_components/test.erp5.testDms.py
@@ -56,7 +56,7 @@ import ZPublisher.HTTPRequest
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from Products.ERP5Type.tests.utils import FileUpload
 from Products.ERP5Type.tests.utils import DummyLocalizer
-from Products.ERP5OOo.OOoUtils import OOoBuilder
+from erp5.component.module.OOoUtils import OOoBuilder
 from AccessControl.SecurityManagement import newSecurityManager
 from AccessControl import getSecurityManager
 from Products.ERP5.Document.Document import NotConvertedError
diff --git a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
index eaa5846123..7c74988990 100644
--- a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
+++ b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
@@ -1,4 +1,4 @@
-from Products.ERP5OOo.OOoUtils import OOoParser
+from erp5.component.module.OOoUtils import OOoParser
 import string
 
 request  = container.REQUEST
diff --git a/product/ERP5OOo/OOoTemplate.py b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.py
similarity index 92%
rename from product/ERP5OOo/OOoTemplate.py
rename to product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.py
index ff381998f2..71980141ed 100644
--- a/product/ERP5OOo/OOoTemplate.py
+++ b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.py
@@ -37,31 +37,30 @@ from Products.PageTemplates.PageTemplateFile import PageTemplateFile
 from zope.tal.talinterpreter import FasterStringIO
 from Products.ERP5Type import PropertySheet
 from urllib import quote
-from Products.ERP5Type.Globals import InitializeClass, DTMLFile, get_request
+from Products.ERP5Type.Globals import InitializeClass, DTMLFile
 from Acquisition import aq_base
 from AccessControl import ClassSecurityInfo
-from OOoUtils import OOoBuilder
+from erp5.component.module.OOoUtils import OOoBuilder
 from zipfile import ZipFile, ZIP_DEFLATED
 from cStringIO import StringIO
 import re
 import itertools
 
 try:
+   # pylint: disable=no-name-in-module,unused-import
   from webdav.Lockable import ResourceLockedError
   from webdav.WriteLockInterface import WriteLockInterface
   SUPPORTS_WEBDAV_LOCKS = 1
 except ImportError:
   SUPPORTS_WEBDAV_LOCKS = 0
 
-from Products.ERP5.Document.Document import ConversionError
-
 from lxml import etree
 from lxml.etree import Element
 
 # Constructors
 manage_addOOoTemplate = DTMLFile("dtml/OOoTemplate_add", globals())
 
-def addOOoTemplate(self, id, title="", xml_file_id="content.xml", REQUEST=None):
+def addOOoTemplate(self, id, title="", xml_file_id="content.xml", REQUEST=None): # pylint: disable=redefined-builtin
   """Add OOo template to folder.
 
   id     -- the id of the new OOo template to add
@@ -76,12 +75,12 @@ def addOOoTemplate(self, id, title="", xml_file_id="content.xml", REQUEST=None):
     file_ = REQUEST.form.get('file')
     if file_.filename:
       # Get the template in the associated context and upload the file
-      obj.pt_upload(REQUEST, file)
+      obj.pt_upload(REQUEST, file_)
   # respond to the add_and_edit button if necessary
   add_and_edit(self, id, REQUEST)
   return ''
 
-def add_and_edit(self, id, REQUEST):
+def add_and_edit(self, id, REQUEST): # pylint: disable=redefined-builtin
   """Helper method to point to the object's management screen if
   'Add and Edit' button is pressed.
   id -- id of the object we just added
@@ -97,14 +96,18 @@ def add_and_edit(self, id, REQUEST):
   REQUEST.RESPONSE.redirect(u+'/manage_main')
 
 class OOoTemplateStringIO(FasterStringIO):
+  # pylint: disable=method-hidden
   def write(self, s):
-    if type(s) == unicode:
+    if isinstance(s, unicode):
       s = s.encode('utf-8')
     FasterStringIO.write(self, s)
 
 from Products.PageTemplates.Expressions import ZopeContext, createZopeEngine
 
 # On recent Zope, we need an engine to decode non-unicode-strings for us
+#
+# evaluateCode():
+# pylint: disable=abstract-method
 class OOoContext(ZopeContext):
   """ ZopeContext variant that ALWAYS converts standard strings through utf-8,
   as needed by OpenOffice, ignoring the preferred encodings in the request.
@@ -117,9 +120,9 @@ class OOoContext(ZopeContext):
     return ZopeContext._handleText(self, text, expr)
 
 def createOOoZopeEngine():
-    e = createZopeEngine()
-    e._create_context = OOoContext
-    return e
+  e = createZopeEngine()
+  e._create_context = OOoContext
+  return e
 
 _engine = createOOoZopeEngine()
 
@@ -177,7 +180,7 @@ class OOoTemplate(Base, ZopePageTemplate):
                                   __name__='formSettings')
   formSettings._owner = None
 
-  def __init__(self, id, title='', *args, **kw):
+  def __init__(self, id, title='', *args, **kw): # pylint: disable=redefined-builtin
     ZopePageTemplate.__init__(self, id, title, *args, **kw)
     # we store the attachments of the uploaded document
     self.OLE_documents_zipstring = None
@@ -190,12 +193,12 @@ class OOoTemplate(Base, ZopePageTemplate):
   def pt_getEngine(self):
     return _engine
 
-  def pt_upload(self, REQUEST, file=''):
+  def pt_upload(self, REQUEST, file=''): # pylint: disable=redefined-builtin,arguments-differ
     """Replace the document with the text in file."""
     if SUPPORTS_WEBDAV_LOCKS and self.wl_isLocked():
       raise ResourceLockedError, "File is locked via WebDAV"
 
-    if type(file) is not StringType:
+    if not isinstance(file, StringType):
       if not file: raise ValueError, 'File not specified'
       file = file.read()
 
@@ -217,7 +220,7 @@ class OOoTemplate(Base, ZopePageTemplate):
         except RuntimeError:
           zf = ZipFile(memory_file, mode='w')
         for attached_file in attached_files_list:
-            zf.writestr(attached_file, builder.extract(attached_file) )
+          zf.writestr(attached_file, builder.extract(attached_file) )
         zf.close()
         memory_file.seek(0)
         self.OLE_documents_zipstring = memory_file.read()
@@ -225,20 +228,6 @@ class OOoTemplate(Base, ZopePageTemplate):
       file = builder.prepareContentXml(self.getXmlFileId())
     return ZopePageTemplate.pt_upload(self, REQUEST, file)
 
-  if 'pt_edit' not in ZopePageTemplate.__dict__:
-    # Override it only for 2.8 !
-    # ZopePageTemplate v.2.8 inherate pt_edit from
-    # PageTemplate. If method is defined on ZopePageTemplate
-    # means we are under 2.12.
-    # Delete me when we drop support of 2.8
-    security.declareProtected('Change Page Templates', 'pt_edit')
-    def pt_edit(self, text, content_type):
-      if content_type:
-        self.content_type = str(content_type)
-      if hasattr(text, 'read'):
-        text = text.read()
-      self.write(text)
-
   security.declareProtected('Change Page Templates', 'doSettings')
   def doSettings(self, REQUEST, title, xml_file_id, ooo_stylesheet, script_name=None):
     """
@@ -262,7 +251,7 @@ class OOoTemplate(Base, ZopePageTemplate):
 
   def renderIncludes(self, here, text, extra_context, request, sub_document=None):
     attached_files_dict = {}
-    arguments_re = re.compile('''(\S+?)\s*=\s*('|")(.*?)\\2\s*''',re.DOTALL)
+    arguments_re = re.compile(r'''(\S+?)\s*=\s*('|")(.*?)\\2\s*''',re.DOTALL)
     def getLengthInfos( opts_dict, opts_names ):
       ret = []
       for opt_name in opts_names:
@@ -351,6 +340,7 @@ class OOoTemplate(Base, ZopePageTemplate):
         if picture_type is None:
           picture_type = picture.getContentType()
 
+      # pylint: disable=unbalanced-tuple-unpacking
       w, h, maxwidth, maxheight = getLengthInfos(options_dict,
                                   ('width', 'height', 'maxwidth', 'maxheight'))
 
@@ -425,11 +415,13 @@ class OOoTemplate(Base, ZopePageTemplate):
       office_include.getparent().replace(office_include, draw_object)
     text = etree.tostring(xml_doc, encoding='utf-8', xml_declaration=True,
                           pretty_print=False)
-    text = re.sub('<\s*office:include_img\s+(.*?)\s*/\s*>(?s)', replaceIncludesImg, text)
+    text = re.sub(r'<\s*office:include_img\s+(.*?)\s*/\s*>(?s)', replaceIncludesImg, text)
 
     return (text, attached_files_dict)
   # Proxy method to PageTemplate
-  def pt_render(self, source=0, extra_context={}):
+  def pt_render(self, source=0, extra_context=None):
+    if extra_context is None:
+      extra_context = {}
     if source:
       return ZopePageTemplate.pt_render(self, source=source,
                                          extra_context=extra_context)
@@ -448,14 +440,14 @@ class OOoTemplate(Base, ZopePageTemplate):
       ooo_document = ooo_script(self.getOooStylesheet())
     else:
       ooo_document = getattr(here, self.getOooStylesheet())
-    format = request.get('format')
+    format_ = request.get('format')
     try:
       # If style is dynamic, call it
       if getattr(aq_base(ooo_document), '__call__', None) is not None:
         request.set('format', None)
         ooo_document = ooo_document()
     finally:
-      request.set('format', format)
+      request.set('format', format_)
     # Create a new builder instance
     ooo_builder = OOoBuilder(ooo_document)
     # Pass builder instance as extra_context
@@ -550,8 +542,8 @@ class OOoTemplate(Base, ZopePageTemplate):
                  filename=filename,
                  content_type=mimetype,)
 
-    format = opts.get('format', request.get('format', None))
-    if format:
+    format_ = opts.get('format', request.get('format', None))
+    if format_:
       # Performance improvement:
       # We already have OOo format data, so we do not need to call
       # convertToBaseFormat(), but just copy it into base_data property.
@@ -561,19 +553,19 @@ class OOoTemplate(Base, ZopePageTemplate):
     if request is not None and not batch_mode and not source:
       return tmp_ooo.index_html(REQUEST=request,
                                 RESPONSE=request.RESPONSE,
-                                format=format)
-    return tmp_ooo.convert(format)[1]
+                                format=format_)
+    return tmp_ooo.convert(format_)[1]
 
   def om_icons(self):
     """Return a list of icon URLs to be displayed by an ObjectManager"""
     icons = ({'path': 'misc_/ERP5OOo/OOo.png',
               'alt': self.meta_type, 'title': self.meta_type},)
     if not self._v_cooked:
-        self._cook()
+      self._cook()
     if self._v_errors:
-        icons = icons + ({'path': 'misc_/PageTemplates/exclamation.gif',
-                          'alt': 'Error',
-                          'title': 'This template has an error'},)
+      icons = icons + ({'path': 'misc_/PageTemplates/exclamation.gif',
+                        'alt': 'Error',
+                        'title': 'This template has an error'},)
     return icons
 
   def _getFileName(self):
diff --git a/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.xml b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.xml
new file mode 100644
index 0000000000..fd12b5ec09
--- /dev/null
+++ b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoTemplate.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Module Component" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>OOoTemplate</string> </value>
+        </item>
+        <item>
+            <key> <string>default_source_reference</string> </key>
+            <value> <string>Products.ERP5OOo.OOoTemplate</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>module.erp5.OOoTemplate</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Module 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">AAAAAAAAAAI=</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>
+                <item>
+                    <key> <string>component_validation_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <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>
diff --git a/product/ERP5OOo/OOoUtils.py b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.py
similarity index 95%
rename from product/ERP5OOo/OOoUtils.py
rename to product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.py
index a799f722a2..86d2b8e87d 100644
--- a/product/ERP5OOo/OOoUtils.py
+++ b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.py
@@ -31,16 +31,12 @@
 from Acquisition import Implicit
 
 from Products.PythonScripts.Utility import allow_class
-from ZPublisher.HTTPRequest import FileUpload
-from xml.dom import Node
-from AccessControl import ClassSecurityInfo
-from Products.ERP5Type.Globals import InitializeClass, get_request
+from Products.ERP5Type.Globals import get_request
 from zipfile import ZipFile, ZIP_DEFLATED
 from cStringIO import StringIO
 import imghdr
 import random
-from Products.ERP5Type import Permissions
-from zLOG import LOG, INFO, DEBUG
+from zLOG import LOG, DEBUG
 
 from OFS.Image import Pdata
 
@@ -142,7 +138,6 @@ class OOoBuilder(Implicit):
         - indent the xml
     """
     content_xml = self.extract(ooo_xml_file_id)
-    output = StringIO()
     content_doc = etree.XML(content_xml)
     root = content_doc.getroottree().getroot()
     #Declare zope namespaces
@@ -160,10 +155,10 @@ class OOoBuilder(Implicit):
 
 
   def addFileEntry(self, full_path, media_type, content=None):
-      """ Add a file entry to the manifest and possibly is content """
-      self.addManifest(full_path, media_type)
-      if content:
-          self.replace(full_path, content)
+    """ Add a file entry to the manifest and possibly is content """
+    self.addManifest(full_path, media_type)
+    if content:
+      self.replace(full_path, content)
 
   def addManifest(self, full_path, media_type):
     """ Add a path to the manifest """
@@ -176,9 +171,9 @@ class OOoBuilder(Implicit):
     meta_infos = self.extract(MANIFEST_FILENAME)
     # prevent some duplicates
     for meta_line in meta_infos.split('\n'):
-        for new_meta_line in self._manifest_additions_list:
-            if meta_line.strip() == new_meta_line:
-                self._manifest_additions_list.remove(new_meta_line)
+      for new_meta_line in self._manifest_additions_list:
+        if meta_line.strip() == new_meta_line:
+          self._manifest_additions_list.remove(new_meta_line)
 
     # add the new lines
     self._manifest_additions_list.append('</manifest:manifest>')
@@ -186,7 +181,7 @@ class OOoBuilder(Implicit):
     self.replace(MANIFEST_FILENAME, meta_infos)
     self._manifest_additions_list = []
 
-  def addImage(self, image, format='png', content_type=None):
+  def addImage(self, image, format='png', content_type=None): # pylint: disable=redefined-builtin
     """
     Add an image to the current document and return its id
     """
@@ -334,7 +329,6 @@ class OOoParser(Implicit):
       document = embedded.get('{%s}href' % embedded.nsmap['xlink'])
       if document:
         try:
-          object_content = etree.XML(self.oo_files[document[3:] + '/content.xml'])
           find_path = './/{%s}table' % self.oo_content_dom.nsmap['table']
           table_list = self.oo_content_dom.findall(find_path)
           if table_list:
@@ -342,7 +336,7 @@ class OOoParser(Implicit):
               spreadsheets.append(table)
           else: # XXX: insert the link to OLE document ?
             pass
-        except XMLSyntaxError:
+        except XMLSyntaxError: # pylint: disable=catching-non-exception
           pass
     return spreadsheets
 
@@ -383,7 +377,7 @@ class OOoParser(Implicit):
       else:
         lines_to_repeat = int(line_group_found)
 
-      for i in range(lines_to_repeat):
+      for _ in range(lines_to_repeat):
         table_line = []
 
         # Get all cells
@@ -413,7 +407,7 @@ class OOoParser(Implicit):
             cells_to_repeat = int(cell_group_found)
 
           # Ungroup repeated cells
-          for j in range(cells_to_repeat):
+          for _ in range(cells_to_repeat):
             # Get the cell content
             cell_data = None
             attribute_type_mapping = {'date': 'date-value',
@@ -433,7 +427,6 @@ class OOoParser(Implicit):
               # instance <text:s/> for a space (or using <text:s text:c="3"/>
               # for multiple spaces) <text:tab/> for a tab and <text:line-break/>
               # for new line
-              text_ns = cell.nsmap['text']
               def format_node(node):
                 if node.tag == '{%s}table-cell' % node.nsmap['table']:
                   return "\n".join(part for part in
diff --git a/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.xml b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.xml
new file mode 100644
index 0000000000..58359e3583
--- /dev/null
+++ b/product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.OOoUtils.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Module Component" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>OOoUtils</string> </value>
+        </item>
+        <item>
+            <key> <string>default_source_reference</string> </key>
+            <value> <string>Products.ERP5OOo.OOoUtils</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>module.erp5.OOoUtils</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Module 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">AAAAAAAAAAI=</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>
+                <item>
+                    <key> <string>component_validation_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <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>
diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getCategoriesSpreadSheetMapping.py b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getCategoriesSpreadSheetMapping.py
index 2bf3960eb1..084bbff021 100644
--- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getCategoriesSpreadSheetMapping.py
+++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_getCategoriesSpreadSheetMapping.py
@@ -26,7 +26,7 @@ This scripts guarantees that the list of category info is sorted in such a
 way that parent always precedes their children.
 """
 from Products.ERP5Type.Message import translateString
-from Products.ERP5OOo.OOoUtils import OOoParser
+from erp5.component.module.OOoUtils import OOoParser
 parser = OOoParser()
 category_list_spreadsheet_mapping = {}
 error_list = []
diff --git a/product/ERP5/bootstrap/erp5_core/bt/template_module_component_id_list b/product/ERP5/bootstrap/erp5_core/bt/template_module_component_id_list
index ce14d8e1fd..85dd091893 100644
--- a/product/ERP5/bootstrap/erp5_core/bt/template_module_component_id_list
+++ b/product/ERP5/bootstrap/erp5_core/bt/template_module_component_id_list
@@ -5,5 +5,7 @@ module.erp5.GeneratedAmountList
 module.erp5.Log
 module.erp5.MovementCollectionDiff
 module.erp5.MovementGroup
+module.erp5.OOoTemplate
+module.erp5.OOoUtils
 module.erp5.TimeoutTransport
 module.erp5.WebDAVSupport
\ No newline at end of file
diff --git a/product/ERP5/tests/testAccounting.py b/product/ERP5/tests/testAccounting.py
index 804cbfdb65..5685e28879 100644
--- a/product/ERP5/tests/testAccounting.py
+++ b/product/ERP5/tests/testAccounting.py
@@ -3161,7 +3161,7 @@ class TestAccountingExport(AccountingTestCase):
                    quantity=200),))
     ods_data = accounting_transaction.Base_viewAsODS(
                     form_id='AccountingTransaction_view')
-    from Products.ERP5OOo.OOoUtils import OOoParser
+    from erp5.component.module.OOoUtils import OOoParser
     parser = OOoParser()
     parser.openFromString(ods_data)
     content_xml = parser.oo_files['content.xml']
diff --git a/product/ERP5/tests/testBusinessTemplateTwoFileExport.py b/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
index cdc6b1fe5c..b21fa00640 100644
--- a/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
+++ b/product/ERP5/tests/testBusinessTemplateTwoFileExport.py
@@ -826,7 +826,7 @@ AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
                          "output_encoding": "utf-8",
                          "content_type": "text/html"}
 
-    from Products.ERP5OOo.OOoTemplate import OOoTemplate
+    from erp5.component.module.OOoTemplate import OOoTemplate
     skin_folder._setObject(OOo_template_id,
       OOoTemplate(OOo_template_id, OOo_template_data, content_type=''))
 
diff --git a/product/ERP5/tests/testInvoice.py b/product/ERP5/tests/testInvoice.py
index 139c18ab0d..f9829a50cb 100644
--- a/product/ERP5/tests/testInvoice.py
+++ b/product/ERP5/tests/testInvoice.py
@@ -37,7 +37,6 @@ from Products.DCWorkflow.DCWorkflow import ValidationFailed
 from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
 from Products.ERP5Type.tests.utils import FileUpload
 from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
-from Products.ERP5OOo.OOoUtils import OOoParser
 from AccessControl.SecurityManagement import newSecurityManager
 from DateTime import DateTime
 from Acquisition import aq_parent
@@ -1712,6 +1711,7 @@ class TestInvoice(TestInvoiceMixin):
       self.fail(''.join(err_list))
 
     # the <draw:image> should not be present, because there's no logo
+    from erp5.component.module.OOoUtils import OOoParser
     parser = OOoParser()
     parser.openFromString(odt)
     style_xml = parser.oo_files['styles.xml']
diff --git a/product/ERP5Form/tests/testOOoChart.py b/product/ERP5Form/tests/testOOoChart.py
index 7a5a31f8d9..d00f51a894 100644
--- a/product/ERP5Form/tests/testOOoChart.py
+++ b/product/ERP5Form/tests/testOOoChart.py
@@ -157,7 +157,7 @@ class TestOOoChart(ERP5TypeTestCase, ZopeTestCase.Functional):
       # Test Validation Relax NG
       self._validate(body)
 
-      from Products.ERP5OOo.OOoUtils import OOoParser
+      from erp5.component.module.OOoUtils import OOoParser
       parser = OOoParser()
       parser.openFromString(body)
       content_xml_view = parser.oo_files['content.xml']
@@ -250,7 +250,7 @@ class TestOOoChart(ERP5TypeTestCase, ZopeTestCase.Functional):
       # Test Validation Relax NG
       self._validate(body)
 
-      from Products.ERP5OOo.OOoUtils import OOoParser
+      from erp5.component.module.OOoUtils import OOoParser
       parser = OOoParser()
       parser.openFromString(body)
       content_xml_view = parser.oo_files['content.xml']
diff --git a/product/ERP5OOo/Core/__init__.py b/product/ERP5OOo/Core/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/product/ERP5OOo/Document/__init__.py b/product/ERP5OOo/Document/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/product/ERP5OOo/GPL.txt b/product/ERP5OOo/GPL.txt
deleted file mode 100644
index dcfa4c235e..0000000000
--- a/product/ERP5OOo/GPL.txt
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/product/ERP5OOo/MAINTAINERS.txt b/product/ERP5OOo/MAINTAINERS.txt
deleted file mode 100644
index 3d6d4ed815..0000000000
--- a/product/ERP5OOo/MAINTAINERS.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-kevin
-jerome
diff --git a/product/ERP5OOo/PropertySheet/__init__.py b/product/ERP5OOo/PropertySheet/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/product/ERP5OOo/Tool/__init__.py b/product/ERP5OOo/Tool/__init__.py
deleted file mode 100644
index 8b13789179..0000000000
--- a/product/ERP5OOo/Tool/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/product/ERP5OOo/VERSION.txt b/product/ERP5OOo/VERSION.txt
deleted file mode 100644
index 74efd67bb4..0000000000
--- a/product/ERP5OOo/VERSION.txt
+++ /dev/null
@@ -1 +0,0 @@
-ERP5OOo 5.4.7
diff --git a/product/ERP5OOo/readme.txt b/product/ERP5OOo/readme.txt
deleted file mode 100644
index 2151e5e1ea..0000000000
--- a/product/ERP5OOo/readme.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-OOo Template
-
-  An Zope object class to generate OOo documents dynamically.
-
-  OOo Template derives from Zope Page Templates. Simply define the content.xml
-  part of an OOo document in the edit tab. Then create a new File and upload
-  an existing OOo document (ex. default_ooo_template). Then set the stylesheet
-  property to the id of the uploaded OOo document (ex. default_ooo_template in this case).
-
-  Rendering consists in replacing content.xml of the original OOo document
-  with the content.xml generated by the OOo Template.
-
-  Special tags for including content:
-
-    - <office:include>
-        Allow you to include another document in the current template (as an OLE attachment)
-        You must specify at least the path (can be either a single name or a path name using "/").
-        The type of document must be specified in the embedded document itself as
-        a MIME type. Size parameters are defined, as in any ODF file,
-        within the <draw:frame> tag which encloses the <office:include> tag.
-
-        TODO: make sure it is useful or useless to pass x, y params (as before)
-
-       Example:
-        <draw:frame draw:style-name='gr1' svg:height='18.686cm' svg:width='27.367cm' draw:layer='layout' 
-                    svg:x='0cm' svg:y='0cm'
-                    tal:attributes="svg:height height | string:18.686cm;
-                                    svg:width width | string:27.367cm">
-          <office:include path="ERP5Site_viewOwnerBarChart" xlink:type='simple' 
-                          xlink:actuate='onLoad' xlink:show='embed'/>
-        </draw:frame>
-
-    - <office:include_img>
-        Not unlike <office:include>, allows you to include a picture document, refer to
-        the <office:include> part for details.
-        The optional "type" attribute specifies the picture format ; you can either
-        pass a full value ("image/jpeg") or the short version ("jpeg").
-        You can also pass position parameters with "x" and "y" attributes.
-        The maxwidth and maxheight parameters are useful to set constraints.
-        The aspect ratio information try to be kept (if you set only one size
-        or if a constraint is applied).
-
-       Example:
-           <office:include_img x="5cm" y="1cm" path="foo" />
-
-  Tips:
-
-    - it is possible to embed images by calling oo_builder.addImage(image)
-      where oo_builder is a handle to OOo Template internals and
-      addImage a method to embed an image in the resulting document.
-
-      Example:
-
-      <draw:image draw:style-name="fr1" draw:name="Image1" text:anchor-type="as-char"
-              draw:z-index="0" xlink:href="#Pictures/0001.png"
-              xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"
-              tal:attributes="xlink:href python:request.oo_builder.addImage(image.index_html(None,None,display='medium'))"/>
-
-  Known Issues:
-
-    - content type must be set to text/html
-
-    - remove any dtd declaration such as:
-
-    <!DOCTYPE office:document-content PUBLIC "-//OpenOffice.org//DTD OfficeDocument
-1.0//EN" "office.dtd">
-- 
2.30.9