[lc_ldap] Ajoute d'une methode générale (allMachinesAdherents) renvoyant la listes de toutes les machines et de tous les adhérents.

On bind allMachines dessus et on ajoute allAdherents en bindant également.
On ajoute aussi une methode paiement_ok dans la classe proprio car pratique.
Cette fois, pour allMachinesAdherents on oublie pas de traiter les club, mais on refait un appel
à l'annuaire ldap pour chaque club pour trouver le responsable ce qui prends un temps non négligeable
(c'est toujours mieux que de refaire un appel pour chaque machine pour trouver le propriétaire)
This commit is contained in:
Valentin Samir 2011-10-28 19:16:25 +02:00
parent 6dfa3af3ec
commit 2459e40531

View file

@ -121,32 +121,53 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit) res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit)
return [ new_cransldapobject(self, r[0], mode=mode) for r in res ] return [ new_cransldapobject(self, r[0], mode=mode) for r in res ]
def allMachinesAdherents(self):
"""Renvoie la liste de toutes les machines et de tous les adherents
(club et Association Crans compris). Conçue pour s'éxécuter le plus
rapidement possible. On dumpe malgré tout toute la base."""
res = {}
parent = {}
machines = {}
# (proxying de la base ldap)
for dn, attrs in self.search_s(base_dn, scope=2):
# On crée les listes des machines et propriétaires
if dn.startswith('mid='): # les machines
m = new_cransldapobject(self, dn, ldif = attrs)
parent_dn = dn.split(',', 1)[1]
if not machines.has_key(parent_dn):
machines[parent_dn]=[]
machines[parent_dn].append(m)
elif (dn.startswith('aid=') or dn.startswith('cid=') or dn==base_dn) and not parent.has_key(dn):
# Hélas on refait une recherche ldap dans attributs.py pour trouver les responsables des club
# ce qui prends un temps non négligeable mais est toujours mieux que de le faire pour tous les adherents
parent[dn]=new_cransldapobject(self, dn, ldif = attrs)
allmachines=[]
for dn,mlist in machines.items(): # on associe propriétaires et machines
parent[dn]._machines=mlist
for m in mlist:
m._proprio=parent[dn]
allmachines.append(m)
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
s'éxécuter le plus rapidement possible. On dumpe malgré tout s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les propriétaires.""" les propriétaires."""
res = {} machines,_=self.allMachinesAdherents()
parent = {}
machines = []
# On récupère tous les objets ldap et on les met dans un dico
# (proxying de la base ldap)
for dn, attrs in self.search_s(base_dn, scope=2): #on fait tout dans une seule boucle
#~ res[dn] = attrs
# On crée la liste des machines
#~ for dn, attrs in res.items():
if dn.startswith('mid='):
m = new_cransldapobject(self, dn, ldif = attrs)
parent_dn = dn.split(',', 1)[1]
if not parent.has_key(parent_dn):
parent[parent_dn]=adherent(self, dn,machines= [ new_cransldapobject(self, dn,ldif=attrs)]) # on utilise pas new_cransldapobject pour optimiser les appel ldap (on passe la liste des machines)
else:
parent[parent_dn]._machines.append(new_cransldapobject(self, dn,ldif=attrs))
#~ m._proprio = new_cransldapobject(self, parent_dn, res[parent_dn],opt=machine_proprio[parent_dn])
m._proprio = parent[parent_dn]
machines.append(m)
return machines return machines
def allAdherents(self):
"""Renvoie la liste de toutes les adherents, Conçue pour
s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les machines."""
_,adherents=self.allMachinesAdherents()
return adherents
def newMachine(self, parent, realm, uldif): def newMachine(self, parent, realm, uldif):
"""Crée une nouvelle machine: realm peut être: """Crée une nouvelle machine: realm peut être:
fil, fil-v6, wifi, wifi-v6, adm, gratuit, personnel-ens, special""" fil, fil-v6, wifi, wifi-v6, adm, gratuit, personnel-ens, special"""
@ -241,10 +262,10 @@ def new_cransldapobject(conn, dn, mode='ro', ldif = None):
classe = None classe = None
if ldif: if dn == base_dn:
classe = globals()[ldif['objectClass'][0]]
elif dn == base_dn:
classe = AssociationCrans classe = AssociationCrans
elif ldif:
classe = globals()[ldif['objectClass'][0]]
else: else:
res = conn.search_s(dn, 0) res = conn.search_s(dn, 0)
if not res: if not res:
@ -265,7 +286,7 @@ class CransLdapObject(object):
self.mode = mode self.mode = mode
self.attrs = None # Contient un dico uldif qui doit représenter ce qui self.attrs = {} # Contient un dico uldif qui doit représenter ce qui
# est dans la base # est dans la base
self._modifs = None # C'est là qu'on met les modifications self._modifs = None # C'est là qu'on met les modifications
@ -279,6 +300,9 @@ class CransLdapObject(object):
# Vous précisez un ldif, l'objet est 'ro' # Vous précisez un ldif, l'objet est 'ro'
self.mode = 'ro' self.mode = 'ro'
self.attrs = ldif self.attrs = ldif
if dn != base_dn: # new_cransldapobject ne donne pas de ldif formaté et utilise un ldif non formaté, donc on formate
self.attrs = ldif_to_uldif(self.attrs)
self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) # on est en read only, donc pas la peine de vérifier la validité
elif dn != base_dn: elif dn != base_dn:
res = conn.search_s(dn, 0) res = conn.search_s(dn, 0)
if not res: if not res:
@ -395,7 +419,7 @@ class CransLdapObject(object):
# XXX - Proposer de filtrer les blacklistes avec un arg supplémentaire ? # XXX - Proposer de filtrer les blacklistes avec un arg supplémentaire ?
# XXX - Vérifier les blacklistes des machines pour les adhérents ? # XXX - Vérifier les blacklistes des machines pour les adhérents ?
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)
return filter((lambda bl: bl.is_actif()), attrs.get("blacklist")) return filter((lambda bl: bl.is_actif()), attrs.get("blacklist",[]))
def blacklist(self, sanction, commentaire, debut="now", fin = '-'): def blacklist(self, sanction, commentaire, debut="now", fin = '-'):
u""" u"""
@ -425,6 +449,17 @@ class proprio(CransLdapObject):
super(proprio, self).__init__(conn, dn, mode, ldif) super(proprio, self).__init__(conn, dn, mode, ldif)
self._machines = machines self._machines = machines
def paiement_ok(self):
"""Renvoie si le propriétaire à payé pour l'année en cours"""
if self.dn == base_dn:
return True
for paiement in self['paiement']:
if paiement.value == config.ann_scol:
return True
return False
def machines(self): def machines(self):
if not self._machines: if not self._machines:
self._machines = self.conn.search('mid=*', dn = self.dn, scope = 1) self._machines = self.conn.search('mid=*', dn = self.dn, scope = 1)