From c59d1dc29078c7727cbb884609f32378abfc70d0 Mon Sep 17 00:00:00 2001 From: glondu Date: Fri, 10 Mar 2006 02:14:21 +0100 Subject: [PATCH] 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 --- gestion/ldap_crans.py | 93 ++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 58 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 63da7125..5c435a28 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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