From c5cbac5468e7d1ca09dce6e3522d680d8e4534af Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Wed, 8 May 2013 01:14:30 +0200 Subject: [PATCH] [lc_ldap] Methode pour supprimer un objet et le ressuciter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit le cimetière est dans /home/cimetiere_lc/ ressucite prend le path du fichier contenant l'object à ressuciter --- lc_ldap.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lc_ldap.py b/lc_ldap.py index 116100a..62133a4 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -163,6 +163,23 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): self.dn = None self.droits = [] + def ressucite(self, ldif_file, login=current_user): + 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: + if self.search(dn=dn): + raise ValueError ('objet existant: %s' % dn) + except ldap.NO_SUCH_OBJECT: pass + obj = new_cransldapobject(self, dn, mode='rw', ldif=ldif) + obj.history_add(login, u"resurrection") + return obj + def user_to_dn(self, user): """Cherche le dn à partir de l'username.""" self._first_bind() @@ -554,6 +571,37 @@ class CransLdapObject(object): # Requête LDAP de création de l'objet self.conn.add_s(self.dn, modlist) + def delete(self, comm="", login=current_user): + def bury(self, comm, login): + self.history_add(login, u"destruction (%s)" % comm) + self.save() + #On produit un ldif + ldif=u"dn: %s\n" % self.dn + for key in self.attrs.keys(): + for value in self.attrs[key]: + ldif+=u"%s: %s\n" % (key, value) + + import datetime + file="%s %s" % (datetime.datetime.now(), self.dn) + f = open('/home/cimetiere_lc/%s/%s' % (self['objectClass'][0],file), 'w') + f.write(ldif.encode("UTF-8")) + f.close() + + if self.mode not in ['w', 'rw']: + raise EnvironmentError("Objet en lecture seule, réessayer en lecture/écriture") + if not self.may_be(deleted, self.conn.droits): + raise EnvironmentError("Vous n'avez pas le droit de supprimer %s." % self.dn) + ref = [ r[0] for r in self.conn.search_s(self.dn, 2) ] + ref.reverse() + for dn in ref: + if dn == self.dn: bury(self, comm, login) + else: + obj = new_cransldapobject(self.conn, dn, self.mode) + bury(obj, comm, login) + for dn in ref: + self.conn.delete_s(dn) + + def save(self): """Sauvegarde dans la base les modifications apportées à l'objet. Interne: Vérifie que ``self._modifs`` contient des valeurs correctes et