9d7662975c3d88d48dde8a3e864993a0e1a196d9
[theonering] / src / aliasing.py
1 import logging
2
3 import telepathy
4
5 import gtk_toolbox
6 import handle
7
8
9 _moduleLogger = logging.getLogger('aliasing')
10
11
12 def make_pretty(phonenumber):
13         """
14         Function to take a phone number and return the pretty version
15         pretty numbers:
16                 if phonenumber begins with 0:
17                         ...-(...)-...-....
18                 if phonenumber begins with 1: ( for gizmo callback numbers )
19                         1 (...)-...-....
20                 if phonenumber is 13 digits:
21                         (...)-...-....
22                 if phonenumber is 10 digits:
23                         ...-....
24         >>> make_pretty("12")
25         '12'
26         >>> make_pretty("1234567")
27         '123-4567'
28         >>> make_pretty("2345678901")
29         '(234)-567-8901'
30         >>> make_pretty("12345678901")
31         '1 (234)-567-8901'
32         >>> make_pretty("01234567890")
33         '+012-(345)-678-90'
34         """
35         if phonenumber is None or phonenumber is "":
36                 return ""
37
38         phonenumber = handle.strip_number(phonenumber)
39
40         if len(phonenumber) < 3:
41                 return phonenumber
42
43         if phonenumber[0] == "0":
44                 prettynumber = ""
45                 prettynumber += "+%s" % phonenumber[0:3]
46                 if 3 < len(phonenumber):
47                         prettynumber += "-(%s)" % phonenumber[3:6]
48                         if 6 < len(phonenumber):
49                                 prettynumber += "-%s" % phonenumber[6:9]
50                                 if 9 < len(phonenumber):
51                                         prettynumber += "-%s" % phonenumber[9:]
52                 return prettynumber
53         elif len(phonenumber) <= 7:
54                 prettynumber = "%s-%s" % (phonenumber[0:3], phonenumber[3:])
55         elif len(phonenumber) > 8 and phonenumber[0] == "1":
56                 prettynumber = "1 (%s)-%s-%s" % (phonenumber[1:4], phonenumber[4:7], phonenumber[7:])
57         elif len(phonenumber) > 7:
58                 prettynumber = "(%s)-%s-%s" % (phonenumber[0:3], phonenumber[3:6], phonenumber[6:])
59         return prettynumber
60
61
62 class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
63
64         def __init__(self):
65                 telepathy.server.ConnectionInterfaceAliasing.__init__(self)
66
67         @property
68         def session(self):
69                 """
70                 @abstract
71                 """
72                 raise NotImplementedError("Abstract property called")
73
74         @property
75         def handle(self):
76                 """
77                 @abstract
78                 """
79                 raise NotImplementedError("Abstract property called")
80
81         @gtk_toolbox.log_exception(_moduleLogger)
82         def GetAliasFlags(self):
83                 return 0
84
85         @gtk_toolbox.log_exception(_moduleLogger)
86         def RequestAliases(self, contactHandleIds):
87                 _moduleLogger.debug("Called RequestAliases")
88                 return [self._get_alias(handleId) for handleId in contactHandleIds]
89
90         @gtk_toolbox.log_exception(_moduleLogger)
91         def GetAliases(self, contactHandleIds):
92                 _moduleLogger.debug("Called GetAliases")
93
94                 idToAlias = dict(
95                         (handleId, self._get_alias(handleId))
96                         for handleId in contactHandleIds
97                 )
98                 return idToAlias
99
100         @gtk_toolbox.log_exception(_moduleLogger)
101         def SetAliases(self, aliases):
102                 _moduleLogger.debug("Called SetAliases")
103
104                 # first validate that no other handle types are included
105                 userHandleAndAlias = None
106                 for handleId, alias in aliases.iteritems():
107                         h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
108                         if not isinstance(h, handle.ConnectionHandle):
109                                 raise telepathy.errors.PermissionDenied("No user customizable aliases")
110                         userHandleAndAlias = h, alias
111                 if userHandleAndAlias is None:
112                         _moduleLogger.debug("No user handle")
113                         return
114
115                 # Update callback
116                 uglyNumber = handle.strip_number(userHandleAndAlias[1])
117                 self.session.backend.set_callback_number(uglyNumber)
118
119                 # Inform of change
120                 changedAliases = (userHandleAndAlias, )
121                 self.AliasesChanged(changedAliases)
122
123         def _get_alias(self, handleId):
124                 h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
125                 if isinstance(h, handle.ConnectionHandle):
126                         callbackNumber = self.session.backend.get_callback_number()
127                         userAlias = make_pretty(callbackNumber)
128                         return userAlias
129                 else:
130                         contactId = h.contactID
131                         if contactId:
132                                 contactAlias = self.session.addressbook.get_contact_name(contactId)
133                         else:
134                                 contactAlias = make_pretty(h.phoneNumber)
135                         return contactAlias