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 expr[-1] == '*':
|
||||
el = '(%s=%s)' % (champ, expr)
|
||||
elif expr.find('.') == -1:
|
||||
elif '.' not in expr:
|
||||
el = '(%s=%s.*)' % (champ, expr)
|
||||
else:
|
||||
el = '(%s=%s*)' % (champ, expr)
|
||||
elif champ == 'macAddress':
|
||||
# Formatage adresse mac
|
||||
try: el = '(macAddress=%s)' % format_mac(expr)
|
||||
except: pass
|
||||
try:
|
||||
el = '(macAddress=%s)' % format_mac(expr)
|
||||
except:
|
||||
pass
|
||||
elif champ == 'paiement' and expr == 'ok':
|
||||
# Paiement donnant droit à une connexion maintenant ?
|
||||
# (il doit avoir payé pour l'année en cours ou pour
|
||||
|
@ -560,14 +562,14 @@ class crans_ldap:
|
|||
# définifif (cf config.py).
|
||||
if localtime()[1] == 9:
|
||||
# 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:
|
||||
el = "(paiement=%s)" % (int(ann_scol),)
|
||||
el = "(paiement=%s)" % ann_scol
|
||||
# Doit-on bloquer en cas de manque de la carte d'etudiant ?
|
||||
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':
|
||||
el = '(blacklist=%s)' % (expr)
|
||||
el = '(blacklist=%s)' % expr
|
||||
else:
|
||||
# Cas général
|
||||
el = '(%s=%s)' % (champ, expr)
|
||||
|
@ -577,15 +579,12 @@ class crans_ldap:
|
|||
if '=' in expression:
|
||||
#### Recherche avec conditions explicites
|
||||
## Construction des filtres
|
||||
|
||||
|
||||
# initialisation
|
||||
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:
|
||||
filtre[i] = '(&'
|
||||
filtre_cond[i] = False
|
||||
filtre[i] = ''
|
||||
|
||||
conds = expression.split('&')
|
||||
|
||||
# Test de l'expression de recherche et classement par filtres
|
||||
|
@ -598,9 +597,9 @@ class crans_ldap:
|
|||
champ = champ[:-1]
|
||||
neg = True
|
||||
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)
|
||||
|
||||
if expr == '': expr = '*'
|
||||
|
@ -612,62 +611,26 @@ class crans_ldap:
|
|||
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]:
|
||||
filtre[i] += build_filtre(champ, expr, neg)
|
||||
ok = True
|
||||
if expr != '*' or neg:
|
||||
filtre_cond[i] = True
|
||||
filtre_tout = False
|
||||
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
|
||||
r = {} # contiendra les réponses par filtre
|
||||
for i in filtres:
|
||||
if (filtre_tout and filtre[i] != '(&' ) or filtre_cond[i]:
|
||||
if filtre[i] != '':
|
||||
# Filtre valide
|
||||
#filtre[i] += ')'
|
||||
filtre[i] += '(objectClass=%s))' % i
|
||||
filtre[i] = '(&(objectClass=%s)%s)' % (i, filtre[i])
|
||||
r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i])
|
||||
else:
|
||||
r[i] = None
|
||||
|
||||
## On a alors une liste de résultats
|
||||
## r = { categorie1: [ (result1), (result2), ...] , ... }
|
||||
## r = {categorie1: [(result1), (result2), ...], ...}
|
||||
|
||||
# Traitement
|
||||
if not r['machine'] and not r['adherent'] and not r['club']:
|
||||
# Pas de réponses
|
||||
return result
|
||||
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:
|
||||
if r['machine'] != None \
|
||||
and (r['adherent'] != None or r['club'] != None) \
|
||||
and len(conds) > 1:
|
||||
# Il faut croiser les résultats machine et propriétaire
|
||||
# Traitement des machines
|
||||
mach_adh = [] # liste de dn d'adhérents et de clubs
|
||||
|
@ -699,6 +662,20 @@ class crans_ldap:
|
|||
result['machine'].append(BorneWifi(a, mode, self.conn))
|
||||
else:
|
||||
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:
|
||||
### Recherche d'une chaine sur tous les champs
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue