Skip to content

Commit

Permalink
Merge pull request #607 from praekeltfoundation/capi-backend-changes
Browse files Browse the repository at this point in the history
Add process whatsapp template send status task
  • Loading branch information
erikh360 authored Jul 17, 2024
2 parents 555f628 + dc8c7eb commit 8eb4e43
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 4.2.13 on 2024-07-17 13:09

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
(
"eventstore",
"0067_rename_registration_completed_at_whatsapptemplatesendstatus_action_completed_at_and_more",
),
]

operations = [
migrations.AddField(
model_name="whatsapptemplatesendstatus",
name="contact_uuid",
field=models.UUIDField(blank=True, null=True),
),
migrations.AddField(
model_name="whatsapptemplatesendstatus",
name="data",
field=models.JSONField(blank=True, default=dict, null=True),
),
migrations.AddField(
model_name="whatsapptemplatesendstatus",
name="flow_uuid",
field=models.UUIDField(blank=True, null=True),
),
]
3 changes: 3 additions & 0 deletions eventstore/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1148,3 +1148,6 @@ class Status:
status = models.CharField(
max_length=30, choices=Status.choices, default=Status.WIRED
)
contact_uuid = models.UUIDField(null=True, blank=True)
flow_uuid = models.UUIDField(null=True, blank=True)
data = models.JSONField(default=dict, blank=True, null=True)
24 changes: 24 additions & 0 deletions eventstore/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -842,3 +842,27 @@ def update_whatsapp_template_send_status(message_id, preferred_channel=None):
status.save()
except WhatsAppTemplateSendStatus.DoesNotExist:
pass


@app.task(acks_late=True, soft_time_limit=10, time_limit=15)
def process_whatsapp_template_send_status():
filter_date = timezone.now() - timedelta(
hours=settings.WHATSAPP_TEMPLATE_SEND_TIMEOUT_HOURS
)
ready_statuses = WhatsAppTemplateSendStatus.objects.filter(
flow_uuid__isnull=False, status=WhatsAppTemplateSendStatus.Status.EVENT_RECEIVED
)
expired_statuses = WhatsAppTemplateSendStatus.objects.filter(
flow_uuid__isnull=False,
status=WhatsAppTemplateSendStatus.Status.WIRED,
sent_at__lt=filter_date,
)

all_statuses = ready_statuses | expired_statuses

for status in all_statuses:
async_create_flow_start.delay(
extra=status.data,
flow=str(status.flow_uuid),
contacts=[str(status.contact_uuid)],
)
46 changes: 46 additions & 0 deletions eventstore/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import requests
import responses
from django.test import TestCase, override_settings
from django.utils import timezone
from temba_client.v2 import TembaClient

from eventstore import tasks
Expand Down Expand Up @@ -952,3 +953,48 @@ def test_update_status_sms(self):
)
self.assertEqual(self.status.preferred_channel, "SMS")
self.assertIsNotNone(self.status.event_received_at)


class ProcessWhatsAppTemplateSendStatusTests(TestCase):
def setUp(self):
self.contact_uuid = "06639860-1967-4b2b-97a5-f17b094f3763"
self.flow_uuid = "f4cc0bfb-57ec-4fd9-8c32-4a6a72b14d53"
self.status_ignored = WhatsAppTemplateSendStatus.objects.create(
message_id="test-message-id1"
)
self.status_ready = WhatsAppTemplateSendStatus.objects.create(
message_id="test-message-id2",
status=WhatsAppTemplateSendStatus.Status.EVENT_RECEIVED,
data={"status": "ready"},
flow_uuid=self.flow_uuid,
contact_uuid=self.contact_uuid,
)
self.status_expired = WhatsAppTemplateSendStatus.objects.create(
message_id="test-message-id3",
status=WhatsAppTemplateSendStatus.Status.WIRED,
data={"status": "expired"},
flow_uuid=self.flow_uuid,
contact_uuid=self.contact_uuid,
)
self.status_expired.sent_at = timezone.now() - datetime.timedelta(hours=4)
self.status_expired.save()

@mock.patch("eventstore.tasks.async_create_flow_start")
def test_starts_flows(self, mock_async_flow_start):
tasks.process_whatsapp_template_send_status()

self.assertEqual(
mock_async_flow_start.delay.mock_calls,
[
mock.call(
extra=self.status_ready.data,
flow=self.status_ready.flow_uuid,
contacts=[self.status_ready.contact_uuid],
),
mock.call(
extra=self.status_expired.data,
flow=self.status_expired.flow_uuid,
contacts=[self.status_expired.contact_uuid],
),
],
)
8 changes: 8 additions & 0 deletions ndoh_hub/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,10 @@
day_of_week=RANDOM_CONTACTS_DAY_OF_WEEK,
),
},
"process-whatsapp-template-send-status": {
"task": "eventstore.tasks.process_whatsapp_template_send_status",
"schedule": 300.0,
},
}

BULK_INSERT_EVENTS_ENABLED = env.bool("BULK_INSERT_EVENTS_ENABLED", False)
Expand Down Expand Up @@ -427,3 +431,7 @@
AAQ_UD_INBOUND_CHECK_AUTH = env.str("AAQ_UD_INBOUND_CHECK_AUTH", None)

ALERT_OPTOUT_PHRASE = env.str("ALERT_OPTOUT_PHRASE", "Opt out of alerts")

WHATSAPP_TEMPLATE_SEND_TIMEOUT_HOURS = env.int(
"WHATSAPP_TEMPLATE_SEND_TIMEOUT_HOURS", 3
)

0 comments on commit 8eb4e43

Please sign in to comment.