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