diff --git a/app/service/rest.py b/app/service/rest.py index ef68e6dc2..c71f9ed02 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -42,6 +42,11 @@ from app.dao.service_contact_list_dao import ( dao_get_contact_list_by_id, save_service_contact_list, ) +from app.dao.service_permissions_dao import ( + dao_add_service_permission, + dao_fetch_service_permissions, + dao_remove_service_permission, +) from app.dao.service_data_retention_dao import ( fetch_service_data_retention, fetch_service_data_retention_by_id, @@ -105,6 +110,7 @@ from app.letters.utils import letter_print_day from app.models import ( KEY_TYPE_NORMAL, LETTER_TYPE, + BROADCAST_TYPE, NOTIFICATION_CANCELLED, Permission, Service, @@ -112,6 +118,7 @@ from app.models import ( LetterBranding, ServiceContactList, ServiceBroadcastSettings, + ServicePermission ) from app.notifications.process_notifications import persist_notification, send_notification_to_queue from app.schema_validation import validate @@ -1084,8 +1091,21 @@ def create_contact_list(service_id): @service_blueprint.route('//set-as-broadcast-service', methods=['POST']) def set_as_broadcast_service(service_id): + """ + This route does three things + - adds a service broadcast settings to define which channel broadcasts should go out on + - removes all current service permissions + - adds the broadcast service permission + """ data = validate(request.get_json(), service_broadcast_settings_schema) service = dao_fetch_service_by_id(service_id) + insert_or_update_service_broadcast_settings(service, channel=data["broadcast_channel"]) + + current_service_permissions = dao_fetch_service_permissions(service.id) + for permission in current_service_permissions: + dao_remove_service_permission(service.id, permission.permission) + dao_add_service_permission(service.id, BROADCAST_TYPE) + data = service_schema.dump(service).data return jsonify(data=data) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 461d56801..ec87873d0 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -3718,3 +3718,44 @@ def test_set_as_broadcast_service_rejects_if_no_channel(client, notify_db, sampl headers=[('Content-Type', 'application/json'), create_authorization_header()] ) assert resp.status_code == 400 + + +def test_set_as_broadcast_service_gives_broadcast_permission_and_removes_other_permissions(client, notify_db, sample_service): + current_permissions = [p.permission for p in sample_service.permissions] + assert len(current_permissions) > 0 + assert current_permissions != [BROADCAST_TYPE] + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_service.id), + data=json.dumps({ + 'broadcast_channel': "severe", + }), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + result = resp.json + assert resp.status_code == 200 + assert result['data']['permissions'] == [BROADCAST_TYPE] + + permissions = ServicePermission.query.filter_by(service_id=sample_service.id).all() + assert [p.permission for p in permissions] == [BROADCAST_TYPE] + + +def test_set_as_broadcast_service_maintains_broadcast_permission_for_existing_broadcast_service( + client, notify_db, sample_broadcast_service +): + current_permissions = [p.permission for p in sample_broadcast_service.permissions] + assert current_permissions == [BROADCAST_TYPE] + + resp = client.post( + '/service/{}/set-as-broadcast-service'.format(sample_broadcast_service.id), + data=json.dumps({ + 'broadcast_channel': "severe", + }), + headers=[('Content-Type', 'application/json'), create_authorization_header()] + ) + result = resp.json + assert resp.status_code == 200 + assert result['data']['permissions'] == [BROADCAST_TYPE] + + permissions = ServicePermission.query.filter_by(service_id=sample_broadcast_service.id).all() + assert [p.permission for p in permissions] == [BROADCAST_TYPE]