6 import util.misc as util_misc
10 _moduleLogger = logging.getLogger('aliasing')
13 def _make_pretty_with_areacodde(phonenumber):
14 prettynumber = "(%s)" % (phonenumber[0:3], )
15 if 3 < len(phonenumber):
16 prettynumber += " %s" % (phonenumber[3:6], )
17 if 6 < len(phonenumber):
18 prettynumber += "-%s" % (phonenumber[6:], )
22 def _make_pretty_local(phonenumber):
23 prettynumber = "%s" % (phonenumber[0:3], )
24 if 3 < len(phonenumber):
25 prettynumber += "-%s" % (phonenumber[3:], )
29 def _make_pretty_international(phonenumber):
30 if phonenumber.startswith("0"):
31 prettynumber = "+%s " % (phonenumber[0:3], )
32 if 3 < len(phonenumber):
33 prettynumber += _make_pretty_with_areacodde(phonenumber[3:])
34 if phonenumber.startswith("1"):
36 prettynumber += _make_pretty_with_areacodde(phonenumber[1:])
40 def make_pretty(phonenumber):
42 Function to take a phone number and return the pretty version
44 if phonenumber begins with 0:
46 if phonenumber begins with 1: ( for gizmo callback numbers )
48 if phonenumber is 13 digits:
50 if phonenumber is 10 digits:
54 >>> make_pretty("1234567")
56 >>> make_pretty("2345678901")
58 >>> make_pretty("12345678901")
60 >>> make_pretty("01234567890")
62 >>> make_pretty("+01234567890")
64 >>> make_pretty("+12")
66 >>> make_pretty("+123")
68 >>> make_pretty("+1234")
71 if phonenumber is None or phonenumber is "":
74 phonenumber = util_misc.strip_number(phonenumber)
76 if phonenumber[0] == "+":
77 prettynumber = _make_pretty_international(phonenumber[1:])
78 if not prettynumber.startswith("+"):
79 prettynumber = "+"+prettynumber
80 elif 8 < len(phonenumber) and phonenumber[0] in ("0", "1"):
81 prettynumber = _make_pretty_international(phonenumber)
82 elif 7 < len(phonenumber):
83 prettynumber = _make_pretty_with_areacodde(phonenumber)
84 elif 3 < len(phonenumber):
85 prettynumber = _make_pretty_local(phonenumber)
87 prettynumber = phonenumber
88 return prettynumber.strip()
91 class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
93 USER_ALIAS_ACCOUNT = "account"
94 USER_ALIAS_CALLBACK = "callback"
97 telepathy.server.ConnectionInterfaceAliasing.__init__(self)
104 raise NotImplementedError("Abstract property called")
107 def userAliasType(self):
111 raise NotImplementedError("Abstract property called")
113 def handle(self, handleType, handleId):
117 raise NotImplementedError("Abstract function called")
119 @gtk_toolbox.log_exception(_moduleLogger)
120 def GetAliasFlags(self):
123 @gtk_toolbox.log_exception(_moduleLogger)
124 def RequestAliases(self, contactHandleIds):
125 _moduleLogger.debug("Called RequestAliases")
126 return [self._get_alias(handleId) for handleId in contactHandleIds]
128 @gtk_toolbox.log_exception(_moduleLogger)
129 def GetAliases(self, contactHandleIds):
130 _moduleLogger.debug("Called GetAliases")
133 (handleId, self._get_alias(handleId))
134 for handleId in contactHandleIds
138 @gtk_toolbox.log_exception(_moduleLogger)
139 def SetAliases(self, aliases):
140 _moduleLogger.debug("Called SetAliases")
141 if self.userAliasType == self.USER_ALIAS_ACCOUNT:
142 raise telepathy.errors.PermissionDenied("No user customizable aliases")
143 elif self.userAliasType != self.USER_ALIAS_CALLBACK:
144 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
146 # first validate that no other handle types are included
147 userHandleAndAlias = None
148 for handleId, alias in aliases.iteritems():
149 h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
150 if not isinstance(h, handle.ConnectionHandle):
151 raise telepathy.errors.PermissionDenied("No user customizable aliases")
152 userHandleAndAlias = h, alias
153 if userHandleAndAlias is None:
154 _moduleLogger.debug("No user handle")
158 uglyNumber = util_misc.strip_number(userHandleAndAlias[1])
159 self.session.backend.set_callback_number(uglyNumber)
162 changedAliases = (userHandleAndAlias, )
163 self.AliasesChanged(changedAliases)
165 def _get_alias(self, handleId):
166 h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
167 if isinstance(h, handle.ConnectionHandle):
168 if self.userAliasType == self.USER_ALIAS_CALLBACK:
169 aliasNumber = self.session.backend.get_callback_number()
170 elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
171 aliasNumber = self.session.backend.get_account_number()
173 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
174 userAlias = make_pretty(aliasNumber)
177 contactId = h.contactID
179 contactAlias = self.session.addressbook.get_contact_name(contactId)
181 contactAlias = make_pretty(h.phoneNumber)