X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=ldapdb%2Fmodels%2Fbase.py;h=3c15151ba53fe154234e535b52a3ff594e142982;hb=8cb1fdd93c7a4ffce12fc9b29397499046c56ab6;hp=9ba331edfd45f43d75a859e7d5f0c6659405b89a;hpb=c1265f3b8c5d88ac3fa0de1a4b1756c6cdc9d7a2;p=matthijs%2Fupstream%2Fdjango-ldapdb.git diff --git a/ldapdb/models/base.py b/ldapdb/models/base.py index 9ba331e..3c15151 100644 --- a/ldapdb/models/base.py +++ b/ldapdb/models/base.py @@ -24,6 +24,7 @@ import ldap import logging import django.db.models +from django.db.models import signals import ldapdb from ldapdb.models.query import QuerySet @@ -56,17 +57,29 @@ class Model(django.db.models.base.Model): """ __metaclass__ = ModelBase - def __init__(self, dn=None, *args, **kwargs): - self.dn = dn + dn = django.db.models.fields.CharField(max_length=200) + + def __init__(self, *args, **kwargs): 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): @@ -75,10 +88,12 @@ class Model(django.db.models.base.Model): """ logging.debug("Deleting LDAP entry %s" % self.dn) ldapdb.connection.delete_s(self.dn) + signals.post_delete.send(sender=self.__class__, instance=self) def save(self): - # create a new entry if not self.dn: + # create a new entry + record_exists = False entry = [('objectClass', self._meta.object_classes)] new_dn = self.build_dn() @@ -91,28 +106,40 @@ class Model(django.db.models.base.Model): logging.debug("Creating new LDAP entry %s" % new_dn) ldapdb.connection.add_s(new_dn, entry) - + # update object self.dn = new_dn - return - # update an existing entry - modlist = [] - orig = self.__class__.objects.get(pk=self.pk) - for field in self._meta.local_fields: - if not field.db_column: - continue - old_value = getattr(orig, field.name, None) - new_value = getattr(self, field.name, None) - if old_value != new_value: - if new_value: - modlist.append((ldap.MOD_REPLACE, field.db_column, new_value)) - 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: - logging.debug("No changes to be saved to LDAP entry %s" % self.dn) + # update an existing entry + record_exists = True + modlist = [] + orig = self.__class__.objects.get(pk=self.saved_pk) + for field in self._meta.local_fields: + if not field.db_column: + continue + old_value = getattr(orig, field.name, None) + new_value = getattr(self, field.name, None) + if old_value != new_value: + if new_value: + modlist.append((ldap.MOD_REPLACE, field.db_column, new_value)) + elif old_value: + modlist.append((ldap.MOD_DELETE, field.db_column, None)) + + if len(modlist): + # 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) + else: + logging.debug("No changes to be saved to LDAP entry %s" % self.dn) + + # done + self.saved_pk = self.pk + signals.post_save.send(sender=self.__class__, instance=self, created=(not record_exists))