def send_broadcast_event(broadcast_event_id):
    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
            },
            queue=QueueNames.BROADCASTS)
Пример #2
0
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)
    formatted_message_number = None
    if provider == BroadcastProvider.VODAFONE:
        formatted_message_number = format_sequential_number(
            broadcast_provider_message.message_number)

    current_app.logger.info(f'invoking cbc proxy to send '
                            f'broadcast_event {broadcast_event.reference} '
                            f'msgType {broadcast_event.message_type}')

    areas = [{
        "polygon": polygon
    } for polygon in broadcast_event.transmitted_areas["simple_polygons"]]

    cbc_proxy_provider_client = cbc_proxy_client.get_proxy(provider)

    if broadcast_event.message_type == BroadcastEventMessageType.ALERT:
        cbc_proxy_provider_client.create_and_send_broadcast(
            identifier=str(broadcast_provider_message.id),
            message_number=formatted_message_number,
            headline="GOV.UK Notify Broadcast",
            description=broadcast_event.transmitted_content['body'],
            areas=areas,
            sent=broadcast_event.sent_at_as_cap_datetime_string,
            expires=broadcast_event.
            transmitted_finishes_at_as_cap_datetime_string,
        )
    elif broadcast_event.message_type == BroadcastEventMessageType.UPDATE:
        cbc_proxy_provider_client.update_and_send_broadcast(
            identifier=str(broadcast_provider_message.id),
            message_number=formatted_message_number,
            headline="GOV.UK Notify Broadcast",
            description=broadcast_event.transmitted_content['body'],
            areas=areas,
            previous_provider_messages=broadcast_event.
            get_earlier_provider_messages(provider),
            sent=broadcast_event.sent_at_as_cap_datetime_string,
            expires=broadcast_event.
            transmitted_finishes_at_as_cap_datetime_string,
        )
    elif broadcast_event.message_type == BroadcastEventMessageType.CANCEL:
        cbc_proxy_provider_client.cancel_broadcast(
            identifier=str(broadcast_provider_message.id),
            message_number=formatted_message_number,
            previous_provider_messages=broadcast_event.
            get_earlier_provider_messages(provider),
            sent=broadcast_event.sent_at_as_cap_datetime_string,
        )
Пример #3
0
def send_broadcast_event(broadcast_event_id):
    if not current_app.config['CBC_PROXY_ENABLED']:
        current_app.logger.info(
            f'CBC Proxy disabled, not sending broadcast_event {broadcast_event_id}'
        )
        return

    broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)
    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
        },
                                                    queue=QueueNames.NOTIFY)
def send_broadcast_event(broadcast_event_id):
    broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)

    current_app.logger.info(f'invoking cbc proxy to send '
                            f'broadcast_event {broadcast_event.reference} '
                            f'msgType {broadcast_event.message_type}')

    areas = [{
        "polygon": polygon
    } for polygon in broadcast_event.transmitted_areas["simple_polygons"]]

    if broadcast_event.message_type == BroadcastEventMessageType.ALERT:
        cbc_proxy_client.create_and_send_broadcast(
            identifier=str(broadcast_event.id),
            headline="GOV.UK Notify Broadcast",
            description=broadcast_event.transmitted_content['body'],
            areas=areas,
            sent=broadcast_event.sent_at_as_cap_datetime_string,
            expires=broadcast_event.
            transmitted_finishes_at_as_cap_datetime_string,
        )
    elif broadcast_event.message_type == BroadcastEventMessageType.UPDATE:
        cbc_proxy_client.update_and_send_broadcast(
            identifier=str(broadcast_event.id),
            headline="GOV.UK Notify Broadcast",
            description=broadcast_event.transmitted_content['body'],
            areas=areas,
            references=broadcast_event.get_earlier_message_references(),
            sent=broadcast_event.sent_at_as_cap_datetime_string,
            expires=broadcast_event.
            transmitted_finishes_at_as_cap_datetime_string,
        )
    elif broadcast_event.message_type == BroadcastEventMessageType.CANCEL:
        cbc_proxy_client.cancel_broadcast(
            identifier=str(broadcast_event.id),
            headline="GOV.UK Notify Broadcast",
            description=broadcast_event.transmitted_content['body'],
            areas=areas,
            references=broadcast_event.get_earlier_message_references(),
            sent=broadcast_event.sent_at_as_cap_datetime_string,
            expires=broadcast_event.
            transmitted_finishes_at_as_cap_datetime_string,
        )
