[Erp5-report] r32339 leonardo - /erp5/trunk/products/ERP5/Document/BusinessTemplate.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Feb 9 05:59:50 CET 2010


Author: leonardo
Date: Tue Feb  9 05:59:50 2010
New Revision: 32339

URL: http://svn.erp5.org?rev=32339&view=rev
Log:
optionally allow uninstall of BT translations (off by default), and enable pass-through of keyword args to BusinessTemplate items .uninstall()

Modified:
    erp5/trunk/products/ERP5/Document/BusinessTemplate.py

Modified: erp5/trunk/products/ERP5/Document/BusinessTemplate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BusinessTemplate.py?rev=32339&r1=32338&r2=32339&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BusinessTemplate.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BusinessTemplate.py [utf8] Tue Feb  9 05:59:50 2010
@@ -4504,9 +4504,34 @@
           modified_object_list.update({path : ['Removed', self.__class__.__name__[:-12]]})
     return modified_object_list
 
-  def install(self, context, trashbin, **kw):
-    localizer = context.getPortalObject().Localizer
-    update_dict = kw.get('object_to_update')
+  def _splitKey(self,key):
+    path = key.split('/')
+    if len(path) == 1:
+      lang = path[0]
+      catalog = None
+    elif len(path) == 2:
+      lang = path[0]
+      catalog = path[1]
+    else:
+      lang = path[-3]
+      catalog = path[-2]
+    return lang, catalog
+
+  def _importCatalogLanguage(self, localizer, catalog, lang, po):
+    if catalog not in localizer.objectIds():
+      dispatcher = localizer.manage_addProduct['Localizer']
+      dispatcher.manage_addMessageCatalog(id=catalog, 
+                                          title='Message Catalog',
+                                          languages=['en'])
+    mc = localizer._getOb(catalog)
+    if lang not in mc.get_languages():
+      mc.manage_addLanguage(lang)
+    mc.manage_import(lang, po)
+
+  def install(self, context, trashbin, localizer=None, **kw):
+    if localizer is None:
+      localizer = context.getPortalObject().Localizer
+    update_dict = kw.get('object_to_update', {})
     force = kw.get('force')
     if context.getTemplateFormatVersion() == 1:
       for key in sorted(self._objects.keys()):
@@ -4515,16 +4540,7 @@
             action = update_dict[key]
             if action == 'nothing':
               continue
-          path = key.split('/')
-          if len(path) == 1:
-            lang = path[0]
-            catalog = None
-          elif len(path) == 2:
-            lang = path[0]
-            catalog = path[1]
-          else:
-            lang = path[-3]
-            catalog = path[-2]
+          lang, catalog = self._splitKey(key)
 
           if catalog is None:
             name = self._objects[key]
@@ -4547,20 +4563,43 @@
             po = self._objects[key]
             if lang not in localizer.get_languages():
               localizer.manage_addLanguage(lang)
-            mc = localizer._getOb(catalog)
-            if lang not in mc.get_languages():
-              mc.manage_addLanguage(lang)
-            mc.manage_import(lang, po)
+            self._importCatalogLanguage(localizer, catalog, lang, po)
     else:
       BaseTemplateItem.install(self, context, trashbin, **kw)
       for lang, catalogs in self._archive.iteritems():
         if lang not in localizer.get_languages():
           localizer.manage_addLanguage(lang)
         for catalog, po in catalogs.items():
-          mc = localizer._getOb(catalog)
-          if lang not in mc.get_languages():
-            mc.manage_addLanguage(lang)
-          mc.manage_import(lang, po)
+          self._importCatalogLanguage(catalog, lang, po)
+
+  def uninstall(self, context, remove_translations=False, **kw):
+    if not remove_translations:
+      return
+    portal = context.getPortalObject()
+    localizer = portal.Localizer
+    from Products.Localizer.Localizer import Localizer
+    fake_localizer = Localizer('Fake Localizer',
+                               languages=['en']).__of__(portal)
+    # roundabout way of keeping BW compatibility, allow install() to do the
+    # heavy lifting so we can extract the original catalogs and messages:
+    self.install(context, None, localizer=fake_localizer, force=True, **kw)
+    # now scan the actual message_catalog to remove messages present in the
+    # fake one.
+    for fake_message_catalog in fake_localizer.objectValues():
+      message_catalog = localizer._getOb(fake_message_catalog.getId())
+      # get list of messages present in both the fake and the real catalog
+      # UGH! direct attribute access... but there is no real API to access
+      # all messages here.
+      messages = set(fake_message_catalog._messages.keys())
+      messages.intersection_update(message_catalog._messages.keys())
+      for message in messages:
+        # delete translations from the real catalog that are present in the
+        # fake one
+        fake_translations = fake_message_catalog.get_translations(message)
+        translations = message_catalog.get_translations(message)
+        for lang in fake_translations.keys():
+          # XXX: should we check they're still the same before removing?
+          translations.pop(lang, None)
 
   def export(self, context, bta, **kw):
     if len(self._objects) == 0:
@@ -5268,7 +5307,7 @@
       for item_name in self._item_name_list[::-1]:
         item = getattr(self, item_name, None)
         if item is not None:
-          item.uninstall(self)
+          item.uninstall(self, **kw)
       # It is better to clear cache because the uninstallation of a
       # template deletes many things from the portal.
       self.getPortalObject().portal_caches.clearAllCache()




More information about the Erp5-report mailing list