mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-05 10:42:41 -05:00
create broadcast_provider_message and use id from that instead
(instead of using the id from broadcast_event) we need every XML blob we send to have a different ID. if we're sending different XML blobs for each provider, then each one should have a different identifier. So, instead of taking the identifier from the broadcast_event, take it from the broadcast_provider_message instead. Note: We're still going to the broadcast_event for most fields, to ensure they stay consistent between different providers. The last thing we want is for different phone networks to get different content
This commit is contained in:
@@ -6,7 +6,7 @@ from notifications_utils.statsd_decorators import statsd
|
||||
from app import cbc_proxy_client, notify_celery
|
||||
from app.config import QueueNames
|
||||
from app.models import BroadcastEventMessageType
|
||||
from app.dao.broadcast_message_dao import dao_get_broadcast_event_by_id
|
||||
from app.dao.broadcast_message_dao import dao_get_broadcast_event_by_id, create_broadcast_provider_message
|
||||
|
||||
|
||||
@notify_celery.task(name="send-broadcast-event")
|
||||
@@ -26,6 +26,8 @@ def send_broadcast_event(broadcast_event_id):
|
||||
def send_broadcast_provider_message(broadcast_event_id, provider):
|
||||
broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)
|
||||
|
||||
broadcast_provider_message = create_broadcast_provider_message(broadcast_event, provider)
|
||||
|
||||
current_app.logger.info(
|
||||
f'invoking cbc proxy to send '
|
||||
f'broadcast_event {broadcast_event.reference} '
|
||||
@@ -39,7 +41,7 @@ def send_broadcast_provider_message(broadcast_event_id, provider):
|
||||
|
||||
if broadcast_event.message_type == BroadcastEventMessageType.ALERT:
|
||||
cbc_proxy_client.create_and_send_broadcast(
|
||||
identifier=str(broadcast_event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description=broadcast_event.transmitted_content['body'],
|
||||
areas=areas,
|
||||
@@ -48,7 +50,7 @@ def send_broadcast_provider_message(broadcast_event_id, provider):
|
||||
)
|
||||
elif broadcast_event.message_type == BroadcastEventMessageType.UPDATE:
|
||||
cbc_proxy_client.update_and_send_broadcast(
|
||||
identifier=str(broadcast_event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description=broadcast_event.transmitted_content['body'],
|
||||
areas=areas,
|
||||
@@ -58,7 +60,7 @@ def send_broadcast_provider_message(broadcast_event_id, provider):
|
||||
)
|
||||
elif broadcast_event.message_type == BroadcastEventMessageType.CANCEL:
|
||||
cbc_proxy_client.cancel_broadcast(
|
||||
identifier=str(broadcast_event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description=broadcast_event.transmitted_content['body'],
|
||||
areas=areas,
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from app.models import BroadcastMessage, BroadcastEvent
|
||||
from app import db
|
||||
from app.dao.dao_utils import transactional
|
||||
from app.models import BroadcastMessage, BroadcastEvent, BroadcastProviderMessage, BroadcastProviderMessageStatus
|
||||
|
||||
|
||||
def dao_get_broadcast_message_by_id_and_service_id(broadcast_message_id, service_id):
|
||||
@@ -34,3 +36,14 @@ def get_earlier_events_for_broadcast_event(broadcast_event_id):
|
||||
).order_by(
|
||||
BroadcastEvent.sent_at.asc()
|
||||
).all()
|
||||
|
||||
|
||||
@transactional
|
||||
def create_broadcast_provider_message(broadcast_event, provider):
|
||||
provider_message = BroadcastProviderMessage(
|
||||
broadcast_event=broadcast_event,
|
||||
provider=provider,
|
||||
status=BroadcastProviderMessageStatus.SENDING,
|
||||
)
|
||||
db.session.add(provider_message)
|
||||
return provider_message
|
||||
|
||||
@@ -2377,6 +2377,16 @@ class BroadcastEvent(db.Model):
|
||||
"""
|
||||
return f"{dt.strftime('%Y-%m-%dT%H:%M:%S')}-00:00"
|
||||
|
||||
def get_provider_message(self, provider):
|
||||
return next(
|
||||
(
|
||||
provider_message
|
||||
for provider_message in self.provider_messages
|
||||
if provider_message.provider == provider
|
||||
),
|
||||
None
|
||||
)
|
||||
|
||||
def get_earlier_message_references(self):
|
||||
from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event
|
||||
return [event.reference for event in get_earlier_events_for_broadcast_event(self.id)]
|
||||
@@ -2432,7 +2442,7 @@ class BroadcastProviderMessage(db.Model):
|
||||
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
|
||||
broadcast_event_id = db.Column(UUID(as_uuid=True), db.ForeignKey('broadcast_event.id'))
|
||||
broadcast_event = db.relationship('BroadcastEvent')
|
||||
broadcast_event = db.relationship('BroadcastEvent', backref='provider_messages')
|
||||
|
||||
# 'ee', 'three', 'vodafone', etc
|
||||
provider = db.Column(db.String)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import uuid
|
||||
from unittest.mock import call
|
||||
from unittest.mock import call, ANY
|
||||
|
||||
from freezegun import freeze_time
|
||||
import pytest
|
||||
|
||||
from app.models import BROADCAST_TYPE, BroadcastStatusType, BroadcastEventMessageType
|
||||
from app.models import BROADCAST_TYPE, BroadcastStatusType, BroadcastEventMessageType, BroadcastProviderMessageStatus
|
||||
from app.celery.broadcast_message_tasks import send_broadcast_event, send_broadcast_provider_message, trigger_link_test
|
||||
|
||||
from tests.app.db import create_template, create_broadcast_message, create_broadcast_event
|
||||
@@ -46,10 +46,15 @@ def test_send_broadcast_provider_message_sends_data_correctly(mocker, sample_ser
|
||||
'app.cbc_proxy_client.create_and_send_broadcast',
|
||||
)
|
||||
|
||||
assert event.get_provider_message('ee') is None
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(event.id))
|
||||
|
||||
broadcast_provider_message = event.get_provider_message('ee')
|
||||
assert broadcast_provider_message.status == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_create_broadcast.assert_called_once_with(
|
||||
identifier=str(event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline='GOV.UK Notify Broadcast',
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
@@ -89,8 +94,11 @@ def test_send_broadcast_provider_message_sends_update_with_references(mocker, sa
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(update_event.id))
|
||||
|
||||
broadcast_provider_message = update_event.get_provider_message('ee')
|
||||
assert broadcast_provider_message.state == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_update_broadcast.assert_called_once_with(
|
||||
identifier=str(update_event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
@@ -126,8 +134,11 @@ def test_send_broadcast_provider_message_sends_cancel_with_references(mocker, sa
|
||||
|
||||
send_broadcast_provider_message(provider='ee', broadcast_event_id=str(cancel_event.id))
|
||||
|
||||
broadcast_provider_message = cancel_event.get_provider_message('ee')
|
||||
assert broadcast_provider_message.state == BroadcastProviderMessageStatus.SENDING
|
||||
|
||||
mock_cancel_broadcast.assert_called_once_with(
|
||||
identifier=str(cancel_event.id),
|
||||
identifier=str(broadcast_provider_message.id),
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
@@ -166,7 +177,7 @@ def test_send_broadcast_provider_message_errors(mocker, sample_service):
|
||||
assert ex.match('oh no')
|
||||
|
||||
mock_create_broadcast.assert_called_once_with(
|
||||
identifier=str(event.id),
|
||||
identifier=ANY,
|
||||
headline="GOV.UK Notify Broadcast",
|
||||
description='this is an emergency broadcast message',
|
||||
areas=[{
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
from datetime import datetime
|
||||
from app.models import BROADCAST_TYPE
|
||||
from app.models import BroadcastEventMessageType
|
||||
from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
from app.models import BROADCAST_TYPE, BroadcastStatusType, BroadcastEventMessageType
|
||||
from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event, create_broadcast_provider_message
|
||||
|
||||
from tests.app.db import create_broadcast_message, create_template, create_broadcast_event
|
||||
|
||||
|
||||
def test_get_earlier_events_for_broadcast_event(sample_service):
|
||||
t = create_template(sample_service, BROADCAST_TYPE)
|
||||
bm = create_broadcast_message(t)
|
||||
@@ -41,3 +42,21 @@ def test_get_earlier_events_for_broadcast_event(sample_service):
|
||||
# only fetches earlier events, and they're in time order
|
||||
earlier_events = get_earlier_events_for_broadcast_event(events[2].id)
|
||||
assert earlier_events == [events[0], events[1]]
|
||||
|
||||
|
||||
@freeze_time('2020-02-03 04:05:06')
|
||||
def test_create_broadcast_provider_message_creates_in_correct_state(sample_broadcast_service):
|
||||
t = create_template(sample_broadcast_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(t, status=BroadcastStatusType.APPROVED)
|
||||
broadcast_event = create_broadcast_event(
|
||||
broadcast_message,
|
||||
sent_at=datetime(2020, 1, 1, 12, 0, 0),
|
||||
message_type=BroadcastEventMessageType.ALERT,
|
||||
transmitted_content={'body': 'Initial content'}
|
||||
)
|
||||
|
||||
broadcast_provider_message = create_broadcast_provider_message(broadcast_event, 'fake-provider')
|
||||
|
||||
assert broadcast_provider_message.status == 'sending'
|
||||
assert broadcast_provider_message.broadcast_event_id == broadcast_event.id
|
||||
assert broadcast_provider_message.created_at == datetime.utcnow()
|
||||
|
||||
Reference in New Issue
Block a user