7 import util.misc as misc_utils
11 _moduleLogger = logging.getLogger(__name__)
14 def _make_pretty_with_areacode(phonenumber):
15 prettynumber = "(%s)" % (phonenumber[0:3], )
16 if 3 < len(phonenumber):
17 prettynumber += " %s" % (phonenumber[3:6], )
18 if 6 < len(phonenumber):
19 prettynumber += "-%s" % (phonenumber[6:], )
23 def _make_pretty_local(phonenumber):
24 prettynumber = "%s" % (phonenumber[0:3], )
25 if 3 < len(phonenumber):
26 prettynumber += "-%s" % (phonenumber[3:], )
30 def _make_pretty_international(phonenumber):
31 prettynumber = phonenumber
32 if phonenumber.startswith("0"):
33 prettynumber = "+%s " % (phonenumber[0:3], )
34 if 3 < len(phonenumber):
35 prettynumber += _make_pretty_with_areacode(phonenumber[3:])
36 elif phonenumber.startswith("1"):
38 prettynumber += _make_pretty_with_areacode(phonenumber[1:])
42 def make_pretty(phonenumber):
44 Function to take a phone number and return the pretty version
46 if phonenumber begins with 0:
48 if phonenumber begins with 1: ( for gizmo callback numbers )
50 if phonenumber is 13 digits:
52 if phonenumber is 10 digits:
56 >>> make_pretty("1234567")
58 >>> make_pretty("2345678901")
60 >>> make_pretty("12345678901")
62 >>> make_pretty("01234567890")
64 >>> make_pretty("+01234567890")
66 >>> make_pretty("+12")
68 >>> make_pretty("+123")
70 >>> make_pretty("+1234")
73 if phonenumber is None or phonenumber is "":
76 phonenumber = misc_utils.normalize_number(phonenumber)
78 if phonenumber[0] == "+":
79 prettynumber = _make_pretty_international(phonenumber[1:])
80 if not prettynumber.startswith("+"):
81 prettynumber = "+"+prettynumber
82 elif 8 < len(phonenumber) and phonenumber[0] in ("0", "1"):
83 prettynumber = _make_pretty_international(phonenumber)
84 elif 7 < len(phonenumber):
85 prettynumber = _make_pretty_with_areacode(phonenumber)
86 elif 3 < len(phonenumber):
87 prettynumber = _make_pretty_local(phonenumber)
89 prettynumber = phonenumber
90 return prettynumber.strip()
93 class AliasingMixin(tp.ConnectionInterfaceAliasing):
96 tp.ConnectionInterfaceAliasing.__init__(self)
103 raise NotImplementedError("Abstract property called")
106 def callbackNumberParameter(self):
110 raise NotImplementedError("Abstract property called")
112 def get_handle_by_id(self, handleType, handleId):
116 raise NotImplementedError("Abstract function called")
118 @misc_utils.log_exception(_moduleLogger)
119 def GetAliasFlags(self):
122 @misc_utils.log_exception(_moduleLogger)
123 def RequestAliases(self, contactHandleIds):
124 _moduleLogger.debug("Called RequestAliases")
125 return [self._get_alias(handleId) for handleId in contactHandleIds]
127 @misc_utils.log_exception(_moduleLogger)
128 def GetAliases(self, contactHandleIds):
129 _moduleLogger.debug("Called GetAliases")
131 idToAlias = dbus.Dictionary(
133 (handleId, self._get_alias(handleId))
134 for handleId in contactHandleIds
140 @misc_utils.log_exception(_moduleLogger)
141 def SetAliases(self, aliases):
142 _moduleLogger.debug("Called SetAliases")
143 # first validate that no other handle types are included
144 handleId, alias = None, None
145 for handleId, alias in aliases.iteritems():
146 h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
147 if isinstance(h, handle.ConnectionHandle):
150 raise telepathy.errors.PermissionDenied("No user customizable aliases")
152 uglyNumber = misc_utils.normalize_number(alias)
153 if len(uglyNumber) == 0:
154 # Reset to the original from login if one was provided
155 uglyNumber = self.callbackNumberParameter
156 if not misc_utils.is_valid_number(uglyNumber):
157 raise telepathy.errors.InvalidArgument("Invalid phone number %r" % (uglyNumber, ))
160 self.session.backend.set_callback_number(uglyNumber)
163 userAlias = make_pretty(uglyNumber)
164 changedAliases = ((handleId, userAlias), )
165 self.AliasesChanged(changedAliases)
167 def _get_alias(self, handleId):
168 h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
169 if isinstance(h, handle.ConnectionHandle):
170 aliasNumber = self.session.backend.get_callback_number()
171 userAlias = make_pretty(aliasNumber)
174 number = h.phoneNumber
176 contactAlias = self.session.addressbook.get_contact_name(number)
178 contactAlias = make_pretty(number)