Skip to content

Commit 4ba2cf6

Browse files
committed
fix: send manual emails only to active users
Guardians must be filtered with user__is_active to ensure that emails are not sent to inactive users. This is already done for automatic emails. refs: KK-1478
1 parent 3afe619 commit 4ba2cf6

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

messaging/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ def send(self, *, force=False):
9999
messaging_service.send_message(self, force=force)
100100

101101
def get_recipient_guardians(self):
102-
guardians = Guardian.objects.filter(children__project=self.project)
102+
guardians = Guardian.objects.filter(
103+
children__project=self.project, user__is_active=True
104+
)
103105

104106
if self.recipient_selection == Message.ALL:
105107
return guardians.distinct()

messaging/tests/test_sending.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,3 +315,64 @@ def test_message_sending_to_invited_with_enrolment_limit(
315315
assert emails == []
316316
assert message.recipient_count == len(mail.outbox)
317317
assert message.sent_at
318+
319+
320+
def test_message_sending_excludes_inactive_users(message):
321+
"""Inactive users (is_active=False) should not receive manual messages."""
322+
ChildWithGuardianFactory(
323+
relationship__guardian__email="active-user@example.com",
324+
relationship__guardian__user__is_active=True,
325+
)
326+
ChildWithGuardianFactory(
327+
relationship__guardian__email="inactive-user@example.com",
328+
relationship__guardian__user__is_active=False,
329+
)
330+
331+
message.send()
332+
333+
emails = sorted(m.to for m in mail.outbox)
334+
335+
assert emails == [["active-user@example.com"]]
336+
assert message.recipient_count == 1
337+
assert message.sent_at
338+
339+
340+
def test_message_sending_to_only_active_users(message):
341+
"""When all users are active, all should receive the message."""
342+
ChildWithGuardianFactory(
343+
relationship__guardian__email="active-user-1@example.com",
344+
relationship__guardian__user__is_active=True,
345+
)
346+
ChildWithGuardianFactory(
347+
relationship__guardian__email="active-user-2@example.com",
348+
relationship__guardian__user__is_active=True,
349+
)
350+
351+
message.send()
352+
353+
emails = sorted(m.to for m in mail.outbox)
354+
355+
assert emails == [
356+
["active-user-1@example.com"],
357+
["active-user-2@example.com"],
358+
]
359+
assert message.recipient_count == 2
360+
assert message.sent_at
361+
362+
363+
def test_message_sending_to_no_one_when_all_inactive(message):
364+
"""When all users are inactive, no one should receive the message."""
365+
ChildWithGuardianFactory(
366+
relationship__guardian__email="inactive-user-1@example.com",
367+
relationship__guardian__user__is_active=False,
368+
)
369+
ChildWithGuardianFactory(
370+
relationship__guardian__email="inactive-user-2@example.com",
371+
relationship__guardian__user__is_active=False,
372+
)
373+
374+
message.send()
375+
376+
assert len(mail.outbox) == 0
377+
assert message.recipient_count == 0
378+
assert message.sent_at

0 commit comments

Comments
 (0)