mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-25 00:33:41 -04:00
trigger send_broadcast_message task when user approves
lets leave the cancellation can of worms alone for now
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import iso8601
|
import iso8601
|
||||||
from flask import Blueprint, jsonify, request
|
from flask import Blueprint, jsonify, request, current_app
|
||||||
|
|
||||||
|
from app.config import QueueNames
|
||||||
from app.dao.templates_dao import dao_get_template_by_id_and_service_id
|
from app.dao.templates_dao import dao_get_template_by_id_and_service_id
|
||||||
from app.dao.users_dao import get_user_by_id
|
from app.dao.users_dao import get_user_by_id
|
||||||
from app.dao.broadcast_message_dao import (
|
from app.dao.broadcast_message_dao import (
|
||||||
@@ -14,6 +15,7 @@ from app.dao.broadcast_message_dao import (
|
|||||||
from app.dao.services_dao import dao_fetch_service_by_id
|
from app.dao.services_dao import dao_fetch_service_by_id
|
||||||
from app.errors import register_errors
|
from app.errors import register_errors
|
||||||
from app.models import BroadcastMessage, BroadcastStatusType
|
from app.models import BroadcastMessage, BroadcastStatusType
|
||||||
|
from app.celery.broadcast_message_tasks import send_broadcast_message
|
||||||
from app.broadcast_message.broadcast_message_schema import (
|
from app.broadcast_message.broadcast_message_schema import (
|
||||||
create_broadcast_message_schema,
|
create_broadcast_message_schema,
|
||||||
update_broadcast_message_schema,
|
update_broadcast_message_schema,
|
||||||
@@ -107,8 +109,7 @@ def update_broadcast_message_status(service_id, broadcast_message_id):
|
|||||||
new_status = data['status']
|
new_status = data['status']
|
||||||
|
|
||||||
# TODO: Restrict status transitions
|
# TODO: Restrict status transitions
|
||||||
# TODO: Do we need to validate that the user belongs to the same service, isn't the creator, has permissions, etc?
|
# TODO: validate that the user belongs to the same service, isn't the creator, has permissions, etc
|
||||||
# or is that admin's job
|
|
||||||
if new_status == BroadcastStatusType.BROADCASTING:
|
if new_status == BroadcastStatusType.BROADCASTING:
|
||||||
broadcast_message.approved_at = datetime.utcnow()
|
broadcast_message.approved_at = datetime.utcnow()
|
||||||
broadcast_message.approved_by = get_user_by_id(data['created_by'])
|
broadcast_message.approved_by = get_user_by_id(data['created_by'])
|
||||||
@@ -118,6 +119,15 @@ def update_broadcast_message_status(service_id, broadcast_message_id):
|
|||||||
|
|
||||||
broadcast_message.status = new_status
|
broadcast_message.status = new_status
|
||||||
|
|
||||||
|
current_app.logger.info(
|
||||||
|
f'broadcast_message {broadcast_message_id} moving from {broadcast_message.status} to {new_status}'
|
||||||
|
)
|
||||||
dao_update_broadcast_message(broadcast_message)
|
dao_update_broadcast_message(broadcast_message)
|
||||||
|
|
||||||
|
if new_status == BroadcastStatusType.BROADCASTING:
|
||||||
|
send_broadcast_message.apply_async(
|
||||||
|
kwargs={'broadcast_message_id': str(broadcast_message.id)},
|
||||||
|
queue=QueueNames.NOTIFY
|
||||||
|
)
|
||||||
|
|
||||||
return jsonify(broadcast_message.serialize()), 200
|
return jsonify(broadcast_message.serialize()), 200
|
||||||
|
|||||||
@@ -258,10 +258,15 @@ def test_update_broadcast_message_status_stores_cancelled_by_and_cancelled_at(ad
|
|||||||
assert response['cancelled_by_id'] == str(canceller.id)
|
assert response['cancelled_by_id'] == str(canceller.id)
|
||||||
|
|
||||||
|
|
||||||
def test_update_broadcast_message_status_stores_approved_by_and_approved_at(admin_request, sample_service):
|
def test_update_broadcast_message_status_stores_approved_by_and_approved_at_and_queues_task(
|
||||||
|
admin_request,
|
||||||
|
sample_service,
|
||||||
|
mocker
|
||||||
|
):
|
||||||
t = create_template(sample_service, BROADCAST_TYPE)
|
t = create_template(sample_service, BROADCAST_TYPE)
|
||||||
bm = create_broadcast_message(t, status=BroadcastStatusType.PENDING_APPROVAL)
|
bm = create_broadcast_message(t, status=BroadcastStatusType.PENDING_APPROVAL)
|
||||||
approver = create_user('approver@gov.uk')
|
approver = create_user('approver@gov.uk')
|
||||||
|
mock_task = mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_message.apply_async')
|
||||||
|
|
||||||
response = admin_request.post(
|
response = admin_request.post(
|
||||||
'broadcast_message.update_broadcast_message_status',
|
'broadcast_message.update_broadcast_message_status',
|
||||||
@@ -274,3 +279,4 @@ def test_update_broadcast_message_status_stores_approved_by_and_approved_at(admi
|
|||||||
assert response['status'] == BroadcastStatusType.BROADCASTING
|
assert response['status'] == BroadcastStatusType.BROADCASTING
|
||||||
assert response['approved_at'] is not None
|
assert response['approved_at'] is not None
|
||||||
assert response['approved_by_id'] == str(approver.id)
|
assert response['approved_by_id'] == str(approver.id)
|
||||||
|
mock_task.assert_called_once_with(kwargs={'broadcast_message_id': str(bm.id)}, queue='notify-internal-tasks')
|
||||||
|
|||||||
Reference in New Issue
Block a user