[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:
parent
6dfa3af3ec
commit
2459e40531
1 changed files with 59 additions and 24 deletions
83
lc_ldap.py
83
lc_ldap.py
|
@ -121,32 +121,53 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
|||
res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit)
|
||||
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):
|
||||
"""Renvoie la liste de toutes les machines, 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 propriétaires."""
|
||||
res = {}
|
||||
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)
|
||||
machines,_=self.allMachinesAdherents()
|
||||
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):
|
||||
"""Crée une nouvelle machine: realm peut être:
|
||||
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
|
||||
|
||||
if ldif:
|
||||
classe = globals()[ldif['objectClass'][0]]
|
||||
elif dn == base_dn:
|
||||
if dn == base_dn:
|
||||
classe = AssociationCrans
|
||||
elif ldif:
|
||||
classe = globals()[ldif['objectClass'][0]]
|
||||
else:
|
||||
res = conn.search_s(dn, 0)
|
||||
if not res:
|
||||
|
@ -265,7 +286,7 @@ class CransLdapObject(object):
|
|||
|
||||
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
|
||||
|
||||
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'
|
||||
self.mode = 'ro'
|
||||
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:
|
||||
res = conn.search_s(dn, 0)
|
||||
if not res:
|
||||
|
@ -395,7 +419,7 @@ class CransLdapObject(object):
|
|||
# XXX - Proposer de filtrer les blacklistes avec un arg supplémentaire ?
|
||||
# XXX - Vérifier les blacklistes des machines pour les adhérents ?
|
||||
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 = '-'):
|
||||
u"""
|
||||
|
@ -425,6 +449,17 @@ class proprio(CransLdapObject):
|
|||
super(proprio, self).__init__(conn, dn, mode, ldif)
|
||||
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):
|
||||
if not self._machines:
|
||||
self._machines = self.conn.search('mid=*', dn = self.dn, scope = 1)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue