Commit f1e5f6a2 authored by Jeremy Kerr's avatar Jeremy Kerr
Browse files

notifications: implement opt-out



Check for opt-out status before sending notification mail.
Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
parent 017f73b0
......@@ -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)
......
......@@ -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',
......
......@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment