use django's database router instead of hard-coding ldapdb.connection
[matthijs/upstream/django-ldapdb.git] / ldapdb / models / base.py
index e98133b58cc7f596f61c365cadfb8b12a27df6a5..cd407a271192788178750a0dfad1542db00e3819 100644 (file)
@@ -68,25 +68,28 @@ class Model(django.db.models.base.Model):
 
     # meta-data
     base_dn = None
 
     # meta-data
     base_dn = None
+    search_scope = ldap.SCOPE_SUBTREE
     object_classes = ['top']
 
     def __init__(self, *args, **kwargs):
         super(Model, self).__init__(*args, **kwargs)
         self.saved_pk = self.pk
 
     object_classes = ['top']
 
     def __init__(self, *args, **kwargs):
         super(Model, self).__init__(*args, **kwargs)
         self.saved_pk = self.pk
 
-    def _collect_sub_objects(self, collector):
+    def _collect_sub_objects(self, seen_objs, parent=None, nullable=False):
         """
         This private API seems to be called by the admin interface in django 1.2
         """
         """
         This private API seems to be called by the admin interface in django 1.2
         """
-        pass
+        pk_val = self._get_pk_val()
+        seen_objs.add(self.__class__, pk_val, self,
+                      type(parent), parent, nullable)
 
     def build_rdn(self):
         """
         Build the Relative Distinguished Name for this entry.
         """
         bits = []
 
     def build_rdn(self):
         """
         Build the Relative Distinguished Name for this entry.
         """
         bits = []
-        for field in self._meta.local_fields:
-            if field.primary_key:
+        for field in self._meta.fields:
+            if field.db_column and field.primary_key:
                 bits.append("%s=%s" % (field.db_column, getattr(self, field.name)))
         if not len(bits):
             raise Exception("Could not build Distinguished Name")
                 bits.append("%s=%s" % (field.db_column, getattr(self, field.name)))
         if not len(bits):
             raise Exception("Could not build Distinguished Name")
@@ -103,26 +106,33 @@ class Model(django.db.models.base.Model):
         """
         Delete this entry.
         """
         """
         Delete this entry.
         """
+        using = using or router.db_for_write(self.__class__, instance=self)
+        connection = connections[using]
         logging.debug("Deleting LDAP entry %s" % self.dn)
         logging.debug("Deleting LDAP entry %s" % self.dn)
-        ldapdb.connection.delete_s(self.dn)
+        connection.delete_s(self.dn)
         signals.post_delete.send(sender=self.__class__, instance=self)
         signals.post_delete.send(sender=self.__class__, instance=self)
-        
-    def save(self):
+
+    def save(self, using=None):
+        """
+        Saves the current instance.
+        """
+        using = using or router.db_for_write(self.__class__, instance=self)
+        connection = connections[using]
         if not self.dn:
             # create a new entry
             record_exists = False 
             entry = [('objectClass', self.object_classes)]
             new_dn = self.build_dn()
 
         if not self.dn:
             # create a new entry
             record_exists = False 
             entry = [('objectClass', self.object_classes)]
             new_dn = self.build_dn()
 
-            for field in self._meta.local_fields:
+            for field in self._meta.fields:
                 if not field.db_column:
                     continue
                 value = getattr(self, field.name)
                 if value:
                 if not field.db_column:
                     continue
                 value = getattr(self, field.name)
                 if value:
-                    entry.append((field.db_column, field.get_db_prep_save(value, connection=ldapdb.connection)))
+                    entry.append((field.db_column, field.get_db_prep_save(value, connection=connection)))
 
             logging.debug("Creating new LDAP entry %s" % new_dn)
 
             logging.debug("Creating new LDAP entry %s" % new_dn)
-            ldapdb.connection.add_s(new_dn, entry)
+            connection.add_s(new_dn, entry)
 
             # update object
             self.dn = new_dn
 
             # update object
             self.dn = new_dn
@@ -132,14 +142,14 @@ class Model(django.db.models.base.Model):
             record_exists = True
             modlist = []
             orig = self.__class__.objects.get(pk=self.saved_pk)
             record_exists = True
             modlist = []
             orig = self.__class__.objects.get(pk=self.saved_pk)
-            for field in self._meta.local_fields:
+            for field in self._meta.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:
                 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, field.get_db_prep_save(new_value, connection=ldapdb.connection)))
+                        modlist.append((ldap.MOD_REPLACE, field.db_column, field.get_db_prep_save(new_value, connection=connection)))
                     elif old_value:
                         modlist.append((ldap.MOD_DELETE, field.db_column, None))
 
                     elif old_value:
                         modlist.append((ldap.MOD_DELETE, field.db_column, None))
 
@@ -148,11 +158,11 @@ class Model(django.db.models.base.Model):
                 new_dn = self.build_dn()
                 if new_dn != self.dn:
                     logging.debug("Renaming LDAP entry %s to %s" % (self.dn, new_dn))
                 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())
+                    connection.rename_s(self.dn, self.build_rdn())
                     self.dn = new_dn
             
                 logging.debug("Modifying existing LDAP entry %s" % self.dn)
                     self.dn = new_dn
             
                 logging.debug("Modifying existing LDAP entry %s" % self.dn)
-                ldapdb.connection.modify_s(self.dn, modlist)
+                connection.modify_s(self.dn, modlist)
             else:
                 logging.debug("No changes to be saved to LDAP entry %s" % self.dn)
 
             else:
                 logging.debug("No changes to be saved to LDAP entry %s" % self.dn)