[global] On diminue le risque de lock résiduel, et on corrige une faille des fonctions new[A-Z]*
* En cas d'erreur au create ou au save, on supprime les locks malgré tout * Les fonctions new* modifiaient directement le dico qu'on leur passait en argument, on fait désormais une copie de celui-ci, de façon à ce que test.py n'instancie pas toujours le même objet en croyant instancier des objets différents à chaque fois * Cela permet de trouver une typo dans services.py * crans_utils a été un peu corrigé.
This commit is contained in:
parent
e0bce3f7d3
commit
616acdbb7a
6 changed files with 52 additions and 21 deletions
37
objets.py
37
objets.py
|
@ -44,6 +44,7 @@ import re
|
|||
import datetime
|
||||
import time
|
||||
import ldap
|
||||
import traceback
|
||||
from ldap.modlist import addModlist, modifyModlist
|
||||
|
||||
## import locaux
|
||||
|
@ -189,24 +190,36 @@ class CransLdapObject(object):
|
|||
faite"""
|
||||
pass
|
||||
|
||||
def create(self):
|
||||
def create(self, login=None):
|
||||
"""Crée l'objet dans la base ldap, cette méthode vise à faire en sorte que
|
||||
l'objet se crée lui-même, si celui qui essaye de le modifier a les droits
|
||||
de le faire."""
|
||||
if login is None:
|
||||
login = self.conn.current_login
|
||||
self._check_optionnal(comment="créez")
|
||||
|
||||
self.history_add(login, u"Inscription")
|
||||
|
||||
# Création de la requête LDAP
|
||||
modlist = addModlist(self._modifs.to_ldif())
|
||||
# Requête LDAP de création de l'objet
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
try:
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
except Exception:
|
||||
print traceback.format_exc()
|
||||
return
|
||||
# On nettoie les locks
|
||||
for key, values in self._modifs.to_ldif().iteritems():
|
||||
for value in values:
|
||||
self.conn.lockholder.removelock(key, value)
|
||||
self.conn.lockholder.purge(id(self))
|
||||
|
||||
# Services à relancer
|
||||
services.services_to_restart(self.conn, {}, self._modifs)
|
||||
self._post_creation()
|
||||
|
||||
# Vérifications après insertion.
|
||||
self.check_modifs()
|
||||
|
||||
def bury(self, comm, login):
|
||||
"""Sauvegarde l'objet dans un fichier dans le cimetière."""
|
||||
|
@ -251,25 +264,33 @@ class CransLdapObject(object):
|
|||
try:
|
||||
self.conn.modify_s(self.dn, modlist)
|
||||
except:
|
||||
# On nettoie les locks
|
||||
self.conn.lockholder.purge(id(self))
|
||||
self._modifs = self.attrs
|
||||
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ?")
|
||||
|
||||
# On programme le redémarrage des services
|
||||
services.services_to_restart(self.conn, self.attrs, self._modifs)
|
||||
|
||||
# On nettoie les locks
|
||||
self.conn.lockholder.purge(id(self))
|
||||
# Vérification des modifications.
|
||||
self.check_modifs()
|
||||
|
||||
def check_modifs(self):
|
||||
"""
|
||||
Fonction qui vérifie que les modifications se sont bien
|
||||
passées.
|
||||
"""
|
||||
# Vérification des modifications
|
||||
old_ldif = self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1]
|
||||
old_uldif = lc_ldap.ldif_to_uldif(old_ldif)
|
||||
old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1])
|
||||
self.attrs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
|
||||
differences = []
|
||||
# On fait les différences entre les deux dicos
|
||||
for attr in set(self.attrs.keys()).union(set(self._modifs.keys())):
|
||||
exp_vals = set([unicode(i) for i in self.attrs.get(attr, [])])
|
||||
new_vals = set([unicode(i) for i in self._modifs.get(attr, [])])
|
||||
exp_vals = set([str(i) for i in self.attrs.get(attr, [])])
|
||||
new_vals = set([str(i) for i in self._modifs.get(attr, [])])
|
||||
if exp_vals != new_vals:
|
||||
differences.append({"missing": exp_vals - new_vals, "having": new_vals - exp_vals})
|
||||
print differences[-1]
|
||||
if differences:
|
||||
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue