X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Faliasing.py;h=1ebf4c945f53054fb566960019ced732452b13aa;hp=02a483ecd47c118e98d62f8bdd553ee001f10cba;hb=f5790d1585812687c2bf2e5922827b29eee4a670;hpb=59327fe23f05616d0976777d00ae0024f2ea0265 diff --git a/src/aliasing.py b/src/aliasing.py index 02a483e..1ebf4c9 100644 --- a/src/aliasing.py +++ b/src/aliasing.py @@ -2,11 +2,40 @@ import logging import telepathy -import gtk_toolbox +import tp +import util.misc as misc_utils import handle -_moduleLogger = logging.getLogger('aliasing') +_moduleLogger = logging.getLogger(__name__) + + +def _make_pretty_with_areacode(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 + + +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): + prettynumber = phonenumber + if phonenumber.startswith("0"): + prettynumber = "+%s " % (phonenumber[0:3], ) + if 3 < len(phonenumber): + prettynumber += _make_pretty_with_areacode(phonenumber[3:]) + elif phonenumber.startswith("1"): + prettynumber = "1 " + prettynumber += _make_pretty_with_areacode(phonenumber[1:]) + return prettynumber def make_pretty(phonenumber): @@ -26,43 +55,44 @@ def make_pretty(phonenumber): >>> make_pretty("1234567") '123-4567' >>> make_pretty("2345678901") - '(234)-567-8901' + '+1 (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 = misc_utils.normalize_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_areacode(phonenumber) + elif 3 < len(phonenumber): + prettynumber = _make_pretty_local(phonenumber) + else: + prettynumber = phonenumber + return prettynumber.strip() -class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing): +class AliasingMixin(tp.ConnectionInterfaceAliasing): def __init__(self): - telepathy.server.ConnectionInterfaceAliasing.__init__(self) + tp.ConnectionInterfaceAliasing.__init__(self) @property def session(self): @@ -72,22 +102,28 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing): raise NotImplementedError("Abstract property called") @property - def handle(self): + def callbackNumberParameter(self): """ @abstract """ raise NotImplementedError("Abstract property called") - @gtk_toolbox.log_exception(_moduleLogger) + def get_handle_by_id(self, handleType, handleId): + """ + @abstract + """ + raise NotImplementedError("Abstract function called") + + @misc_utils.log_exception(_moduleLogger) def GetAliasFlags(self): return 0 - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def RequestAliases(self, contactHandleIds): _moduleLogger.debug("Called RequestAliases") return [self._get_alias(handleId) for handleId in contactHandleIds] - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def GetAliases(self, contactHandleIds): _moduleLogger.debug("Called GetAliases") @@ -97,17 +133,43 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing): ) return idToAlias - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def SetAliases(self, aliases): - # @todo Look into setting callback number through this mechanism - raise telepathy.PermissionDenied("No user customizable aliases") + _moduleLogger.debug("Called SetAliases") + # first validate that no other handle types are included + handleId, alias = None, None + for handleId, alias in aliases.iteritems(): + h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId) + if isinstance(h, handle.ConnectionHandle): + break + else: + raise telepathy.errors.PermissionDenied("No user customizable aliases") + + uglyNumber = misc_utils.normalize_number(alias) + if len(uglyNumber) == 0: + # Reset to the original from login if one was provided + uglyNumber = self.callbackNumberParameter + if not misc_utils.is_valid_number(uglyNumber): + raise telepathy.errors.InvalidArgument("Invalid phone number %r" % (uglyNumber, )) + + # Update callback + self.session.backend.set_callback_number(uglyNumber) + + # Inform of change + userAlias = make_pretty(uglyNumber) + changedAliases = ((handleId, userAlias), ) + self.AliasesChanged(changedAliases) def _get_alias(self, handleId): - h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId) + h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId) if isinstance(h, handle.ConnectionHandle): - callbackNumber = self.session.backend.get_callback_number() - userAlias = make_pretty(callbackNumber) + aliasNumber = self.session.backend.get_callback_number() + userAlias = make_pretty(aliasNumber) return userAlias else: - contactAlias = self.session.addressbook.get_contact_name(h.contactID) + number = h.phoneNumber + try: + contactAlias = self.session.addressbook.get_contact_name(number) + except KeyError: + contactAlias = make_pretty(number) return contactAlias