from django.tasks import task from django.utils import timezone from email_sms.channels import dispatch_message from email_sms.models import Message from email_sms.services import contact_may_receive, refresh_campaign_status @task def send_campaign_message(message_id: str) -> None: campaign = None try: message = Message.objects.select_related("contact", "campaign").get( pk=message_id ) except Message.DoesNotExist: return campaign = message.campaign if not contact_may_receive(message.contact, message.channel): message.status = Message.Status.SUPPRESSED message.error = "Contact opted out or suppressed" message.save(update_fields=["status", "error", "updated_at"]) refresh_campaign_status(campaign) return try: result = dispatch_message(message) message.status = Message.Status.SENT message.provider = result.provider message.provider_message_id = result.provider_id message.sent_at = timezone.now() message.error = "" message.save( update_fields=[ "status", "provider", "provider_message_id", "sent_at", "error", "updated_at", ] ) except Exception as exc: # noqa: BLE001 — persist provider failures message.status = Message.Status.FAILED message.error = str(exc)[:2000] message.save(update_fields=["status", "error", "updated_at"]) refresh_campaign_status(campaign) raise refresh_campaign_status(campaign)