On spare les machineFixe, machineWifi, machineCrans et borneWifi dans

la base.

darcs-hash:20060311142734-68412-d30b4c9cef04f81730b9233fb85f21666f248c43.gz
This commit is contained in:
glondu 2006-03-11 15:27:34 +01:00
parent 9334846582
commit eafbfe7f86

View file

@ -236,26 +236,50 @@ class crans_ldap:
### Configuration de la recheche ### Configuration de la recheche
# Dictionnaire de transformation des champs # Dictionnaire de transformation des champs
trans = { 'prénom': 'prenom' , trans = { 'prénom': 'prenom',
'chambre': 'chbre', 'chambre': 'chbre',
'login': 'mail' , 'login': 'mail',
'hostname': 'host', 'hostname': 'host',
'mac': 'macAddress', 'mac': 'macAddress',
'ip': 'ipHostNumber', 'ip': 'ipHostNumber',
'telephone': 'tel'} 'telephone': 'tel'}
# Champs de recherche pour la recherche automatique # Champs de recherche pour la recherche automatique
auto_search_champs = { 'adherent': [ 'nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'cannonicalAlias' ], \ auto_search_machines_champs = \
'machine': [ 'macAddress', 'host', 'ipHostNumber', 'hostAlias'] , ['macAddress', 'host', 'ipHostNumber', 'hostAlias']
'club': [ 'nom', 'chbre' ] }
auto_search_champs = { \
'adherent': \
['nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'cannonicalAlias' ],
'club': ['nom', 'chbre'],
'machineFixe': auto_search_machines_champs,
'machineWifi': auto_search_machines_champs,
'machineCrans': auto_search_machines_champs,
'borneWifi': auto_search_machines_champs }
# Champs de recherche pour la recherche manuelle (en plus de la recherche auto) # Champs de recherche pour la recherche manuelle (en plus de la recherche auto)
non_auto_search_champs = { 'adherent': [ 'etudes', 'paiement', 'carteEtudiant', 'aid' , 'postalAddress', 'historique' ,'blacklist', 'droits', 'uidNumber', 'uid', 'info', 'solde', 'controle', 'contourneGreylist', 'rewriteMailHeaders', 'ablacklist'], \ non_auto_search_machines_champs = \
'machine': [ 'mid' , 'ipsec', 'historique', 'blacklist' , 'puissance', 'canal', 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', 'prise' , 'info', 'exempt', 'mblacklist'] , ['mid', 'historique', 'blacklist', 'info', 'exempt', 'mblacklist',
'club': [ 'cid' , 'responsable', 'paiement', 'historique', 'blacklist', 'mailAlias', 'info', 'controle' ] } 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout']
non_auto_search_champs = { \
'adherent': \
['etudes', 'paiement', 'carteEtudiant', 'aid', 'postalAddress',
'historique', 'blacklist', 'droits', 'uidNumber', 'uid', 'info',
'solde', 'controle', 'contourneGreylist', 'rewriteMailHeaders',
'ablacklist'], \
'club': \
['cid', 'responsable', 'paiement', 'historique', 'blacklist',
'mailAlias', 'info', 'controle'], \
'machineFixe': non_auto_search_machines_champs,
'machineCrans': non_auto_search_machines_champs + ['prise'],
'borneWifi': non_auto_search_machines_champs + ['prise', 'puissance', 'canal'],
'machineWifi': non_auto_search_machines_champs + ['ipsec'] }
# Profondeur des différentes recherches (scope) # Profondeur des différentes recherches (scope)
scope = { 'adherent': 1 , 'machine': 2 , 'club': 1 } scope = {'adherent': 1, 'club': 1,
'machineFixe': 2, 'machineWifi': 2,
'machineCrans': 2, 'borneWifi': 2 }
def __init__(self,readonly=False): def __init__(self,readonly=False):
self.connect(readonly) self.connect(readonly)
@ -503,6 +527,28 @@ class crans_ldap:
# Existe déja => rien à faire # Existe déja => rien à faire
pass pass
def make(self, entry, mode=''):
"""
Crée le bon objet à partir de entry.
mode a la même signification que dans search.
"""
# On récupère la bonne classe
nom_classe = (entry[1].get('objectClass') or ['none'])[0]
nom_classe = nom_classe[0].upper() + nom_classe[1:]
try:
# Hack temporaire, à enlever quand on aura tout renommé
if nom_classe in ['Adherent', 'Club']:
nom_classe = nom_classe.lower()
if nom_classe in ['MachineFixe', 'MachineWifi', 'MachineCrans']:
nom_classe = 'Machine'
classe = globals()[nom_classe]
# On crée l'objet
return classe(entry, mode, self.conn)
except:
raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
def search(self, expression, mode=''): def search(self, expression, mode=''):
""" """
Recherche dans la base LDAP, expression est une chaîne : Recherche dans la base LDAP, expression est une chaîne :
@ -528,7 +574,9 @@ class crans_ldap:
# Il faut un filtre par type d'objet de la base # Il faut un filtre par type d'objet de la base
filtres = self.auto_search_champs.keys() filtres = self.auto_search_champs.keys()
result = {'adherent': [], 'machine': [], 'club': []} result = {}
for i in filtres:
result[i] = []
# Fonction utile # Fonction utile
def build_filtre(champ, expr, neg=False): def build_filtre(champ, expr, neg=False):
@ -580,7 +628,7 @@ class crans_ldap:
#### Recherche avec conditions explicites #### Recherche avec conditions explicites
## Construction des filtres ## Construction des filtres
# initialisation # Initialisation
filtre = {} filtre = {}
for i in filtres: for i in filtres:
filtre[i] = '' filtre[i] = ''
@ -616,6 +664,7 @@ class crans_ldap:
## 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[i] != '': if filtre[i] != '':
# Filtre valide # Filtre valide
@ -628,13 +677,23 @@ class crans_ldap:
## r = {categorie1: [(result1), (result2), ...], ...} ## r = {categorie1: [(result1), (result2), ...], ...}
# Traitement # Traitement
if r['machine'] != None \
if (r['machineFixe'] != None or r['machineWifi'] != None) \
and (r['adherent'] != None or r['club'] != None) \ and (r['adherent'] != None or r['club'] != None) \
and len(conds) > 1: and len(conds) > 1:
# Il faut croiser les résultats machine et propriétaire
# On renvoie toutes les machineCrans et borneWifi
for i in 'machineCrans', 'borneWifi':
if r[i] == None:
continue
for res in r[i]:
result[i].append(self.make(res, mode))
# On croise maintenant 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
for res in r['machine']: for res in r['machineFixe'] + r['machineWifi']:
dn = ','.join(res[0].split(',')[-4:]) dn = ','.join(res[0].split(',')[-4:])
if dn[:3] != 'aid' and dn[:3] != 'cid': if dn[:3] != 'aid' and dn[:3] != 'cid':
continue continue
@ -643,25 +702,20 @@ class crans_ldap:
# Croisement # Croisement
bons_dn = [] # liste des dn d'adhérents qui correspondent aux critères bons_dn = [] # liste des dn d'adhérents qui correspondent aux critères
for a in r['adherent']: for i in 'adherent', 'club':
for a in r[i]:
if a[0] in mach_adh and not a[0] in bons_dn: if a[0] in mach_adh and not a[0] in bons_dn:
bons_dn.append(a[0]) bons_dn.append(a[0])
result['adherent'].append(adherent(a, mode, self.conn)) result[i].append(self.make(a, mode))
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))
# Maintenant c'est au tour des bonnes machines # Maintenant c'est au tour des bonnes machines
bons_dn2 = [] bons_dn2 = []
for a in r['machine']: for i in 'machineFixe', 'machineWifi':
for a in r[i]:
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: if dn in bons_dn and not a[0] in bons_dn2:
bons_dn2.append(dn) bons_dn2.append(dn)
if a[1].has_key('puissance'): result[i].append(self.make(a, mode))
result['machine'].append(BorneWifi(a, mode, self.conn))
else:
result['machine'].append(Machine(a, mode, self.conn))
else: else:
# On retourne tout # On retourne tout
@ -669,39 +723,28 @@ class crans_ldap:
if r[i] == None: if r[i] == None:
continue continue
for res in r[i]: for res in r[i]:
if i == "machine": result[i].append(self.make(res, mode))
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 }
for i in filtres: for i in filtres:
cl = conv.get(i)
# Construction du filtre # Construction du filtre
filtre = '(&(|' filtre = ''
for champ in self.auto_search_champs[i]: for champ in self.auto_search_champs[i]:
filtre += build_filtre(champ, expression) filtre += build_filtre(champ, expression)
filtre += ')(objectClass=%s))' % i filtre = '(&(|%s)(objectClass=%s))' % (filtre, i)
# Recherche # 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': result[i].append(self.make(r, mode))
if r[1].has_key('puissance'):
result['machine'].append(BorneWifi(r, mode, self.conn)) # Backward-compatibilité
else: result['machine'] = result['machineCrans'] + result['borneWifi']
result['machine'].append(Machine(r, mode, self.conn)) result['machine'] += result['machineFixe'] + result['machineWifi']
else:
result[i].append(cl(r, mode, self.conn))
return result return result
__machines = () __machines = ()
def all_machines(self, graphic=False): def all_machines(self, graphic=False):
"""Renvoie toutes les machines autorisées. """Renvoie toutes les machines autorisées.
@ -1020,7 +1063,7 @@ class base_classes_crans(crans_ldap):
if not self._init_data: if not self._init_data:
### Nouvel enregistrement ### Nouvel enregistrement
# Génération du dn # Génération du dn
res = self.conn.search_s(self.base_dn,2,'objectClass=%s' % self._data['objectClass'][0],['']) res = self.conn.search_s(self.base_dn, 2, self.filtre_idn)
vidn=1 vidn=1
vidns=[] vidns=[]
# Liste des dn pris # Liste des dn pris
@ -1496,6 +1539,7 @@ class adherent(base_proprietaire):
""" Classe de définition d'un adhérent """ """ Classe de définition d'un adhérent """
objectClass = 'adherent' objectClass = 'adherent'
idn = 'aid' idn = 'aid'
filtre_idn = '(objectClass=adherent)'
### Méthodes Nom utilisée lors de l'affichage des propriétés ### Méthodes Nom utilisée lors de l'affichage des propriétés
### (commune avec les classes crans et club) ### (commune avec les classes crans et club)
@ -1912,6 +1956,7 @@ class adherent(base_proprietaire):
class club(base_proprietaire): class club(base_proprietaire):
""" Classe de définition d'un club """ """ Classe de définition d'un club """
idn = 'cid' idn = 'cid'
filtre_idn = '(objectClass=club)'
objectClass = 'club' objectClass = 'club'
def Nom(self,new=None): def Nom(self,new=None):
@ -2039,6 +2084,8 @@ class club(base_proprietaire):
class Machine(base_classes_crans): class Machine(base_classes_crans):
""" Classe de définition d'une machine """ """ Classe de définition d'une machine """
idn = 'mid' idn = 'mid'
filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)'
filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))'
def __init__(self, parent_or_tuple, typ='fixe', conn=None): def __init__(self, parent_or_tuple, typ='fixe', conn=None):
""" """