1
0
Parcourir la source

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

Fabs il y a 10 ans
Parent
commit
a02248c3be
2 fichiers modifiés avec 14 ajouts et 4 suppressions
  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
         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
         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 '
         assert self.username, ('Can\'t sync with LDAP because missing username '
                               'value for the Member : %s' % self)
                               '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
     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 '
         raise NotImplementedError('Using CoinLdapSyncModel require '
                                   'sync_to_ldap method being implemented')
                                   'sync_to_ldap method being implemented')
 
 
 
 
-    def delete_from_ldap(self):
+    def delete_from_ldap(self, *args, **kwargs):
         raise NotImplementedError('Using CoinLdapSyncModel require '
         raise NotImplementedError('Using CoinLdapSyncModel require '
                                   'delete_from_ldap method being implemented')
                                   '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
         # Détermine si on est dans une création ou une mise à jour
         creation = (self.pk == None)
         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)
         # Sauvegarde en base de donnée (mais sans commit, cf decorator)
         super(CoinLdapSyncMixin, self).save(*args, **kwargs)
         super(CoinLdapSyncMixin, self).save(*args, **kwargs)
 
 
@@ -34,7 +37,7 @@ class CoinLdapSyncMixin(object):
         # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
         # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
         # commit
         # commit
         try:
         try:
-            self.sync_to_ldap(creation)
+            self.sync_to_ldap(creation=creation,update_fields=update_fields)
         except:
         except:
             raise
             raise