Quelques simplifications pour crans_ldap.search.
Correction de ce que je considrais comme un bug : la requte 'paiement=ok&host=tata' renvoyait tous les adhrents ok car la liste des machines correspondant est vide. C'tait probablement d une confusion du type liste == None et not liste. Cela change le comportement de la mthode search, mais j'estime que le prcdent comportement est incorrect et que les autres scripts ne devraient pas compter dessus. darcs-hash:20060310011421-68412-77cccb3532321ea3ebf5b73e113e5675b87d16ba.gz
This commit is contained in:
parent
97c42d7459
commit
c59d1dc290
1 changed files with 35 additions and 58 deletions
|
@ -541,14 +541,16 @@ class crans_ldap:
|
||||||
if champ in ['host', 'hostAlias']:
|
if champ in ['host', 'hostAlias']:
|
||||||
if expr[-1] == '*':
|
if expr[-1] == '*':
|
||||||
el = '(%s=%s)' % (champ, expr)
|
el = '(%s=%s)' % (champ, expr)
|
||||||
elif expr.find('.') == -1:
|
elif '.' not in expr:
|
||||||
el = '(%s=%s.*)' % (champ, expr)
|
el = '(%s=%s.*)' % (champ, expr)
|
||||||
else:
|
else:
|
||||||
el = '(%s=%s*)' % (champ, expr)
|
el = '(%s=%s*)' % (champ, expr)
|
||||||
elif champ == 'macAddress':
|
elif champ == 'macAddress':
|
||||||
# Formatage adresse mac
|
# Formatage adresse mac
|
||||||
try: el = '(macAddress=%s)' % format_mac(expr)
|
try:
|
||||||
except: pass
|
el = '(macAddress=%s)' % format_mac(expr)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
elif champ == 'paiement' and expr == 'ok':
|
elif champ == 'paiement' and expr == 'ok':
|
||||||
# Paiement donnant droit à une connexion maintenant ?
|
# Paiement donnant droit à une connexion maintenant ?
|
||||||
# (il doit avoir payé pour l'année en cours ou pour
|
# (il doit avoir payé pour l'année en cours ou pour
|
||||||
|
@ -560,14 +562,14 @@ class crans_ldap:
|
||||||
# définifif (cf config.py).
|
# définifif (cf config.py).
|
||||||
if localtime()[1] == 9:
|
if localtime()[1] == 9:
|
||||||
# Pour septembre paiement année précédente ok
|
# Pour septembre paiement année précédente ok
|
||||||
el = "(|(paiement=%s)(paiement=%s))" % (int(ann_scol), int(ann_scol)-1)
|
el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1)
|
||||||
else:
|
else:
|
||||||
el = "(paiement=%s)" % (int(ann_scol),)
|
el = "(paiement=%s)" % ann_scol
|
||||||
# Doit-on bloquer en cas de manque de la carte d'etudiant ?
|
# Doit-on bloquer en cas de manque de la carte d'etudiant ?
|
||||||
if config.bl_carte_et_definitif:
|
if config.bl_carte_et_definitif:
|
||||||
el = "(&(|(carteEtudiant=%s)(objectClass=club))%s)" % (int(ann_scol), el)
|
el = "(&(|(carteEtudiant=%d)(objectClass=club))%s)" % (ann_scol, el)
|
||||||
elif champ[1:] == 'blacklist':
|
elif champ[1:] == 'blacklist':
|
||||||
el = '(blacklist=%s)' % (expr)
|
el = '(blacklist=%s)' % expr
|
||||||
else:
|
else:
|
||||||
# Cas général
|
# Cas général
|
||||||
el = '(%s=%s)' % (champ, expr)
|
el = '(%s=%s)' % (champ, expr)
|
||||||
|
@ -580,12 +582,9 @@ class crans_ldap:
|
||||||
|
|
||||||
# initialisation
|
# initialisation
|
||||||
filtre = {}
|
filtre = {}
|
||||||
filtre_cond = {} # Stockage si filtre avec condition (ne comporte pas que des *)
|
|
||||||
filtre_tout = True # Passse à False si au moins une condition
|
|
||||||
|
|
||||||
for i in filtres:
|
for i in filtres:
|
||||||
filtre[i] = '(&'
|
filtre[i] = ''
|
||||||
filtre_cond[i] = False
|
|
||||||
conds = expression.split('&')
|
conds = expression.split('&')
|
||||||
|
|
||||||
# Test de l'expression de recherche et classement par filtres
|
# Test de l'expression de recherche et classement par filtres
|
||||||
|
@ -598,9 +597,9 @@ class crans_ldap:
|
||||||
champ = champ[:-1]
|
champ = champ[:-1]
|
||||||
neg = True
|
neg = True
|
||||||
except:
|
except:
|
||||||
raise ValueError(u'Syntaxe de recherche invalide.')
|
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)
|
||||||
|
|
||||||
if expr == '': expr = '*'
|
if expr == '': expr = '*'
|
||||||
|
@ -612,62 +611,26 @@ class crans_ldap:
|
||||||
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]:
|
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]:
|
||||||
filtre[i] += build_filtre(champ, expr, neg)
|
filtre[i] += build_filtre(champ, expr, neg)
|
||||||
ok = True
|
ok = True
|
||||||
if expr != '*' or neg:
|
|
||||||
filtre_cond[i] = True
|
|
||||||
filtre_tout = False
|
|
||||||
if not ok:
|
if not ok:
|
||||||
raise ValueError(u'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
|
||||||
for i in filtres:
|
for i in filtres:
|
||||||
if (filtre_tout and filtre[i] != '(&' ) or filtre_cond[i]:
|
if filtre[i] != '':
|
||||||
# Filtre valide
|
# Filtre valide
|
||||||
#filtre[i] += ')'
|
filtre[i] = '(&(objectClass=%s)%s)' % (i, filtre[i])
|
||||||
filtre[i] += '(objectClass=%s))' % i
|
|
||||||
r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i])
|
r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i])
|
||||||
else:
|
else:
|
||||||
r[i] = None
|
r[i] = None
|
||||||
|
|
||||||
## On a alors une liste de résultats
|
## On a alors une liste de résultats
|
||||||
## r = { categorie1: [ (result1), (result2), ...] , ... }
|
## r = {categorie1: [(result1), (result2), ...], ...}
|
||||||
|
|
||||||
# Traitement
|
# Traitement
|
||||||
if not r['machine'] and not r['adherent'] and not r['club']:
|
if r['machine'] != None \
|
||||||
# Pas de réponses
|
and (r['adherent'] != None or r['club'] != None) \
|
||||||
return result
|
and len(conds) > 1:
|
||||||
elif len(conds) == 1:
|
|
||||||
# Filtre sur un seul champ
|
|
||||||
# => on retourne tout
|
|
||||||
for i in filtres:
|
|
||||||
if not r[i]:
|
|
||||||
continue
|
|
||||||
for res in r[i]:
|
|
||||||
if i == "machine":
|
|
||||||
if res[1].has_key('puissance'):
|
|
||||||
result['machine'].append(BorneWifi(res, mode, self.conn))
|
|
||||||
else:
|
|
||||||
result['machine'].append(Machine(res, mode, self.conn))
|
|
||||||
else:
|
|
||||||
result[i].append(globals()[i](res, mode, self.conn))
|
|
||||||
elif not r['adherent'] and not r['club']:
|
|
||||||
# Il n'y avait seulement un filtre machine
|
|
||||||
# => on retourne uniquement les machines trouvées
|
|
||||||
for m in r['machine']:
|
|
||||||
if m[1].has_key('puissance'):
|
|
||||||
result['machine'].append(BorneWifi(m, mode, self.conn))
|
|
||||||
else:
|
|
||||||
result['machine'].append(Machine(m, mode, self.conn))
|
|
||||||
elif not r['machine']:
|
|
||||||
# Il n'y avait pas de filtre machine
|
|
||||||
# => on retourne uniquement les adhérents
|
|
||||||
if r['adherent']:
|
|
||||||
for a in r['adherent']:
|
|
||||||
result['adherent'].append(adherent(a, mode, self.conn))
|
|
||||||
if r['club']:
|
|
||||||
for a in r['club']:
|
|
||||||
result['club'].append(club(a, mode, self.conn))
|
|
||||||
else:
|
|
||||||
# Il faut croiser les résultats machine et propriétaire
|
# Il faut croiser les résultats machine et propriétaire
|
||||||
# Traitement des machines
|
# Traitement des machines
|
||||||
mach_adh = [] # liste de dn d'adhérents et de clubs
|
mach_adh = [] # liste de dn d'adhérents et de clubs
|
||||||
|
@ -700,6 +663,20 @@ class crans_ldap:
|
||||||
else:
|
else:
|
||||||
result['machine'].append(Machine(a, mode, self.conn))
|
result['machine'].append(Machine(a, mode, self.conn))
|
||||||
|
|
||||||
|
else:
|
||||||
|
# On retourne tout
|
||||||
|
for i in filtres:
|
||||||
|
if r[i] == None:
|
||||||
|
continue
|
||||||
|
for res in r[i]:
|
||||||
|
if i == "machine":
|
||||||
|
if res[1].has_key('puissance'):
|
||||||
|
result['machine'].append(BorneWifi(res, mode, self.conn))
|
||||||
|
else:
|
||||||
|
result['machine'].append(Machine(res, mode, self.conn))
|
||||||
|
else:
|
||||||
|
result[i].append(globals()[i](res, mode, self.conn))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
### Recherche d'une chaine sur tous les champs
|
### Recherche d'une chaine sur tous les champs
|
||||||
conv = { 'club': club, 'adherent': adherent }
|
conv = { 'club': club, 'adherent': adherent }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue