Browse Source

Avoid query ldap if update_fields is set with useless field for the ldap

Fabs 10 years ago
parent
commit
a02248c3be
2 changed files with 14 additions and 4 deletions
  1. 8 1
      coin/members/models.py
  2. 6 3
      coin/mixins.py

+ 8 - 1
coin/members/models.py

@@ -140,11 +140,18 @@ class Member(CoinLdapSyncMixin, AbstractUser):
 
         return username
 
-    def sync_to_ldap(self, creation):
+    def sync_to_ldap(self, creation, update_fields, *args, **kwargs):
         """
         Update LDAP data when a member is saved
         """
 
+        # Do not perform LDAP query if no usefull fields to update are specified
+        # in update_fields
+        # Ex : at login, last_login field is updated by django auth module.
+        if set(['username', 'last_name', 'first_name']).isdisjoint(set(update_fields)):
+            return
+
+        # Fail if no username specified
         assert self.username, ('Can\'t sync with LDAP because missing username '
                               'value for the Member : %s' % self)
 

+ 6 - 3
coin/mixins.py

@@ -13,12 +13,12 @@ class CoinLdapSyncMixin(object):
     la cohérence entre base de donnée et LDAP
     """
 
-    def sync_to_ldap(self, creation):
+    def sync_to_ldap(self, creation, *args, **kwargs):
         raise NotImplementedError('Using CoinLdapSyncModel require '
                                   'sync_to_ldap method being implemented')
 
 
-    def delete_from_ldap(self):
+    def delete_from_ldap(self, *args, **kwargs):
         raise NotImplementedError('Using CoinLdapSyncModel require '
                                   'delete_from_ldap method being implemented')
 
@@ -27,6 +27,9 @@ class CoinLdapSyncMixin(object):
         # Détermine si on est dans une création ou une mise à jour
         creation = (self.pk == None)
 
+        # Récupère les champs mis à jour si cela est précisé
+        update_fields = kwargs['update_fields'] if kwargs['update_fields'] else None
+
         # Sauvegarde en base de donnée (mais sans commit, cf decorator)
         super(CoinLdapSyncMixin, self).save(*args, **kwargs)
 
@@ -34,7 +37,7 @@ class CoinLdapSyncMixin(object):
         # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
         # commit
         try:
-            self.sync_to_ldap(creation)
+            self.sync_to_ldap(creation=creation,update_fields=update_fields)
         except:
             raise