diff -r eb04ac3a8327 -r 3f4bdea2abbf iro/telnumber.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/telnumber.py Thu Sep 27 17:15:46 2012 +0200 @@ -0,0 +1,114 @@ +# Copyright (c) 2012 netzguerilla.net +# +# This file is part of Iro. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# #Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# -*- coding: utf-8 -*- +import re + +from .error import InvalidTel + +class Telnumber: + """A telefonnumer, with splitted country part""" + re_telnum=re.compile(r'^\s*(\+)?([0-9\s\-/\(\)]){5,}\s*$') + """Regex for a complete telefon number""" + + re_land=re.compile(r'^\s*(\+|00)(?P[1-9]{2})') + """Regex for country part""" + + re_number=re.compile(r'[^0-9]') + """Regex for numbers""" + + std_land="49" + """Standard country part""" + + def __init__(self,number=None): + """ + :param string number: a telefonnumber + + .. automethod:: __eq__ + .. automethod:: __neq__ + .. automethod:: __hash__ + .. automethod:: __str__ + .. automethod:: __repr__ + + """ + self.land = None + """Country part of a telefonnumber""" + + self.number = None + """Localpart of the telefonnumber""" + + if not(number is None): + self.createNumber(number) + + def createNumber(self, number): + """Split string into two parts: one country part and the rest. + + For a local number :attr:`std_land` will be used for country part. + + :param string number: a telefonnumber + """ + if not self.re_telnum.match(number): + raise InvalidTel(number) + + + self.land=self.std_land + + land=self.re_land.match(number) + + if land: + self.land=land.group("land") + number=number[land.end("land"):] + + number=self.re_number.sub('',number) + + if number[0]=="0": + number=number[1:] + + self.number = number + + def __eq__(self, y): + """Return ``True``, if y hase the same telefonnumber""" + return ((self.number == y.number) and ( self.land == y.land)) + + def __neq__(self, y): + """Return ``True``, if y is not equal (see :meth:`__eq__`)""" + return not self.__eq__(y) + + def __hash__(self): + """Return the Hash for telefonnumbers. + + Yust use the hash of the string representation of the Number + """ + return str(self).__hash__() + + def __str__(self): + """String representation of the telefonnumber. + + :return: the international telefonnumber with leading zeros + """ + return "00%s%s"%(self.land,self.number) + + def __repr__(self): + """debug representation of the class. + + :return: `` + """ + return ""%str(self)