[lc_ldap] On vire le from attributs import *, on corrige une faute de phrapp, et on vire les [xomu]fields, qu'on remplace par une variable attribs.

This commit is contained in:
Pierre-Elliott Bécue 2013-03-04 05:51:43 +01:00
parent 0d0d9d9676
commit ecdfbd8962

View file

@ -58,7 +58,7 @@ sys.path.append('/usr/scripts/gestion')
import config import config
import crans_utils import crans_utils
from attributs import * import attributs
from ldap_locks import CransLock from ldap_locks import CransLock
uri = 'ldap://ldap.adm.crans.org/' uri = 'ldap://ldap.adm.crans.org/'
@ -109,7 +109,7 @@ def ldif_to_cldif(ldif, conn, check_ctxt = True):
""" """
cldif = {} cldif = {}
for attr, vals in ldif.items(): for attr, vals in ldif.items():
cldif[attr] = [ attrify(val, attr, ldif, conn, check_ctxt) for val in vals] cldif[attr] = [ attributs.attrify(val, attr, ldif, conn, check_ctxt) for val in vals]
return cldif return cldif
def cldif_to_ldif(cldif): def cldif_to_ldif(cldif):
@ -153,7 +153,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
self.dn = dn self.dn = dn
self.droits = self.search_s(dn, ldap.SCOPE_BASE, attrlist=['droits'])[0][1].get('droits', []) self.droits = self.search_s(dn, ldap.SCOPE_BASE, attrlist=['droits'])[0][1].get('droits', [])
if dn == admin_dn: if dn == admin_dn:
self.droits += [nounou] self.droits += [attributs.nounou]
else: else:
self.conn = self.simple_bind_s() self.conn = self.simple_bind_s()
self.dn = None self.dn = None
@ -209,7 +209,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
for m in mlist: for m in mlist:
m._proprio = parent[dn] m._proprio = parent[dn]
allmachines.append(m) allmachines.append(m)
return allmachines,parent.values() # on renvoie la liste des machines et des adherents (dont club et crans) return allmachines, parent.values() # on renvoie la liste des machines et des adherents (dont club et crans)
def allMachines(self): def allMachines(self):
"""Renvoie la liste de toutes les machines, Conçue pour """Renvoie la liste de toutes les machines, Conçue pour
@ -321,7 +321,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
continue continue
else: else:
# On crée l'attribut associé, pour parser sa valeur. # On crée l'attribut associé, pour parser sa valeur.
my_id = attrify(unicode(i), attr, {}, self, False) my_id = attributs.attrify(unicode(i), attr, {}, self, False)
if my_id.value != i: if my_id.value != i:
continue continue
else: else:
@ -340,20 +340,20 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
""" """
if obj.dn.endswith(self.dn) and obj.dn != self.dn: if obj.dn.endswith(self.dn) and obj.dn != self.dn:
return [parent] return [attributs.parent]
else: else:
return [] return []
def _is_self(obj1, obj2): def _is_self(self, obj):
""" """
Teste si l'objet qui se binde est celui qui est en cours de modif. Teste si l'objet qui se binde est celui qui est en cours de modif.
Retourne une liste qui s'ajoutera à la liste des droits Retourne une liste qui s'ajoutera à la liste des droits
""" """
if obj.dn == self.dn: if obj.dn == self.dn:
return [soi] return [attributs.soi]
else: else:
return [] return []
@ -427,22 +427,12 @@ class CransLdapObject(object):
Cette classe ne devrait pas être utilisée directement.""" Cette classe ne devrait pas être utilisée directement."""
""" Qui peut faire quoi ? """ """ Qui peut faire quoi ? """
can_be_by = { created: [nounou], can_be_by = { created: [attributs.nounou],
modified: [nounou], modified: [attributs.nounou],
deleted: [nounou], deleted: [attributs.nounou],
} }
""" Champs uniques et nécessaires """ attribs = []
ufields = []
""" Champs uniques facultatifs """
ofields = []
""" Champs multivalués facultatifs """
mfields = []
""" Champs obligatoires multivalué """
xfields = []
def __init__(self, conn, dn, mode='ro', ldif = None): def __init__(self, conn, dn, mode='ro', ldif = None):
''' '''
@ -508,7 +498,7 @@ class CransLdapObject(object):
def _get_fields(self): def _get_fields(self):
"""Renvoie la liste des champs LDAP de l'objet""" """Renvoie la liste des champs LDAP de l'objet"""
return self.ofields + self.xfields + self.ufields + self.mfields return self.attribs
fields = property(_get_fields) fields = property(_get_fields)
def history_add(self, login, chain): def history_add(self, login, chain):
@ -596,17 +586,16 @@ class CransLdapObject(object):
return [] return []
raise KeyError(attr) raise KeyError(attr)
def has_key(self,attr): def has_key(self, attr):
"""Est-ce que notre objet a l'attribut en question ?""" """Est-ce que notre objet a l'attribut en question ?"""
return attr in self.ofields or attr in self.xfields or\ return attr in [attrib.__class__.__name__ for attrib in self.attributs]
attr in self.ufields or attr in self.mfields
def __setitem__(self, attr, values): def __setitem__(self, attr, values):
if self.mode not in ['w', 'rw']: if self.mode not in ['w', 'rw']:
raise ValueError("Objet en lecture seule") raise ValueError("Objet en lecture seule")
if not isinstance(values, list): if not isinstance(values, list):
values = [ values ] values = [ values ]
self._modifs[attr] = [ attrify(val, attr, self._modifs, self.conn) for val in values ] self._modifs[attr] = [ attributs.attrify(val, attr, self._modifs, self.conn) for val in values ]
def search_historique(self, ign_fields=HIST_IGNORE_FIELDS): def search_historique(self, ign_fields=HIST_IGNORE_FIELDS):
u"""Récupère l'historique u"""Récupère l'historique
@ -657,10 +646,10 @@ class CransLdapObject(object):
# blacklistes virtuelle si on est un adhérent pour carte étudiant et chambre invalides # blacklistes virtuelle si on est un adhérent pour carte étudiant et chambre invalides
if self.__class__.__name__ == "adherent" and self.paiement_ok(): if self.__class__.__name__ == "adherent" and self.paiement_ok():
if not config.periode_transitoire and config.bl_carte_et_actif and not self.carte_ok() and not self.sursis_carte(): if not config.periode_transitoire and config.bl_carte_et_actif and not self.carte_ok() and not self.sursis_carte():
bl = blacklist(u'%s$%s$%s$%s' % ('-', '-', 'carte_etudiant', ''), {}, self.conn, False) bl = attributs.blacklist(u'%s$%s$%s$%s' % ('-', '-', 'carte_etudiant', ''), {}, self.conn, False)
blacklist_liste.append(bl) blacklist_liste.append(bl)
if self['chbre'][0].value == '????': if self['chbre'][0].value == '????':
bl = blacklist(u'%s$%s$%s$%s' % ('-', '-', 'chambre_invalide', ''), {}, self.conn, False) bl = attributs.blacklist(u'%s$%s$%s$%s' % ('-', '-', 'chambre_invalide', ''), {}, self.conn, False)
blacklist_liste.append(bl) blacklist_liste.append(bl)
attrs = (self.attrs if self.mode not in ["w", "rw"] else self._modifs) attrs = (self.attrs if self.mode not in ["w", "rw"] else self._modifs)
blacklist_liste.extend(filter((lambda bl: bl.is_actif()), attrs.get("blacklist",[]))) blacklist_liste.extend(filter((lambda bl: bl.is_actif()), attrs.get("blacklist",[])))
@ -679,22 +668,19 @@ class CransLdapObject(object):
debut = int(time.time()) debut = int(time.time())
if fin == 'now': if fin == 'now':
fin = int(time.time()) fin = int(time.time())
bl = blacklist(u'%s$%s$%s$%s' % (debut, fin, sanction, commentaire), {}, self.conn, False) bl = attributs.blacklist(u'%s$%s$%s$%s' % (debut, fin, sanction, commentaire), {}, self.conn, False)
self._modifs.setdefault('blacklist', []).append(bl) self._modifs.setdefault('blacklist', []).append(bl)
class proprio(CransLdapObject): class proprio(CransLdapObject):
u""" Un propriétaire de machine (adhérent, club…) """ u""" Un propriétaire de machine (adhérent, club…) """
can_be_by = { created: [nounou, bureau, cableur], can_be_by = { created: [attributs.nounou, attributs.bureau, attributs.cableur],
modified: [nounou, bureau, soi, cableur], modified: [attributs.nounou, attributs.bureau, attributs.soi, attributs.cableur],
deleted: [nounou, bureau], deleted: [attributs.nounou, attributs.bureau],
} }
ufields = [ 'nom', 'chbre' ] attribs = [attributs.nom, attributs.chbre, attributs.paiement, attributs.info, attributs.blacklist, attributs.controle]
mfields = [ 'paiement', 'info', 'blacklist', 'controle']
ofields = []
xfields = []
def __init__(self, conn, dn, mode='ro', ldif = None, machines=[]): def __init__(self, conn, dn, mode='ro', ldif = None, machines=[]):
super(proprio, self).__init__(conn, dn, mode, ldif) super(proprio, self).__init__(conn, dn, mode, ldif)
@ -780,16 +766,16 @@ class proprio(CransLdapObject):
class machine(CransLdapObject): class machine(CransLdapObject):
u""" Une machine """ u""" Une machine """
can_be_by = { created: [nounou, bureau, cableur, parent], can_be_by = { created: [attributs.nounou, attributs.bureau, attributs.cableur, attributs.parent],
modified: [nounou, bureau, cableur, parent], modified: [attributs.nounou, attributs.bureau, attributs.cableur, attributs.parent],
deleted: [nounou, bureau, cableur, parent], deleted: [attributs.nounou, attributs.bureau, attributs.cableur, attributs.parent],
} }
ufields = ['mid', 'macAddress', 'host', 'midType'] attribs = [attributs.mid, attributs.macAddress, attributs.host, attributs.midType,
ofields = ['rid'] attributs.rid, attributs.info, attributs.blacklist, attributs.hostAlias,
mfields = ['info', 'blacklist', 'hostAlias', 'exempt', attributs.exempt, attributs.portTCPout, attributs.portTCPin,
'portTCPout', 'portTCPin', 'portUDPout', 'portUDPin','sshFingerprint', 'ipHostNumber', 'ip6HostNumber'] attributs.portUDPout, attributs.portUDPin, attributs.sshFingerprint,
xfields = [] attributs.ipHostNumber, attributs.ip6HostNumber]
def __init__(self, conn, dn, mode='ro', ldif = None): def __init__(self, conn, dn, mode='ro', ldif = None):
super(machine, self).__init__(conn, dn, mode, ldif) super(machine, self).__init__(conn, dn, mode, ldif)
@ -819,17 +805,15 @@ class AssociationCrans(proprio):
class adherent(proprio): class adherent(proprio):
u"""Adhérent crans.""" u"""Adhérent crans."""
ufields = proprio.ufields + ['aid', 'prenom', 'tel', 'mail', 'mailInvalide', 'uid'] attribs = proprio.attribs + [attributs.aid, attributs.prenom, attributs.tel,
ofields = proprio.ofields + ['charteMA', attributs.mail, attributs.mailInvalide, attributs.uid,
'canonicalAlias', 'solde', 'contourneGreylist', attributs.charteMA, attributs.canonicalAlias, attributs.solde,
'rewriteMailHeaders', 'derniereConnexion', attributs.contourneGreylist, attributs.derniereConnexion,
'homepageAlias','gpgFingerprint', attributs.homepageAlias, attributs.gpgFingerprint,
'compteWiki', attributs.carteEtudiant, attributs.mailAlias,
] attributs.droits, attributs.etudes, attributs.postalAddress]
mfields = proprio.mfields + ['carteEtudiant', 'mailAlias', 'droits' ]
xfields = ['etudes', 'postalAddress']
def compte(self,login = None, uidNumber=0, hash_pass = '', shell=config.login_shell): def compte(self, login = None, uidNumber=0, hash_pass = '', shell=config.login_shell):
u"""Renvoie le nom du compte crans. S'il n'existe pas, et que uid u"""Renvoie le nom du compte crans. S'il n'existe pas, et que uid
est précisé, le crée.""" est précisé, le crée."""
@ -898,8 +882,7 @@ class adherent(proprio):
class club(proprio): class club(proprio):
u"""Club crans""" u"""Club crans"""
ufields = ['cid', 'responsable'] attribs = proprio.attribs + [attributs.cid, attributs.responsable, attributs.imprimeurClub]
mfields = ['imprimeurClub']
class machineFixe(machine): class machineFixe(machine):
u"""Machine fixe""" u"""Machine fixe"""
@ -907,35 +890,31 @@ class machineFixe(machine):
class machineWifi(machine): class machineWifi(machine):
u"""Machine wifi""" u"""Machine wifi"""
ufields = machine.ufields + ['ipsec'] attribs = machine.attribs + [attributs.ipsec]
class machineCrans(machine): class machineCrans(machine):
can_be_by = { created: [nounou], can_be_by = { created: [attributs.nounou],
modified: [nounou], modified: [attributs.nounou],
deleted: [nounou], deleted: [attributs.nounou],
} }
ufields = machine.ufields + ['prise'] attribs = machine.attribs + [attributs.prise, attributs.nombrePrises]
ofields = machine.ofields + ['nombrePrises']
class borneWifi(machine): class borneWifi(machine):
can_be_by = { created: [nounou], can_be_by = { created: [attributs.nounou],
modified: [nounou], modified: [attributs.nounou],
deleted: [nounou], deleted: [attributs.nounou],
} }
ufields = machine.ufields + ['canal', 'puissance', 'hotspot', attribs = machine.attribs + [attributs.canal, attributs.puissance, attributs.hotspot,
'prise', 'positionBorne', 'nvram'] attributs.prise, attributs.positionBorne, attributs.nvram]
class facture(CransLdapObject): class facture(CransLdapObject):
can_be_by = { created: [nounou, bureau, cableur], can_be_by = { created: [attributs.nounou, attributs.bureau, attributs.cableur],
modified: [nounou, bureau, cableur], modified: [attributs.nounou, attributs.bureau, attributs.cableur],
deleted: [nounou, bureau, cableur], deleted: [attributs.nounou, attributs.bureau, attributs.cableur],
} }
ufields = ['fid', 'modePaiement', 'recuPaiement'] attribs = [attributs.fid, attributs.modePaiement, attributs.recuPaiement]
class service(CransLdapObject): pass class service(CransLdapObject): pass
class lock(CransLdapObject): pass class lock(CransLdapObject): pass
MODIFIABLE_ATTRS = [ 'tel', 'chbre', 'mailAlias', 'loginShell' ]