Misc cleanup
[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         USER_ALIAS_ACCOUNT = "account"
65         USER_ALIAS_CALLBACK = "callback"
66
67         def __init__(self):
68                 telepathy.server.ConnectionInterfaceAliasing.__init__(self)
69
70         @property
71         def session(self):
72                 """
73                 @abstract
74                 """
75                 raise NotImplementedError("Abstract property called")
76
77         @property
78         def userAliasType(self):
79                 """
80                 @abstract
81                 """
82                 raise NotImplementedError("Abstract property called")
83
84         def handle(self, handleType, handleId):
85                 """
86                 @abstract
87                 """
88                 raise NotImplementedError("Abstract function called")
89
90         @gtk_toolbox.log_exception(_moduleLogger)
91         def GetAliasFlags(self):
92                 return 0
93
94         @gtk_toolbox.log_exception(_moduleLogger)
95         def RequestAliases(self, contactHandleIds):
96                 _moduleLogger.debug("Called RequestAliases")
97                 return [self._get_alias(handleId) for handleId in contactHandleIds]
98
99         @gtk_toolbox.log_exception(_moduleLogger)
100         def GetAliases(self, contactHandleIds):
101                 _moduleLogger.debug("Called GetAliases")
102
103                 idToAlias = dict(
104                         (handleId, self._get_alias(handleId))
105                         for handleId in contactHandleIds
106                 )
107                 return idToAlias
108
109         @gtk_toolbox.log_exception(_moduleLogger)
110         def SetAliases(self, aliases):
111                 _moduleLogger.debug("Called SetAliases")
112                 if self.userAliasType == self.USER_ALIAS_ACCOUNT:
113                         raise telepathy.errors.PermissionDenied("No user customizable aliases")
114                 elif self.userAliasType != self.USER_ALIAS_CALLBACK:
115                         raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
116
117                 # first validate that no other handle types are included
118                 userHandleAndAlias = None
119                 for handleId, alias in aliases.iteritems():
120                         h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
121                         if not isinstance(h, handle.ConnectionHandle):
122                                 raise telepathy.errors.PermissionDenied("No user customizable aliases")
123                         userHandleAndAlias = h, alias
124                 if userHandleAndAlias is None:
125                         _moduleLogger.debug("No user handle")
126                         return
127
128                 # Update callback
129                 uglyNumber = handle.strip_number(userHandleAndAlias[1])
130                 self.session.backend.set_callback_number(uglyNumber)
131
132                 # Inform of change
133                 changedAliases = (userHandleAndAlias, )
134                 self.AliasesChanged(changedAliases)
135
136         def _get_alias(self, handleId):
137                 h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
138                 if isinstance(h, handle.ConnectionHandle):
139                         if self.userAliasType == self.USER_ALIAS_CALLBACK:
140                                 aliasNumber = self.session.backend.get_callback_number()
141                         elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
142                                 aliasNumber = self.session.backend.get_account_number()
143                         else:
144                                 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
145                         userAlias = make_pretty(aliasNumber)
146                         return userAlias
147                 else:
148                         contactId = h.contactID
149                         if contactId:
150                                 contactAlias = self.session.addressbook.get_contact_name(contactId)
151                         else:
152                                 contactAlias = make_pretty(h.phoneNumber)
153                         return contactAlias