7 import util.misc as util_misc
11 _moduleLogger = logging.getLogger('aliasing')
14 def _make_pretty_with_areacodde(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 if phonenumber.startswith("0"):
32 prettynumber = "+%s " % (phonenumber[0:3], )
33 if 3 < len(phonenumber):
34 prettynumber += _make_pretty_with_areacodde(phonenumber[3:])
35 if phonenumber.startswith("1"):
37 prettynumber += _make_pretty_with_areacodde(phonenumber[1:])
41 def make_pretty(phonenumber):
43 Function to take a phone number and return the pretty version
45 if phonenumber begins with 0:
47 if phonenumber begins with 1: ( for gizmo callback numbers )
49 if phonenumber is 13 digits:
51 if phonenumber is 10 digits:
55 >>> make_pretty("1234567")
57 >>> make_pretty("2345678901")
59 >>> make_pretty("12345678901")
61 >>> make_pretty("01234567890")
63 >>> make_pretty("+01234567890")
65 >>> make_pretty("+12")
67 >>> make_pretty("+123")
69 >>> make_pretty("+1234")
72 if phonenumber is None or phonenumber is "":
75 phonenumber = util_misc.normalize_number(phonenumber)
77 if phonenumber[0] == "+":
78 prettynumber = _make_pretty_international(phonenumber[1:])
79 if not prettynumber.startswith("+"):
80 prettynumber = "+"+prettynumber
81 elif 8 < len(phonenumber) and phonenumber[0] in ("0", "1"):
82 prettynumber = _make_pretty_international(phonenumber)
83 elif 7 < len(phonenumber):
84 prettynumber = _make_pretty_with_areacodde(phonenumber)
85 elif 3 < len(phonenumber):
86 prettynumber = _make_pretty_local(phonenumber)
88 prettynumber = phonenumber
89 return prettynumber.strip()
92 class AliasingMixin(tp.ConnectionInterfaceAliasing):
94 USER_ALIAS_ACCOUNT = "account"
95 USER_ALIAS_CALLBACK = "callback"
98 tp.ConnectionInterfaceAliasing.__init__(self)
105 raise NotImplementedError("Abstract property called")
108 def userAliasType(self):
112 raise NotImplementedError("Abstract property called")
114 def handle(self, handleType, handleId):
118 raise NotImplementedError("Abstract function called")
120 @gtk_toolbox.log_exception(_moduleLogger)
121 def GetAliasFlags(self):
124 @gtk_toolbox.log_exception(_moduleLogger)
125 def RequestAliases(self, contactHandleIds):
126 _moduleLogger.debug("Called RequestAliases")
127 return [self._get_alias(handleId) for handleId in contactHandleIds]
129 @gtk_toolbox.log_exception(_moduleLogger)
130 def GetAliases(self, contactHandleIds):
131 _moduleLogger.debug("Called GetAliases")
134 (handleId, self._get_alias(handleId))
135 for handleId in contactHandleIds
139 @gtk_toolbox.log_exception(_moduleLogger)
140 def SetAliases(self, aliases):
141 _moduleLogger.debug("Called SetAliases")
142 if self.userAliasType == self.USER_ALIAS_ACCOUNT:
143 raise telepathy.errors.PermissionDenied("No user customizable aliases")
144 elif self.userAliasType != self.USER_ALIAS_CALLBACK:
145 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
147 # first validate that no other handle types are included
148 userHandleAndAlias = None
149 for handleId, alias in aliases.iteritems():
150 h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
151 if not isinstance(h, handle.ConnectionHandle):
152 raise telepathy.errors.PermissionDenied("No user customizable aliases")
153 userHandleAndAlias = h, alias
154 if userHandleAndAlias is None:
155 _moduleLogger.debug("No user handle")
159 uglyNumber = util_misc.normalize_number(userHandleAndAlias[1])
160 self.session.backend.set_callback_number(uglyNumber)
163 changedAliases = (userHandleAndAlias, )
164 self.AliasesChanged(changedAliases)
166 def _get_alias(self, handleId):
167 h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
168 if isinstance(h, handle.ConnectionHandle):
169 if self.userAliasType == self.USER_ALIAS_CALLBACK:
170 aliasNumber = self.session.backend.get_callback_number()
171 elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
172 aliasNumber = self.session.backend.get_account_number()
174 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
175 userAlias = make_pretty(aliasNumber)
178 contactId = h.contactID
180 contactAlias = self.session.addressbook.get_contact_name(contactId)
182 contactAlias = make_pretty(h.phoneNumber)