0
0
mirror of https://github.com/wagtail/wagtail.git synced 2024-11-30 01:46:24 +01:00

Fix commenting thread notifications being sent to non-thread users

This commit is contained in:
jacobtoppm 2021-12-09 14:20:53 +00:00 committed by Matt Westcott
parent 335ece5f96
commit 5fe901e5d8
2 changed files with 25 additions and 3 deletions

View File

@ -2100,6 +2100,7 @@ class TestCommenting(TestCase, WagtailTestUtils):
self.subscriber = self.create_user('subscriber')
self.non_subscriber = self.create_user('non-subscriber')
self.non_subscriber_2 = self.create_user('non-subscriber-2')
self.never_emailed_user = self.create_user('never-emailed')
PageSubscription.objects.create(
page=self.child_page,
@ -2113,6 +2114,23 @@ class TestCommenting(TestCase, WagtailTestUtils):
comment_notifications=True
)
# Add comment and reply on a different page for the never_emailed_user
# They should never be notified
comment_on_other_page = Comment.objects.create(
page=self.root_page,
user=self.never_emailed_user,
text='a comment'
)
CommentReply.objects.create(
user=self.never_emailed_user,
comment=comment_on_other_page,
text='a reply'
)
def assertNeverEmailedWrongUser(self):
self.assertNotIn(self.never_emailed_user.email, [to for email in mail.outbox for to in email.to])
def test_new_comment(self):
post_data = {
'title': "I've been edited!",
@ -2144,6 +2162,7 @@ class TestCommenting(TestCase, WagtailTestUtils):
# Check notification email
self.assertEqual(len(mail.outbox), 1)
self.assertNeverEmailedWrongUser()
self.assertEqual(mail.outbox[0].to, [self.subscriber.email])
self.assertEqual(mail.outbox[0].subject, 'test@email.com has updated comments on "I\'ve been edited! (simple page)"')
self.assertIn('New comments:\n - "A test comment"\n\n', mail.outbox[0].body)
@ -2283,6 +2302,7 @@ class TestCommenting(TestCase, WagtailTestUtils):
# Check notification email
self.assertEqual(len(mail.outbox), 2)
self.assertNeverEmailedWrongUser()
# The non subscriber created the comment, so should also get an email
self.assertEqual(mail.outbox[0].to, [self.non_subscriber.email])
self.assertEqual(mail.outbox[0].subject, 'test@email.com has updated comments on "I\'ve been edited! (simple page)"')
@ -2337,6 +2357,7 @@ class TestCommenting(TestCase, WagtailTestUtils):
# Check notification email
self.assertEqual(len(mail.outbox), 1)
self.assertNeverEmailedWrongUser()
self.assertEqual(mail.outbox[0].to, [self.subscriber.email])
self.assertEqual(mail.outbox[0].subject, 'test@email.com has updated comments on "I\'ve been edited! (simple page)"')
self.assertIn('Deleted comments:\n - "A test comment"\n\n', mail.outbox[0].body)
@ -2398,6 +2419,7 @@ class TestCommenting(TestCase, WagtailTestUtils):
# Check notification email
self.assertEqual(len(mail.outbox), 3)
self.assertNeverEmailedWrongUser()
recipients = [mail.to for mail in mail.outbox]
# The other non subscriber replied in the thread, so should get an email

View File

@ -141,11 +141,11 @@ class EditView(TemplateResponseMixin, ContextMixin, HookResponseMixin, View):
# Get subscribers to individual threads
replies = CommentReply.objects.filter(comment_id__in=relevant_comment_ids)
comments = Comment.objects.filter(id__in=relevant_comment_ids)
thread_users = get_user_model().objects.exclude(pk=self.request.user.pk).exclude(pk__in=subscribers.values_list('user_id', flat=True)).prefetch_related(
thread_users = get_user_model().objects.exclude(pk=self.request.user.pk).exclude(pk__in=subscribers.values_list('user_id', flat=True)).filter(
Q(comment_replies__comment_id__in=relevant_comment_ids) | Q(**{('%s__pk__in' % COMMENTS_RELATION_NAME): relevant_comment_ids})
).prefetch_related(
Prefetch('comment_replies', queryset=replies),
Prefetch(COMMENTS_RELATION_NAME, queryset=comments)
).exclude(
Q(comment_replies__isnull=True) & Q(**{('%s__isnull' % COMMENTS_RELATION_NAME): True})
)
# Skip if no recipients