mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-22 23:36:08 -04:00
Compare commits
9 Commits
ben-test-n
...
allowed-br
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
517688c5f4 | ||
|
|
1cae8a620e | ||
|
|
4a2e47b118 | ||
|
|
4a5b1c23bd | ||
|
|
9bd8c0239c | ||
|
|
dea5828d0e | ||
|
|
42b3f13538 | ||
|
|
df97b28c57 | ||
|
|
df393e36c5 |
@@ -214,7 +214,7 @@ def _create_broadcast_event(broadcast_message):
|
||||
|
||||
dao_save_object(event)
|
||||
|
||||
if not broadcast_message.stubbed or current_app.config['NOTIFY_ENVIRONMENT'] in ['preview', 'development']:
|
||||
if not broadcast_message.stubbed:
|
||||
send_broadcast_event.apply_async(
|
||||
kwargs={'broadcast_event_id': str(event.id)},
|
||||
queue=QueueNames.BROADCASTS
|
||||
|
||||
@@ -5,7 +5,7 @@ from flask import current_app
|
||||
from notifications_utils.statsd_decorators import statsd
|
||||
from sqlalchemy.schema import Sequence
|
||||
|
||||
from app import cbc_proxy_client, db, notify_celery
|
||||
from app import cbc_proxy_client, db, notify_celery, zendesk_client
|
||||
from app.clients.cbc_proxy import (
|
||||
CBCProxyFatalException,
|
||||
CBCProxyRetryableException,
|
||||
@@ -111,6 +111,33 @@ def send_broadcast_event(broadcast_event_id):
|
||||
return
|
||||
|
||||
broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)
|
||||
|
||||
if (
|
||||
current_app.config['NOTIFY_ENVIRONMENT'] == 'live' and
|
||||
broadcast_event.message_type == BroadcastEventMessageType.ALERT
|
||||
):
|
||||
broadcast_message = broadcast_event.broadcast_message
|
||||
# raise a P1 to alert team that broadcast is going out.
|
||||
message = '\n'.join([
|
||||
'Broadcast Sent',
|
||||
'',
|
||||
f'https://www.notifications.service.gov.uk/services/{broadcast_message.service_id}/current-alerts/{broadcast_message.id}', # noqa
|
||||
'',
|
||||
f'This broacast has been sent on channel {broadcast_message.service.broadcast_channel}.',
|
||||
f'This broadcast is targeted at areas {broadcast_message.areas.get("areas")}.',
|
||||
''
|
||||
f'This broadcast\'s content starts "{broadcast_message.content[:100]}"'
|
||||
'',
|
||||
'If this alert is not expected refer to the runbook for instructions.',
|
||||
'https://docs.google.com/document/d/1J99yOlfp4nQz6et0w5oJVqi-KywtIXkxrEIyq_g2XUs',
|
||||
])
|
||||
zendesk_client.create_ticket(
|
||||
subject="Live broadcast sent",
|
||||
message=message,
|
||||
ticket_type=zendesk_client.TYPE_INCIDENT,
|
||||
p1=True,
|
||||
)
|
||||
|
||||
for provider in broadcast_event.service.get_available_broadcast_providers():
|
||||
send_broadcast_provider_message.apply_async(
|
||||
kwargs={'broadcast_event_id': broadcast_event_id, 'provider': provider},
|
||||
|
||||
@@ -75,3 +75,13 @@ def insert_or_update_service_broadcast_settings(service, channel, provider_restr
|
||||
service.service_broadcast_settings.channel = channel
|
||||
service.service_broadcast_settings.provider = provider_restriction
|
||||
db.session.add(service.service_broadcast_settings)
|
||||
|
||||
|
||||
def insert_or_update_requested_allowed_broadcast_areas(service, requested_allowed_broadcast_areas):
|
||||
service.service_broadcast_settings.requested_allowed_broadcast_areas = requested_allowed_broadcast_areas
|
||||
db.session.add(service.service_broadcast_settings)
|
||||
|
||||
|
||||
def insert_or_update_allowed_broadcast_areas(service):
|
||||
service.service_broadcast_settings.allowed_broadcast_areas = service.service_broadcast_settings.requested_allowed_broadcast_areas # noqa
|
||||
db.session.add(service.service_broadcast_settings)
|
||||
|
||||
@@ -2557,6 +2557,9 @@ class ServiceBroadcastSettings(db.Model):
|
||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow)
|
||||
|
||||
allowed_broadcast_areas = db.Column(JSONB(none_as_null=True), nullable=False, default=list)
|
||||
requested_allowed_broadcast_areas = db.Column(JSONB(none_as_null=True), nullable=True)
|
||||
|
||||
|
||||
class BroadcastChannelTypes(db.Model):
|
||||
__tablename__ = 'broadcast_channel_types'
|
||||
|
||||
31
migrations/versions/0351_allowed_broadcast_areas.py
Normal file
31
migrations/versions/0351_allowed_broadcast_areas.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""
|
||||
|
||||
Revision ID: 0351_allowed_broadcast_areas
|
||||
Revises: 0350_update_rates
|
||||
Create Date: 2021-04-09 12:51:17.158043
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects import postgresql
|
||||
|
||||
revision = '0351_allowed_broadcast_areas'
|
||||
down_revision = '0350_update_rates'
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('service_broadcast_settings', sa.Column(
|
||||
'allowed_broadcast_areas', postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), nullable=True)
|
||||
)
|
||||
op.add_column('service_broadcast_settings', sa.Column(
|
||||
'requested_allowed_broadcast_areas', postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), nullable=True)
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('service_broadcast_settings', 'requested_allowed_broadcast_areas')
|
||||
op.drop_column('service_broadcast_settings', 'allowed_broadcast_areas')
|
||||
# ### end Alembic commands ###
|
||||
@@ -36,6 +36,7 @@ def test_send_broadcast_event_queues_up_for_active_providers(mocker, notify_api,
|
||||
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(template, status=BroadcastStatusType.BROADCASTING)
|
||||
event = create_broadcast_event(broadcast_message)
|
||||
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
|
||||
|
||||
mock_send_broadcast_provider_message = mocker.patch(
|
||||
'app.celery.broadcast_message_tasks.send_broadcast_provider_message',
|
||||
@@ -49,6 +50,9 @@ def test_send_broadcast_event_queues_up_for_active_providers(mocker, notify_api,
|
||||
call(kwargs={'broadcast_event_id': event.id, 'provider': 'vodafone'}, queue='broadcast-tasks')
|
||||
]
|
||||
|
||||
# we're on test env so this isn't called
|
||||
assert mock_create_ticket.called is False
|
||||
|
||||
|
||||
def test_send_broadcast_event_only_sends_to_one_provider_if_set_on_service(
|
||||
mocker,
|
||||
@@ -106,6 +110,69 @@ def test_send_broadcast_event_does_nothing_if_cbc_proxy_disabled(mocker, notify_
|
||||
assert mock_send_broadcast_provider_message.apply_async.called is False
|
||||
|
||||
|
||||
def test_send_broadcast_event_creates_zendesk_p1(mocker, notify_api, sample_broadcast_service):
|
||||
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(
|
||||
template,
|
||||
status=BroadcastStatusType.BROADCASTING,
|
||||
areas={'areas': ['wd20-S13002775', 'wd20-S13002773'], 'simple_polygons': []},
|
||||
)
|
||||
event = create_broadcast_event(broadcast_message)
|
||||
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
|
||||
|
||||
mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_provider_message')
|
||||
|
||||
with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'):
|
||||
send_broadcast_event(event.id)
|
||||
|
||||
assert mock_create_ticket.call_count == 1
|
||||
zendesk_args = mock_create_ticket.call_args[1]
|
||||
assert zendesk_args['p1'] is True
|
||||
assert zendesk_args['ticket_type'] == 'incident'
|
||||
|
||||
assert str(broadcast_message.id) in zendesk_args['message']
|
||||
assert 'channel severe' in zendesk_args['message']
|
||||
assert "areas ['wd20-S13002775', 'wd20-S13002773']" in zendesk_args['message']
|
||||
# the start of the content from the broadcast template
|
||||
assert "Dear Sir/Madam" in zendesk_args['message']
|
||||
|
||||
|
||||
def test_send_broadcast_event_doesnt_p1_when_cancelling(mocker, notify_api, sample_broadcast_service):
|
||||
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(
|
||||
template,
|
||||
status=BroadcastStatusType.BROADCASTING,
|
||||
areas={'areas': ['wd20-S13002775', 'wd20-S13002773'], 'simple_polygons': []},
|
||||
)
|
||||
create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.ALERT)
|
||||
cancel_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.CANCEL)
|
||||
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
|
||||
|
||||
mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_provider_message')
|
||||
|
||||
with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'):
|
||||
send_broadcast_event(cancel_event.id)
|
||||
|
||||
assert mock_create_ticket.called is False
|
||||
|
||||
|
||||
def test_send_broadcast_event_doesnt_create_zendesk_on_staging(mocker, notify_api, sample_broadcast_service):
|
||||
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
|
||||
broadcast_message = create_broadcast_message(template, status=BroadcastStatusType.BROADCASTING)
|
||||
event = create_broadcast_event(broadcast_message)
|
||||
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
|
||||
|
||||
mock_send_broadcast_provider_message = mocker.patch(
|
||||
'app.celery.broadcast_message_tasks.send_broadcast_provider_message',
|
||||
)
|
||||
|
||||
with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'staging'):
|
||||
send_broadcast_event(event.id)
|
||||
|
||||
assert mock_send_broadcast_provider_message.apply_async.called is True
|
||||
assert mock_create_ticket.called is False
|
||||
|
||||
|
||||
@freeze_time('2020-08-01 12:00')
|
||||
@pytest.mark.parametrize('provider,provider_capitalised', [
|
||||
['ee', 'EE'],
|
||||
|
||||
Reference in New Issue
Block a user