[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:
parent
b2abbef3b4
commit
60ded9f830
7 changed files with 244 additions and 237 deletions
147
attributs.py
147
attributs.py
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue