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,10 +763,21 @@ 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
# 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])
clas.solde(res[0], comment)
break
except ValueError, c :
arg = u'--title "Opération impossible" '

View file

@ -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,
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)
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 """