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