From 31cbf7be0fbc549589b7016242b9716ff31d8802 Mon Sep 17 00:00:00 2001 From: klonfish Date: Sat, 4 May 2019 22:19:49 +0200 Subject: [PATCH] Avoid LDAP sync on irrelevant changes --- bam/ldap_sync.py | 8 ++++++++ bam/signals.py | 9 ++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bam/ldap_sync.py b/bam/ldap_sync.py index 48ab7a6..b975783 100644 --- a/bam/ldap_sync.py +++ b/bam/ldap_sync.py @@ -51,6 +51,14 @@ class LDAPUserEntry(): } passw_attr = 'userPassword' + @classmethod + def get_mapped_fields(cls): + fields = set() + fields.update(cls.attr_map.values()) + fields.update(cls.mandatory_attr_fallbacks.values()) + fields.add(cls.passw_attr) + return fields + def __init__(self, user, ldap_conn, base_dn): self.user = user self.base_dn = base_dn diff --git a/bam/signals.py b/bam/signals.py index ea7dd72..0b5dccc 100644 --- a/bam/signals.py +++ b/bam/signals.py @@ -2,7 +2,7 @@ from django.dispatch import receiver from django.db.models.signals import post_save, post_delete, m2m_changed from django.contrib.auth import get_user_model from django.conf import settings -from .ldap_sync import make_ldap_conn, LDAPAction, LDAPUserSyncer +from .ldap_sync import make_ldap_conn, LDAPUserEntry, LDAPUserSyncer User = get_user_model() @@ -25,8 +25,11 @@ def synchronous_user_sync(user, remove=False): ldap_conn.unbind_s() @receiver(post_save, sender=User) -def handle_user_save(sender, instance, **kwargs): - synchronous_user_sync(instance) +def handle_user_save(sender, instance, created, raw, using, update_fields, + **kwargs): + relevant_fields = LDAPUserEntry.get_mapped_fields() + if update_fields is None or not update_fields.isdisjoint(relevant_fields): + synchronous_user_sync(instance) @receiver(post_delete, sender=User) def handle_user_delete(sender, instance, **kwargs):