Add phone number support to friends, and contacts, and populate from
[hermes] / package / src / org / maemo / hermes / engine / phonenumber.py
1 import re
2
3 class PhoneNumber():
4     """Encapsulate a phone number.
5     
6        Copyright (c) Andrew Flegg <andrew@bleb.org> 2010.
7        Released under the Artistic Licence."""
8
9     
10     def __init__(self, number, device=None, type=None, country=None):
11         """Store a phone number.
12         
13              'device' can be one of: None, 'landline', 'mobile'
14              'type' can be one of: None, 'home', 'work'
15              'country' can be a two-character ISO-3166 country code.
16         """
17         
18         self._country = country and country.lower() or None
19         self._number  = _build_number(number, self._country)
20         self._device  = device
21         self._type    = type
22     
23     # -----------------------------------------------------------------------
24     def __repr__(self):
25         device = self._device
26         type = self._type
27         if device and type:
28             return "Tel (%s %s): %s" % (type, device, self.get_number())
29         if device or type:
30             return "Tel (%s): %s" % (type or device, self.get_number())
31         return "Tel: %s" % self.get_number()
32
33     
34     # -----------------------------------------------------------------------
35     def get_device(self):
36         """Return the device type. Can be one of None, 'landline' or 'mobile'."""
37         
38         return self._device
39
40     
41     # -----------------------------------------------------------------------
42     def get_type(self):
43         """Return the number type. Can be one of None, 'home' or 'work'.""" 
44         
45         return self._type
46
47     
48     # -----------------------------------------------------------------------
49     def get_country(self):
50         """Return the country type.""" 
51         
52         return self._country
53
54     
55     # -----------------------------------------------------------------------
56     def get_number(self):
57         """Return the number, turning it into an international format
58            if possible.""" 
59         
60         return self._number
61
62
63 # -----------------------------------------------------------------------
64 _stripre = re.compile(r'[^\dp#\*]+')
65 _dropre  = re.compile(r'^0')
66
67 def _build_number(number, country):
68     """Return the number, turning it into an international format
69        if possible."""
70        
71     clean_number = _stripre.sub('', number)
72     dropped_zero = _dropre.sub('', clean_number)
73     if number.startswith('+'):
74         return '+%s' % (clean_number)
75     if country == 'af':
76         return '+93%s' % (clean_number)
77     if country == 'al':
78         return '+355%s' % (clean_number)
79     if country == 'dz':
80         return '+213%s' % (clean_number)
81     if country == 'ad':
82         return '+376%s' % (clean_number)
83     if country == 'ao':
84         return '+244%s' % (clean_number)
85     if country == 'aq':
86         return '+672%s' % (clean_number)
87     if country == 'ar':
88         return '+54%s' % (clean_number)
89     if country == 'am':
90         return '+374%s' % (clean_number)
91     if country == 'aw':
92         return '+297%s' % (clean_number)
93     if country == 'au':
94         return '+61%s' % (clean_number)
95     if country == 'at':
96         return '+43%s' % (clean_number)
97     if country == 'az':
98         return '+994%s' % (clean_number)
99     if country == 'bh':
100         return '+973%s' % (clean_number)
101     if country == 'bd':
102         return '+880%s' % (clean_number)
103     if country == 'by':
104         return '+375%s' % (clean_number)
105     if country == 'be':
106         return '+32%s' % (clean_number)
107     if country == 'bz':
108         return '+501%s' % (clean_number)
109     if country == 'bj':
110         return '+229%s' % (clean_number)
111     if country == 'bt':
112         return '+975%s' % (clean_number)
113     if country == 'bo':
114         return '+591%s' % (clean_number)
115     if country == 'ba':
116         return '+387%s' % (clean_number)
117     if country == 'bw':
118         return '+267%s' % (clean_number)
119     if country == 'br':
120         return '+55%s' % (clean_number)
121     if country == 'bn':
122         return '+673%s' % (clean_number)
123     if country == 'bg':
124         return '+359%s' % (clean_number)
125     if country == 'bf':
126         return '+226%s' % (clean_number)
127     if country == 'mm':
128         return '+95%s' % (clean_number)
129     if country == 'bi':
130         return '+257%s' % (clean_number)
131     if country == 'kh':
132         return '+855%s' % (clean_number)
133     if country == 'cm':
134         return '+237%s' % (clean_number)
135     if country == 'ca':
136         return '+1%s' % (clean_number)
137     if country == 'cv':
138         return '+238%s' % (clean_number)
139     if country == 'cf':
140         return '+236%s' % (clean_number)
141     if country == 'td':
142         return '+235%s' % (clean_number)
143     if country == 'cl':
144         return '+56%s' % (clean_number)
145     if country == 'cn':
146         return '+86%s' % (clean_number)
147     if country == 'cx':
148         return '+61%s' % (clean_number)
149     if country == 'cc':
150         return '+61%s' % (clean_number)
151     if country == 'co':
152         return '+57%s' % (clean_number)
153     if country == 'km':
154         return '+269%s' % (clean_number)
155     if country == 'cg':
156         return '+242%s' % (clean_number)
157     if country == 'cd':
158         return '+243%s' % (clean_number)
159     if country == 'ck':
160         return '+682%s' % (clean_number)
161     if country == 'cr':
162         return '+506%s' % (clean_number)
163     if country == 'hr':
164         return '+385%s' % (clean_number)
165     if country == 'cu':
166         return '+53%s' % (clean_number)
167     if country == 'cy':
168         return '+357%s' % (clean_number)
169     if country == 'cz':
170         return '+420%s' % (clean_number)
171     if country == 'dk':
172         return '+45%s' % (clean_number)
173     if country == 'dj':
174         return '+253%s' % (clean_number)
175     if country == 'tl':
176         return '+670%s' % (clean_number)
177     if country == 'ec':
178         return '+593%s' % (clean_number)
179     if country == 'eg':
180         return '+20%s' % (clean_number)
181     if country == 'sv':
182         return '+503%s' % (clean_number)
183     if country == 'gq':
184         return '+240%s' % (clean_number)
185     if country == 'er':
186         return '+291%s' % (clean_number)
187     if country == 'ee':
188         return '+372%s' % (clean_number)
189     if country == 'et':
190         return '+251%s' % (clean_number)
191     if country == 'fk':
192         return '+500%s' % (clean_number)
193     if country == 'fo':
194         return '+298%s' % (clean_number)
195     if country == 'fj':
196         return '+679%s' % (clean_number)
197     if country == 'fi':
198         return '+358%s' % (clean_number)
199     if country == 'fr':
200         return '+33%s' % (dropped_zero)
201     if country == 'pf':
202         return '+689%s' % (clean_number)
203     if country == 'ga':
204         return '+241%s' % (clean_number)
205     if country == 'gm':
206         return '+220%s' % (clean_number)
207     if country == 'ge':
208         return '+995%s' % (clean_number)
209     if country == 'de':
210         return '+49%s' % (clean_number)
211     if country == 'gh':
212         return '+233%s' % (clean_number)
213     if country == 'gi':
214         return '+350%s' % (clean_number)
215     if country == 'gr':
216         return '+30%s' % (clean_number)
217     if country == 'gl':
218         return '+299%s' % (clean_number)
219     if country == 'gt':
220         return '+502%s' % (clean_number)
221     if country == 'gn':
222         return '+224%s' % (clean_number)
223     if country == 'gw':
224         return '+245%s' % (clean_number)
225     if country == 'gy':
226         return '+592%s' % (clean_number)
227     if country == 'ht':
228         return '+509%s' % (clean_number)
229     if country == 'hn':
230         return '+504%s' % (clean_number)
231     if country == 'hk':
232         return '+852%s' % (clean_number)
233     if country == 'hu':
234         return '+36%s' % (clean_number)
235     if country == 'in':
236         return '+91%s' % (clean_number)
237     if country == 'id':
238         return '+62%s' % (clean_number)
239     if country == 'ir':
240         return '+98%s' % (clean_number)
241     if country == 'iq':
242         return '+964%s' % (clean_number)
243     if country == 'ie':
244         return '+353%s' % (clean_number)
245     if country == 'im':
246         return '+44%s' % (dropped_zero)
247     if country == 'il':
248         return '+972%s' % (clean_number)
249     if country == 'it':
250         return '+39%s' % (clean_number)
251     if country == 'ci':
252         return '+225%s' % (clean_number)
253     if country == 'jp':
254         return '+81%s' % (clean_number)
255     if country == 'jo':
256         return '+962%s' % (clean_number)
257     if country == 'kz':
258         return '+7%s' % (clean_number)
259     if country == 'ke':
260         return '+254%s' % (clean_number)
261     if country == 'ki':
262         return '+686%s' % (clean_number)
263     if country == 'kw':
264         return '+965%s' % (clean_number)
265     if country == 'kg':
266         return '+996%s' % (clean_number)
267     if country == 'la':
268         return '+856%s' % (clean_number)
269     if country == 'lv':
270         return '+371%s' % (clean_number)
271     if country == 'lb':
272         return '+961%s' % (clean_number)
273     if country == 'ls':
274         return '+266%s' % (clean_number)
275     if country == 'lr':
276         return '+231%s' % (clean_number)
277     if country == 'ly':
278         return '+218%s' % (clean_number)
279     if country == 'li':
280         return '+423%s' % (clean_number)
281     if country == 'lt':
282         return '+370%s' % (clean_number)
283     if country == 'lu':
284         return '+352%s' % (clean_number)
285     if country == 'mo':
286         return '+853%s' % (clean_number)
287     if country == 'mk':
288         return '+389%s' % (clean_number)
289     if country == 'mg':
290         return '+261%s' % (clean_number)
291     if country == 'mw':
292         return '+265%s' % (clean_number)
293     if country == 'my':
294         return '+60%s' % (clean_number)
295     if country == 'mv':
296         return '+960%s' % (clean_number)
297     if country == 'ml':
298         return '+223%s' % (clean_number)
299     if country == 'mt':
300         return '+356%s' % (clean_number)
301     if country == 'mh':
302         return '+692%s' % (clean_number)
303     if country == 'mr':
304         return '+222%s' % (clean_number)
305     if country == 'mu':
306         return '+230%s' % (clean_number)
307     if country == 'yt':
308         return '+262%s' % (clean_number)
309     if country == 'mx':
310         return '+52%s' % (clean_number)
311     if country == 'fm':
312         return '+691%s' % (clean_number)
313     if country == 'md':
314         return '+373%s' % (clean_number)
315     if country == 'mc':
316         return '+377%s' % (clean_number)
317     if country == 'mn':
318         return '+976%s' % (clean_number)
319     if country == 'me':
320         return '+382%s' % (clean_number)
321     if country == 'ma':
322         return '+212%s' % (clean_number)
323     if country == 'mz':
324         return '+258%s' % (clean_number)
325     if country == 'na':
326         return '+264%s' % (clean_number)
327     if country == 'nr':
328         return '+674%s' % (clean_number)
329     if country == 'np':
330         return '+977%s' % (clean_number)
331     if country == 'nl':
332         return '+31%s' % (clean_number)
333     if country == 'an':
334         return '+599%s' % (clean_number)
335     if country == 'nc':
336         return '+687%s' % (clean_number)
337     if country == 'nz':
338         return '+64%s' % (clean_number)
339     if country == 'ni':
340         return '+505%s' % (clean_number)
341     if country == 'ne':
342         return '+227%s' % (clean_number)
343     if country == 'ng':
344         return '+234%s' % (clean_number)
345     if country == 'nu':
346         return '+683%s' % (clean_number)
347     if country == 'kp':
348         return '+850%s' % (clean_number)
349     if country == 'no':
350         return '+47%s' % (clean_number)
351     if country == 'om':
352         return '+968%s' % (clean_number)
353     if country == 'pk':
354         return '+92%s' % (clean_number)
355     if country == 'pw':
356         return '+680%s' % (clean_number)
357     if country == 'pa':
358         return '+507%s' % (clean_number)
359     if country == 'pg':
360         return '+675%s' % (clean_number)
361     if country == 'py':
362         return '+595%s' % (clean_number)
363     if country == 'pe':
364         return '+51%s' % (clean_number)
365     if country == 'ph':
366         return '+63%s' % (clean_number)
367     if country == 'pn':
368         return '+870%s' % (clean_number)
369     if country == 'pl':
370         return '+48%s' % (clean_number)
371     if country == 'pt':
372         return '+351%s' % (clean_number)
373     if country == 'pr':
374         return '+1%s' % (clean_number)
375     if country == 'qa':
376         return '+974%s' % (clean_number)
377     if country == 'ro':
378         return '+40%s' % (clean_number)
379     if country == 'ru':
380         return '+7%s' % (clean_number)
381     if country == 'rw':
382         return '+250%s' % (clean_number)
383     if country == 'bl':
384         return '+590%s' % (clean_number)
385     if country == 'ws':
386         return '+685%s' % (clean_number)
387     if country == 'sm':
388         return '+378%s' % (clean_number)
389     if country == 'st':
390         return '+239%s' % (clean_number)
391     if country == 'sa':
392         return '+966%s' % (clean_number)
393     if country == 'sn':
394         return '+221%s' % (clean_number)
395     if country == 'rs':
396         return '+381%s' % (clean_number)
397     if country == 'sc':
398         return '+248%s' % (clean_number)
399     if country == 'sl':
400         return '+232%s' % (clean_number)
401     if country == 'sg':
402         return '+65%s' % (clean_number)
403     if country == 'sk':
404         return '+421%s' % (clean_number)
405     if country == 'si':
406         return '+386%s' % (clean_number)
407     if country == 'sb':
408         return '+677%s' % (clean_number)
409     if country == 'so':
410         return '+252%s' % (clean_number)
411     if country == 'za':
412         return '+27%s' % (clean_number)
413     if country == 'kr':
414         return '+82%s' % (clean_number)
415     if country == 'es':
416         return '+34%s' % (clean_number)
417     if country == 'lk':
418         return '+94%s' % (clean_number)
419     if country == 'sh':
420         return '+290%s' % (clean_number)
421     if country == 'pm':
422         return '+508%s' % (clean_number)
423     if country == 'sd':
424         return '+249%s' % (clean_number)
425     if country == 'sr':
426         return '+597%s' % (clean_number)
427     if country == 'sz':
428         return '+268%s' % (clean_number)
429     if country == 'se':
430         return '+46%s' % (clean_number)
431     if country == 'ch':
432         return '+41%s' % (clean_number)
433     if country == 'sy':
434         return '+963%s' % (clean_number)
435     if country == 'tw':
436         return '+886%s' % (clean_number)
437     if country == 'tj':
438         return '+992%s' % (clean_number)
439     if country == 'tz':
440         return '+255%s' % (clean_number)
441     if country == 'th':
442         return '+66%s' % (clean_number)
443     if country == 'tg':
444         return '+228%s' % (clean_number)
445     if country == 'tk':
446         return '+690%s' % (clean_number)
447     if country == 'to':
448         return '+676%s' % (clean_number)
449     if country == 'tn':
450         return '+216%s' % (clean_number)
451     if country == 'tr':
452         return '+90%s' % (clean_number)
453     if country == 'tm':
454         return '+993%s' % (clean_number)
455     if country == 'tv':
456         return '+688%s' % (clean_number)
457     if country == 'ae':
458         return '+971%s' % (clean_number)
459     if country == 'ug':
460         return '+256%s' % (clean_number)
461     if country == 'gb':
462         return '+44%s' % (dropped_zero)
463     if country == 'ua':
464         return '+380%s' % (clean_number)
465     if country == 'uy':
466         return '+598%s' % (clean_number)
467     if country == 'us':
468         return '+1%s' % (clean_number)
469     if country == 'uz':
470         return '+998%s' % (clean_number)
471     if country == 'vu':
472         return '+678%s' % (clean_number)
473     if country == 'va':
474         return '+39%s' % (clean_number)
475     if country == 've':
476         return '+58%s' % (clean_number)
477     if country == 'vn':
478         return '+84%s' % (clean_number)
479     if country == 'wf':
480         return '+681%s' % (clean_number)
481     if country == 'ye':
482         return '+967%s' % (clean_number)
483     if country == 'zm':
484         return '+260%s' % (clean_number)
485     if country == 'zw':
486         return '+263%s' % (clean_number)
487             
488     return clean_number