3 commits - pykolab/plugins pykolab/utils.py tests/functional tests/unit

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Thu Jan 10 16:50:10 CET 2013


 pykolab/plugins/recipientpolicy/__init__.py                 |   19 ++-
 pykolab/utils.py                                            |   11 +-
 tests/functional/test_wap_client/test_003_user_add_fr_FR.py |   58 ++++++++++
 tests/functional/test_wap_client/test_004_user_add_es_ES.py |   58 ++++++++++
 tests/functional/test_wap_client/test_005_user_add_de_CH.py |   57 ++++++++++
 tests/unit/test-010-transliterate.py                        |   64 ++++++++++++
 6 files changed, 259 insertions(+), 8 deletions(-)

New commits:
commit 80e07eb905091c6bb921329cd883ae7c51647e0c
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jan 10 16:49:58 2013 +0100

    Add tests for #1508

diff --git a/tests/functional/test_wap_client/test_003_user_add_fr_FR.py b/tests/functional/test_wap_client/test_003_user_add_fr_FR.py
new file mode 100644
index 0000000..b9ef510
--- /dev/null
+++ b/tests/functional/test_wap_client/test_003_user_add_fr_FR.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+
+import time
+import unittest
+
+import pykolab
+from pykolab import wap_client
+from pykolab.auth import Auth
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+class TestUserAddFrFR(unittest.TestCase):
+    @classmethod
+    def setup_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+        self.user = {
+                'local': 'etienne-nicolas.mehul',
+                'domain': 'example.org'
+            }
+
+        from tests.functional.user_add import user_add
+        user_add("Étienne-Nicolas", "Méhul", 'fr_FR')
+        from tests.functional.synchronize import synchronize_once
+        synchronize_once()
+
+    @classmethod
+    def teardown_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    def test_001_inbox_created(self):
+
+        time.sleep(2)
+        imap = IMAP()
+        imap.connect()
+
+        folders = imap.lm('user/%(local)s@%(domain)s' % (self.user))
+        self.assertEqual(len(folders), 1)
+
+    def test_002_fr_FR_user_recipient_policy(self):
+        auth = Auth()
+        auth.connect()
+        recipient = auth.find_recipient("%(local)s@%(domain)s" % (self.user))
+        if hasattr(self, 'assertIsInstance'):
+            self.assertIsInstance(recipient, str)
+
+        self.assertEqual(recipient, "uid=mehul,ou=People,dc=example,dc=org")
+
+        result = wap_client.user_info(recipient)
+        print result
+
+        self.assertEqual(result['mail'], 'etienne-nicolas.mehul at example.org')
+        self.assertEqual(sorted(result['alias']), ['e.mehul at example.org', 'mehul at example.org'])
+
+
diff --git a/tests/functional/test_wap_client/test_004_user_add_es_ES.py b/tests/functional/test_wap_client/test_004_user_add_es_ES.py
new file mode 100644
index 0000000..a681a2d
--- /dev/null
+++ b/tests/functional/test_wap_client/test_004_user_add_es_ES.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+
+import time
+import unittest
+
+import pykolab
+from pykolab import wap_client
+from pykolab.auth import Auth
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+class TestUserAddEsES(unittest.TestCase):
+
+    @classmethod
+    def setup_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+        self.user = {
+                'local': 'alvaro.fuentes',
+                'domain': 'example.org'
+            }
+
+        from tests.functional.user_add import user_add
+        user_add("Álvaro", "Fuentes", 'es_ES')
+        from tests.functional.synchronize import synchronize_once
+        synchronize_once()
+
+    @classmethod
+    def teardown_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    def test_001_inbox_created(self):
+
+        time.sleep(2)
+        imap = IMAP()
+        imap.connect()
+
+        folders = imap.lm('user/%(local)s@%(domain)s' % (self.user))
+        self.assertEqual(len(folders), 1)
+
+    def test_002_fr_FR_user_recipient_policy(self):
+        auth = Auth()
+        auth.connect()
+        recipient = auth.find_recipient("%(local)s@%(domain)s" % (self.user))
+        if hasattr(self, 'assertIsInstance'):
+            self.assertIsInstance(recipient, str)
+
+        self.assertEqual(recipient, "uid=fuentes,ou=People,dc=example,dc=org")
+
+        result = wap_client.user_info(recipient)
+
+        self.assertEqual(result['mail'], 'alvaro.fuentes at example.org')
+        self.assertEqual(sorted(result['alias']), ['a.fuentes at example.org', 'fuentes at example.org'])
+
+
diff --git a/tests/functional/test_wap_client/test_005_user_add_de_CH.py b/tests/functional/test_wap_client/test_005_user_add_de_CH.py
new file mode 100644
index 0000000..dd38383
--- /dev/null
+++ b/tests/functional/test_wap_client/test_005_user_add_de_CH.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+import time
+import unittest
+
+import pykolab
+from pykolab import wap_client
+from pykolab.auth import Auth
+from pykolab.imap import IMAP
+
+conf = pykolab.getConf()
+
+class TestUserAddDeCH(unittest.TestCase):
+    @classmethod
+    def setup_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+        self.user = {
+                'local': 'thomas.bruederli',
+                'domain': 'example.org'
+            }
+
+        from tests.functional.user_add import user_add
+        user_add("Thomas", "Brüderli", 'de_CH')
+        from tests.functional.synchronize import synchronize_once
+        synchronize_once()
+
+    @classmethod
+    def teardown_class(self, *args, **kw):
+        from tests.functional.purge_users import purge_users
+        purge_users()
+
+    def test_001_inbox_created(self):
+
+        time.sleep(2)
+        imap = IMAP()
+        imap.connect()
+
+        folders = imap.lm('user/%(local)s@%(domain)s' % (self.user))
+        self.assertEqual(len(folders), 1)
+
+    def test_002_fr_FR_user_recipient_policy(self):
+        auth = Auth()
+        auth.connect()
+        recipient = auth.find_recipient("%(local)s@%(domain)s" % (self.user))
+        if hasattr(self, 'assertIsInstance'):
+            self.assertIsInstance(recipient, str)
+
+        self.assertEqual(recipient, "uid=bruederli,ou=People,dc=example,dc=org")
+
+        result = wap_client.user_info(recipient)
+
+        self.assertEqual(result['mail'], 'thomas.bruederli at example.org')
+        self.assertEqual(sorted(result['alias']), ['bruederli at example.org', 't.bruederli at example.org'])
+
+
diff --git a/tests/unit/test-010-transliterate.py b/tests/unit/test-010-transliterate.py
new file mode 100644
index 0000000..7f70700
--- /dev/null
+++ b/tests/unit/test-010-transliterate.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+import unittest
+
+class TestTransliteration(unittest.TestCase):
+    def test_001_raw_fr_FR(self):
+        """
+            The special thing about this case is that the givenname starts with
+            a special character.
+        """
+        from pykolab import utils
+        givenname = r'Étienne-Nicolas'
+        surname = r'Méhul'
+
+        preferredlanguage = 'fr_FR'
+
+        self.assertEqual('Etienne-Nicolas', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Mehul', utils.translate(surname, preferredlanguage))
+
+    def test_002_unicode_fr_FR(self):
+        """
+            The special thing about this case is that the givenname starts with
+            a special character.
+        """
+        from pykolab import utils
+        givenname = 'Étienne-Nicolas'
+        surname = 'Méhul'
+
+        preferredlanguage = 'fr_FR'
+
+        self.assertEqual('Etienne-Nicolas', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Mehul', utils.translate(surname, preferredlanguage))
+
+    def test_003_raw_es_ES(self):
+        """
+            The special thing about this case is that the givenname starts with
+            a special character.
+        """
+        from pykolab import utils
+        givenname = r'Álvaro'
+        surname = r'Fuentes'
+
+        preferredlanguage = 'es_ES'
+
+        self.assertEqual('Alvaro', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Fuentes', utils.translate(surname, preferredlanguage))
+
+    def test_004_unicode_es_ES(self):
+        """
+            The special thing about this case is that the givenname starts with
+            a special character.
+        """
+        from pykolab import utils
+        givenname = 'Álvaro'
+        surname = 'Fuentes'
+
+        preferredlanguage = 'es_ES'
+
+        self.assertEqual('Alvaro', utils.translate(givenname, preferredlanguage))
+        self.assertEqual('Fuentes', utils.translate(surname, preferredlanguage))
+
+
+if __name__ == '__main__':
+    unittest.main()


commit d024ba1a14d7ad833879ed9ff033729edf5ccd2c
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jan 10 16:49:34 2013 +0100

    Make sure we transliterate the components before we push them in to a policy (#1508)

diff --git a/pykolab/plugins/recipientpolicy/__init__.py b/pykolab/plugins/recipientpolicy/__init__.py
index 9d50e83..e3d6b65 100644
--- a/pykolab/plugins/recipientpolicy/__init__.py
+++ b/pykolab/plugins/recipientpolicy/__init__.py
@@ -116,29 +116,34 @@ class KolabRecipientpolicy(object):
 
         alternative_mail = []
 
-        #print "%r" % (alternative_mail_routines)
+        log.debug(_("Alternative mail routines: %r") % (alternative_mail_routines), level=8)
         _domains = [ kw['primary_domain'] ] + kw['secondary_domains']
 
+        for attr in [ 'givenname', 'sn', 'surname' ]:
+            user_attrs[attr] = utils.translate(user_attrs[attr], user_attrs['preferredlanguage'])
+
         for number in alternative_mail_routines.keys():
             for routine in alternative_mail_routines[number].keys():
                 try:
                     exec("retval = '%s'.%s" % (routine,alternative_mail_routines[number][routine] % user_attrs))
+
+                    log.debug(_("Appending additional mail address: %s") % (retval), level=8)
+                    alternative_mail.append(retval)
+
                 except KeyError, e:
                     log.warning(_("Attribute substitution for 'alternative_mail' failed in Recipient Policy"))
 
-                #log.debug(_("Appending additional mail address: %s") % (retval), level=8)
-                alternative_mail.append(utils.translate(retval, user_attrs['preferredlanguage']))
-
                 for _domain in kw['secondary_domains']:
                     user_attrs['domain'] = _domain
                     try:
                         exec("retval = '%s'.%s" % (routine,alternative_mail_routines[number][routine] % user_attrs))
+
+                        log.debug(_("Appending additional mail address: %s") % (retval), level=8)
+                        alternative_mail.append(retval)
+
                     except KeyError, e:
                         log.warning(_("Attribute substitution for 'alternative_mail' failed in Recipient Policy"))
 
-                    #log.debug(_("Appending additional mail address: %s") % (retval), level=8)
-                    alternative_mail.append(utils.translate(retval, user_attrs['preferredlanguage']))
-
         alternative_mail = utils.normalize(alternative_mail)
 
         alternative_mail = list(set(alternative_mail))


commit 5a721a992e6aea9df92e8bd2b02ab147c92e8f0b
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Jan 10 16:47:22 2013 +0100

    Add debug statements for transliteration using pykolab.utils.translate(), so we can work out bugs such as #1508 and #1536

diff --git a/pykolab/utils.py b/pykolab/utils.py
index dc2b088..7f56c29 100644
--- a/pykolab/utils.py
+++ b/pykolab/utils.py
@@ -23,9 +23,12 @@ import os
 import pwd
 import sys
 
+import pykolab
 from pykolab import constants
 from pykolab.translate import _
 
+log = pykolab.getLogger('pykolab.utils')
+
 def ask_question(question, default="", password=False, confirm=False):
     """
         Ask a question on stderr.
@@ -389,14 +392,19 @@ def translate(mystring, locale_name='en_US'):
     import locale
     import subprocess
 
+    log.debug(_("Transliterating string %r with locale %r") % (mystring, locale_name), level=8)
+
     if len(locale.normalize(locale_name).split('.')) > 1:
         (locale_name,locale_charset) = locale.normalize(locale_name).split('.')
     else:
         locale_charset = 'utf-8'
 
     try:
+        log.debug(_("Attempting to set locale"), level=8)
         locale.setlocale(locale.LC_ALL, (locale_name,locale_charset))
+        log.debug(_("Success setting locale"), level=8)
     except:
+        log.debug(_("Failure to set locale"), level=8)
         pass
 
     command = [ '/usr/bin/iconv',
@@ -404,9 +412,10 @@ def translate(mystring, locale_name='en_US'):
                 '-t', 'ASCII//TRANSLIT',
                 '-s' ]
 
+    log.debug(_("Executing '%s | %s'") % (r"%s" % (mystring), ' '.join(command)), level=8)
     process = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, env={'LANG': locale.normalize(locale_name)})
 
-    print >> process.stdin, mystring
+    print >> process.stdin, r"%s" % mystring
 
     result = process.communicate()[0].strip()
 





More information about the commits mailing list