[global] Passage à tout unicode et quelques corrections mineures.

* Typos
 * Docstrings unicode
 * Erreurs unicode
 * Ajout de _post_delete et _post_create
 * ?
This commit is contained in:
Pierre-Elliott Bécue 2013-05-27 23:18:24 +02:00
parent b2abbef3b4
commit 60ded9f830
7 changed files with 244 additions and 237 deletions

View file

@ -46,6 +46,8 @@ import string
from unicodedata import normalize
from crans_utils import format_tel, format_mac, mailexist, validate_name, ip4_of_rid, ip6_of_mac
sys.path.append("/usr/scripts/")
import cranslib.deprecated
sys.path.append("/usr/scripts/gestion")
import config
import config.impression
@ -122,13 +124,14 @@ def attrify(val, attr, conn, Parent=None):
return val
else:
if not isinstance(val, unicode):
cranslib.deprecated.usage("attrify ne devrait être appelé qu'avec des unicode (%r)" % val, level=3)
val = val.decode('utf-8')
return AttributeFactory.get(attr, fallback=Attr)(val, conn, Parent)
class AttrsDict(dict):
def __init__(self, conn, ldif={}, Parent=None):
super(AttrsDict, self).__init__(ldif)
def __init__(self, conn, uldif={}, Parent=None):
super(AttrsDict, self).__init__(uldif)
self._conn = conn
self._parent = Parent
self._iterator = None
@ -139,7 +142,7 @@ class AttrsDict(dict):
values = [ values ]
output = []
for val in values:
output.append(attrify(val , attr, self._conn, self._parent))
output.append(attrify(val, attr, self._conn, self._parent))
self[attr] = output
return output
@ -201,7 +204,7 @@ class Attr(object):
category = 'other'
def __init__(self, val, conn, Parent):
"""Crée un nouvel objet représentant un attribut. """
"""Crée un nouvel objet représentant un attribut."""
self.value = None
self.conn = conn
assert isinstance(val, unicode)
@ -211,7 +214,7 @@ class Attr(object):
def parse_value(self, val):
"""Transforme l'attribut pour travailler avec notre validateur
Le ldif est en dépendance car à certains endroits, il peut servir
(par exemple, pour l'ipv6, ou l'ipv4..."""
(par exemple, pour l'ipv6, ou l'ipv4"""
self.value = val
def __str__(self):
@ -221,15 +224,16 @@ class Attr(object):
return str(self.__class__) + " : " + repr(self.value)
def __unicode__(self):
# XXX - Vérifier que cette méthode produit un objet parsable
assert isinstance(self.value, unicode)
return self.value
if isinstance(self.value, unicode):
return self.value
else:
return unicode(self.value)
def check_uniqueness(self, liste_exclue):
"""Vérifie l'unicité dans la base de la valeur (``mailAlias``, ``chbre``,
etc...)"""
attr = self.__class__.__name__
if str(self) in liste_exclue:
if unicode(self) in liste_exclue:
return
if self.unique:
res = self.conn.search('%s=%s' % (attr, str(self)))
@ -438,7 +442,7 @@ class mail(Attr):
singlevalue = False
optional = False
unique = True
legend = "Le mail de l'adhérent"
legend = "Adresse mail de l'adhérent"
can_modify = [soi, nounou, cableur]
category = 'mail'
ldap_name = "mail"
@ -456,7 +460,7 @@ class mail(Attr):
res = smtp.getreply()[0] in [250, 252]
smtp.close()
except:
raise ValueError(u'Serveur de mail injoignable')
raise ValueError('Serveur de mail injoignable')
if res:
raise ValueError("Le mail %s est déjà pris." % (str(self)))
@ -466,8 +470,8 @@ class mail(Attr):
raise ValueError("Le mail %s est déjà pris." % (str(self)))
def parse_value(self, mail):
if not re.match('^[-_.0-9A-Za-z]+@([A-Za-z0-9]{1}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("Adresse mail invalide (%s)" % mail)
if not re.match(u'^[-_.0-9A-Za-z]+@([A-Za-z0-9]{1}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("%s invalide %r" % (self.legend, mail))
self.value = mail
@ -482,9 +486,7 @@ class canonicalAlias(mail):
def parse_value(self, mail):
mail = u".".join([ a.capitalize() for a in mail.split(u'.', 1) ])
if not re.match('^[-_.0-9A-Za-z]+@([A-Za-z0-9]{1}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("Alias mail invalide (%s)" % mail)
self.value = mail
super(canonicalAlias, self).parse_value(mail)
@crans_attribute
class mailAlias(mail):
@ -498,9 +500,7 @@ class mailAlias(mail):
def parse_value(self, mail):
mail = mail.lower()
if not re.match('^[-_.0-9A-Za-z]+@([A-Za-z0-9]{2}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("Alias mail invalide (%r)" % mail)
self.value = mail
super(mailAlias, self).parse_value(mail)
@crans_attribute
class mailExt(mail):
@ -514,9 +514,7 @@ class mailExt(mail):
def parse_value(self, mail):
mail = mail.lower()
if not re.match('^[-_.0-9A-Za-z]+@([A-Za-z0-9]{2}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("Mail externe invalide (%r)" % mail)
self.value = mail
super(mailExt, self).parse_value(mail)
@crans_attribute
class mailInvalide(boolAttr):
@ -524,7 +522,7 @@ class mailInvalide(boolAttr):
legend = u"Mail invalide"
can_modify = [bureau, nounou]
ldap_name = "mailInvalide"
@crans_attribute
class contourneGreylist(boolAttr):
optionnal = True
@ -545,10 +543,6 @@ class etudes(Attr):
category = 'perso'
ldap_name = "etudes"
def parse_value(self, etudes):
# who cares
self.value = etudes
@crans_attribute
class chbre(Attr):
singlevalue = True
@ -564,21 +558,17 @@ class chbre(Attr):
if u'club' in [str(o) for o in self.parent['objectClass']]:
if chambre in annuaires_pg.locaux_clubs():
self.value = chambre
return
else:
raise ValueError("Club devrait etre en XclN, pas en %r" % chambre)
if chambre in (u"EXT", u"????"):
elif chambre in (u"EXT", u"????"):
self.value = chambre
else:
try:
annuaires_pg.chbre_prises(chambre[0], chambre[1:])
except NameError:
import annuaires_pg_test
annuaires_pg_test.chbre_prises(chambre[0], chambre[1:])
self.value = chambre
return
try:
annuaires_pg.chbre_prises(chambre[0], chambre[1:])
except NameError:
import annuaires_pg_test
annuaires_pg_test.chbre_prises(chambre[0], chambre[1:])
self.value = chambre
@crans_attribute
class droits(Attr):
@ -617,11 +607,15 @@ class solde(Attr):
# on évite les dépassements, sauf si on nous dit de ne pas vérifier
#if not (float(solde) >= config.impression.decouvert and float(solde) <= 1024.):
# raise ValueError("Solde invalide: %r" % solde)
self.value = solde
self.value = float(solde)
def __unicode__(self):
return u"%.2f" % self.value
class dnsAttr(Attr):
category = 'dns'
ldap_name = "dnsAttr"
def parse_value(self, val):
val = val.lower()
names = val.split('.')
@ -809,9 +803,6 @@ class positionBorne(Attr):
singlevalue = True
optional = True
ldap_name = "positionBorne"
def parse_value(self, pos):
self.value = unicode(pos)
@crans_attribute
class nvram(Attr):
@ -820,10 +811,6 @@ class nvram(Attr):
can_modify = [nounou]
ldap_name = "nvram"
def parse_value(self, nvr):
# XXX - on fait quoi ici ?
self.value = nvr
class portAttr(Attr):
singlevalue = False
optional = True
@ -861,7 +848,7 @@ class portAttr(Attr):
@crans_attribute
class portTCPout(portAttr):
legend = u'Port TCP ouvert vers l\'extérieur'
legend = u"Port TCP ouvert vers l'extérieur"
ldap_name = "portTCPout"
@crans_attribute
@ -902,10 +889,6 @@ class prise(Attr):
can_modify = [nounou]
ldap_name = "prise"
def parse_value(self, prise):
### Tu es Beau, je te fais confiance
self.value = prise
@crans_attribute
class cid(intAttr):
singlevalue = True
@ -1058,7 +1041,7 @@ class charteMA(Attr):
ldap_name = "charteMA"
def parse_value(self, charteSignee):
if charteSignee.upper() not in ["TRUE", "FALSE"]:
if charteSignee.upper() not in [u"TRUE", u"FALSE"]:
raise ValueError("La charte MA est soit TRUE ou FALSE, pas %r" % charteSignee)
self.value = charteSignee.upper()
@ -1071,9 +1054,9 @@ class homeDirectory(Attr):
ldap_name = "homeDirectory"
def parse_value(self, home):
uid = str(self.parent['uid'][0])
if uid.startswith('club-'):
uid = uid.split('-',1)[1]
uid = unicode(self.parent['uid'][0])
if uid.startswith(u'club-'):
uid = uid.split('-', 1)[1]
if home != u'/home/%s' % uid and home != u'/home/club/%s' % uid:
raise ValueError("Le répertoire personnel n'est pas bon: %r (devrait être %r ou %r)" % (home, '/home/%s' % self.parent['uid'][0], '/home/club/%s' % self.parent['uid'][0]))
self.value = home
@ -1089,30 +1072,29 @@ class loginShell(Attr):
def parse_value(self, shell):
#with open('/etc/shells') as f:
# shells = [ l.strip() for l in f.readlines() if not l.startswith('#') ]
shells = ['/bin/csh',
'/bin/sh',
'/usr/bin/es',
'/usr/bin/ksh',
'/bin/ksh',
'/usr/bin/rc',
'/usr/bin/tcsh',
'/bin/tcsh',
'/usr/bin/esh',
'/bin/bash',
'/bin/rbash',
'/bin/zsh',
'/usr/bin/zsh',
'/usr/bin/screen',
'/bin/dash',
'/usr/bin/rssh',
'/usr/local/bin/disconnect_shell',
'/usr/scripts/surveillance/disconnect_shell',
'/usr/local/bin/badPassSh',
'/usr/bin/passwd',
'/bin/false',
'/bin//zsh',
'/usr/sbin/nologin'
'']
shells = [u'/bin/csh',
u'/bin/sh',
u'/usr/bin/es',
u'/usr/bin/ksh',
u'/bin/ksh',
u'/usr/bin/rc',
u'/usr/bin/tcsh',
u'/bin/tcsh',
u'/usr/bin/esh',
u'/bin/bash',
u'/bin/rbash',
u'/bin/zsh',
u'/usr/bin/zsh',
u'/usr/bin/screen',
u'/bin/dash',
u'/usr/bin/rssh',
u'/usr/local/bin/disconnect_shell',
u'/usr/scripts/surveillance/disconnect_shell',
u'/usr/local/bin/badPassSh',
u'/usr/bin/passwd',
u'/bin/false',
u'/usr/sbin/nologin'
u'']
if shell not in shells:
raise ValueError("Shell %r invalide" % shell)
self.value = shell
@ -1141,9 +1123,6 @@ class gecos(Attr):
legend = "Le gecos"
category = 'id'
ldap_name = "gecos"
def parse_value(self, gecos):
self.value = gecos
@crans_attribute
class sshFingerprint(Attr):
@ -1197,7 +1176,7 @@ class controle(Attr):
def parse_value(self, ctrl):
if ctrl not in [u"", u"c", u"p", u"cp", u"pc"]:
raise ValueError("control peut prendre les valeurs [c][p]")
raise ValueError("Contrôle peut prendre les valeurs [c][p]")
self.value = ctrl
@crans_attribute