198 lines
5.4 KiB
Python
198 lines
5.4 KiB
Python
# -*- coding: UTF-8 -*-
|
|
"""
|
|
utilitaires créole
|
|
"""
|
|
|
|
import sys
|
|
from .error import NoneError, OutOfRange
|
|
from .config import charset
|
|
try:
|
|
from pyeole.ansiprint import *
|
|
except:
|
|
pass
|
|
import time, hashlib, random, unicodedata
|
|
|
|
# définition des classes d'adresse IP existantes
|
|
classes = {
|
|
u'128.0.0.0' : u'1'
|
|
, u'192.0.0.0' : u'2'
|
|
, u'224.0.0.0' : u'3'
|
|
, u'240.0.0.0' : u'4'
|
|
, u'248.0.0.0' : u'5'
|
|
, u'252.0.0.0' : u'6'
|
|
, u'254.0.0.0' : u'7'
|
|
, u'255.0.0.0' : u'8'
|
|
, u'255.128.0.0' : u'9'
|
|
, u'255.192.0.0' : u'10'
|
|
, u'255.224.0.0' : u'11'
|
|
, u'255.240.0.0' : u'12'
|
|
, u'255.248.0.0' : u'13'
|
|
, u'255.252.0.0' : u'14'
|
|
, u'255.254.0.0' : u'15'
|
|
, u'255.255.0.0' : u'16'
|
|
, u'255.255.128.0' : u'17'
|
|
, u'255.255.192.0' : u'18'
|
|
, u'255.255.224.0' : u'19'
|
|
, u'255.255.240.0' : u'20'
|
|
, u'255.255.248.0' : u'21'
|
|
, u'255.255.252.0' : u'22'
|
|
, u'255.255.254.0' : u'23'
|
|
, u'255.255.255.0' : u'24'
|
|
, u'255.255.255.128' : u'25'
|
|
, u'255.255.255.192' : u'26'
|
|
, u'255.255.255.224' : u'27'
|
|
, u'255.255.255.240' : u'28'
|
|
, u'255.255.255.248' : u'29'
|
|
, u'255.255.255.252' : u'30'
|
|
, u'255.255.255.254' : u'31'
|
|
, u'255.255.255.255' : u'32'
|
|
}
|
|
|
|
def string_to_bool(string):
|
|
"""
|
|
Transforme les chaines 'True' ou 'False' en valeurs booléennes
|
|
"""
|
|
if string == "":
|
|
raise ValueError('empty string')
|
|
result = eval(string)
|
|
if result not in [True, False]:
|
|
raise TypeError("string must be like 'True' or 'False'")
|
|
else: return result
|
|
|
|
|
|
def get_text_node(node):
|
|
"""
|
|
@param node: node minidom contenant du texte
|
|
Utilitaire minidom permettant de récupérer le texte d'un node texte
|
|
"""
|
|
texte = ""
|
|
nodelist = node.childNodes
|
|
for textnode in nodelist:
|
|
if textnode.nodeType == textnode.TEXT_NODE:
|
|
texte = texte + textnode.data
|
|
return texte
|
|
|
|
|
|
# utilitaires pour la
|
|
# ligne de commande
|
|
|
|
def raw(text):
|
|
"""
|
|
Question en ligne de commande : permet de repérer si l'utilisateur a renvoyé quelque chose
|
|
|
|
@param text: le libellé de message
|
|
@return: la variable demandée
|
|
"""
|
|
var = raw_input(text + " : ")
|
|
if var:
|
|
return var
|
|
else:
|
|
raise NoneError
|
|
|
|
|
|
def stringify(string):
|
|
"""
|
|
Encodage des chaînes avec le charset local
|
|
"""
|
|
try:
|
|
return string.encode(charset)
|
|
except:
|
|
return string
|
|
|
|
def encode_list(_list):
|
|
""" encode une liste en utf-8 si les éléments sont de type dico ou str ou liste, unicode"""
|
|
encoded_list = []
|
|
for element in _list:
|
|
if type(element) == str:
|
|
encoded_list.append(encode_str(element))
|
|
elif type(element) == dict:
|
|
encoded_list.append(encode_dico(element))
|
|
elif type(element) == list:
|
|
encoded_list.append(encode_list(element))
|
|
elif type(element) == unicode:
|
|
encoded_list.append(encode_str(element))
|
|
else:
|
|
encoded_list.append(element)
|
|
return encoded_list
|
|
|
|
def encode_str(string):
|
|
""" encode une string ou un unicode en utf8 """
|
|
try:
|
|
string = string.encode(charset)
|
|
except:
|
|
pass
|
|
return string
|
|
|
|
def encode_dico(dico):
|
|
""" encode un dico en utf8 dans le cas ou les valeurs soient de type dico, liste, str, unicode """
|
|
for key in dico.keys():
|
|
if type(dico[key]) == str:
|
|
dico[key] = encode_str(dico[key])
|
|
elif type(dico[key]) == unicode:
|
|
dico[key] = encode_str(dico[key])
|
|
elif type(dico[key]) == dict:
|
|
dico[key] = encode_dico(dico[key])
|
|
elif type(dico[key]) == list:
|
|
dico[key] = encode_list(dico[key])
|
|
return dico
|
|
|
|
|
|
def select_list(selection):
|
|
"""
|
|
Utilitaire de construction d'une sélection en ligne de commande
|
|
@param selection : liste
|
|
@return : l'identifiant sélectionné (entier)
|
|
"""
|
|
# affichage de la liste (ordonnée)
|
|
for i in selection:
|
|
print(selection.index(i) , ':', stringify(i))
|
|
# print selection.index(i) , ':', i[0]
|
|
|
|
# recuperation du numero
|
|
try:
|
|
number = int(raw(stringify(_("Choose a number in the list"))))
|
|
except:
|
|
raise OutOfRange
|
|
if number not in range(len(selection)):
|
|
raise OutOfRange
|
|
return number
|
|
|
|
def gen_random(length=None):
|
|
"""
|
|
length: longueur de la chaine aléatoire attendu
|
|
"""
|
|
try:
|
|
random_id = str(time.time()).split('.')[0]
|
|
random_str = hashlib.sha224('{}/{}'.format(random_id, str(random.randrange(2**100))).encode('utf-8')).hexdigest()
|
|
return random_str[:length]
|
|
except:
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
def normalize_family(family_name, check_name=True):
|
|
"""
|
|
il ne faut pas d'espace, d'accent, de majuscule, de tiré, ...
|
|
dans le nom des familles
|
|
"""
|
|
if sys.version_info[0] < 3:
|
|
f = unicode(family_name)
|
|
else:
|
|
f = family_name
|
|
f = f.replace('-', '_')
|
|
#f = f.replace(u'é', 'e')
|
|
#f = f.replace(u'è', 'e')
|
|
nfkd_form = unicodedata.normalize('NFKD', f)
|
|
f = u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
|
|
f = f.replace(' ', '_')
|
|
f = f.lower()
|
|
try:
|
|
int(f[0])
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
raise ValueError(u'Le nom de la famille ne doit pas commencer par un chiffre : {0}'.format(f))
|
|
if check_name and f.lower() in ['containers']:
|
|
raise ValueError(u'nom de la famille interdit {0}'.format(f))
|
|
return f
|
|
|