From 5841c398afa3a60f4d8a314bdd90d55f862b941d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lien=20Calonne?= <aurel@nexedi.com>
Date: Thu, 23 Feb 2006 19:49:51 +0000
Subject: [PATCH] add class to manage properties translation domains on portal
 types

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@5821 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/TranslationProviderBase.py | 188 ++++++++++++++++++++
 1 file changed, 188 insertions(+)
 create mode 100755 product/ERP5Type/TranslationProviderBase.py

diff --git a/product/ERP5Type/TranslationProviderBase.py b/product/ERP5Type/TranslationProviderBase.py
new file mode 100755
index 0000000000..f6eee8c8aa
--- /dev/null
+++ b/product/ERP5Type/TranslationProviderBase.py
@@ -0,0 +1,188 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Corporation and Contributors. All Rights Reserved.
+#               2006 Nexedi
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+from Globals import DTMLFile, InitializeClass
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.Expression import Expression
+from Products.ERP5Type import _dtmldir
+
+from Permissions import ManagePortal
+from OFS.SimpleItem import SimpleItem
+from Products.ERP5Type import PropertySheet
+from Acquisition import aq_base
+
+import Products
+
+from zLOG import LOG
+
+class TranslationProviderBase:
+  """
+  Provide Translation Tabs and management methods for PropertyTranslationDomain
+  """
+
+  security = ClassSecurityInfo()
+  
+  _property_domain_dict = {}
+
+  _translation_form = DTMLFile( 'editToolsTranslation', _dtmldir )
+
+  manage_options = ( { 'label' : 'Translation'
+                       , 'action' : 'manage_editTranslationForm'
+                       }
+                     ,
+                     )
+
+  security.declarePrivate( 'createInitialPropertyTranslationDomainDict' )
+  def createInitialPropertyTranslationDomainDict(self, ):
+    """
+    Create the initial list of association between property and domain name
+    """
+    property_domain_dict = {}
+    ptype_object = self
+    # get the klass of the object based on the constructor document
+    m = Products.ERP5Type._m
+    ptype_name = ''.join(ptype_object.id.split(' '))
+    constructor = 'add%s' %(ptype_name)
+    klass = None
+    for method, doc in m.items():
+      if method == constructor:
+        klass = doc.klass
+        break
+    # get the property sheet list for the portal type
+    # from the list of property sheet defined on the portal type
+    ps_list = map(lambda p: getattr(PropertySheet, p, None),
+                  ptype_object.property_sheet_list)
+    ps_list = filter(lambda p: p is not None, ps_list)
+    # from the property sheets defined on the class
+    if klass is not None:
+      from Products.ERP5Type.Base import getClassPropertyList
+      ps_list = tuple(ps_list) + getClassPropertyList(klass)
+    # get all properties from the property sheet list
+    current_list = []
+    for base in ps_list:
+      if hasattr(base, '_properties'):
+        # XXX must check that property is translatable
+        ps_property = getattr(base, '_properties')
+        if type(ps_property) in (type(()), type([])):
+          current_list += ps_property
+    # create TranslationInformation object for each property
+    for prop in current_list:      
+      if prop.get('translatable', 0):
+        prop_id = prop['id']
+        if not property_domain_dict.has_key(prop_id):
+          property_domain_dict[prop_id] = TranslationInformation(prop_id, '')
+
+    self._property_domain_dict = property_domain_dict
+        
+  security.declarePrivate( 'getPropertyTranslationDomainDict' )
+  def getPropertyTranslationDomainDict(self,):
+    """
+    Return all the translation defined by a provider.
+    """
+    property_domain_dict = getattr(aq_base(self), '_property_domain_dict', {})
+    if len(property_domain_dict) == 0:
+      self.createInitialPropertyTranslationDomainDict()      
+    return self._property_domain_dict
+
+  #
+  #   ZMI methods
+  #
+  security.declareProtected( ManagePortal, 'manage_editTranslationForm' )
+  def manage_editTranslationForm( self, REQUEST, manage_tabs_message=None ):
+    """ Show the 'Translation' management tab.
+    """
+    translation_list = []
+    prop_domain_name_dict = self.getPropertyTranslationDomainDict()
+    keys = prop_domain_name_dict.keys()
+    keys.sort()
+    for k in keys:
+      prop = prop_domain_name_dict[k]
+      t = {}      
+      t['property_name'] = prop.getPropertyName()
+      t['domain_name'] = prop.getDomainName()
+      translation_list.append(t)      
+
+    # get list of Localizer catalog, add 'empty' one for no traduction
+    catalog = self.getPortalObject().Localizer.objectIds() + ['']
+    
+    return self._translation_form( self
+                                   , REQUEST
+                                   , translations = translation_list
+                                   , possible_domain_names=catalog
+                                   , management_view='Translation'
+                                   , manage_tabs_message=manage_tabs_message
+                                   )
+  
+
+  security.declareProtected( ManagePortal, 'changeRoles' )
+  def changeTranslations( self, properties=None, REQUEST=None ):
+    """
+    Update our list of translations domain name
+    """
+    if properties is None:
+      properties = REQUEST
+    
+    for prop_name in self._property_domain_dict.keys():
+      new_domain_name = properties.get(prop_name)
+      prop_object = self._property_domain_dict[prop_name]
+      if new_domain_name != prop_object.getDomainName():
+        prop_object.setDomainName(new_domain_name)
+
+    if REQUEST is not None:
+      return self.manage_editTranslationForm(REQUEST, manage_tabs_message=
+                                       'Translations Updated.')
+
+
+InitializeClass(TranslationProviderBase)
+
+
+class TranslationInformation (SimpleItem):
+  """
+  This class represent the association between a property of a portal type and
+  the domain name used to translate this property
+  """
+
+  security = ClassSecurityInfo()
+
+  security.declarePrivate( '__init__')
+  def __init__(self, property_name='', domain_name=None):
+    """
+    Set up an instance
+    """
+    self.property_name = property_name
+    self.domain_name = domain_name
+
+  security.declarePrivate('getPropertyName')
+  def getPropertyName(self):
+    """
+    Return the property name
+    """
+    return self.property_name
+
+  security.declarePrivate('getDomainName')
+  def getDomainName(self):
+    """
+    Return the domain name
+    """
+    return self.domain_name
+
+  security.declarePrivate('setDomainName')
+  def setDomainName(self, domain_name='erp5_ui'):
+    """
+    Set the domain name value
+    """
+    self.domain_name = domain_name
+  
+    
+InitializeClass(TranslationInformation)
-- 
2.30.9