From fd5cca07f279ace951ae7d82d8054f3c7697372b Mon Sep 17 00:00:00 2001 From: Antoine Durand-Gasselin Date: Tue, 29 Sep 2009 22:59:03 +0200 Subject: [PATCH] =?UTF-8?q?[ldap=5Fcrans.py]=20l'interface=20avec=20des=20?= =?UTF-8?q?dicos=20marche!=20m=C3=AAme=20la=20copie=20mde=20dicos=20marche?= =?UTF-8?q?!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore-this: 192f099c2b334df59cca5d73c12309d2 darcs-hash:20090929205903-bd074-77224dc37a11f4fe18a0dc2aac3edcefd7ef6c0d.gz --- gestion/gest_crans.py | 2 +- gestion/ldap_crans.py | 178 ++++++++++++++++++++----------- lib/dialogwizard/dialogwizard.py | 2 +- lib/dialogwizard/wizard.py | 4 +- 4 files changed, 122 insertions(+), 64 deletions(-) diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index e00b45e4..fe978fbf 100644 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -191,7 +191,7 @@ def set_etudes(adher): arg += u'"P4" "Université Paris Sorbonne" ' arg += u'"P5" "Université René Descartes" ' arg += u'"P6" "Université Pierre et Marie Curie" ' - arg += u'"P7" "Université Denis Diderot" ' + arg += u'"P7" "Université Paris Diderot" ' arg += u'"P8" "Université Vincennes Saint Denis" ' arg += u'"P9" "Université Paris Dauphine" ' arg += u'"P10" "Université de Nanterre" ' diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 89c11727..1e734f3d 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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): diff --git a/lib/dialogwizard/dialogwizard.py b/lib/dialogwizard/dialogwizard.py index d0d7023c..38179a88 100755 --- a/lib/dialogwizard/dialogwizard.py +++ b/lib/dialogwizard/dialogwizard.py @@ -14,7 +14,7 @@ def really_quit(dico): raise EndScenario("game over!", data = dico) def error_handler(exc): - dialog.Dialog().msgbox(str(exc), width=0, height =0, title = 'Erreur :') + dialog.Dialog().msgbox(str(exc), widht=0, height =0, title = 'Erreur :') raise TryAgain() class DialogStepGenerator: diff --git a/lib/dialogwizard/wizard.py b/lib/dialogwizard/wizard.py index 01032a3d..900d8d08 100755 --- a/lib/dialogwizard/wizard.py +++ b/lib/dialogwizard/wizard.py @@ -118,7 +118,9 @@ class Running: if self.steps[0] == 'CASE' : switch, cases, fallback = self.steps[1] self.steps = self.steps[2] - plan_steps = cases.get(switch(self.env), fallback).steps + scenar = cases.get(switch(self.env), fallback) + if scenar: plan_steps = scenar.steps + else: plan_steps = None while plan_steps: self.steps = plan_steps[0], plan_steps[1], self.steps plan_steps = plan_steps[2]