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