def save(self, using=None):
        """
        Saves the current instance.
        """
        signals.pre_save.send(sender=self.__class__, instance=self)
        
        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()

            for field in self._meta.fields:
                if not field.db_column:
                    continue
                value = getattr(self, field.name)
                value = field.get_db_prep_save(value, connection=connection)
                if value:
                    entry.append((field.db_column, value))

            logger.debug("Creating new LDAP entry %s" % new_dn)
            connection.add_s(new_dn, entry)

            # update object
            self.dn = new_dn

        else:
            # update an existing entry
            record_exists = True
            modlist = []
            orig = self.__class__.objects.using(using).get(pk=self.saved_pk)
            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:
                    new_value = field.get_db_prep_save(new_value, 
                                        connection=connection)
                    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:
                    logger.debug("Renaming LDAP entry %s to %s" % (self.dn,
                                                                   new_dn))
                    connection.rename_s(self.dn, self.build_rdn())
                    self.dn = new_dn

                logger.debug("Modifying existing LDAP entry %s" % self.dn)
                connection.modify_s(self.dn, modlist)
            else:
                logger.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))
dataset/ETHPy150Open django-ldapdb/django-ldapdb/ldapdb/models/base.py/Model.save/original