def send_broadcast_event(broadcast_event_id, provider='stub-1'):
    broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)

    current_app.logger.info(
        f'sending broadcast_event {broadcast_event.reference} '
        f'msgType {broadcast_event.message_type} to {provider}'
    )

    payload = broadcast_event.serialize()

    resp = requests.post(
        f'{current_app.config["CBC_PROXY_URL"]}/broadcasts/events/{provider}',
        json=payload
    )
    resp.raise_for_status()

    current_app.logger.info(
        f'broadcast_event {broadcast_event.reference} '
        f'msgType {broadcast_event.message_type} sent to {provider}'
    )
def send_broadcast_provider_message(self, broadcast_event_id, provider):
    if not current_app.config['CBC_PROXY_ENABLED']:
        current_app.logger.info(
            "CBC Proxy disabled, not sending broadcast_provider_message for "
            f"broadcast_event_id {broadcast_event_id} with provider {provider}"
        )
        return

    broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)

    check_provider_message_should_send(broadcast_event, provider)

    # the broadcast_provider_message may already exist if we retried previously
    broadcast_provider_message = broadcast_event.get_provider_message(provider)
    if broadcast_provider_message is None:
        broadcast_provider_message = create_broadcast_provider_message(
            broadcast_event, provider)

    formatted_message_number = None
    if provider == BroadcastProvider.VODAFONE:
        formatted_message_number = format_sequential_number(
            broadcast_provider_message.message_number)

    current_app.logger.info(f'invoking cbc proxy to send '
                            f'broadcast_event {broadcast_event.reference} '
                            f'msgType {broadcast_event.message_type}')

    areas = [{
        "polygon": polygon
    } for polygon in broadcast_event.transmitted_areas["simple_polygons"]]

    cbc_proxy_provider_client = cbc_proxy_client.get_proxy(provider)

    try:
        if broadcast_event.message_type == BroadcastEventMessageType.ALERT:
            cbc_proxy_provider_client.create_and_send_broadcast(
                identifier=str(broadcast_provider_message.id),
                message_number=formatted_message_number,
                headline="GOV.UK Notify Broadcast",
                description=broadcast_event.transmitted_content['body'],
                areas=areas,
                sent=broadcast_event.sent_at_as_cap_datetime_string,
                expires=broadcast_event.
                transmitted_finishes_at_as_cap_datetime_string,
                channel=broadcast_event.service.broadcast_channel)
        elif broadcast_event.message_type == BroadcastEventMessageType.UPDATE:
            cbc_proxy_provider_client.update_and_send_broadcast(
                identifier=str(broadcast_provider_message.id),
                message_number=formatted_message_number,
                headline="GOV.UK Notify Broadcast",
                description=broadcast_event.transmitted_content['body'],
                areas=areas,
                previous_provider_messages=broadcast_event.
                get_earlier_provider_messages(provider),
                sent=broadcast_event.sent_at_as_cap_datetime_string,
                expires=broadcast_event.
                transmitted_finishes_at_as_cap_datetime_string,
                # We think an alert update should always go out on the same channel that created the alert
                # We recognise there is a small risk with this code here that if the services channel was
                # changed between an alert being sent out and then updated, then something might go wrong
                # but we are relying on service channels changing almost never, and not mid incident
                # We may consider in the future, changing this such that we store the channel a broadcast was
                # sent on on the broadcast message itself and pick the value from there instead of the service
                channel=broadcast_event.service.broadcast_channel)
        elif broadcast_event.message_type == BroadcastEventMessageType.CANCEL:
            cbc_proxy_provider_client.cancel_broadcast(
                identifier=str(broadcast_provider_message.id),
                message_number=formatted_message_number,
                previous_provider_messages=broadcast_event.
                get_earlier_provider_messages(provider),
                sent=broadcast_event.sent_at_as_cap_datetime_string,
            )
    except CBCProxyRetryableException as exc:
        delay = get_retry_delay(self.request.retries)
        current_app.logger.exception(
            f'Retrying send_broadcast_provider_message for broadcast_event {broadcast_event_id} and '
            + f'provider {provider} in {delay} seconds')

        self.retry(
            exc=exc,
            countdown=delay,
            queue=QueueNames.BROADCASTS,
        )

    update_broadcast_provider_message_status(
        broadcast_provider_message, status=BroadcastProviderMessageStatus.ACK)