From b47e99f0692c02a872553a7368bbf00998b3ca6f Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 4 Oct 2023 15:55:35 +0000 Subject: [PATCH 1/2] Add optin as field to channelevents --- .../migrations/0177_channelevent_optin.py | 21 +++++++++++++++++++ temba/channels/models.py | 1 + temba/contacts/models.py | 4 ++-- temba/mailroom/events.py | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 temba/channels/migrations/0177_channelevent_optin.py diff --git a/temba/channels/migrations/0177_channelevent_optin.py b/temba/channels/migrations/0177_channelevent_optin.py new file mode 100644 index 00000000000..6b790b9bc87 --- /dev/null +++ b/temba/channels/migrations/0177_channelevent_optin.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.3 on 2023-10-04 15:54 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("msgs", "0250_alter_msg_msg_type"), + ("channels", "0176_remove_channel_alert_email_delete_alert"), + ] + + operations = [ + migrations.AddField( + model_name="channelevent", + name="optin", + field=models.ForeignKey( + null=True, on_delete=django.db.models.deletion.PROTECT, related_name="optins", to="msgs.optin" + ), + ), + ] diff --git a/temba/channels/models.py b/temba/channels/models.py index a7d279b4ecd..22214c0bf75 100644 --- a/temba/channels/models.py +++ b/temba/channels/models.py @@ -852,6 +852,7 @@ class ChannelEvent(models.Model): contact_urn = models.ForeignKey( "contacts.ContactURN", on_delete=models.PROTECT, null=True, related_name="channel_events" ) + optin = models.ForeignKey("msgs.OptIn", null=True, on_delete=models.PROTECT, related_name="optins") extra = JSONAsTextField(null=True, default=dict) occurred_on = models.DateTimeField() created_on = models.DateTimeField(default=timezone.now) diff --git a/temba/contacts/models.py b/temba/contacts/models.py index bb5060afe24..81a66152960 100644 --- a/temba/contacts/models.py +++ b/temba/contacts/models.py @@ -778,7 +778,7 @@ def get_history(self, after: datetime, before: datetime, include_event_types: se self.msgs.filter(created_on__gte=after, created_on__lt=before) .exclude(status=Msg.STATUS_PENDING) .order_by("-created_on", "-id") - .select_related("channel", "contact_urn", "broadcast")[:limit] + .select_related("channel", "contact_urn", "broadcast", "optin")[:limit] ) # get all runs start started or ended in this period @@ -797,7 +797,7 @@ def get_history(self, after: datetime, before: datetime, include_event_types: se channel_events = ( self.channel_events.filter(created_on__gte=after, created_on__lt=before) .order_by("-created_on") - .select_related("channel")[:limit] + .select_related("channel", "optin")[:limit] ) campaign_events = ( diff --git a/temba/mailroom/events.py b/temba/mailroom/events.py index fd1a9e3d34c..81174407be1 100644 --- a/temba/mailroom/events.py +++ b/temba/mailroom/events.py @@ -252,7 +252,7 @@ def from_channel_event(cls, org: Org, user: User, obj: ChannelEvent) -> dict: if obj.event_type in ChannelEvent.CALL_TYPES: ch_event["duration"] = extra.get("duration") elif obj.event_type in (ChannelEvent.TYPE_OPTIN, ChannelEvent.TYPE_OPTOUT): - ch_event["optin"] = _optin(OptIn.objects.get(org=org, id=extra.get("optin_id"))) + ch_event["optin"] = _optin(obj.optin) if obj.optin else None return { "type": cls.TYPE_CHANNEL_EVENT, From a410019b8802c2ebdf302db079c4057f7f03bd11 Mon Sep 17 00:00:00 2001 From: Rowan Seymour Date: Wed, 4 Oct 2023 16:39:40 +0000 Subject: [PATCH 2/2] Fix test --- temba/mailroom/tests.py | 3 ++- temba/tests/base.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/temba/mailroom/tests.py b/temba/mailroom/tests.py index 56e82000a45..e2e5bc0e117 100644 --- a/temba/mailroom/tests.py +++ b/temba/mailroom/tests.py @@ -1061,7 +1061,8 @@ def test_from_channel_event(self): self.channel, "tel:+250979111111", ChannelEvent.TYPE_OPTIN, - extra={"optin_id": optin.id, "optin_name": "Polls"}, + optin=optin, + extra={"title": "Polls", "payload": str(optin.id)}, ) self.assertEqual( diff --git a/temba/tests/base.py b/temba/tests/base.py index 61ac1456f60..d581793f13d 100644 --- a/temba/tests/base.py +++ b/temba/tests/base.py @@ -679,7 +679,7 @@ def create_channel( modified_by=self.admin, ) - def create_channel_event(self, channel, urn, event_type, occurred_on=None, extra=None): + def create_channel_event(self, channel, urn, event_type, occurred_on=None, optin=None, extra=None): urn_obj = ContactURN.lookup(channel.org, urn, country_code=channel.country) if urn_obj: contact = urn_obj.contact @@ -694,6 +694,7 @@ def create_channel_event(self, channel, urn, event_type, occurred_on=None, extra contact_urn=urn_obj, occurred_on=occurred_on or timezone.now(), event_type=event_type, + optin=optin, extra=extra, )