From 5b075f28bff2aeb4493b1c3fea0e2cac4dd2bb4e Mon Sep 17 00:00:00 2001 From: glondu Date: Fri, 20 Jan 2006 03:30:38 +0100 Subject: [PATCH] Historique plus souple. Dans base_classes_crans, modifs devient un dictionnaire. Franois, c'est toi. darcs-hash:20060120023038-68412-8a5b577ca9877e7c46c53b00a0b4a2773d6d2b58.gz --- gestion/gest_crans.py | 27 ++++++++++----- gestion/ldap_crans.py | 77 ++++++++++++++++++++++++++----------------- 2 files changed, 65 insertions(+), 39 deletions(-) diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index a2d15faa..466cf697 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -763,15 +763,26 @@ def set_solde(clas) : arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() arg+= u'--inputbox "Solde actuel : %s\n Opération à effectuer (+ pour crédits et - pour débit) ?" 0 0 "" ' % clas.solde() annul,res = dialog(arg) - if annul : return 1 + if annul: return 1 - try: - clas.solde(res[0]) - break - except ValueError, c : - arg = u'--title "Opération impossible" ' - arg+= u'--msgbox "%s\n\n\n" 0 0' % c.args[0] - dialog(arg) + # Ajout du commentaire + arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() + arg+= u'--inputbox "Commentaire à insérer ?" 0 0' + annul, comment = dialog(arg) + + if not annul: + if comment[0]: + comment = comment[0] + else: + comment = None + + try: + clas.solde(res[0], comment) + break + except ValueError, c : + arg = u'--title "Opération impossible" ' + arg+= u'--msgbox "%s\n\n\n" 0 0' % c.args[0] + dialog(arg) def confirm(clas) : """ Demande confirmation avant enregistrement""" diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 31b1da41..d1aa7118 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -830,7 +830,7 @@ class base_classes_crans(crans_ldap): if self._data['blacklist'] != liste: self._data['blacklist']=liste - self.modifs.append('blacklist_' + new[2]) + self.modifs.setdefault('blacklist_' + new[2], None) if not hasattr(self,"_blacklist_restart"): self._blacklist_restart={} if not self._blacklist_restart.has_key(new[2]): @@ -846,7 +846,7 @@ class base_classes_crans(crans_ldap): def restore(self): """ Restore les données à l'état initial """ self._data = self._init_data.copy() - self.modifs=[] + self.modifs = {} def historique(self): """ Retourne l'historique de l'objet """ @@ -901,23 +901,25 @@ class base_classes_crans(crans_ldap): # Construction de l'historique if not self._init_data: - modif='inscription' + modif = 'inscription' else: ### ON NE TOUCHE PAS A SELF.MODIFS, IL EST UTILISÉ PLUS LOIN !!!!!!! - # Copie locale de la liste - modif = self.modifs[:] + # Dictionnaire local des modifs + modif = {} # Cas spécial if "solde" in self.modifs: diff = float(self._init_data.get('solde',[0])[0]) - float(self._data.get('solde',[0])[0]) if diff > 0: - modif[modif.index('solde')] = "debit %s Euros" % str(diff) + modif['solde'] = "debit %s Euros" % str(diff) else: - modif[modif.index('solde')] = "credit %s Euros" % str(-diff) + modif['solde'] = "credit %s Euros" % str(-diff) # Formate les entrées de l'historique de la forme champ (ancien -> nouveau) # On suppose que le champ apparaît forcément dans l'enregistrement - for champ in ['chbre', 'nom', 'prenom', 'puissance', 'canal', 'prise', 'responsable', 'contourneGreylist']: + for champ in ['chbre', 'nom', 'prenom', 'mail', + 'puissance', 'canal', 'prise', 'responsable', + 'contourneGreylist']: if champ in self.modifs: if champ not in self._init_data.keys(): valeur_initiale = 'N/A' @@ -927,12 +929,13 @@ class base_classes_crans(crans_ldap): valeur_finale = 'N/A' else: valeur_finale = self._data[champ][0] - modif[modif.index(champ)] = '%s (%s -> %s)' % (champ, - valeur_initiale, - valeur_finale) + modif[champ] = '%s (%s -> %s)' % (champ, + valeur_initiale, + valeur_finale) # Formate les entrées de l'historique de la forme champ+diff-diff - for champ in ['droits', 'controle', 'paiement', 'carteEtudiant', 'mailAlias', 'hostAlias', 'exempt']: + for champ in ['droits', 'controle', 'paiement', 'carteEtudiant', + 'mailAlias', 'hostAlias', 'exempt']: if champ in self.modifs: if champ == 'controle': # Ce n'est pas pareil que self._init_data.get('controle', ['']) @@ -948,10 +951,16 @@ class base_classes_crans(crans_ldap): # On établit le diff diff = ''.join([ '+%s' % decode(d) for d in nouveau if d not in ancien ]) diff += ''.join([ '-%s' % decode(d) for d in ancien if d not in nouveau ]) - modif[modif.index(champ)] = champ + diff + modif[champ] = champ + diff # On recolle tous les morceaux - modif = ', '.join(modif) + liste_historique = [] + for champ in self.modifs.keys(): + ligne = modif.get(champ, champ) + if self.modifs[champ] != None: + ligne += ' [%s]' % self.modifs[champ] + liste_historique.append(ligne) + modif = ', '.join(liste_historique) timestamp = localtime() hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur ) @@ -1027,7 +1036,7 @@ class base_classes_crans(crans_ldap): """ Sauvegarde puis destruction du dn (et des sous-dn) fourni """ # Commentaires comment = preattr(comment)[1] - self.modifs.append('destruction (%s)' % comment) + self.modifs.setdefault('destruction (%s)' % comment, None) self._save() # Sauvegarde @@ -1053,13 +1062,18 @@ class base_classes_crans(crans_ldap): except: pass - def _set(self,champ,val): + def _set(self, champ, val, comment=None): """ Met à jour les données de data et modifie modifs si besoin """ if (not self._data.has_key(champ) and val != []) \ or (self._data.has_key(champ) and self._data[champ]!=val): self._data[champ]=val - if champ not in self.modifs: - self.modifs.append(champ) + if self.modifs.get(champ) == None or comment == None: + self.modifs[champ] = comment + else: + # Ici, self.modifs[champ] et comment devraient être tous deux + # des chaînes de caractères + self.modifs[champ] += ', ' + comment + ############################################################################# @@ -1083,7 +1097,7 @@ class base_proprietaire(base_classes_crans): if type(data) != tuple: raise TypeError - self.modifs=[] + self.modifs = {} if data: self.dn=data[0] if mode == 'w': @@ -1183,10 +1197,11 @@ class base_proprietaire(base_classes_crans): """ Retourne les machines wifi appartenant à l'instance """ return filter(lambda x: x.ipsec(), self.machines()) - def solde(self, operation=None): + def solde(self, operation=None, comment=None): """ Retourne ou modifie le solde d'un propriétaire operation doit être un nombre positif ou négatif - (string ou int ou float) + (string ou int ou float) + comment est un commentaire à rajouter dans l'historique """ solde = float(self._data.get('solde',[0])[0]) @@ -1203,7 +1218,7 @@ class base_proprietaire(base_classes_crans): if new < config.impression.decouvert: raise ValueError(u"Solde minimal atteind, opération non effectuée.") - self._set('solde',[str(new)]) + self._set('solde',[str(new)], comment) return new def controle(self,new=None): @@ -1238,7 +1253,7 @@ class base_proprietaire(base_classes_crans): if self._data.pop('controle') != []: # Il y avait vraiment qqch avant if 'controle' not in self.modifs: - self.modifs.append('controle') + self.modifs.setdefault('controle', None) else: self._set('controle',[actuel]) @@ -1415,7 +1430,7 @@ class base_proprietaire(base_classes_crans): self.services_to_restart('mail_modif',['uid=%s' % self._data['uid'][0]]) # Remise à zero - self.modifs=[] + self.modifs = {} return ret @@ -1445,7 +1460,7 @@ class base_proprietaire(base_classes_crans): trans.remove(-action) touched = True if touched and champ not in self.modifs: - self.modifs.append(champ) + self.modifs.setdefault(champ, None) trans.sort() self._data[champ] = map(str, trans) @@ -1758,7 +1773,7 @@ class adherent(base_proprietaire): self._data['mail']= [ login ] if not 'compte' in self.modifs: - self.modifs.append('compte') + self.modifs.setdefault('compte', None) # Création de l'alias cannonique if self.nom() and self.prenom(): @@ -1948,7 +1963,7 @@ class club(base_proprietaire): self.lock('mail',login) if not 'compte' in self.modifs: - self.modifs.append('compte') + self.modifs.setdefault('compte', None) self._data['objectClass'] = [ 'club', 'posixAccount', 'shadowAccount' ] self._data['uid'] = [ login ] @@ -1997,7 +2012,7 @@ class machine(base_classes_crans): """ self.conn = conn if not self.conn: self.connect() - self.modifs=[] + self.modifs = {} t = parent_or_tuple.__class__ if t == tuple: # Initialisation avec données fournies @@ -2537,7 +2552,7 @@ class machine(base_classes_crans): self.services_to_restart('surveillance_machines') # Remise à zéro - self.modifs=[] + self.modifs = {} # Message de sortie ret += coul(u"Machine %s enregistrée avec succès." % self._data['host'][0],'vert') @@ -2589,11 +2604,11 @@ class machine(base_classes_crans): if ports and self._data.get(champ)!=ports: self._data[champ] = [ ports ] if 'ports' not in self.modifs: - self.modifs.append('ports') + self.modifs.setdefault('ports', None) elif self._data.has_key(champ): self._data.pop(champ) if 'ports' not in self.modifs: - self.modifs.append('ports') + self.modifs.setdefault('ports', None) class _fake_proprio(crans_ldap): """ Définitions de base d'un propriétaire virtuel """