Attempting to fix a bug in code I stole from python-telepathy in which they deviated...
[theonering] / src / aliasing.py
index bf73e06..f25c06f 100644 (file)
@@ -3,16 +3,38 @@ import logging
 import telepathy
 
 import gtk_toolbox
+import util.misc as util_misc
 import handle
 
 
-USER_ALIAS_ACCOUNT = "account"
-USER_ALIAS_CALLBACK = "callback"
+_moduleLogger = logging.getLogger('aliasing')
 
-USER_ALIAS = USER_ALIAS_ACCOUNT
 
+def _make_pretty_with_areacodde(phonenumber):
+       prettynumber = "(%s)" % (phonenumber[0:3], )
+       if 3 < len(phonenumber):
+               prettynumber += " %s" % (phonenumber[3:6], )
+               if 6 < len(phonenumber):
+                       prettynumber += "-%s" % (phonenumber[6:], )
+       return prettynumber
 
-_moduleLogger = logging.getLogger('aliasing')
+
+def _make_pretty_local(phonenumber):
+       prettynumber = "%s" % (phonenumber[0:3], )
+       if 3 < len(phonenumber):
+               prettynumber += "-%s" % (phonenumber[3:], )
+       return prettynumber
+
+
+def _make_pretty_international(phonenumber):
+       if phonenumber.startswith("0"):
+               prettynumber = "+%s " % (phonenumber[0:3], )
+               if 3 < len(phonenumber):
+                       prettynumber += _make_pretty_with_areacodde(phonenumber[3:])
+       if phonenumber.startswith("1"):
+               prettynumber = "1 "
+               prettynumber += _make_pretty_with_areacodde(phonenumber[1:])
+       return prettynumber
 
 
 def make_pretty(phonenumber):
@@ -32,41 +54,45 @@ def make_pretty(phonenumber):
        >>> make_pretty("1234567")
        '123-4567'
        >>> make_pretty("2345678901")
-       '(234)-567-8901'
+       '(234) 567-8901'
        >>> make_pretty("12345678901")
-       '1 (234)-567-8901'
+       '1 (234) 567-8901'
        >>> make_pretty("01234567890")
-       '+012-(345)-678-90'
+       '+012 (345) 678-90'
+       >>> make_pretty("+01234567890")
+       '+012 (345) 678-90'
+       >>> make_pretty("+12")
+       '+1 (2)'
+       >>> make_pretty("+123")
+       '+1 (23)'
+       >>> make_pretty("+1234")
+       '+1 (234)'
        """
        if phonenumber is None or phonenumber is "":
                return ""
 
-       phonenumber = handle.strip_number(phonenumber)
+       phonenumber = util_misc.strip_number(phonenumber)
 
-       if len(phonenumber) < 3:
-               return phonenumber
-
-       if phonenumber[0] == "0":
-               prettynumber = ""
-               prettynumber += "+%s" % phonenumber[0:3]
-               if 3 < len(phonenumber):
-                       prettynumber += "-(%s)" % phonenumber[3:6]
-                       if 6 < len(phonenumber):
-                               prettynumber += "-%s" % phonenumber[6:9]
-                               if 9 < len(phonenumber):
-                                       prettynumber += "-%s" % phonenumber[9:]
-               return prettynumber
-       elif len(phonenumber) <= 7:
-               prettynumber = "%s-%s" % (phonenumber[0:3], phonenumber[3:])
-       elif len(phonenumber) > 8 and phonenumber[0] == "1":
-               prettynumber = "1 (%s)-%s-%s" % (phonenumber[1:4], phonenumber[4:7], phonenumber[7:])
-       elif len(phonenumber) > 7:
-               prettynumber = "(%s)-%s-%s" % (phonenumber[0:3], phonenumber[3:6], phonenumber[6:])
-       return prettynumber
+       if phonenumber[0] == "+":
+               prettynumber = _make_pretty_international(phonenumber[1:])
+               if not prettynumber.startswith("+"):
+                       prettynumber = "+"+prettynumber
+       elif 8 < len(phonenumber) and phonenumber[0] in ("0", "1"):
+               prettynumber = _make_pretty_international(phonenumber)
+       elif 7 < len(phonenumber):
+               prettynumber = _make_pretty_with_areacodde(phonenumber)
+       elif 3 < len(phonenumber):
+               prettynumber = _make_pretty_local(phonenumber)
+       else:
+               prettynumber = phonenumber
+       return prettynumber.strip()
 
 
 class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
 
+       USER_ALIAS_ACCOUNT = "account"
+       USER_ALIAS_CALLBACK = "callback"
+
        def __init__(self):
                telepathy.server.ConnectionInterfaceAliasing.__init__(self)
 
@@ -77,6 +103,13 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
                """
                raise NotImplementedError("Abstract property called")
 
+       @property
+       def userAliasType(self):
+               """
+               @abstract
+               """
+               raise NotImplementedError("Abstract property called")
+
        def handle(self, handleType, handleId):
                """
                @abstract
@@ -105,10 +138,10 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
        @gtk_toolbox.log_exception(_moduleLogger)
        def SetAliases(self, aliases):
                _moduleLogger.debug("Called SetAliases")
-               if USER_ALIAS == USER_ALIAS_ACCOUNT:
+               if self.userAliasType == self.USER_ALIAS_ACCOUNT:
                        raise telepathy.errors.PermissionDenied("No user customizable aliases")
-               elif USER_ALIAS != USER_ALIAS_CALLBACK:
-                       raise RuntimeError("Invalid alias type: %r" % USER_ALIAS)
+               elif self.userAliasType != self.USER_ALIAS_CALLBACK:
+                       raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
 
                # first validate that no other handle types are included
                userHandleAndAlias = None
@@ -122,7 +155,7 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
                        return
 
                # Update callback
-               uglyNumber = handle.strip_number(userHandleAndAlias[1])
+               uglyNumber = util_misc.strip_number(userHandleAndAlias[1])
                self.session.backend.set_callback_number(uglyNumber)
 
                # Inform of change
@@ -132,12 +165,12 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
        def _get_alias(self, handleId):
                h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
                if isinstance(h, handle.ConnectionHandle):
-                       if USER_ALIAS == USER_ALIAS_CALLBACK:
+                       if self.userAliasType == self.USER_ALIAS_CALLBACK:
                                aliasNumber = self.session.backend.get_callback_number()
-                       elif USER_ALIAS == USER_ALIAS_ACCOUNT:
+                       elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
                                aliasNumber = self.session.backend.get_account_number()
                        else:
-                               raise RuntimeError("Invalid alias type: %r" % USER_ALIAS)
+                               raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
                        userAlias = make_pretty(aliasNumber)
                        return userAlias
                else: