From a208f055eda6aa8851d8486748cdf82e3c42e856 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 17 Sep 2013 21:07:36 +0200 Subject: [PATCH] models: augment NotificationManager.notify() to also notify delegates recursively, fixes #3635 --- docbow_project/docbow/models.py | 3 +++ docbow_project/docbow/utils.py | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docbow_project/docbow/models.py b/docbow_project/docbow/models.py index 76f2313..3ad3179 100644 --- a/docbow_project/docbow/models.py +++ b/docbow_project/docbow/models.py @@ -23,6 +23,7 @@ import timestamp from .validators import validate_phone from .utils import file_match_mime_types from . import app_settings +from . import utils DOCBOW_APP = _('docbow') DOCBOW_APP = _('Docbow_App') @@ -729,6 +730,8 @@ class DocbowProfile(Model): class NotificationManager(Manager): def notify(self, document=None, users=None, kind='new-document', ctx=None): '''Build notifications in bulk''' + users = utils.queryset_fixpoint(users, + lambda s: User.objects.filter(delegations_by__by__in=s)) notifications = [Notification(user=user, document=document, kind=kind, ctx=ctx) for user in users] self.bulk_create(notifications) diff --git a/docbow_project/docbow/utils.py b/docbow_project/docbow/utils.py index f031418..0e02f7b 100644 --- a/docbow_project/docbow/utils.py +++ b/docbow_project/docbow/utils.py @@ -73,4 +73,12 @@ def date_to_aware_datetime(date): datetime.datetime(date.year, date.month, date.day), timezone.get_current_timezone()) - +def queryset_fixpoint(initial, qs_function): + initial = set(initial) + count = len(initial) + while True: + initial |= set(qs_function(initial)) + if len(initial) == count: + break + count = len(initial) + return initial