[PATCH 03/10] notifications: fix notification expiry when no user is associated

Daniel Axtens dja at axtens.net
Tue Apr 30 16:03:01 AEST 2019

From: Jeremy Kerr <jk at ozlabs.org>

It's possible that an EmailConfirmation object will have no associated
user (eg, for email opt-out, which does not require a user object). In
this case, we will see a NULL value for EmailConfirmation.user_id.

However, having a NULL value appear in a SQL 'IN' clause will match
every value. This means that once one of these null-user
EmailConfirmations is present, we will never expire any non-active user

This change adds a filter for a valid user_id when we query for active
EmailConfirmation objects. This means we'll have a valid values set to
use in the pending_confs set.

Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
[dja: fix pep8 issue]
Signed-off-by: Daniel Axtens <dja at axtens.net>
(cherry picked from commit d0b79d9dee04aee13c8d64a193a7818f72eeca3b)
Signed-off-by: Daniel Axtens <dja at axtens.net>
 patchwork/notifications.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/patchwork/notifications.py b/patchwork/notifications.py
index a5f642352c1d..dce525aba57e 100644
--- a/patchwork/notifications.py
+++ b/patchwork/notifications.py
@@ -109,7 +109,8 @@ def expire_notifications():
     # remove inactive users with no pending confirmation
-    pending_confs = EmailConfirmation.objects.values('user')
+    pending_confs = (EmailConfirmation.objects
+                     .filter(user__isnull=False).values('user'))
     users = User.objects.filter(is_active=False).exclude(id__in=pending_confs)
     # delete users

More information about the Patchwork mailing list