models: augment NotificationManager.notify() to also notify delegates recursively, fixes #3635
This commit is contained in:
parent
c37a4e933a
commit
a208f055ed
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue