[PATCH 01/13] utils: Rework how notifications are selected

Stephen Finucane stephen.finucane at intel.com
Fri Mar 11 23:08:05 AEDT 2016


The current method of filtering valid patches from invalid ones is
effective, but incompatible with forthcoming rework that splits
the 'Patch' model into two models. Rework this, removing the
soon-to-be non-existant 'User.patch' reference.

Signed-off-by: Stephen Finucane <stephen.finucane at intel.com>
---
 patchwork/utils.py | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/patchwork/utils.py b/patchwork/utils.py
index 62ffc3a..4ca5642 100644
--- a/patchwork/utils.py
+++ b/patchwork/utils.py
@@ -26,7 +26,7 @@ from django.conf import settings
 from django.contrib.auth.models import User
 from django.contrib.sites.models import Site
 from django.core.mail import EmailMessage
-from django.db.models import Max, Q, F
+from django.db.models import Count, Q, F
 from django.template.loader import render_to_string
 
 from patchwork.models import (PatchChangeNotification, EmailOptout,
@@ -37,14 +37,16 @@ def send_notifications():
     date_limit = datetime.datetime.now() - datetime.timedelta(
         minutes=settings.NOTIFICATION_DELAY_MINUTES)
 
-    # This gets funky: we want to filter out any notifications that should
-    # be grouped with other notifications that aren't ready to go out yet. To
-    # do that, we join back onto PatchChangeNotification (PCN -> Patch ->
-    # Person -> Patch -> max(PCN.last_modified)), filtering out any maxima
-    # that are with the date_limit.
-    qs = PatchChangeNotification.objects.annotate(
-        m=Max('patch__submitter__patch__patchchangenotification'
-              '__last_modified')).filter(m__lt=date_limit)
+    # We delay sending notifications to a user if they have other
+    # notifications that are still in the "pending" state. To do this,
+    # we compare the total number of patch change notifications queued
+    # for each user against the number of "ready" notifications.
+    qs = PatchChangeNotification.objects.all()
+    qs2 = PatchChangeNotification.objects\
+        .filter(last_modified__lt=date_limit)\
+        .values('patch__submitter')\
+        .annotate(count=Count('patch__submitter'))
+    qs2 = {elem['patch__submitter']: elem['count'] for elem in qs2}
 
     groups = itertools.groupby(qs.order_by('patch__submitter'),
                                lambda n: n.patch.submitter)
@@ -53,6 +55,10 @@ def send_notifications():
 
     for (recipient, notifications) in groups:
         notifications = list(notifications)
+
+        if recipient.id not in qs2 or qs2[recipient.id] < len(notifications):
+            continue
+
         projects = set([n.patch.project.linkname for n in notifications])
 
         def delete_notifications():
-- 
2.0.0



More information about the Patchwork mailing list