From 007bfeb54e595fc2a81d0759b8afcee14abb8d93 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sun, 17 Nov 2013 20:22:07 +0100 Subject: [PATCH] =?UTF-8?q?[ressucite]=20On=20donne=20un=20nouvel=20id=20s?= =?UTF-8?q?i=20l'id=20est=20d=C3=A9j=C3=A0=20pris=20et=20on=20v=C3=A9rifie?= =?UTF-8?q?=20l'unicit=C3=A9=20seulement=20au=20moment=20d'enregistrer=20l?= =?UTF-8?q?'objet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- lc_ldap.py | 33 ++++++++++++++++++--------------- objets.py | 10 ++++++++-- 2 files changed, 26 insertions(+), 17 deletions(-) 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