iro/telnumber.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 24 Aug 2012 01:05:06 +0200
branchdevel
changeset 294 0e75bd39767d
parent 291 84eb5a7a715a
permissions -rw-r--r--
adding LICENSE to all files

# Copyright (c) 2012 netzguerilla.net <iro@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<land>[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: `<Telnumber 0012345667>`
        """
        return "<Telnumber %s>"%str(self)