#!/usr/bin/env python # -*- coding: utf-8 -*- # # CRANS_UTILS.PY-- Utils for Cr@ns gestion # # Copyright (c) 2010, Cr@ns # Author: Antoine Durand-Gasselin # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the Cr@ns nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import netaddr, re, time, smtplib import config from unicodedata import normalize def ip_of_mid(mid): """Convertit un mid en son IP associée""" for net, plage in config.mid.items(): if mid >= plage[0] and mid <= plage[1]: break else: raise ValueError("Mid dans aucune plage: %d" % mid) return netaddr.IPAddress(netaddr.IPNetwork(config.NETs[net][0]).first + mid - plage[0]) def strip_accents(a): """ Supression des accents de la chaîne fournie""" res = normalize('NFKD', a).encode('ASCII', 'ignore') return res.replace(' ', '_').replace("'", '') def mailexist(mail): """Vérifie si une adresse mail existe ou non grace à la commande vrfy du serveur mail """ mail = mail.split('@', 1)[0] try: s = smtplib.SMTP(config.smtpserv) s.putcmd("vrfy", mail) r = s.getreply()[0] in [250, 252] s.close() except: raise ValueError(u'Serveur de mail injoignable') return r def format_mac(mac): u""" Formatage des adresses mac Transforme une adresse pour obtenir la forme xx:xx:xx:xx:xx:xx Retourne la mac formatée. """ mac = netaddr.EUI(mac, dialect='mac_unix') if not mac: raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.") return mac def format_tel(tel): u"""Formatage des numéros de téléphone Transforme un numéro de téléphone pour ne contenir que des chiffres (00ii... pour les numéros internationaux) Retourne le numéro formaté. """ tel_f = tel.strip() if tel_f.startswith(u"+"): tel_f = u"00" + tel_f[1:] if u"(0)" in tel_f: tel_f = tel_f.replace(u"(0)", u"") tel_f = re.sub(r'\D', '', tel_f) return tel_f def validate_name(value, more_chars=""): """Valide un nom: ie un unicode qui contient lettres, espaces et apostrophes, et éventuellement des caractères additionnels""" if re.match("[A-Za-z]([-' %s]?[A-Za-z])*" % more_chars, normalize('NFKD', value).encode('ASCII', 'ignore')): return value else: raise ValueError("Nom invalide ('%s')" % value)