summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2011-04-14 19:37:55 +0800
committerJeremy Kerr <jk@ozlabs.org>2011-04-14 19:37:55 +0800
commitf1e5f6a2c9d737f12290f5bd5a934b74c362616f (patch)
tree5917844b4f15870e9a0015f2ebd1d928190bf9cb /apps
parent017f73b059aadfce30ee29d2aceeab92739105a6 (diff)
downloadpatchwork-f1e5f6a2c9d737f12290f5bd5a934b74c362616f.tar.bz2
patchwork-f1e5f6a2c9d737f12290f5bd5a934b74c362616f.tar.xz
notifications: implement opt-outnotifications
Check for opt-out status before sending notification mail. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'apps')
-rw-r--r--apps/patchwork/models.py5
-rw-r--r--apps/patchwork/tests/notifications.py14
-rw-r--r--apps/patchwork/utils.py13
3 files changed, 29 insertions, 3 deletions
diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py
index 17a68db..22062c2 100644
--- a/apps/patchwork/models.py
+++ b/apps/patchwork/models.py
@@ -408,6 +408,11 @@ class EmailOptout(models.Model):
def __unicode__(self):
return self.email
+ @classmethod
+ def is_optout(cls, email):
+ email = email.lower().strip()
+ return cls.objects.filter(email = email).count() > 0
+
class PatchChangeNotification(models.Model):
patch = models.ForeignKey(Patch, primary_key = True)
last_modified = models.DateTimeField(default = datetime.datetime.now)
diff --git a/apps/patchwork/tests/notifications.py b/apps/patchwork/tests/notifications.py
index ae37988..f14b30b 100644
--- a/apps/patchwork/tests/notifications.py
+++ b/apps/patchwork/tests/notifications.py
@@ -23,7 +23,7 @@ from django.core.urlresolvers import reverse
from django.core import mail
from django.conf import settings
from django.db.utils import IntegrityError
-from patchwork.models import Patch, State, PatchChangeNotification
+from patchwork.models import Patch, State, PatchChangeNotification, EmailOptout
from patchwork.tests.utils import defaults, create_maintainer
from patchwork.utils import send_notifications
@@ -172,6 +172,18 @@ class PatchNotificationEmailTest(TestCase):
self.assertEquals(msg.to, [self.submitter.email])
self.assertTrue(self.patch.get_absolute_url() in msg.body)
+ def testNotificationOptout(self):
+ """ensure opt-out addresses don't get notifications"""
+ PatchChangeNotification(patch = self.patch,
+ orig_state = self.patch.state).save()
+ self._expireNotifications()
+
+ EmailOptout(email = self.submitter.email).save()
+
+ errors = send_notifications()
+ self.assertEquals(errors, [])
+ self.assertEquals(len(mail.outbox), 0)
+
def testNotificationMerge(self):
patches = [self.patch,
Patch(project = self.project, msgid = 'testpatch-2',
diff --git a/apps/patchwork/utils.py b/apps/patchwork/utils.py
index 58edb19..5cb45e8 100644
--- a/apps/patchwork/utils.py
+++ b/apps/patchwork/utils.py
@@ -28,7 +28,7 @@ from django.core.mail import EmailMessage
from django.db.models import Max
from patchwork.forms import MultiplePatchForm
from patchwork.models import Bundle, Project, BundlePatch, UserProfile, \
- PatchChangeNotification
+ PatchChangeNotification, EmailOptout
def get_patch_ids(d, prefix = 'patch_id'):
ids = []
@@ -169,6 +169,15 @@ def send_notifications():
for (recipient, notifications) in groups:
notifications = list(notifications)
+
+ def delete_notifications():
+ PatchChangeNotification.objects.filter(
+ pk__in = notifications).delete()
+
+ if EmailOptout.is_optout(recipient.email):
+ delete_notifications()
+ continue
+
context = {
'site': Site.objects.get_current(),
'person': recipient,
@@ -191,6 +200,6 @@ def send_notifications():
errors.append((recipient, ex))
continue
- PatchChangeNotification.objects.filter(pk__in = notifications).delete()
+ delete_notifications()
return errors