X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fdjango-ldapdb.git;a=blobdiff_plain;f=ldapdb%2Fmodels%2Fbase.py;h=8ff0c7a5e296b7a671b757b25abbc46f09ad5f51;hp=9ba331edfd45f43d75a859e7d5f0c6659405b89a;hb=e90edabc07b64ddb0e9800dd3bc071e51fb4081a;hpb=56baef02291c62a08688253b860cd9093cbcd6e0 diff --git a/ldapdb/models/base.py b/ldapdb/models/base.py index 9ba331e..8ff0c7a 100644 --- a/ldapdb/models/base.py +++ b/ldapdb/models/base.py @@ -59,14 +59,25 @@ class Model(django.db.models.base.Model): def __init__(self, dn=None, *args, **kwargs): self.dn = dn super(Model, self).__init__(*args, **kwargs) + self.saved_pk = self.pk - def build_dn(self): + def build_rdn(self): """ - Build the Distinguished Name for this entry. + Build the Relative Distinguished Name for this entry. """ + bits = [] for field in self._meta.local_fields: if field.primary_key: - return "%s=%s,%s" % (field.db_column, getattr(self, field.name), self._meta.dn) + bits.append("%s=%s" % (field.db_column, getattr(self, field.name))) + if not len(bits): + raise Exception("Could not build Distinguished Name") + return '+'.join(bits) + + def build_dn(self): + """ + Build the Distinguished Name for this entry. + """ + return "%s,%s" % (self.build_rdn(), self._meta.dn) raise Exception("Could not build Distinguished Name") def delete(self): @@ -94,11 +105,12 @@ class Model(django.db.models.base.Model): # update object self.dn = new_dn + self.saved_pk = self.pk return # update an existing entry modlist = [] - orig = self.__class__.objects.get(pk=self.pk) + orig = self.__class__.objects.get(pk=self.saved_pk) for field in self._meta.local_fields: if not field.db_column: continue @@ -110,9 +122,18 @@ class Model(django.db.models.base.Model): elif old_value: modlist.append((ldap.MOD_DELETE, field.db_column, None)) - if len(modlist): - logging.debug("Modifying existing LDAP entry %s" % self.dn) - ldapdb.connection.modify_s(self.dn, modlist) - else: + if not len(modlist): logging.debug("No changes to be saved to LDAP entry %s" % self.dn) + return + + # handle renaming + new_dn = self.build_dn() + if new_dn != self.dn: + logging.debug("Renaming LDAP entry %s to %s" % (self.dn, new_dn)) + ldapdb.connection.rename_s(self.dn, self.build_rdn()) + self.dn = new_dn + + logging.debug("Modifying existing LDAP entry %s" % self.dn) + ldapdb.connection.modify_s(self.dn, modlist) + self.saved_pk = self.pk