Esthtisme.

darcs-hash:20060309235447-68412-3733c8be4ceec74ea69f9cae948181293fabac74.gz
This commit is contained in:
glondu 2006-03-10 00:54:47 +01:00
parent 95a6fe21bd
commit aea8585794

View file

@ -506,18 +506,19 @@ class crans_ldap:
def search(self, expression, mode=''):
"""
Recherche dans la base LDAP, expression est une chaîne :
une expression : champ1=expr1 champ2=expr2 champ3!=expr3....
soit un seul terme, dans ce cas cherche sur les champs de auto_search_champs
Si mode ='w' les instances crées seront en mode d'écriture
* soit une expression : champ1=expr1&champ2=expr2&champ3!=expr3...
* soit un seul terme, dans ce cas cherche sur les champs de
auto_search_champs
Si mode='w', les instances crées seront en mode d'écriture
"""
if type(expression)==str:
if type(expression) == str:
# Transformation de l'expression en utf-8
expression = unicode(expression,'iso-8859-15').encode('utf-8')
elif type(expression)==unicode:
expression = unicode(expression, 'iso-8859-15').encode('utf-8')
elif type(expression) == unicode:
expression = expression.encode('utf-8')
else:
raise TypeError(u'Chaine attendue')
raise TypeError(u'Chaîne attendue')
if not expression:
return []
@ -527,34 +528,36 @@ class crans_ldap:
# Il faut un filtre par type d'objet de la base
filtres = self.auto_search_champs.keys()
result={'adherent': [], 'machine': [], 'club': []}
result = {'adherent': [], 'machine': [], 'club': []}
# Fonction utile
def build_filtre(champ,expr,neg=0):
""" Retourne une chaine pour recherche dans la base LDAP
du style (champ=expr) en adaptant les valeurs de expr au champ
si neg = 1: retourne le négatif : (!(champ=expr))"""
def build_filtre(champ, expr, neg=0):
"""
Retourne une chaine pour recherche dans la base LDAP
du style (champ=expr) en adaptant les valeurs de expr au champ.
Si neg = 1, retourne le négatif : (!(champ=expr))
"""
el = ''
if champ in [ 'host', 'hostAlias' ]:
if champ in ['host', 'hostAlias']:
if expr[-1] == '*':
el = '(%s=%s)' % (champ, expr)
elif expr.find('.')==-1:
el = '(%s=%s.*)' % ( champ, expr)
elif expr.find('.') == -1:
el = '(%s=%s.*)' % (champ, expr)
else:
el = '(%s=%s*)' % ( champ, expr)
el = '(%s=%s*)' % (champ, expr)
elif champ == 'macAddress':
# Formatage adresse mac
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 l'année précédente
# si on est en septembre
# (il doit avoir payé pour l'année en cours ou pour
# l'année précédente si on est en septembre
#
# Dans tous les cas, pour un adhérent, le paiement est considéré non ok
# s'il n'a pas fourni sa carte d'etudiant alors que l'on est desormais
# en periode de bloquage definifif (cf config.py).
# Dans tous les cas, pour un adhérent, le paiement est
# considéré non ok s'il n'a pas fourni sa carte d'etudiant
# alors que l'on est desormais en periode de bloquage
# 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)
@ -571,17 +574,17 @@ class crans_ldap:
if neg: el = '(!%s)' % el
return el
if expression.find('=')!=-1:
if expression.find('=') != -1:
#### Recherche avec conditions explicites
## Construction des filtres
# initialisation
filtre={}
filtre_cond={} # Stokage si filtre avec condition (ne comporte pas que des *)
filtre_tout=1 # Passse à 0 si au moins une condition
filtre = {}
filtre_cond = {} # Stokage si filtre avec condition (ne comporte pas que des *)
filtre_tout = 1 # Passse à 0 si au moins une condition
for i in filtres:
filtre[i]='(&'
filtre[i] = '(&'
filtre_cond[i] = 0
conds = expression.split('&')
@ -598,31 +601,31 @@ class crans_ldap:
raise ValueError(u'Syntaxe de recherche invalide.')
# transformation de certains champs
champ = self.trans.get(champ,champ)
champ = self.trans.get(champ, champ)
if expr=='': expr='*'
if expr == '': expr='*'
ok = 0
# Construction du filtre
for i in filtres:
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 = 1
if expr!='*' or neg:
if expr != '*' or neg:
filtre_cond[i] = 1
filtre_tout=0
filtre_tout = 0
if not ok:
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_tout and filtre[i] != '(&' ) or filtre_cond[i]:
# Filtre valide
#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:
r[i] = None
@ -637,7 +640,8 @@ class crans_ldap:
# Filtre sur un seul champ
# => on retourne tout
for i in filtres:
if not r[i]: continue
if not r[i]:
continue
for res in r[i]:
if i == "machine":
if res[1].has_key('puissance'):
@ -659,17 +663,18 @@ class crans_ldap:
# => on retourne uniquement les adhérents
if r['adherent']:
for a in r['adherent']:
result['adherent'].append(adherent(a,mode,self.conn) )
result['adherent'].append(adherent(a, mode, self.conn))
if r['club']:
for a in r['club']:
result['club'].append(club(a,mode,self.conn) )
result['club'].append(club(a, mode, self.conn))
else:
# Il faut croiser les résultats machine et propriétaire
# Traitement des machines
mach_adh = [] # liste de dn d'adhérents et de clubs
for res in r['machine']:
dn = string.join(res[0].split(',')[-4:],',')
if dn[:3] != 'aid' and dn[:3] != 'cid': continue
dn = ','.join(res[0].split(',')[-4:])
if dn[:3] != 'aid' and dn[:3] != 'cid':
continue
if dn not in mach_adh:
mach_adh.append(dn)
@ -678,16 +683,16 @@ class crans_ldap:
for a in r['adherent']:
if a[0] in mach_adh and not a[0] in bons_dn:
bons_dn.append(a[0])
result['adherent'].append(adherent(a,mode,self.conn) )
result['adherent'].append(adherent(a, mode, self.conn))
for a in r['club']:
if a[0] in mach_adh and not a[0] in bons_dn:
bons_dn.append(a[0])
result['club'].append(club(a,mode,self.conn) )
result['club'].append(club(a, mode, self.conn))
# Maintenant c'est au tour des bonnes machines
bons_dn2 = []
for a in r['machine']:
dn = string.join(a[0].split(',')[-4:],',')
dn = string.join(a[0].split(',')[-4:], ',')
if dn in bons_dn and not a[0] in bons_dn2:
bons_dn2.append(dn)
if a[1].has_key('puissance'):
@ -705,11 +710,11 @@ class crans_ldap:
# Construction du filtre
filtre = '(&(|'
for champ in self.auto_search_champs[i]:
filtre += build_filtre(champ,expression)
filtre+=')(objectClass=%s))' %i
filtre += build_filtre(champ, expression)
filtre += ')(objectClass=%s))' %i
# Recherche
for r in self.conn.search_s(self.base_dn,self.scope[i],filtre):
for r in self.conn.search_s(self.base_dn, self.scope[i], filtre):
if i == 'machine':
if r[1].has_key('puissance'):
result['machine'].append(BorneWifi(r, mode, self.conn))