[ldap_crans] revert...

darcs-hash:20100904135012-ffbb2-55f54088578faae5eb741cdce9d627d843e3666b.gz
This commit is contained in:
Nicolas Dandrimont 2010-09-04 15:50:12 +02:00
parent b19d9cc71b
commit 36bb207274

View file

@ -38,7 +38,7 @@ cur_user = os.getenv('SUDO_USER') or pwd.getpwuid(os.getuid())[0]
if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test': if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test':
if hostname != "vo": if hostname != "vo":
raise ImportError(coul("La base de test n'est accessible que depuis vo !", "rouge")) raise ImportError, coul("La base de test n'est accessible que depuis vo !", "rouge")
# Utilisation de la base de données de test (tests, séminaire...) # Utilisation de la base de données de test (tests, séminaire...)
# Il faut au choix : # Il faut au choix :
# - faire un import crans_ldap_test # - faire un import crans_ldap_test
@ -158,7 +158,7 @@ def mailexist(mail):
r = s.getreply()[0] in [250, 252] r = s.getreply()[0] in [250, 252]
s.close() s.close()
except: except:
raise ValueError('Serveur de mail injoignable') raise ValueError(u'Serveur de mail injoignable')
return r return r
@ -218,12 +218,12 @@ def format_mac(mac):
map(lambda x: "%02s" % x, mac.split(":")))) map(lambda x: "%02s" % x, mac.split(":"))))
mac = mac.replace(':', '').lower() mac = mac.replace(':', '').lower()
if len(mac) != 12: if len(mac) != 12:
raise ValueError("Longueur de l'adresse mac incorrecte.") raise ValueError(u"Longueur de l'adresse mac incorrecte.")
for c in mac[:]: for c in mac[:]:
if c not in string.hexdigits: if c not in string.hexdigits:
raise ValueError("Caractère interdit '%s' dans l'adresse mac." % c) raise ValueError(u"Caractère interdit '%s' dans l'adresse mac." % c)
if mac == '000000000000': if mac == '000000000000':
raise ValueError("MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.") raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.")
# Formatage # Formatage
mac = "%s:%s:%s:%s:%s:%s" % (mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:]) mac = "%s:%s:%s:%s:%s:%s" % (mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:])
@ -247,16 +247,16 @@ def validate_mail(mail, crans_allowed=False):
if mail.count('@') != 1 \ if mail.count('@') != 1 \
or not ( l-b >= 2 and l-b <= 4) \ or not ( l-b >= 2 and l-b <= 4) \
or a < 1 or b-a < 2: or a < 1 or b-a < 2:
raise ValueError("Adresse mail incorrecte.") raise ValueError(u"Adresse mail incorrecte.")
# Pas de caractèrs bizarres # Pas de caractèrs bizarres
for l in mail[:]: for l in mail[:]:
if not l in (string.lowercase + string.digits + '-_.@'): if not l in (string.lowercase + string.digits + '-_.@'):
raise ValueError("Caractère interdit dans l'adresse mail (%s)." % l) raise ValueError(u"Caractère interdit dans l'adresse mail (%s)." % l)
# Pour les vicieux # Pour les vicieux
if not crans_allowed and mail.endswith(('crans.org','crans.ens-cachan.fr')): if not crans_allowed and mail.endswith(('crans.org','crans.ens-cachan.fr')):
raise ValueError("Adresse mail @crans interdite ici !") raise ValueError(u"Adresse mail @crans interdite ici !")
# On enlève les blacklistes mail_invalide # On enlève les blacklistes mail_invalide
return mail return mail
@ -480,7 +480,7 @@ class CransLdap:
# Il ne tourne plus # Il ne tourne plus
self.remove_lock(res[0]) # delock self.remove_lock(res[0]) # delock
return self.lock(item, valeur) # relock return self.lock(item, valeur) # relock
raise EnvironmentError('Objet (%s=%s) locké, patienter.' % (item, valeur), l) raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l)
else: else:
if not hasattr(self, '_locks'): if not hasattr(self, '_locks'):
self._locks = [lock_dn] self._locks = [lock_dn]
@ -635,7 +635,7 @@ class CransLdap:
# On crée l'objet # On crée l'objet
return classe(entry, mode, self.conn) return classe(entry, mode, self.conn)
except: except:
raise ValueError("Impossible de créer l'objet %s" % nom_classe) raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
def search(self, expression, mode=''): def search(self, expression, mode=''):
@ -658,7 +658,7 @@ class CransLdap:
elif type(expression) == unicode: elif type(expression) == unicode:
expression = expression.encode('utf-8') expression = expression.encode('utf-8')
else: else:
raise TypeError('Chaîne attendue') raise TypeError(u'Chaîne attendue')
if not expression: if not expression:
return [] return []
@ -745,7 +745,7 @@ class CransLdap:
champ = champ[:-1] champ = champ[:-1]
neg = True neg = True
except: except:
raise ValueError('Syntaxe de recherche invalide (%s)' % cond) raise ValueError(u'Syntaxe de recherche invalide (%s)' % cond)
# Transformation de certains champs # Transformation de certains champs
champ = self.trans.get(champ, champ) champ = self.trans.get(champ, champ)
@ -770,7 +770,7 @@ class CransLdap:
filtre_seul[i] = True filtre_seul[i] = True
if not ok: if not ok:
raise ValueError('Champ de recherche inconnu (%s)' % champ) raise ValueError(u'Champ de recherche inconnu (%s)' % champ)
## Recherche avec chacun des filtres ## Recherche avec chacun des filtres
r = {} # contiendra les réponses par filtre r = {} # contiendra les réponses par filtre
@ -1017,7 +1017,7 @@ class BaseClasseCrans(CransLdap):
debut = new[0] = int(time.time()) debut = new[0] = int(time.time())
else: else:
try: debut = new[0] = int(new[0]) try: debut = new[0] = int(new[0])
except: raise ValueError('Date de début blacklist invalide') except: raise ValueError(u'Date de début blacklist invalide')
if new[1] == 'now': if new[1] == 'now':
fin = new[1] = int(time.time()) fin = new[1] = int(time.time())
@ -1025,12 +1025,12 @@ class BaseClasseCrans(CransLdap):
fin = -1 fin = -1
else: else:
try: fin = new[1] = int(new[1]) try: fin = new[1] = int(new[1])
except: raise ValueError('Date de fin blacklist invalide') except: raise ValueError(u'Date de fin blacklist invalide')
if debut == fin: if debut == fin:
raise ValueError('Dates de début et de fin identiques') raise ValueError(u'Dates de début et de fin identiques')
elif fin != -1 and debut > fin: elif fin != -1 and debut > fin:
raise ValueError('Date de fin avant date de début') raise ValueError(u'Date de fin avant date de début')
# On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée. # On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée.
fin = fin + 60 fin = fin + 60
@ -1270,13 +1270,13 @@ class BaseClasseCrans(CransLdap):
else: else:
### Modification entrée ### Modification entrée
if not self._modifiable: if not self._modifiable:
raise RuntimeError('Objet non modifiable : %s' % str(self)) raise RuntimeError(u'Objet non modifiable : %s' % str(self))
modlist = ldap.modlist.modifyModlist(self._init_data, self._data) modlist = ldap.modlist.modifyModlist(self._init_data, self._data)
try: try:
self.conn.modify_s(self.dn, modlist) self.conn.modify_s(self.dn, modlist)
except ldap.TYPE_OR_VALUE_EXISTS, c: except ldap.TYPE_OR_VALUE_EXISTS, c:
champ = c.args[0]['info'].split(':')[0] champ = c.args[0]['info'].split(':')[0]
raise RuntimeError('Entrée en double dans le champ %s' % champ) raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
# l'ip change, le mid aussi... # l'ip change, le mid aussi...
if 'ipHostNumber' in self.modifs: if 'ipHostNumber' in self.modifs:
@ -1443,14 +1443,14 @@ class BaseProprietaire(BaseClasseCrans):
l, new = preattr(new) l, new = preattr(new)
new = new.lower() new = new.lower()
if l < 2: if l < 2:
raise ValueError("Alias trop court.") raise ValueError(u"Alias trop court.")
for c in new[:]: for c in new[:]:
if not c in (string.letters + string.digits + '-_.'): if not c in (string.letters + string.digits + '-_.'):
raise ValueError("Alias : seuls les caractères alphanumériques, le -, le _ et le . sont autorisés." ) raise ValueError(u"Alias : seuls les caractères alphanumériques, le -, le _ et le . sont autorisés." )
if new[0] not in string.letters: if new[0] not in string.letters:
raise ValueError("Le premier caractère de l'alias doit être alphabétique.") raise ValueError(u"Le premier caractère de l'alias doit être alphabétique.")
if mailexist(new): if mailexist(new):
raise ValueError("Alias existant ou correspondand à un compte.") raise ValueError(u"Alias existant ou correspondand à un compte.")
if index != -1: if index != -1:
liste[index] = new liste[index] = new
@ -1570,11 +1570,11 @@ class BaseProprietaire(BaseClasseCrans):
try: try:
new = solde + float(str(operation).replace(',', '.')) new = solde + float(str(operation).replace(',', '.'))
except ValueError: except ValueError:
raise ValueError("Il faut donner un nombre en argument.") raise ValueError(u"Il faut donner un nombre en argument.")
# découvert accepté # découvert accepté
if new < config.impression.decouvert: if new < config.impression.decouvert:
raise ValueError("Solde minimal atteint, opération non effectuée.") raise ValueError(u"Solde minimal atteint, opération non effectuée.")
self._set('solde', [str(new)], comment) self._set('solde', [str(new)], comment)
return new return new
@ -1632,7 +1632,7 @@ class BaseProprietaire(BaseClasseCrans):
# si l'adhérent n'a pas de compte, on lève une exception # si l'adhérent n'a pas de compte, on lève une exception
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
# tente de modifier la valeur # tente de modifier la valeur
if contourneGreylist == True: if contourneGreylist == True:
@ -1640,7 +1640,7 @@ class BaseProprietaire(BaseClasseCrans):
elif contourneGreylist == False: elif contourneGreylist == False:
self._set('contourneGreylist', []) self._set('contourneGreylist', [])
elif contourneGreylist != None: elif contourneGreylist != None:
raise ValueError("contourneGreylist prend un booléen comme argument") raise ValueError, u"contourneGreylist prend un booléen comme argument"
# renvoie la valeur trouvée dans la base # renvoie la valeur trouvée dans la base
return bool(self._data.get('contourneGreylist', [])) return bool(self._data.get('contourneGreylist', []))
@ -1651,7 +1651,7 @@ class BaseProprietaire(BaseClasseCrans):
ou False si le mot de passe n'est pas bon. ou False si le mot de passe n'est pas bon.
""" """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
return ldap_passwd.checkpwd(passwd, self._data['userPassword'][0]) return ldap_passwd.checkpwd(passwd, self._data['userPassword'][0])
def changePasswd(self, passwd): def changePasswd(self, passwd):
@ -1659,7 +1659,7 @@ class BaseProprietaire(BaseClasseCrans):
Modifie le mot de passe de l'adhérent Modifie le mot de passe de l'adhérent
""" """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
self._set('userPassword', [ldap_passwd.mkpasswd(passwd)]) self._set('userPassword', [ldap_passwd.mkpasswd(passwd)])
def forward(self, new = None): def forward(self, new = None):
@ -1669,7 +1669,7 @@ class BaseProprietaire(BaseClasseCrans):
sinon cette metode ne fonctionnera pas sinon cette metode ne fonctionnera pas
""" """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
return config_mail.MailConfig(uid=self._data['uid'][0], forward = new)['forward'] return config_mail.MailConfig(uid=self._data['uid'][0], forward = new)['forward']
def spam(self, new = None): def spam(self, new = None):
@ -1680,20 +1680,20 @@ class BaseProprietaire(BaseClasseCrans):
sinon cette metode ne fonctionnera pas sinon cette metode ne fonctionnera pas
""" """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
return config_mail.MailConfig(uid=self._data['uid'][0], spam = new)['spam'] return config_mail.MailConfig(uid=self._data['uid'][0], spam = new)['spam']
def home(self): def home(self):
""" Retourne le home de l'adhérent """ """ Retourne le home de l'adhérent """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent na pas de compte"
return self._data['homeDirectory'][0] return self._data['homeDirectory'][0]
def uidNumber(self, new=None): def uidNumber(self, new=None):
""" Retourne ou change l'uidNumber de l'adhérent """ """ Retourne ou change l'uidNumber de l'adhérent """
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent na pas de compte") raise NotImplementedError, u"L'adhérent na pas de compte"
if new == None: if new == None:
return self._data['uidNumber'][0] return self._data['uidNumber'][0]
else: else:
@ -1944,11 +1944,11 @@ class Adherent(BaseProprietaire):
new = new.capitalize() new = new.capitalize()
for c in strip_accents(new[:]): for c in strip_accents(new[:]):
if c not in (string.letters + '- '): if c not in (string.letters + '- '):
raise ValueError("Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ) raise ValueError(u"Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ)
if l<2: if l<2:
raise ValueError("%s trop court." % champ) raise ValueError(u"%s trop court." % champ)
if new[0] not in string.letters: if new[0] not in string.letters:
raise ValueError("Le premier caractère du %s doit être une lettre" % champ) raise ValueError(u"Le premier caractère du %s doit être une lettre" % champ)
self._set(champ, [new]) self._set(champ, [new])
if self._data.has_key('gecos'): if self._data.has_key('gecos'):
@ -1963,7 +1963,7 @@ class Adherent(BaseProprietaire):
if new != 'inconnu': if new != 'inconnu':
l, new = preattr(new) l, new = preattr(new)
if not new.isdigit() or l < 6 or l > 15: if not new.isdigit() or l < 6 or l > 15:
raise ValueError("Numéro de téléphone incorrect (il doit comporter uniquement des chiffres).") raise ValueError(u"Numéro de téléphone incorrect (il doit comporter uniquement des chiffres).")
self._set('tel', [new]) self._set('tel', [new])
return new return new
@ -1977,14 +1977,14 @@ class Adherent(BaseProprietaire):
l, new = preattr(new) l, new = preattr(new)
if l == 0: if l == 0:
raise ValueError("Chambre incorrecte.") raise ValueError(u"Chambre incorrecte.")
if new.upper() == 'EXT': if new.upper() == 'EXT':
# N'est pas ou plus sur le campus # N'est pas ou plus sur le campus
# Machine fixe ? # Machine fixe ?
# for m in self.machines(): # for m in self.machines():
# if not isinstance(m, MachineWifi): # if not isinstance(m, MachineWifi):
# raise ValueError('Un adhérent en dehors du campus ne doit pas avoir de machine fixe.') # raise ValueError(u'Un adhérent en dehors du campus ne doit pas avoir de machine fixe.')
self._set('chbre', ['EXT']) self._set('chbre', ['EXT'])
return 'EXT' return 'EXT'
@ -2001,7 +2001,7 @@ class Adherent(BaseProprietaire):
chbres = annuaires.chbre_prises(bat).keys() chbres = annuaires.chbre_prises(bat).keys()
if new[1:] not in chbres or len(new)<4 or not new[1:4].isdigit(): if new[1:] not in chbres or len(new)<4 or not new[1:4].isdigit():
chbres.sort() chbres.sort()
aide = "Chambre inconnue dans le bâtiment, les chambres valides sont :" aide = u"Chambre inconnue dans le batiment, les chambres valides sont :"
a = 0 a = 0
for c in chbres: for c in chbres:
if len(c)>=3 and not c[:3].isdigit(): if len(c)>=3 and not c[:3].isdigit():
@ -2011,23 +2011,23 @@ class Adherent(BaseProprietaire):
if c[0] != 'X': if c[0] != 'X':
aide += c.ljust(5) aide += c.ljust(5)
a = a+1 a = a+1
aide += '\n' aide += u'\n'
raise ValueError(aide) raise ValueError(aide)
else: else:
raise ValueError('Bâtiment inconnu.') raise ValueError(u'Bâtiment inconnu.')
# La chambre est valide, est-elle déja occupée ? # La chambre est valide, est-elle déja occupée ?
test = self.exist('chbre=%s' % new) test = self.exist('chbre=%s' % new)
if test: if test:
search = test[0].split(',')[0] search = test[0].split(',')[0]
if search.split('=')[0] != 'aid': if search.split('=')[0] != 'aid':
raise ValueError('Chambre déjà occupée.') raise ValueError(u'Chambre déjà occupée.')
adh = self.search(search, self._modifiable)['adherent'] adh = self.search(search, self._modifiable)['adherent']
if len(adh) != 1: if len(adh) != 1:
raise ValueError('Chambre déjà occupée.') raise ValueError(u'Chambre déjà occupée.')
else: else:
raise ValueError('Chambre déjà occupée.', adh[0]) raise ValueError(u'Chambre déjà occupée.', adh[0])
# Lock de la chambre # Lock de la chambre
self.lock('chbre', new) self.lock('chbre', new)
@ -2056,7 +2056,7 @@ class Adherent(BaseProprietaire):
l_min = [ 2, 0, 5, 2 ] l_min = [ 2, 0, 5, 2 ]
for i in range(0, 4): for i in range(0, 4):
l, new[i] = preattr(new[i]) l, new[i] = preattr(new[i])
if l < l_min[i]: raise ValueError("Adresse incorrecte.") if l < l_min[i]: raise ValueError(u"Adresse incorrecte.")
# Correction si necessaire # Correction si necessaire
if not new[1]: if not new[1]:
@ -2141,7 +2141,7 @@ class Adherent(BaseProprietaire):
return False return False
else: else:
raise ValueError('mail_invalide ne peut prendre que None ou False en argument') raise ValueError, u'mail_invalide ne peut prendre que None ou False en argument'
def charteMA(self, valeur=None): def charteMA(self, valeur=None):
""" """
@ -2154,7 +2154,7 @@ class Adherent(BaseProprietaire):
elif valeur == False: elif valeur == False:
self._set('charteMA', []) self._set('charteMA', [])
elif valeur != None: elif valeur != None:
raise ValueError("charteMA prend un booléen comme argument") raise ValueError, u"charteMA prend un booléen comme argument"
# renvoie la valeur trouvée dans la base # renvoie la valeur trouvée dans la base
return bool(self._data.get('charteMA', [])) return bool(self._data.get('charteMA', []))
@ -2171,7 +2171,7 @@ class Adherent(BaseProprietaire):
set_to = ['FALSE'] set_to = ['FALSE']
self._set('adherentPayant', set_to) self._set('adherentPayant', set_to)
elif valeur is not None: elif valeur is not None:
raise ValueError("adherentPayant prend un booléen comme argument") raise ValueError, u"adherentPayant prend un booléen comme argument"
# bool d'une liste non vide est true, on inverse donc (la base ne peut contenir que FALSE) # bool d'une liste non vide est true, on inverse donc (la base ne peut contenir que FALSE)
return not bool(self._data.get('adherentPayant', [])) return not bool(self._data.get('adherentPayant', []))
@ -2210,13 +2210,13 @@ class Adherent(BaseProprietaire):
# Pas grand chose à faire à part vérifier que ce sont bien des chaines # Pas grand chose à faire à part vérifier que ce sont bien des chaines
if len(index_or_new) != 3: if len(index_or_new) != 3:
raise ValueError("Format études non valides.") raise ValueError(u"Format études non valides.")
new = ['', '', ''] new = ['', '', '']
for i in range(0, 3): for i in range(0, 3):
n = preattr(index_or_new[i])[1] n = preattr(index_or_new[i])[1]
if n in new or n == '': if n in new or n == '':
raise ValueError("Etudes non valides.") raise ValueError(u"Etudes non valides.")
new[i] = n new[i] = n
self._set('etudes', new) self._set('etudes', new)
@ -2263,34 +2263,34 @@ class Adherent(BaseProprietaire):
login = login.lower() login = login.lower()
if login and not self.adherentPayant(): if login and not self.adherentPayant():
raise ValueError("L'adhérent ne paie pas de cotisation, il n'a pas droit à un compte.") raise ValueError(u"L'adhérent ne paie pas de cotisation, il n'a pas droit à un compte.")
if 'posixAccount' in self._data['objectClass']: if 'posixAccount' in self._data['objectClass']:
if login != self._data['uid']: if login != self._data['uid']:
# A déja un compte # A déja un compte
raise ValueError("L'adhérent à déjà un compte. Login : %s" % self._data['uid'][0]) raise ValueError(u"L'adhérent à déjà un compte. Login : %s" % self._data['uid'][0])
else: else:
return login return login
for c in login[:]: for c in login[:]:
if not c in (string.letters + '-'): if not c in (string.letters + '-'):
raise ValueError("Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.") raise ValueError(u"Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.")
if l < 2: if l < 2:
raise ValueError("Login trop court.") raise ValueError(u"Login trop court.")
if l > config.maxlen_login: if l > config.maxlen_login:
raise ValueError("Login trop long.") raise ValueError(u"Login trop long.")
if login[0] == '-': if login[0] == '-':
raise ValueError("- interdit en première position.") raise ValueError(u"- interdit en première position.")
if mailexist(login): if mailexist(login):
raise ValueError("Login existant ou correspondant à un alias mail.", 1) raise ValueError(u"Login existant ou correspondant à un alias mail.", 1)
home = '/home/' + login home = '/home/' + login
if os.path.exists(home): if os.path.exists(home):
raise ValueError('Création du compte impossible : home existant', 1) raise ValueError(u'Création du compte impossible : home existant', 1)
if os.path.exists("/var/mail/" + login): if os.path.exists("/var/mail/" + login):
raise ValueError('Création du compte impossible : /var/mail/%s existant' % login, 1) raise ValueError(u'Création du compte impossible : /var/mail/%s existant' % login, 1)
# Lock du mail # Lock du mail
self.lock('mail', login) self.lock('mail', login)
@ -2317,7 +2317,7 @@ class Adherent(BaseProprietaire):
if uidNumber: if uidNumber:
if self.exist('(uidNumber=%s)' % uidNumber): if self.exist('(uidNumber=%s)' % uidNumber):
raise ValueError('uidNumber pris') raise ValueError(u'uidNumber pris')
else: else:
pool_uid = range(1001, 9999) pool_uid = range(1001, 9999)
random.shuffle(pool_uid) random.shuffle(pool_uid)
@ -2328,7 +2328,7 @@ class Adherent(BaseProprietaire):
pool_uid.append(uidNumber) pool_uid.append(uidNumber)
break break
if not len(pool_uid): if not len(pool_uid):
raise ValueError("Plus d'uid disponibles !") raise ValueError(u"Plus d'uid disponibles !")
try: try:
self.lock('uidNumber', str(uidNumber)) self.lock('uidNumber', str(uidNumber))
@ -2370,7 +2370,7 @@ class Adherent(BaseProprietaire):
light permet de modifier les droits non critiques sans être Nounou.""" light permet de modifier les droits non critiques sans être Nounou."""
if droits != None and 'cransAccount' not in self._data.get('objectClass', []): if droits != None and 'cransAccount' not in self._data.get('objectClass', []):
raise EnvironmentError('Il faut avoir un compte pour avoir des droits.') raise EnvironmentError(u'Il faut avoir un compte pour avoir des droits.')
if droits == None: if droits == None:
return map(decode, self._data.get('droits', [])) return map(decode, self._data.get('droits', []))
@ -2379,18 +2379,18 @@ class Adherent(BaseProprietaire):
if not light: if not light:
from user_tests import isadm from user_tests import isadm
if not isadm(): if not isadm():
raise EnvironmentError('Il faut être administrateur pour effectuer cette opération.') raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.')
# On vérifie la liste donnée # On vérifie la liste donnée
if type(droits) != list: if type(droits) != list:
raise TypeError('Une liste est attendue') raise TypeError(u'Une liste est attendue')
new = [] new = []
for droit in droits: for droit in droits:
droit = droit.strip() droit = droit.strip()
if droit == '': continue if droit == '': continue
if droit not in droits_possibles: if droit not in droits_possibles:
raise ValueError('Droit %s incorrect' % droit) raise ValueError(u'Droit %s incorrect' % droit)
new.append(droit) new.append(droit)
ancien = self._data.get('droits', []) ancien = self._data.get('droits', [])
@ -2435,7 +2435,7 @@ class Adherent(BaseProprietaire):
# si l'adhérent n'a pas de compte, on lève une exception # si l'adhérent n'a pas de compte, on lève une exception
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
# tente de modifier la valeur # tente de modifier la valeur
if rewrite == True: if rewrite == True:
@ -2443,7 +2443,7 @@ class Adherent(BaseProprietaire):
elif rewrite == False: elif rewrite == False:
self._set('rewriteMailHeaders', []) self._set('rewriteMailHeaders', [])
elif rewrite != None: elif rewrite != None:
raise ValueError("rewriteMailHeaders prend un booléen comme argument") raise ValueError, u"rewriteMailHeaders prend un booléen comme argument"
# renvoie la valeur trouvée dans la base # renvoie la valeur trouvée dans la base
return bool(self._data.get('rewriteMailHeaders', [])) return bool(self._data.get('rewriteMailHeaders', []))
@ -2457,7 +2457,7 @@ class Adherent(BaseProprietaire):
# si l'adhérent n'a pas de compte, on lève une exception # si l'adhérent n'a pas de compte, on lève une exception
if not self.compte(): if not self.compte():
raise NotImplementedError("L'adhérent n'a pas de compte") raise NotImplementedError, u"L'adhérent n'a pas de compte"
current = int(self._data.get('derniereConnexion', ['0'])[0]) current = int(self._data.get('derniereConnexion', ['0'])[0])
@ -2500,7 +2500,7 @@ class Club(BaseProprietaire):
l, new = preattr(new) l, new = preattr(new)
new = new.capitalize() new = new.capitalize()
if l<2: if l<2:
raise ValueError("Nom trop court.") raise ValueError(u"Nom trop court.")
self._set('nom', [new]) self._set('nom', [new])
return new return new
@ -2528,7 +2528,7 @@ class Club(BaseProprietaire):
raise ValueError raise ValueError
if not adher.id(): if not adher.id():
raise AttributeError('Adhérent invalide') raise AttributeError(u'Adhérent invalide')
self._set('responsable', [adher.id()]) self._set('responsable', [adher.id()])
return adher return adher
@ -2565,7 +2565,7 @@ class Club(BaseProprietaire):
annu = annuaires.locaux_clubs() annu = annuaires.locaux_clubs()
if new not in annu.keys(): if new not in annu.keys():
raise ValueError('Local invalide', annu) raise ValueError(u'Local invalide', annu)
self._set('chbre', [new]) self._set('chbre', [new])
return new return new
@ -2586,26 +2586,26 @@ class Club(BaseProprietaire):
if not login.startswith('club-'): if not login.startswith('club-'):
login = 'club-' + login login = 'club-' + login
if not re.match('^[a-z0-9]*[a-z]+[a-z0-9-]*$', login): if not re.match('^[a-z0-9]*[a-z]+[a-z0-9-]*$', login):
raise ValueError('Login incorrect') raise ValueError(u'Login incorrect')
login = preattr(login)[1] login = preattr(login)[1]
if 'posixAccount' in self._data['objectClass']: if 'posixAccount' in self._data['objectClass']:
if login != self._data['uid']: if login != self._data['uid']:
# A déja un compte # A déja un compte
raise ValueError("Le club à déjà un compte. Login : %s" % self._data['uid'][0]) raise ValueError(u"Le club à déjà un compte. Login : %s" % self._data['uid'][0])
else: else:
return login return login
if mailexist(login) and not os.system('/usr/sbin/list_lists | grep -qi %s' % login): if mailexist(login) and not os.system('/usr/sbin/list_lists | grep -qi %s' % login):
# la 2ème vérif est pour vérifier que ce n'est pas la ML du club # la 2ème vérif est pour vérifier que ce n'est pas la ML du club
raise ValueError("Login existant ou correspondant à un alias mail.", 1) raise ValueError(u"Login existant ou correspondant à un alias mail.", 1)
home = '/home/' + login.replace('-', '/', 1) home = '/home/' + login.replace('-', '/', 1)
if os.path.exists(home): if os.path.exists(home):
raise ValueError('Création du compte impossible : home existant', 1) raise ValueError(u'Création du compte impossible : home existant', 1)
if os.path.exists("/var/mail/"+login): if os.path.exists("/var/mail/"+login):
raise ValueError('Création du compte impossible : /var/mail/%s existant'%login, 1) raise ValueError(u'Création du compte impossible : /var/mail/%s existant'%login, 1)
# Lock du mail # Lock du mail
self.lock('mail', login) self.lock('mail', login)
@ -2699,13 +2699,13 @@ class Machine(BaseClasseCrans):
chbre = self.__proprietaire.chbre() chbre = self.__proprietaire.chbre()
# if chbre == 'EXT' and mode == 'fixe': # if chbre == 'EXT' and mode == 'fixe':
# raise ValueError('Il faut une chambre pour pouvoir posséder une machine fixe') # raise ValueError(u'Il faut une chambre pour pouvoir posséder une machine fixe')
if chbre == '????': if chbre == '????':
raise ValueError('ERREUR: la chambre du propriétaire est inconnue') raise ValueError(u'ERREUR: la chambre du propriétaire est inconnue')
else: else:
raise TypeError('Arguments invalides') raise TypeError(u'Arguments invalides')
def Nom(self): def Nom(self):
""" Retourne le nom de la machine """ """ Retourne le nom de la machine """
@ -2728,13 +2728,13 @@ class Machine(BaseClasseCrans):
# La mac serait-elle déjà connue ? # La mac serait-elle déjà connue ?
if not multi_ok and self.exist('macAddress=%s' % mac): if not multi_ok and self.exist('macAddress=%s' % mac):
raise ValueError('Mac déja utilisée sur le réseau.', 1) raise ValueError(u'Mac déja utilisée sur le réseau.', 1)
# La MAC serait-elle une MAC à la con ? # La MAC serait-elle une MAC à la con ?
if mac == "00:04:4b:80:80:03": if mac == "00:04:4b:80:80:03":
raise ValueError("Il s'agit de l'unique adresse MAC achetée par nVidia pour ses cartes réseau. Il faut changer cette adresse.", 2) raise ValueError(u"Il s'agit de l'unique adresse MAC achetée par nVidia pour ses cartes réseau. Il faut changer cette adresse.", 2)
elif mac[0:11] == "44:45:53:54": elif mac[0:11] == "44:45:53:54":
raise ValueError("Il s'agit de l'adresse MAC d'une interface PPP.", 2) raise ValueError(u"Il s'agit de l'adresse MAC d'une interface PPP.", 2)
# Le test final : vendeur connu # Le test final : vendeur connu
prefix = mac[:8].upper() + ' ' prefix = mac[:8].upper() + ' '
@ -2746,7 +2746,7 @@ class Machine(BaseClasseCrans):
break break
except IOError: except IOError:
# Le fichier existe pas, on sors # Le fichier existe pas, on sors
raise RuntimeError("Fichier de fabriquants de MAC non trouvé !") raise RuntimeError(u"Fichier de fabriquants de MAC non trouvé !")
if not multi_ok and not vendor: if not multi_ok and not vendor:
raise ValueError( raise ValueError(
@ -2770,33 +2770,33 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
l = len(new.split('.')[0]) l = len(new.split('.')[0])
if l<2: if l<2:
raise ValueError("%s trop court." % champ.capitalize()) raise ValueError(u"%s trop court." % champ.capitalize())
if self.proprietaire().__class__ != AssociationCrans: if self.proprietaire().__class__ != AssociationCrans:
new = new.split('.', 1)[0] new = new.split('.', 1)[0]
for c in new[:]: for c in new[:]:
if not c in (string.letters + string.digits + '-'): if not c in (string.letters + string.digits + '-'):
raise ValueError("Seuls les caractères alphabétiques minuscules et les - sont autorisés pour %s" % champ) raise ValueError(u"Seuls les caractères alphabétiques minuscules et les - sont autorisés pour %s" % champ)
if l > 17: if l > 17:
raise ValueError("%s trop long." % champ.capitalize()) raise ValueError(u"%s trop long." % champ.capitalize())
if not new[0].isalpha(): if not new[0].isalpha():
raise ValueError("Le premier caractère du champ %s doit être alphabétique" % champ) raise ValueError(u"Le premier caractère du champ %s doit être alphabétique" % champ)
if new.endswith('-'): if new.endswith('-'):
raise ValueError("Le dernier caractère du champ %s ne peut être un tiret" % champ) raise ValueError(u"Le dernier caractère du champ %s ne peut être un tiret" % champ)
# Ajout du domaine si necessaire # Ajout du domaine si necessaire
if new.find('.') == -1: if new.find('.') == -1:
try: try:
new += '.' + config.domains[self.objectClass] new += '.' + config.domains[self.objectClass]
except: except:
raise RuntimeError("%s : domaine non trouvé pour %s" % (champ.capitalize(), self.__class__)) raise RuntimeError(u"%s : domaine non trouvé pour %s" % (champ.capitalize(), self.__class__))
# Pas déja pris ? # Pas déja pris ?
if self.exist('(|(host=%s)(hostAlias=%s))' % (new, new)): if self.exist('(|(host=%s)(hostAlias=%s))' % (new, new)):
raise ValueError("%s : nom déjà pris" % champ.capitalize()) raise ValueError(u"%s : nom déjà pris" % champ.capitalize())
# Lock host # Lock host
self.lock('host', new) self.lock('host', new)
@ -2918,7 +2918,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
net = config.NETs[proprio_subnet] net = config.NETs[proprio_subnet]
pool_ip = lister_ip_dispo(proprio_subnet) pool_ip = lister_ip_dispo(proprio_subnet)
except: except:
raise RuntimeError('Impossible de trouver le réseau où placer la machine.') raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.')
else: else:
net = config.NETs["gratuit"] net = config.NETs["gratuit"]
pool_ip = lister_ip_dispo("gratuit") pool_ip = lister_ip_dispo("gratuit")
@ -2934,19 +2934,19 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
break break
if not len(pool_ip): if not len(pool_ip):
raise RuntimeError("Plus d'IP libres dans %s." % ' et '.join(net)) raise RuntimeError(u"Plus d'IP libres dans %s." % ' et '.join(net))
else: else:
# L'ip est elle dans le bon sous-réseau ? # L'ip est elle dans le bon sous-réseau ?
# (accessoirement teste si l'IP est valide et ne correspond pas # (accessoirement teste si l'IP est valide et ne correspond pas
# à l'adresse de broadcast ou de réseau) # à l'adresse de broadcast ou de réseau)
if not iptools.AddrInNet(ip, net): if not iptools.AddrInNet(ip, net):
raise ValueError('IP invalide ou en dehors du sous-réseau alloué.', 1) raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1)
# Reformatage # Reformatage
ip = iptools.DecToQuad(iptools.QuadToDec(ip)) ip = iptools.DecToQuad(iptools.QuadToDec(ip))
# L'ip est-elle déja allouée ? # L'ip est-elle déja allouée ?
if self.exist('ipHostNumber=%s' % ip): if self.exist('ipHostNumber=%s' % ip):
raise ValueError('IP déjà prise.') raise ValueError(u'IP déjà prise.')
# Lock ip # Lock ip
self.lock('ipHostNumber', ip) self.lock('ipHostNumber', ip)
@ -3015,7 +3015,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
""" """
from user_tests import isadm from user_tests import isadm
if self.proprietaire().__class__ == AssociationCrans and not (isadm() or user_tests.getuser() == 'www-data'): if self.proprietaire().__class__ == AssociationCrans and not (isadm() or user_tests.getuser() == 'www-data'):
raise EnvironmentError('Il faut être administrateur pour effectuer cette opération.') raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.')
ret = '' ret = ''
@ -3104,7 +3104,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
""" Destruction de la machine""" """ Destruction de la machine"""
from user_tests import isadm from user_tests import isadm
if self.proprietaire().__class__ == AssociationCrans and not isadm(): if self.proprietaire().__class__ == AssociationCrans and not isadm():
raise EnvironmentError('Il faut être administrateur pour effectuer cette opération.') raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.')
self.proprio = self.__proprietaire.Nom() # On met dans un coin le nom du proprio self.proprio = self.__proprietaire.Nom() # On met dans un coin le nom du proprio
@ -3157,7 +3157,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
assert(len(liste) == 1 or len(liste) == 2) assert(len(liste) == 1 or len(liste) == 2)
return map(lambda x: x and int(x) or '', liste) return map(lambda x: x and int(x) or '', liste)
except: except:
raise ValueError('Spécification de ports incorrecte : %s' % x) raise ValueError(u'Spécification de ports incorrecte : %s' % x)
ports = map(parse, ports) ports = map(parse, ports)
ports.sort() ports.sort()
@ -3217,7 +3217,7 @@ class MachineCrans(Machine):
try: try:
new = int(new) new = int(new)
except: except:
raise ValueError('Le nombre de prises doit être un entier') raise ValueError(u'Le nombre de prises doit être un entier')
vals = [24, 26, 28, 50, 52] vals = [24, 26, 28, 50, 52]
if new not in vals: if new not in vals:
@ -3310,7 +3310,7 @@ class BorneWifi(Machine):
raise raise
new = new + (1 << (c - 1)) new = new + (1 << (c - 1))
except: except:
raise ValueError('Canal invalide : doit être entre 0 et 13 ou une liste de canaux') raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux')
self._set('canal', [str(new)]) self._set('canal', [str(new)])
return new return new
@ -3324,7 +3324,7 @@ class BorneWifi(Machine):
new = int(new) new = int(new)
if new < -99 or new > 99: raise if new < -99 or new > 99: raise
except: except:
raise ValueError('Puissance invalide : doit être entre -99 et 99') raise ValueError(u'Puissance invalide : doit être entre -99 et 99')
self._set('puissance', [str(new)]) self._set('puissance', [str(new)])
return new return new
@ -3456,13 +3456,13 @@ class Facture(BaseClasseCrans):
self._modifiable = 'w' self._modifiable = 'w'
else: else:
raise TypeError('Arguments invalides') raise TypeError(u'Arguments invalides')
def numero(self): def numero(self):
""" Retourne le numéro de facture """ """ Retourne le numéro de facture """
fid = self._data.get('fid', [None])[0] fid = self._data.get('fid', [None])[0]
if fid == None: if fid == None:
raise NotImplementedError('Il faut enregistrer une facture pour connaitre son numero') raise NotImplementedError, u'Il faut enregistrer une facture pour connaitre son numero'
return fid return fid
def nom(self): def nom(self):
@ -3488,7 +3488,7 @@ class Facture(BaseClasseCrans):
elif 'club' in res[0][1]['objectClass']: elif 'club' in res[0][1]['objectClass']:
self.__proprietaire = Club(res[0], self._modifiable, self.conn) self.__proprietaire = Club(res[0], self._modifiable, self.conn)
else: else:
raise ValueError('Propriétaire inconnu') raise ValueError, u'Propriétaire inconnu'
return self.__proprietaire return self.__proprietaire
@ -3501,13 +3501,13 @@ class Facture(BaseClasseCrans):
# modification du mode de paiement # modification du mode de paiement
if new != None: if new != None:
if self.recuPaiement(): if self.recuPaiement():
raise ValueError('Facture déja payée') raise ValueError, u'Facture déja payée'
if not self._modifiable: if not self._modifiable:
raise NotImplementedError("La facture n'est pas modifiable") raise NotImplementedError, "La facture n'est pas modifiable"
if new not in ['liquide', 'cheque', 'paypal']: if new not in ['liquide', 'cheque', 'paypal']:
raise ValueError('Mode de paiement non accepté') raise ValueError, u'Mode de paiement non accepté'
self._set('modePaiement', [new]) self._set('modePaiement', [new])
@ -3520,13 +3520,13 @@ class Facture(BaseClasseCrans):
# on vérifie que la facture n'est pas déja payéee # on vérifie que la facture n'est pas déja payéee
if new and self._data.get('recuPaiement', []): if new and self._data.get('recuPaiement', []):
raise ValueError('Facture déja payée') raise ValueError, u'Facture déja payée'
# modification de la valeur # modification de la valeur
if new != None: if new != None:
# on vérifie que la facture est modifiable # on vérifie que la facture est modifiable
if not self._modifiable and new: if not self._modifiable and new:
raise NotImplementedError("La facture n'est pas modifiable") raise NotImplementedError, "La facture n'est pas modifiable"
# on crédite les articles, si c'est pas possible, la metode # on crédite les articles, si c'est pas possible, la metode
# levera une exeption # levera une exeption
@ -3556,7 +3556,7 @@ class Facture(BaseClasseCrans):
# on vérifie que le propriétaire est modifiable # on vérifie que le propriétaire est modifiable
if not self.proprietaire()._modifiable: if not self.proprietaire()._modifiable:
raise SystemError("Impossible de créditer les articles, le proprietaire n'est pas modifiable") raise SystemError, u"Impossible de créditer les articles, le proprietaire n'est pas modifiable"
# on crédite les articles # on crédite les articles
for art in self._articles(): for art in self._articles():
@ -3622,7 +3622,7 @@ class Facture(BaseClasseCrans):
""" """
# on ne eut pas modifier une facture payée # on ne eut pas modifier une facture payée
if self.recuPaiement(): if self.recuPaiement():
raise ValueError('On ne peut pas modifier une facture payée') raise ValueError, u'On ne peut pas modifier une facture payée'
# charge la liste des articles # charge la liste des articles
arts = self._articles() arts = self._articles()
@ -3633,12 +3633,12 @@ class Facture(BaseClasseCrans):
if type(ajoute)==list: if type(ajoute)==list:
for art in ajoute: for art in ajoute:
if int(art['nombre']) != float(art['nombre']): if int(art['nombre']) != float(art['nombre']):
raise ValueError('nombre doit être un entier') raise ValueError, u'nombre doit être un entier'
if float(int(art['pu']*100)/100.0) != art['pu']: if float(int(art['pu']*100)/100.0) != art['pu']:
raise ValueError('pu ne doit pas avoir plus de 2 chiffres apres la virgule') raise ValueError, u'pu ne doit pas avoir plus de 2 chiffres apres la virgule'
art['nombre'] = int(art['nombre']) art['nombre'] = int(art['nombre'])
if '~~' in ' '.join([str(x) for x in art.values()]): if '~~' in ' '.join([str(x) for x in art.values()]):
raise ValueError('Ne pas mettre de ~~ dans les champs') raise ValueError, u'Ne pas mettre de ~~ dans les champs'
arts.append(art) arts.append(art)
# enregistre la nouvelle liste # enregistre la nouvelle liste
@ -3650,7 +3650,7 @@ class Facture(BaseClasseCrans):
""" """
# on ne eut pas modifier une facture payée # on ne eut pas modifier une facture payée
if self.recuPaiement(): if self.recuPaiement():
raise ValueError('On ne peut pas modifier une facture payée') raise ValueError, u'On ne peut pas modifier une facture payée'
# charge la liste des articles # charge la liste des articles
arts = self._articles() arts = self._articles()