X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=ldapdb%2Fmodels%2Fbase.py;h=1e47a53298da5e9036b95a4fb1e2a0f564231d22;hb=20e2c869ddee0fc85878c94c60512040b5c563ab;hp=c64e59d9d2fbc52ae766b6ea2ed9651f0cd06f3e;hpb=aefb80524ac814090b305bb508b06426081d7642;p=matthijs%2Fupstream%2Fdjango-ldapdb.git diff --git a/ldapdb/models/base.py b/ldapdb/models/base.py index c64e59d..1e47a53 100644 --- a/ldapdb/models/base.py +++ b/ldapdb/models/base.py @@ -33,10 +33,7 @@ class ModelBase(django.db.models.base.ModelBase): Metaclass for all LDAP models. """ def __new__(cls, name, bases, attrs): - attr_meta = attrs.get('Meta', None) - if attr_meta: - dn = attr_meta._dn - object_classes = attr_meta._object_classes + attr_meta = attrs.pop('Ldap', None) super_new = super(ModelBase, cls).__new__ new_class = super_new(cls, name, bases, attrs) @@ -48,8 +45,8 @@ class ModelBase(django.db.models.base.ModelBase): new_class._default_manager.get_query_set = get_query_set if attr_meta: - new_class._meta.dn = dn - new_class._meta.object_classes = attr_meta._object_classes + new_class._meta.dn = attr_meta.dn + new_class._meta.object_classes = attr_meta.object_classes return new_class @@ -59,17 +56,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): @@ -97,11 +106,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 @@ -113,9 +123,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