Historique plus souple.

Dans base_classes_crans, modifs devient un dictionnaire.
Franois, c'est  toi.

darcs-hash:20060120023038-68412-8a5b577ca9877e7c46c53b00a0b4a2773d6d2b58.gz
This commit is contained in:
glondu 2006-01-20 03:30:38 +01:00
parent 7e6b82566a
commit 5b075f28bf
2 changed files with 65 additions and 39 deletions

View file

@ -763,15 +763,26 @@ def set_solde(clas) :
arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() 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() 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) annul,res = dialog(arg)
if annul : return 1 if annul: return 1
try: # Ajout du commentaire
clas.solde(res[0]) arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom()
break arg+= u'--inputbox "Commentaire à insérer ?" 0 0'
except ValueError, c : annul, comment = dialog(arg)
arg = u'--title "Opération impossible" '
arg+= u'--msgbox "%s\n\n\n" 0 0' % c.args[0] if not annul:
dialog(arg) 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) : def confirm(clas) :
""" Demande confirmation avant enregistrement""" """ Demande confirmation avant enregistrement"""

View file

@ -830,7 +830,7 @@ class base_classes_crans(crans_ldap):
if self._data['blacklist'] != liste: if self._data['blacklist'] != liste:
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"): if not hasattr(self,"_blacklist_restart"):
self._blacklist_restart={} self._blacklist_restart={}
if not self._blacklist_restart.has_key(new[2]): if not self._blacklist_restart.has_key(new[2]):
@ -846,7 +846,7 @@ class base_classes_crans(crans_ldap):
def restore(self): def restore(self):
""" Restore les données à l'état initial """ """ Restore les données à l'état initial """
self._data = self._init_data.copy() self._data = self._init_data.copy()
self.modifs=[] self.modifs = {}
def historique(self): def historique(self):
""" Retourne l'historique de l'objet """ """ Retourne l'historique de l'objet """
@ -901,23 +901,25 @@ class base_classes_crans(crans_ldap):
# Construction de l'historique # Construction de l'historique
if not self._init_data: if not self._init_data:
modif='inscription' modif = 'inscription'
else: else:
### ON NE TOUCHE PAS A SELF.MODIFS, IL EST UTILISÉ PLUS LOIN !!!!!!! ### ON NE TOUCHE PAS A SELF.MODIFS, IL EST UTILISÉ PLUS LOIN !!!!!!!
# Copie locale de la liste # Dictionnaire local des modifs
modif = self.modifs[:] modif = {}
# Cas spécial # Cas spécial
if "solde" in self.modifs: if "solde" in self.modifs:
diff = float(self._init_data.get('solde',[0])[0]) - float(self._data.get('solde',[0])[0]) diff = float(self._init_data.get('solde',[0])[0]) - float(self._data.get('solde',[0])[0])
if diff > 0: if diff > 0:
modif[modif.index('solde')] = "debit %s Euros" % str(diff) modif['solde'] = "debit %s Euros" % str(diff)
else: 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) # 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 # 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 in self.modifs:
if champ not in self._init_data.keys(): if champ not in self._init_data.keys():
valeur_initiale = 'N/A' valeur_initiale = 'N/A'
@ -927,12 +929,13 @@ class base_classes_crans(crans_ldap):
valeur_finale = 'N/A' valeur_finale = 'N/A'
else: else:
valeur_finale = self._data[champ][0] valeur_finale = self._data[champ][0]
modif[modif.index(champ)] = '%s (%s -> %s)' % (champ, modif[champ] = '%s (%s -> %s)' % (champ,
valeur_initiale, valeur_initiale,
valeur_finale) valeur_finale)
# Formate les entrées de l'historique de la forme champ+diff-diff # 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 in self.modifs:
if champ == 'controle': if champ == 'controle':
# Ce n'est pas pareil que self._init_data.get('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 # 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 nouveau if d not in ancien ])
diff += ''.join([ '-%s' % decode(d) for d in ancien if d not in nouveau ]) 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 # 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() timestamp = localtime()
hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur ) 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 """ """ Sauvegarde puis destruction du dn (et des sous-dn) fourni """
# Commentaires # Commentaires
comment = preattr(comment)[1] comment = preattr(comment)[1]
self.modifs.append('destruction (%s)' % comment) self.modifs.setdefault('destruction (%s)' % comment, None)
self._save() self._save()
# Sauvegarde # Sauvegarde
@ -1053,13 +1062,18 @@ class base_classes_crans(crans_ldap):
except: except:
pass 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 """ """ Met à jour les données de data et modifie modifs si besoin """
if (not self._data.has_key(champ) and val != []) \ if (not self._data.has_key(champ) and val != []) \
or (self._data.has_key(champ) and self._data[champ]!=val): or (self._data.has_key(champ) and self._data[champ]!=val):
self._data[champ]=val self._data[champ]=val
if champ not in self.modifs: if self.modifs.get(champ) == None or comment == None:
self.modifs.append(champ) 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: if type(data) != tuple:
raise TypeError raise TypeError
self.modifs=[] self.modifs = {}
if data: if data:
self.dn=data[0] self.dn=data[0]
if mode == 'w': if mode == 'w':
@ -1183,10 +1197,11 @@ class base_proprietaire(base_classes_crans):
""" Retourne les machines wifi appartenant à l'instance """ """ Retourne les machines wifi appartenant à l'instance """
return filter(lambda x: x.ipsec(), self.machines()) 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 """ Retourne ou modifie le solde d'un propriétaire
operation doit être un nombre positif ou négatif 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]) solde = float(self._data.get('solde',[0])[0])
@ -1203,7 +1218,7 @@ class base_proprietaire(base_classes_crans):
if new < config.impression.decouvert: if new < config.impression.decouvert:
raise ValueError(u"Solde minimal atteind, opération non effectuée.") raise ValueError(u"Solde minimal atteind, opération non effectuée.")
self._set('solde',[str(new)]) self._set('solde',[str(new)], comment)
return new return new
def controle(self,new=None): def controle(self,new=None):
@ -1238,7 +1253,7 @@ class base_proprietaire(base_classes_crans):
if self._data.pop('controle') != []: if self._data.pop('controle') != []:
# Il y avait vraiment qqch avant # Il y avait vraiment qqch avant
if 'controle' not in self.modifs: if 'controle' not in self.modifs:
self.modifs.append('controle') self.modifs.setdefault('controle', None)
else: else:
self._set('controle',[actuel]) 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]]) self.services_to_restart('mail_modif',['uid=%s' % self._data['uid'][0]])
# Remise à zero # Remise à zero
self.modifs=[] self.modifs = {}
return ret return ret
@ -1445,7 +1460,7 @@ class base_proprietaire(base_classes_crans):
trans.remove(-action) trans.remove(-action)
touched = True touched = True
if touched and champ not in self.modifs: if touched and champ not in self.modifs:
self.modifs.append(champ) self.modifs.setdefault(champ, None)
trans.sort() trans.sort()
self._data[champ] = map(str, trans) self._data[champ] = map(str, trans)
@ -1758,7 +1773,7 @@ class adherent(base_proprietaire):
self._data['mail']= [ login ] self._data['mail']= [ login ]
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.append('compte') self.modifs.setdefault('compte', None)
# Création de l'alias cannonique # Création de l'alias cannonique
if self.nom() and self.prenom(): if self.nom() and self.prenom():
@ -1948,7 +1963,7 @@ class club(base_proprietaire):
self.lock('mail',login) self.lock('mail',login)
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.append('compte') self.modifs.setdefault('compte', None)
self._data['objectClass'] = [ 'club', 'posixAccount', 'shadowAccount' ] self._data['objectClass'] = [ 'club', 'posixAccount', 'shadowAccount' ]
self._data['uid'] = [ login ] self._data['uid'] = [ login ]
@ -1997,7 +2012,7 @@ class machine(base_classes_crans):
""" """
self.conn = conn self.conn = conn
if not self.conn: self.connect() if not self.conn: self.connect()
self.modifs=[] self.modifs = {}
t = parent_or_tuple.__class__ t = parent_or_tuple.__class__
if t == tuple: if t == tuple:
# Initialisation avec données fournies # Initialisation avec données fournies
@ -2537,7 +2552,7 @@ class machine(base_classes_crans):
self.services_to_restart('surveillance_machines') self.services_to_restart('surveillance_machines')
# Remise à zéro # Remise à zéro
self.modifs=[] self.modifs = {}
# Message de sortie # Message de sortie
ret += coul(u"Machine %s enregistrée avec succès." % self._data['host'][0],'vert') 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: if ports and self._data.get(champ)!=ports:
self._data[champ] = [ ports ] self._data[champ] = [ ports ]
if 'ports' not in self.modifs: if 'ports' not in self.modifs:
self.modifs.append('ports') self.modifs.setdefault('ports', None)
elif self._data.has_key(champ): elif self._data.has_key(champ):
self._data.pop(champ) self._data.pop(champ)
if 'ports' not in self.modifs: if 'ports' not in self.modifs:
self.modifs.append('ports') self.modifs.setdefault('ports', None)
class _fake_proprio(crans_ldap): class _fake_proprio(crans_ldap):
""" Définitions de base d'un propriétaire virtuel """ """ Définitions de base d'un propriétaire virtuel """