[ldap_crans.py] l'interface avec des dicos marche! même la copie mde dicos marche!
Ignore-this: 192f099c2b334df59cca5d73c12309d2 darcs-hash:20090929205903-bd074-77224dc37a11f4fe18a0dc2aac3edcefd7ef6c0d.gz
This commit is contained in:
parent
f5bae74159
commit
fd5cca07f2
4 changed files with 122 additions and 64 deletions
|
@ -228,7 +228,8 @@ def format_mac(mac):
|
|||
### Définition des classes
|
||||
|
||||
class Service:
|
||||
u""" Définit un service à redémarrer """
|
||||
u"Définit un service à redémarrer"
|
||||
|
||||
def __init__(self, nom, args=[], start=[]):
|
||||
"""
|
||||
Nom du service
|
||||
|
@ -329,22 +330,31 @@ class CransLdap(dict):
|
|||
'borneWifi': 2,
|
||||
'facture': 2}
|
||||
|
||||
def __init__(self, readonly=False, conn=None):
|
||||
def __init__(self, **kw):
|
||||
"""Fonction d'initialisation.
|
||||
Marche en 2 temps: initialise la connexion ldap, puis initialise
|
||||
le dictionnaire."""
|
||||
self.__obj_init__(**kw)
|
||||
self.__dict_init__(**kw)
|
||||
|
||||
def __obj_init__(self, readonly = False, conn = None, **kw):
|
||||
"""Initialisation de la connexion à la base LDAP.
|
||||
Cette connexion sera réutilisée pour tous les objets créés
|
||||
depuis cet objet (notamment grâce à la méthode make)"""
|
||||
if not self.conn:
|
||||
self.conn = conn
|
||||
if not self.conn:
|
||||
self.connect(readonly)
|
||||
self['readonly'] = readonly
|
||||
self['witness'] = "I exist"
|
||||
|
||||
def __del__(self):
|
||||
"Destruction de l'objet, et surtout des locks."
|
||||
# Destruction des locks résiduels
|
||||
if hasattr(self, '_locks'):
|
||||
for lock in self._locks:
|
||||
self.remove_lock(lock)
|
||||
|
||||
def connect(self, readonly=False):
|
||||
u""" Initialisation la connexion vers le serveur LDAP """
|
||||
u"Initialisation la connexion vers le serveur LDAP"
|
||||
if readonly:
|
||||
self.conn = ldap.initialize(ro_uri)
|
||||
return
|
||||
|
@ -364,9 +374,8 @@ class CransLdap(dict):
|
|||
time.sleep(0.3)
|
||||
|
||||
def exist(self, arg):
|
||||
u"""
|
||||
Vérifie l'existence d'une entrée dans la base et que cette
|
||||
entrée n'appartient pas à l'objet en cours.
|
||||
"""Vérifie l'existence d'une entrée dans la base et que cette entrée
|
||||
n'appartient pas à l'objet en cours.
|
||||
|
||||
La méthode prend en compte les locks.
|
||||
|
||||
|
@ -598,12 +607,12 @@ class CransLdap(dict):
|
|||
# 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:
|
||||
classe = eval(nom_classe)
|
||||
#try:
|
||||
classe = eval(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)
|
||||
return classe(data= entry, mode= mode, conn= self.conn)
|
||||
#except:
|
||||
# raise ValueError(u"Impossible de créer l'objet %s" % nom_classe)
|
||||
|
||||
|
||||
def search(self, expression, mode=''):
|
||||
|
@ -887,10 +896,12 @@ class CransLdap(dict):
|
|||
|
||||
########################################################################
|
||||
# Méthodes pour fournir une interface proche d'un dictionnaire
|
||||
def __dict_init__(self, dico= {}, **kw):
|
||||
for lbl, value in dico.items(): dict.__setitem__(self, lbl, value)
|
||||
def init_locks(self, locks): self._locks = locks
|
||||
def copy(self):
|
||||
new = dict.copy(self)
|
||||
new = self.__class__(conn = self.conn, dico = self)
|
||||
new._locks = self._locks
|
||||
new.conn = self.conn
|
||||
return new
|
||||
|
||||
#############################################################################
|
||||
|
@ -1320,7 +1331,7 @@ class BaseClasseCrans(CransLdap):
|
|||
class BaseProprietaire(BaseClasseCrans):
|
||||
u""" Méthodes de bases pour les classes Adherent et Club """
|
||||
|
||||
def __init__(self, data=(), mode='', conn=None):
|
||||
def __obj_init__(self, mode='', conn= None, **kw):
|
||||
u"""
|
||||
Si data est fourni initialise l'adhérent avec les valeurs données
|
||||
Format de data : tuple comme retourné par une recherche dans la base ldap:
|
||||
|
@ -1332,11 +1343,16 @@ class BaseProprietaire(BaseClasseCrans):
|
|||
|
||||
conn est une instance de la classe de connexion à la base LDAP
|
||||
"""
|
||||
BaseClasseCrans.__init__(self, conn = conn)
|
||||
|
||||
# Initialisation de la connexion à zelda
|
||||
BaseClasseCrans.__obj_init__(self, conn = conn)
|
||||
|
||||
data = kw.get('data', ())
|
||||
if type(data) != tuple:
|
||||
raise TypeError
|
||||
|
||||
self.modifs = {}
|
||||
data = kw.get('data', ())
|
||||
if data:
|
||||
self.dn = data[0]
|
||||
if mode == 'w':
|
||||
|
@ -1357,6 +1373,7 @@ class BaseProprietaire(BaseClasseCrans):
|
|||
self._init_data = {}
|
||||
self._modifiable = 'w'
|
||||
|
||||
|
||||
def chsh(self, new=None):
|
||||
u""" Retourne ou change le shell de l'adhérent """
|
||||
if new == None:
|
||||
|
@ -1837,12 +1854,16 @@ class BaseProprietaire(BaseClasseCrans):
|
|||
elif lbl == 'greylist': self.contourneGreylist(value)
|
||||
else: pass
|
||||
|
||||
def __dict_init__(self, **kw):
|
||||
dict.__setitem__(self, 'solde', self.solde())
|
||||
dict.__setitem__(self, 'controle', self.controle())
|
||||
|
||||
def copy(self):
|
||||
new = CransLdap.copy(self)
|
||||
new._init_data = self._init_data
|
||||
new._data = self._data
|
||||
new.modifs = self.modifs
|
||||
new.modifiable = self.modifiable
|
||||
new._modifiable = self._modifiable
|
||||
return new
|
||||
|
||||
#############################################################################
|
||||
|
@ -2450,15 +2471,15 @@ class Adherent(BaseProprietaire):
|
|||
elif lbl == 'tel': self.tel(value)
|
||||
elif lbl == 'chbre': self.chbre(value)
|
||||
elif re.match(r'addr\d+', lbl):
|
||||
addr = self.addresse()
|
||||
addr = self.adresse()
|
||||
addr[int(lbl[4]) + 1] = value
|
||||
self.addresse(addr)
|
||||
elif lbl == 'mail': self.mail(value)
|
||||
self.adresse(addr)
|
||||
elif lbl == 'mail': self.email(value)
|
||||
elif lbl == 'chartema': self.charteMA(value)
|
||||
elif lbl == 'payant': self.adherentPayant(value)
|
||||
elif re.match(r'etud\d+', lbl):
|
||||
etud = self.etudes()
|
||||
etud[int(lbl[4]) + 1] = value
|
||||
etud = [self.etudes(i) for i in range(3)]
|
||||
etud[int(lbl[4]) - 1] = value
|
||||
self.etudes(etud)
|
||||
elif lbl == 'carte':
|
||||
if value == True: self.carteEtudiant(ann_scol)
|
||||
|
@ -2471,6 +2492,17 @@ class Adherent(BaseProprietaire):
|
|||
else: raise ValueError(u"les droits_* doivent être True ou False")
|
||||
else: pass
|
||||
|
||||
def __dict_init__(self, **kw):
|
||||
BaseProprietaire.__dict_init__(self, **kw)
|
||||
dict.__setitem__(self, 'nom', self.nom())
|
||||
dict.__setitem__(self, 'prenom', self.prenom())
|
||||
dict.__setitem__(self, 'chbre', self.chbre())
|
||||
dict.__setitem__(self, 'mail', self.email())
|
||||
dict.__setitem__(self, 'payant', self.adherentPayant())
|
||||
for i in range(3): dict.__setitem__(self, 'etud%d'% (i+1), self.etudes(i))
|
||||
dict.__setitem__(self, 'droits', self.droits())
|
||||
dict.__setitem__(self, 'tel', self.tel())
|
||||
|
||||
class Club(BaseProprietaire):
|
||||
u""" Classe de définition d'un club """
|
||||
idn = 'cid'
|
||||
|
@ -2623,15 +2655,25 @@ class Club(BaseProprietaire):
|
|||
u""" Retourne l'adresse mail du responsable """
|
||||
return self.responsable().email()
|
||||
|
||||
########################################################################
|
||||
# Définition de l'initilisation du dico
|
||||
def __dict_init__(self, **kw):
|
||||
BaseProprietaire.__dict_init__(self, **kw)
|
||||
dict.__setitem__(self, 'nom', self.Nom())
|
||||
dict.__setitem__(self, 'chbre', self.chbre())
|
||||
dict.__setitem__(self, 'email', self.email())
|
||||
if self.compte(): dict.__setitem__(self, 'compte', self.compte())
|
||||
dict.__setitem__(self, 'responsable', self.responsable())
|
||||
|
||||
class Machine(BaseClasseCrans):
|
||||
u""" Classe de définition d'une machine """
|
||||
idn = 'mid'
|
||||
filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)'
|
||||
filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))'
|
||||
|
||||
def __init__(self, parent_or_tuple, mode='', conn=None):
|
||||
def __obj_init__(self, data =(), mode='', conn=None, **kw):
|
||||
u"""
|
||||
parent_or_tuple est :
|
||||
data est :
|
||||
* soit une instance d'une classe pouvant posséder une machine
|
||||
(Adherent, Club ou AssociationCrans), la nouvelle machine lui
|
||||
sera alors associée.
|
||||
|
@ -2646,17 +2688,18 @@ class Machine(BaseClasseCrans):
|
|||
conn est une instance de la classe de connexion à la base LDAP
|
||||
"""
|
||||
|
||||
# Initialisation de la connexion
|
||||
BaseClasseCrans.__obj_init__(self, conn = conn)
|
||||
|
||||
# Définition de l'objectClass LDAP à partir du nom de la classe Python
|
||||
self.objectClass = str(self.__class__).split('.')[-1]
|
||||
self.objectClass = self.objectClass[0].lower() + self.objectClass[1:]
|
||||
# Initialisation de la connexion
|
||||
BaseClasseCrans.__init__(self, conn = conn)
|
||||
|
||||
self.modifs = {}
|
||||
t = parent_or_tuple.__class__
|
||||
t = data.__class__
|
||||
if t == tuple:
|
||||
# Initialisation avec données fournies
|
||||
self.dn = parent_or_tuple[0]
|
||||
self.dn = data[0]
|
||||
if mode == 'w':
|
||||
try:
|
||||
self.lock(self.idn, self.id())
|
||||
|
@ -2666,16 +2709,16 @@ class Machine(BaseClasseCrans):
|
|||
else:
|
||||
self._modifiable = 0
|
||||
# Utile pour construire l'instruction LDAP de modif
|
||||
self._init_data = parent_or_tuple[1].copy()
|
||||
self._data = parent_or_tuple[1]
|
||||
self._init_data = data[1].copy()
|
||||
self._data = data[1]
|
||||
|
||||
# Propriéraire inconnu mais ce n'est pas grave
|
||||
self.__proprietaire = None
|
||||
|
||||
elif t in [Adherent, Club, AssociationCrans] and mode != 'w':
|
||||
# Machine vide
|
||||
self.__proprietaire = parent_or_tuple
|
||||
self.dn = parent_or_tuple.dn
|
||||
self.__proprietaire = data
|
||||
self.dn = data.dn
|
||||
self._data = {'objectClass': [self.objectClass]}
|
||||
self._init_data = {}
|
||||
self._modifiable = 'w'
|
||||
|
@ -2982,11 +3025,13 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
if not self.__proprietaire:
|
||||
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
|
||||
if 'adherent' in res[0][1]['objectClass']:
|
||||
self.__proprietaire = Adherent(res[0], self._modifiable, self.conn)
|
||||
self.__proprietaire = \
|
||||
Adherent(data = res[0], mode = self._modifiable, conn = self.conn)
|
||||
elif 'club' in res[0][1]['objectClass']:
|
||||
self.__proprietaire = Club(res[0], self._modifiable, self.conn)
|
||||
self.__proprietaire = \
|
||||
Club(data = res[0], mode = self._modifiable, conn = self.conn)
|
||||
else:
|
||||
self.__proprietaire = AssociationCrans(self.conn)
|
||||
self.__proprietaire = AssociationCrans(conn = self.conn)
|
||||
|
||||
return self.__proprietaire
|
||||
|
||||
|
@ -3158,26 +3203,35 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
|
|||
elif lbl == 'alias': self.alias(value)
|
||||
elif lbl == 'ip': self.alias(value)
|
||||
elif lbl == 'exempt': self.exempt(value)
|
||||
# elif lbl == 'proprio':
|
||||
# if re.match(r'\([a-zA-Z]=\d+\)', value):
|
||||
# proprio = self.search(value)['club'][0]
|
||||
# else:
|
||||
# proprio = self.search('(aid=%s)' % value)['adherent'][0]
|
||||
# self.proprietaire(proprio)
|
||||
# elif lbl == 'proprio':
|
||||
# if re.match(r'\([a-zA-Z]=\d+\)', value):
|
||||
# proprio = self.search(value)['club'][0]
|
||||
# else:
|
||||
# proprio = self.search('(aid=%s)' % value)['adherent'][0]
|
||||
# self.proprietaire(proprio)
|
||||
|
||||
def __dict_init__(self, **kw):
|
||||
BaseClasseCrans.__dict_init__(self, **kw)
|
||||
dict.__setitem__(self, 'mac', self.mac())
|
||||
dict.__setitem__(self, 'host', self.nom())
|
||||
dict.__setitem__(self, 'prise', self.prise())
|
||||
dict.__setitem__(self, 'alias', self.alias())
|
||||
dict.__setitem__(self, 'ip', self.ip())
|
||||
dict.__setitem__(self, 'proprietaire', self.proprietaire())
|
||||
|
||||
class MachineFixe(Machine):
|
||||
u""" Classe de définition d'une machine fixe """
|
||||
|
||||
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
|
||||
Machine.__init__(self, parent_or_tuple, typ, conn)
|
||||
def __obj_init__(self, typ='fixe', **kw):
|
||||
Machine.__obj_init__(self, typ = typ, **kw)
|
||||
|
||||
|
||||
class MachineWifi(Machine):
|
||||
u""" Classe de définition d'une machine wifi """
|
||||
|
||||
def __init__(self, parent_or_tuple, typ='wifi', conn=None):
|
||||
Machine.__init__(self, parent_or_tuple, typ, conn)
|
||||
if not isinstance(parent_or_tuple, tuple):
|
||||
def __obj_init__(self, typ='wifi', **kw):
|
||||
Machine.__obj_init__(self, typ=typ, **kw)
|
||||
if not isinstance(kw.get('data', None), tuple):
|
||||
# Initialisaton d'une nouvelle machine wifi
|
||||
self.ipsec(True)
|
||||
|
||||
|
@ -3204,8 +3258,8 @@ class MachineWifi(Machine):
|
|||
class MachineCrans(Machine):
|
||||
u""" Classe de définition d'une machine du Crans """
|
||||
|
||||
def __init__(self, parent_or_tuple, typ='fixe', conn=None):
|
||||
Machine.__init__(self, parent_or_tuple, typ, conn)
|
||||
def __obj_init__(self, typ='fixe', **kw):
|
||||
Machine.__obj_init__(self, typ, **kw)
|
||||
|
||||
def nombrePrises(self, new=None):
|
||||
u""" Nombre de prises, pour les switchs """
|
||||
|
@ -3228,9 +3282,9 @@ class MachineCrans(Machine):
|
|||
class BorneWifi(Machine):
|
||||
u"""Classe de définition d'une borne wifi"""
|
||||
|
||||
def __init__(self, parent_or_tuple, typ='borne', conn=None):
|
||||
Machine.__init__(self, parent_or_tuple, typ, conn)
|
||||
if not isinstance(parent_or_tuple, tuple):
|
||||
def __obj_init__(self, typ='borne', **kw):
|
||||
Machine.__obj_init__(self, typ=typ, **kw)
|
||||
if not isinstance(kw.get('data', None), tuple):
|
||||
# Initialisaton d'une nouvelle borne wifi
|
||||
self._data['canal'] = ['2047']
|
||||
self._data['puissance'] = ['60']
|
||||
|
@ -3404,7 +3458,7 @@ class Facture(BaseClasseCrans):
|
|||
idn = 'fid'
|
||||
filtre_idn = '(objectClass=facture)'
|
||||
|
||||
def __init__(self, parent_or_tuple, mode='', conn=None):
|
||||
def __obj_init__(self, mode='', **kw):
|
||||
u"""
|
||||
parent_or_tuple est :
|
||||
* soit une instance d'une classe pouvant posséder une facture
|
||||
|
@ -3419,11 +3473,11 @@ class Facture(BaseClasseCrans):
|
|||
|
||||
conn est une instance de la classe de connexion à la base LDAP
|
||||
"""
|
||||
|
||||
# Initialisation de la connexion
|
||||
BaseClasseCrans.__init__(self, conn= conn)
|
||||
BaseClasseCrans.__obj_init__(self, conn= conn, **kw)
|
||||
|
||||
self.modifs = {}
|
||||
parent_or_tuple = kw.get('data', None)
|
||||
t = parent_or_tuple.__class__
|
||||
if t == tuple:
|
||||
# Initialisation avec données fournies
|
||||
|
@ -3480,9 +3534,11 @@ class Facture(BaseClasseCrans):
|
|||
if not self.__proprietaire:
|
||||
res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0)
|
||||
if 'adherent' in res[0][1]['objectClass']:
|
||||
self.__proprietaire = Adherent(res[0], self._modifiable, self.conn)
|
||||
self.__proprietaire = \
|
||||
Adherent(data = res[0], mode = self._modifiable, conn = self.conn)
|
||||
elif 'club' in res[0][1]['objectClass']:
|
||||
self.__proprietaire = Club(res[0], self._modifiable, self.conn)
|
||||
self.__proprietaire = \
|
||||
Club(data = res[0], mode = self._modifiable, conn = self.conn)
|
||||
else:
|
||||
raise ValueError, u'Propriétaire inconnu'
|
||||
|
||||
|
@ -3730,8 +3786,8 @@ class Facture(BaseClasseCrans):
|
|||
class _FakeProprio(CransLdap):
|
||||
u"""Définitions de base d'un propriétaire virtuel"""
|
||||
idn = ''
|
||||
def __init__(self, conn=None):
|
||||
CransLdap.__init__(self, conn = conn)
|
||||
def __obj_init__(self, conn=None):
|
||||
CransLdap.__obj_init__(self, conn = conn)
|
||||
self.dn = self.base_dn
|
||||
def id(self):
|
||||
return ''
|
||||
|
@ -3754,8 +3810,8 @@ class _FakeProprio(CransLdap):
|
|||
|
||||
class AssociationCrans(_FakeProprio):
|
||||
u""" Classe définissant l'assoce (pour affichage de ses machines) """
|
||||
def __init__(self, conn=None):
|
||||
_FakeProprio.__init__(self, conn)
|
||||
def __obj_init__(self, conn=None):
|
||||
_FakeProprio.__obj_init__(self, conn)
|
||||
def Nom(self):
|
||||
return u"Crans"
|
||||
def chbre(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue