diff --git a/lc_ldap.py b/lc_ldap.py index f381278..bb30a42 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -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 diff --git a/objets.py b/objets.py index 80423fc..a3f8990 100644 --- a/objets.py +++ b/objets.py @@ -209,13 +209,19 @@ class CransLdapObject(object): if login is None: login = self.conn.current_login self._check_optionnal(comment="créez") - - self.history_add(login, u"Inscription") + + try: + if self.conn.search(dn=self.dn): + raise ValueError ('objet existant: %s' % self.dn) + except ldap.NO_SUCH_OBJECT: + pass for attr in self.attrs.keys(): for attribut in self[attr]: attribut.check_uniqueness([]) + 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