4 """Encapsulate a phone number.
6 Copyright (c) Andrew Flegg <andrew@bleb.org> 2010.
7 Released under the Artistic Licence."""
10 def __init__(self, number, device=None, type=None, country=None):
11 """Store a phone number.
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.
18 self._country = country and country.lower() or None
19 self._number = _build_number(number, self._country)
23 # -----------------------------------------------------------------------
28 return "Tel (%s %s): %s" % (type, device, self.get_number())
30 return "Tel (%s): %s" % (type or device, self.get_number())
31 return "Tel: %s" % self.get_number()
34 # -----------------------------------------------------------------------
36 """Return the device type. Can be one of None, 'landline' or 'mobile'."""
41 # -----------------------------------------------------------------------
43 """Return the number type. Can be one of None, 'home' or 'work'."""
48 # -----------------------------------------------------------------------
49 def get_country(self):
50 """Return the country type."""
55 # -----------------------------------------------------------------------
57 """Return the number, turning it into an international format
63 # -----------------------------------------------------------------------
64 _stripre = re.compile(r'[^\dp#\*]+')
65 _dropre = re.compile(r'^0')
67 def _build_number(number, country):
68 """Return the number, turning it into an international format
71 clean_number = _stripre.sub('', number)
72 dropped_zero = _dropre.sub('', clean_number)
73 if number.startswith('+'):
74 return '+%s' % (clean_number)
76 return '+93%s' % (clean_number)
78 return '+355%s' % (clean_number)
80 return '+213%s' % (clean_number)
82 return '+376%s' % (clean_number)
84 return '+244%s' % (clean_number)
86 return '+672%s' % (clean_number)
88 return '+54%s' % (clean_number)
90 return '+374%s' % (clean_number)
92 return '+297%s' % (clean_number)
94 return '+61%s' % (clean_number)
96 return '+43%s' % (clean_number)
98 return '+994%s' % (clean_number)
100 return '+973%s' % (clean_number)
102 return '+880%s' % (clean_number)
104 return '+375%s' % (clean_number)
106 return '+32%s' % (clean_number)
108 return '+501%s' % (clean_number)
110 return '+229%s' % (clean_number)
112 return '+975%s' % (clean_number)
114 return '+591%s' % (clean_number)
116 return '+387%s' % (clean_number)
118 return '+267%s' % (clean_number)
120 return '+55%s' % (clean_number)
122 return '+673%s' % (clean_number)
124 return '+359%s' % (clean_number)
126 return '+226%s' % (clean_number)
128 return '+95%s' % (clean_number)
130 return '+257%s' % (clean_number)
132 return '+855%s' % (clean_number)
134 return '+237%s' % (clean_number)
136 return '+1%s' % (clean_number)
138 return '+238%s' % (clean_number)
140 return '+236%s' % (clean_number)
142 return '+235%s' % (clean_number)
144 return '+56%s' % (clean_number)
146 return '+86%s' % (clean_number)
148 return '+61%s' % (clean_number)
150 return '+61%s' % (clean_number)
152 return '+57%s' % (clean_number)
154 return '+269%s' % (clean_number)
156 return '+242%s' % (clean_number)
158 return '+243%s' % (clean_number)
160 return '+682%s' % (clean_number)
162 return '+506%s' % (clean_number)
164 return '+385%s' % (clean_number)
166 return '+53%s' % (clean_number)
168 return '+357%s' % (clean_number)
170 return '+420%s' % (clean_number)
172 return '+45%s' % (clean_number)
174 return '+253%s' % (clean_number)
176 return '+670%s' % (clean_number)
178 return '+593%s' % (clean_number)
180 return '+20%s' % (clean_number)
182 return '+503%s' % (clean_number)
184 return '+240%s' % (clean_number)
186 return '+291%s' % (clean_number)
188 return '+372%s' % (clean_number)
190 return '+251%s' % (clean_number)
192 return '+500%s' % (clean_number)
194 return '+298%s' % (clean_number)
196 return '+679%s' % (clean_number)
198 return '+358%s' % (clean_number)
200 return '+33%s' % (dropped_zero)
202 return '+689%s' % (clean_number)
204 return '+241%s' % (clean_number)
206 return '+220%s' % (clean_number)
208 return '+995%s' % (clean_number)
210 return '+49%s' % (clean_number)
212 return '+233%s' % (clean_number)
214 return '+350%s' % (clean_number)
216 return '+30%s' % (clean_number)
218 return '+299%s' % (clean_number)
220 return '+502%s' % (clean_number)
222 return '+224%s' % (clean_number)
224 return '+245%s' % (clean_number)
226 return '+592%s' % (clean_number)
228 return '+509%s' % (clean_number)
230 return '+504%s' % (clean_number)
232 return '+852%s' % (clean_number)
234 return '+36%s' % (clean_number)
236 return '+91%s' % (clean_number)
238 return '+62%s' % (clean_number)
240 return '+98%s' % (clean_number)
242 return '+964%s' % (clean_number)
244 return '+353%s' % (clean_number)
246 return '+44%s' % (dropped_zero)
248 return '+972%s' % (clean_number)
250 return '+39%s' % (clean_number)
252 return '+225%s' % (clean_number)
254 return '+81%s' % (clean_number)
256 return '+962%s' % (clean_number)
258 return '+7%s' % (clean_number)
260 return '+254%s' % (clean_number)
262 return '+686%s' % (clean_number)
264 return '+965%s' % (clean_number)
266 return '+996%s' % (clean_number)
268 return '+856%s' % (clean_number)
270 return '+371%s' % (clean_number)
272 return '+961%s' % (clean_number)
274 return '+266%s' % (clean_number)
276 return '+231%s' % (clean_number)
278 return '+218%s' % (clean_number)
280 return '+423%s' % (clean_number)
282 return '+370%s' % (clean_number)
284 return '+352%s' % (clean_number)
286 return '+853%s' % (clean_number)
288 return '+389%s' % (clean_number)
290 return '+261%s' % (clean_number)
292 return '+265%s' % (clean_number)
294 return '+60%s' % (clean_number)
296 return '+960%s' % (clean_number)
298 return '+223%s' % (clean_number)
300 return '+356%s' % (clean_number)
302 return '+692%s' % (clean_number)
304 return '+222%s' % (clean_number)
306 return '+230%s' % (clean_number)
308 return '+262%s' % (clean_number)
310 return '+52%s' % (clean_number)
312 return '+691%s' % (clean_number)
314 return '+373%s' % (clean_number)
316 return '+377%s' % (clean_number)
318 return '+976%s' % (clean_number)
320 return '+382%s' % (clean_number)
322 return '+212%s' % (clean_number)
324 return '+258%s' % (clean_number)
326 return '+264%s' % (clean_number)
328 return '+674%s' % (clean_number)
330 return '+977%s' % (clean_number)
332 return '+31%s' % (clean_number)
334 return '+599%s' % (clean_number)
336 return '+687%s' % (clean_number)
338 return '+64%s' % (clean_number)
340 return '+505%s' % (clean_number)
342 return '+227%s' % (clean_number)
344 return '+234%s' % (clean_number)
346 return '+683%s' % (clean_number)
348 return '+850%s' % (clean_number)
350 return '+47%s' % (clean_number)
352 return '+968%s' % (clean_number)
354 return '+92%s' % (clean_number)
356 return '+680%s' % (clean_number)
358 return '+507%s' % (clean_number)
360 return '+675%s' % (clean_number)
362 return '+595%s' % (clean_number)
364 return '+51%s' % (clean_number)
366 return '+63%s' % (clean_number)
368 return '+870%s' % (clean_number)
370 return '+48%s' % (clean_number)
372 return '+351%s' % (clean_number)
374 return '+1%s' % (clean_number)
376 return '+974%s' % (clean_number)
378 return '+40%s' % (clean_number)
380 return '+7%s' % (clean_number)
382 return '+250%s' % (clean_number)
384 return '+590%s' % (clean_number)
386 return '+685%s' % (clean_number)
388 return '+378%s' % (clean_number)
390 return '+239%s' % (clean_number)
392 return '+966%s' % (clean_number)
394 return '+221%s' % (clean_number)
396 return '+381%s' % (clean_number)
398 return '+248%s' % (clean_number)
400 return '+232%s' % (clean_number)
402 return '+65%s' % (clean_number)
404 return '+421%s' % (clean_number)
406 return '+386%s' % (clean_number)
408 return '+677%s' % (clean_number)
410 return '+252%s' % (clean_number)
412 return '+27%s' % (clean_number)
414 return '+82%s' % (clean_number)
416 return '+34%s' % (clean_number)
418 return '+94%s' % (clean_number)
420 return '+290%s' % (clean_number)
422 return '+508%s' % (clean_number)
424 return '+249%s' % (clean_number)
426 return '+597%s' % (clean_number)
428 return '+268%s' % (clean_number)
430 return '+46%s' % (clean_number)
432 return '+41%s' % (clean_number)
434 return '+963%s' % (clean_number)
436 return '+886%s' % (clean_number)
438 return '+992%s' % (clean_number)
440 return '+255%s' % (clean_number)
442 return '+66%s' % (clean_number)
444 return '+228%s' % (clean_number)
446 return '+690%s' % (clean_number)
448 return '+676%s' % (clean_number)
450 return '+216%s' % (clean_number)
452 return '+90%s' % (clean_number)
454 return '+993%s' % (clean_number)
456 return '+688%s' % (clean_number)
458 return '+971%s' % (clean_number)
460 return '+256%s' % (clean_number)
462 return '+44%s' % (dropped_zero)
464 return '+380%s' % (clean_number)
466 return '+598%s' % (clean_number)
468 return '+1%s' % (clean_number)
470 return '+998%s' % (clean_number)
472 return '+678%s' % (clean_number)
474 return '+39%s' % (clean_number)
476 return '+58%s' % (clean_number)
478 return '+84%s' % (clean_number)
480 return '+681%s' % (clean_number)
482 return '+967%s' % (clean_number)
484 return '+260%s' % (clean_number)
486 return '+263%s' % (clean_number)