[ressucite] On donne un nouvel id si l'id est déjà pris et on vérifie l'unicité seulement au moment d'enregistrer l'objet

par id j'entends aid, cid, fid, mid, tout ce que apparait dans un dn et qu'on ne
peut normalement par modifier tout seul après.
This commit is contained in:
Valentin Samir 2013-11-17 20:22:07 +01:00
parent aa573c3c35
commit 007bfeb54e
2 changed files with 26 additions and 17 deletions

View file

@ -124,32 +124,35 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
self.droits = []
self._username_given = user
def ressuscite(self, ldif_file, login=None):
if login is None:
login = self.current_login
def ressuscite_build_ldif(self, ldif_file):
ldif={}
for line in open(ldif_file).readlines():
line = line.split(':',1)
if len(line)==2:
(key, value) = line
ldif[key]=ldif.get(key, []) + [value.strip()]
dn = ldif['dn'][0]
del(ldif['dn'])
try:
dn = ldif['dn'][0]
del(ldif['dn'])
return (dn,ldif)
except KeyError as error:
raise KeyError("%s in %s" % (error, ldif_file))
def ressuscite(self, ldif_file, login=None):
if login is None:
login = self.current_login
(dn, ldif)= self.ressuscite_build_ldif(ldif_file)
# On définit de nouveaux dn si ceux-ci sont déjà pris
try:
if self.search(dn=dn):
raise ValueError ('objet existant: %s' % dn)
for id in ["aid", "mid", "fid", "cid"]:
if dn.startswith("%s=" % id):
ldif[id]=[str(self._find_id(id))]
dn="%s=%s,%s" % (id, ldif['aid'][0], dn.split(',',1)[1])
except ldap.NO_SUCH_OBJECT:
pass
obj = objets.new_cransldapobject(self, dn, mode='rw', uldif=ldif_to_uldif(ldif))
# On vérifie que les attibuts uniques que l'on veut réssuciter
# ne sont pas déjà dans ldap.
### TODO
### S'il existent déjà, traiter au cas par cas,
### par exemple, remettre l'ip/rid en automatique
for attr in obj.attrs.keys():
for attribut in obj[attr]:
attribut.check_uniqueness([])
# La vérification des attibuts uniques et de l'existance du dn est faite en appelant create()
obj.history_add(login, u"resurrection")
return obj