936ff70e8b9dc964ac5b9b2394771e7cf573effd
[theonering] / src / aliasing.py
1 import logging
2
3 import telepathy
4
5 import tp
6 import gtk_toolbox
7 import util.misc as util_misc
8 import handle
9
10
11 _moduleLogger = logging.getLogger('aliasing')
12
13
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:], )
20         return prettynumber
21
22
23 def _make_pretty_local(phonenumber):
24         prettynumber = "%s" % (phonenumber[0:3], )
25         if 3 < len(phonenumber):
26                 prettynumber += "-%s" % (phonenumber[3:], )
27         return prettynumber
28
29
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"):
36                 prettynumber = "1 "
37                 prettynumber += _make_pretty_with_areacodde(phonenumber[1:])
38         return prettynumber
39
40
41 def make_pretty(phonenumber):
42         """
43         Function to take a phone number and return the pretty version
44         pretty numbers:
45                 if phonenumber begins with 0:
46                         ...-(...)-...-....
47                 if phonenumber begins with 1: ( for gizmo callback numbers )
48                         1 (...)-...-....
49                 if phonenumber is 13 digits:
50                         (...)-...-....
51                 if phonenumber is 10 digits:
52                         ...-....
53         >>> make_pretty("12")
54         '12'
55         >>> make_pretty("1234567")
56         '123-4567'
57         >>> make_pretty("2345678901")
58         '+1 (234) 567-8901'
59         >>> make_pretty("12345678901")
60         '+1 (234) 567-8901'
61         >>> make_pretty("01234567890")
62         '+012 (345) 678-90'
63         >>> make_pretty("+01234567890")
64         '+012 (345) 678-90'
65         >>> make_pretty("+12")
66         '+1 (2)'
67         >>> make_pretty("+123")
68         '+1 (23)'
69         >>> make_pretty("+1234")
70         '+1 (234)'
71         """
72         if phonenumber is None or phonenumber is "":
73                 return ""
74
75         phonenumber = util_misc.normalize_number(phonenumber)
76
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)
87         else:
88                 prettynumber = phonenumber
89         return prettynumber.strip()
90
91
92 class AliasingMixin(tp.ConnectionInterfaceAliasing):
93
94         def __init__(self):
95                 tp.ConnectionInterfaceAliasing.__init__(self)
96
97         @property
98         def session(self):
99                 """
100                 @abstract
101                 """
102                 raise NotImplementedError("Abstract property called")
103
104         def handle(self, handleType, handleId):
105                 """
106                 @abstract
107                 """
108                 raise NotImplementedError("Abstract function called")
109
110         @gtk_toolbox.log_exception(_moduleLogger)
111         def GetAliasFlags(self):
112                 return 0
113
114         @gtk_toolbox.log_exception(_moduleLogger)
115         def RequestAliases(self, contactHandleIds):
116                 _moduleLogger.debug("Called RequestAliases")
117                 return [self._get_alias(handleId) for handleId in contactHandleIds]
118
119         @gtk_toolbox.log_exception(_moduleLogger)
120         def GetAliases(self, contactHandleIds):
121                 _moduleLogger.debug("Called GetAliases")
122
123                 idToAlias = dict(
124                         (handleId, self._get_alias(handleId))
125                         for handleId in contactHandleIds
126                 )
127                 return idToAlias
128
129         @gtk_toolbox.log_exception(_moduleLogger)
130         def SetAliases(self, aliases):
131                 _moduleLogger.debug("Called SetAliases")
132                 # first validate that no other handle types are included
133                 for handleId, alias in aliases.iteritems():
134                         h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
135                         if isinstance(h, handle.ConnectionHandle):
136                                 break
137                 else:
138                         raise telepathy.errors.PermissionDenied("No user customizable aliases")
139
140                 if len(alias) == 0:
141                         # Reset to the original from login if one was provided
142                         alias = self.callbackNumberParameter
143                 if not util_misc.is_valid_number(alias):
144                         raise telepathy.errors.InvalidArgument("Invalid phone number %r" % (alias, ))
145
146                 # Update callback
147                 uglyNumber = util_misc.normalize_number(alias)
148                 self.session.backend.set_callback_number(uglyNumber)
149
150                 # Inform of change
151                 userAlias = make_pretty(alias)
152                 changedAliases = ((handleId, userAlias), )
153                 self.AliasesChanged(changedAliases)
154
155         def _get_alias(self, handleId):
156                 h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
157                 if isinstance(h, handle.ConnectionHandle):
158                         aliasNumber = self.session.backend.get_callback_number()
159                         userAlias = make_pretty(aliasNumber)
160                         return userAlias
161                 else:
162                         contactId = h.contactID
163                         if contactId:
164                                 contactAlias = self.session.addressbook.get_contact_name(contactId)
165                         else:
166                                 contactAlias = make_pretty(h.phoneNumber)
167                         return contactAlias