|
3 | 3 |
|
4 | 4 | from django.utils import timezone |
5 | 5 |
|
| 6 | +from mailing.constants import FAILED_ANYMAIL_STATUSES |
6 | 7 | from mailing.models import MailingScenarioLog |
7 | 8 | from mailing.scenarios import RecipientRule, SCENARIOS, TriggerType |
8 | 9 | from mailing.utils import send_mass_mail_from_template |
@@ -54,8 +55,8 @@ def _send_scenario_for_program(scenario, program, scheduled_for): |
54 | 55 | ], |
55 | 56 | ).values_list("user_id", flat=True) |
56 | 57 |
|
57 | | - recipients_to_send = recipients.exclude(id__in=pending_or_sent_ids) |
58 | | - user_ids = list(recipients_to_send.values_list("id", flat=True)) |
| 58 | + recipients_to_send = list(recipients.exclude(id__in=pending_or_sent_ids)) |
| 59 | + user_ids = [user.id for user in recipients_to_send] |
59 | 60 | if not user_ids: |
60 | 61 | return 0 |
61 | 62 |
|
@@ -99,18 +100,24 @@ def _normalize_status(status_value): |
99 | 100 | if status_value is None: |
100 | 101 | return set() |
101 | 102 | if isinstance(status_value, dict): |
102 | | - return {str(key) for key in status_value.keys()} |
| 103 | + statuses = set() |
| 104 | + for value in status_value.values(): |
| 105 | + if isinstance(value, (set, list, tuple)): |
| 106 | + statuses.update(str(item) for item in value) |
| 107 | + else: |
| 108 | + statuses.add(str(value)) |
| 109 | + return {status.lower() for status in statuses} |
103 | 110 | if isinstance(status_value, (set, list, tuple)): |
104 | | - return {str(item) for item in status_value} |
105 | | - return {str(status_value)} |
| 111 | + return {str(item).lower() for item in status_value} |
| 112 | + return {str(status_value).lower()} |
106 | 113 |
|
107 | 114 | def status_callback(user, msg): |
108 | 115 | nonlocal sent_count, failed_count |
109 | 116 | status = getattr(msg, "anymail_status", None) |
110 | 117 | message_id = getattr(status, "message_id", None) if status else None |
111 | 118 | status_set = _normalize_status(getattr(status, "status", None)) |
112 | 119 | status_str = ",".join(sorted(status_set)) if status_set else "unknown" |
113 | | - is_failed = bool(status_set & {"rejected", "failed", "invalid", "bounced"}) |
| 120 | + is_failed = not status_set or bool(status_set & FAILED_ANYMAIL_STATUSES) |
114 | 121 |
|
115 | 122 | if not message_id: |
116 | 123 | failed_count += 1 |
|
0 commit comments