new enum view_activity, _manage_users, send_emails

This commit is contained in:
Beverly Nguyen
2025-07-21 14:24:11 -07:00
parent f3ff033ef0
commit ce4829b717
28 changed files with 80 additions and 70 deletions
+2 -2
View File
@@ -507,7 +507,7 @@
"filename": "tests/app/main/views/test_accept_invite.py", "filename": "tests/app/main/views/test_accept_invite.py",
"hashed_secret": "07f0a6c13923fc3b5f0c57ffa2d29b715eb80d71", "hashed_secret": "07f0a6c13923fc3b5f0c57ffa2d29b715eb80d71",
"is_verified": false, "is_verified": false,
"line_number": 631, "line_number": 632,
"is_secret": false "is_secret": false
} }
], ],
@@ -634,5 +634,5 @@
} }
] ]
}, },
"generated_at": "2025-07-17T07:59:56Z" "generated_at": "2025-07-21T21:23:30Z"
} }
+3
View File
@@ -73,6 +73,9 @@ class ServicePermission(StrEnum):
SEND_MESSAGES = "send_messages" SEND_MESSAGES = "send_messages"
MANAGE_SERVICE = "manage_service" MANAGE_SERVICE = "manage_service"
MANAGE_TEMPLATES = "manage_templates" MANAGE_TEMPLATES = "manage_templates"
VIEW_ACTIVITY = "view_activity"
MANAGE_USERS = "manage_users"
SEND_EMAILS = "send_emails"
class InvitedUserStatus(StrEnum): class InvitedUserStatus(StrEnum):
+2 -2
View File
@@ -1,7 +1,7 @@
from flask import abort, render_template, request, url_for from flask import abort, render_template, request, url_for
from app import current_service, job_api_client from app import current_service, job_api_client
from app.enums import NotificationStatus from app.enums import NotificationStatus, ServicePermission
from app.formatters import get_time_left from app.formatters import get_time_left
from app.main import main from app.main import main
from app.utils.pagination import ( from app.utils.pagination import (
@@ -14,7 +14,7 @@ from app.utils.user import user_has_permissions
@main.route("/activity/services/<uuid:service_id>") @main.route("/activity/services/<uuid:service_id>")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def all_jobs_activity(service_id): def all_jobs_activity(service_id):
service_data_retention_days = 7 service_data_retention_days = 7
page = get_page_from_request() page = get_page_from_request()
+2 -2
View File
@@ -13,7 +13,7 @@ from notifications_utils.template import SMSPreviewTemplate
@main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>") @main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def conversation(service_id, notification_id): def conversation(service_id, notification_id):
user_number = get_user_number(service_id, notification_id) user_number = get_user_number(service_id, notification_id)
@@ -31,7 +31,7 @@ def conversation(service_id, notification_id):
@main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>.json") @main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>.json")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def conversation_updates(service_id, notification_id): def conversation_updates(service_id, notification_id):
return jsonify( return jsonify(
get_conversation_partials( get_conversation_partials(
+3 -3
View File
@@ -24,7 +24,7 @@ from app.utils.user import user_has_permissions
@main.route("/services/<uuid:service_id>/dashboard") @main.route("/services/<uuid:service_id>/dashboard")
@user_has_permissions("view_activity", ServicePermission.SEND_MESSAGES) @user_has_permissions(ServicePermission.VIEW_ACTIVITY, ServicePermission.SEND_MESSAGES)
def old_service_dashboard(service_id): def old_service_dashboard(service_id):
return redirect(url_for(".service_dashboard", service_id=service_id)) return redirect(url_for(".service_dashboard", service_id=service_id))
@@ -37,7 +37,7 @@ def service_dashboard(service_id):
session.pop("invited_user_id", None) session.pop("invited_user_id", None)
session["service_id"] = service_id session["service_id"] = service_id
if not current_user.has_permissions("view_activity"): if not current_user.has_permissions(ServicePermission.VIEW_ACTIVITY):
return redirect(url_for("main.choose_template", service_id=service_id)) return redirect(url_for("main.choose_template", service_id=service_id))
job_response = job_api_client.get_jobs(service_id)["data"] job_response = job_api_client.get_jobs(service_id)["data"]
@@ -166,7 +166,7 @@ def get_daily_stats_by_user(service_id):
@main.route("/services/<uuid:service_id>/template-usage") @main.route("/services/<uuid:service_id>/template-usage")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def template_usage(service_id): def template_usage(service_id):
year, current_financial_year = requested_and_current_financial_year(request) year, current_financial_year = requested_and_current_financial_year(request)
stats = template_statistics_client.get_monthly_template_usage_for_service( stats = template_statistics_client.get_monthly_template_usage_for_service(
+2 -2
View File
@@ -78,7 +78,7 @@ def view_job(service_id, job_id):
@main.route("/services/<uuid:service_id>/jobs/<uuid:job_id>.csv") @main.route("/services/<uuid:service_id>/jobs/<uuid:job_id>.csv")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def view_job_csv(service_id, job_id): def view_job_csv(service_id, job_id):
job = Job.from_id(job_id, service_id=service_id) job = Job.from_id(job_id, service_id=service_id)
filter_args = parse_filter_args(request.args) filter_args = parse_filter_args(request.args)
@@ -222,7 +222,7 @@ def get_notifications(service_id, message_type, status_override=None): # noqa
message_type, number_of_days="seven_day" message_type, number_of_days="seven_day"
) )
if request.path.endswith("csv") and current_user.has_permissions("view_activity"): if request.path.endswith("csv") and current_user.has_permissions(ServicePermission.VIEW_ACTIVITY):
return Response( return Response(
generate_notifications_csv( generate_notifications_csv(
service_id=service_id, service_id=service_id,
+3 -3
View File
@@ -28,7 +28,7 @@ from app.utils.user import user_has_permissions
@main.route("/services/<uuid:service_id>/notification/<uuid:notification_id>") @main.route("/services/<uuid:service_id>/notification/<uuid:notification_id>")
@user_has_permissions("view_activity", ServicePermission.SEND_MESSAGES) @user_has_permissions(ServicePermission.VIEW_ACTIVITY, ServicePermission.SEND_MESSAGES)
def view_notification(service_id, notification_id, error_message=None): def view_notification(service_id, notification_id, error_message=None):
if error_message: if error_message:
flash(error_message) flash(error_message)
@@ -101,7 +101,7 @@ def view_notification(service_id, notification_id, error_message=None):
@main.route("/services/<uuid:service_id>/notification/<uuid:notification_id>.json") @main.route("/services/<uuid:service_id>/notification/<uuid:notification_id>.json")
@user_has_permissions("view_activity", ServicePermission.SEND_MESSAGES) @user_has_permissions(ServicePermission.VIEW_ACTIVITY, ServicePermission.SEND_MESSAGES)
def view_notification_updates(service_id, notification_id): def view_notification_updates(service_id, notification_id):
return jsonify( return jsonify(
**get_single_notification_partials( **get_single_notification_partials(
@@ -134,7 +134,7 @@ def get_all_personalisation_from_notification(notification):
@main.route("/services/<uuid:service_id>/download-notifications.csv") @main.route("/services/<uuid:service_id>/download-notifications.csv")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def download_notifications_csv(service_id): def download_notifications_csv(service_id):
filter_args = parse_filter_args(request.args) filter_args = parse_filter_args(request.args)
filter_args["status"] = set_status_filters(filter_args) filter_args["status"] = set_status_filters(filter_args)
+1 -1
View File
@@ -823,7 +823,7 @@ def redact_template(service_id, template_id):
@main.route("/services/<uuid:service_id>/templates/<uuid:template_id>/versions") @main.route("/services/<uuid:service_id>/templates/<uuid:template_id>/versions")
@user_has_permissions("view_activity") @user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def view_template_versions(service_id, template_id): def view_template_versions(service_id, template_id):
return render_template( return render_template(
"views/templates/choose_history.html", "views/templates/choose_history.html",
+2 -2
View File
@@ -6,11 +6,11 @@
href="{{ url_for('.choose_template', service_id=current_service.id) }}">Send messages</a> href="{{ url_for('.choose_template', service_id=current_service.id) }}">Send messages</a>
<ul class="usa-sidenav"> <ul class="usa-sidenav">
{% if current_user.has_permissions() %} {% if current_user.has_permissions() %}
{% if current_user.has_permissions('view_activity') %} {% if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %}
<li class="usa-sidenav__item"><a class="{{ main_navigation.is_selected('dashboard') }}" href="{{ url_for('.service_dashboard', service_id=current_service.id) }}">Dashboard</a></li> <li class="usa-sidenav__item"><a class="{{ main_navigation.is_selected('dashboard') }}" href="{{ url_for('.service_dashboard', service_id=current_service.id) }}">Dashboard</a></li>
<li class="usa-sidenav__item"><a class="{{ main_navigation.is_selected('activity') }}" href="{{ url_for('.all_jobs_activity', service_id=current_service.id) }}">Activity</a></li> <li class="usa-sidenav__item"><a class="{{ main_navigation.is_selected('activity') }}" href="{{ url_for('.all_jobs_activity', service_id=current_service.id) }}">Activity</a></li>
{% endif %} {% endif %}
{% if not current_user.has_permissions('view_activity') %} {% if not current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %}
<li class="usa-sidenav__item"><a class="{{ casework_navigation.is_selected('sent-messages') }}" href="{{ url_for('.view_notifications', service_id=current_service.id, status='sending,delivered,failed') }}">Sent messages</a></li> <li class="usa-sidenav__item"><a class="{{ casework_navigation.is_selected('sent-messages') }}" href="{{ url_for('.view_notifications', service_id=current_service.id, status='sending,delivered,failed') }}">Sent messages</a></li>
{% endif %} {% endif %}
{% elif current_user.has_permissions(allow_org_user=True) %} {% elif current_user.has_permissions(allow_org_user=True) %}
@@ -125,7 +125,7 @@
<p><b>Note: </b>Report data is only available for 7 days after your message has been sent</p> <p><b>Note: </b>Report data is only available for 7 days after your message has been sent</p>
</div> </div>
{{show_pagination}} {{show_pagination}}
{% if current_user.has_permissions('view_activity') %} {% if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %}
<h2 class="line-height-sans-2 margin-bottom-0 margin-top-4">Download recent reports</h2> <h2 class="line-height-sans-2 margin-bottom-0 margin-top-4">Download recent reports</h2>
<p class="font-body-sm"> <p class="font-body-sm">
<a href="{{ download_link_one_day }}" download="download" class="usa-link">Download all data last 24 hours (<abbr title="Comma separated values">CSV</abbr>)</a> <a href="{{ download_link_one_day }}" download="download" class="usa-link">Download all data last 24 hours (<abbr title="Comma separated values">CSV</abbr>)</a>
+2 -2
View File
@@ -7,7 +7,7 @@
{% set page_title = ( {% set page_title = (
(99|message_count_label(message_type, suffix='')) | capitalize (99|message_count_label(message_type, suffix='')) | capitalize
if current_user.has_permissions('view_activity') if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY)
else 'Sent messages' else 'Sent messages'
) %} ) %}
@@ -62,7 +62,7 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{% endcall %} {% endcall %}
{% if current_user.has_permissions('view_activity') %} {% if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %}
<p class="font-body-sm"> <p class="font-body-sm">
<a href="{{ download_link_seven_day }}" download="download" class="usa-link">Download all data last 7 days (<abbr title="Comma separated values">CSV</abbr>)</a> <a href="{{ download_link_seven_day }}" download="download" class="usa-link">Download all data last 7 days (<abbr title="Comma separated values">CSV</abbr>)</a>
&emsp; &emsp;
@@ -50,7 +50,7 @@
{{ ajax_block(partials, updates_url, 'status', finished=finished) }} {{ ajax_block(partials, updates_url, 'status', finished=finished) }}
{% endif %} {% endif %}
{% if current_user.has_permissions(ServicePermission.SEND_MESSAGES) and current_user.has_permissions('view_activity') and template.template_type == 'sms' and can_receive_inbound %} {% if current_user.has_permissions(ServicePermission.SEND_MESSAGES) and current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) and template.template_type == 'sms' and can_receive_inbound %}
<p> <p>
<a class="usa-link" href="{{ url_for('.conversation', service_id=current_service.id, notification_id=notification_id, _anchor='n{}'.format(notification_id)) }}">See all text messages sent to this phone number</a> <a class="usa-link" href="{{ url_for('.conversation', service_id=current_service.id, notification_id=notification_id, _anchor='n{}'.format(notification_id)) }}">See all text messages sent to this phone number</a>
</p> </p>
+4 -4
View File
@@ -4,18 +4,18 @@ from app.enums import ServicePermission
permission_mappings = { permission_mappings = {
# TODO: consider turning off email-sending permissions during SMS pilot # TODO: consider turning off email-sending permissions during SMS pilot
ServicePermission.SEND_MESSAGES: ["send_texts", "send_emails"], ServicePermission.SEND_MESSAGES: ["send_texts", ServicePermission.SEND_EMAILS],
ServicePermission.MANAGE_TEMPLATES: [ServicePermission.MANAGE_TEMPLATES], ServicePermission.MANAGE_TEMPLATES: [ServicePermission.MANAGE_TEMPLATES],
ServicePermission.MANAGE_SERVICE: ["manage_users", "manage_settings"], ServicePermission.MANAGE_SERVICE: [ServicePermission.MANAGE_USERS, "manage_settings"],
"manage_api_keys": ["manage_api_keys"], "manage_api_keys": ["manage_api_keys"],
"view_activity": ["view_activity"], ServicePermission.VIEW_ACTIVITY: [ServicePermission.VIEW_ACTIVITY],
} }
all_ui_permissions = set(permission_mappings.keys()) all_ui_permissions = set(permission_mappings.keys())
all_db_permissions = set(chain(*permission_mappings.values())) all_db_permissions = set(chain(*permission_mappings.values()))
permission_options = ( permission_options = (
("view_activity", "See dashboard"), (ServicePermission.VIEW_ACTIVITY, "See dashboard"),
(ServicePermission.SEND_MESSAGES, "Send messages"), (ServicePermission.SEND_MESSAGES, "Send messages"),
(ServicePermission.MANAGE_TEMPLATES, "Add and edit templates"), (ServicePermission.MANAGE_TEMPLATES, "Add and edit templates"),
(ServicePermission.MANAGE_SERVICE, "Manage settings, team and usage"), (ServicePermission.MANAGE_SERVICE, "Manage settings, team and usage"),
+3 -1
View File
@@ -5,6 +5,8 @@ import re
import pytest import pytest
from flask import current_app from flask import current_app
from app.enums import ServicePermission
from tests import service_json from tests import service_json
from tests.conftest import ( from tests.conftest import (
ORGANISATION_ID, ORGANISATION_ID,
@@ -51,7 +53,7 @@ def test_services_pages_that_org_users_are_allowed_to_see(
api_user_active["services"] = user_services api_user_active["services"] = user_services
api_user_active["organizations"] = user_organizations api_user_active["organizations"] = user_organizations
api_user_active["permissions"] = { api_user_active["permissions"] = {
service_id: ["manage_users", "manage_settings"] for service_id in user_services service_id: [ServicePermission.MANAGE_USERS, "manage_settings"] for service_id in user_services
} }
service = service_json( service = service_json(
name="SERVICE WITH ORG", name="SERVICE WITH ORG",
+4 -3
View File
@@ -5,6 +5,7 @@ from flask import url_for
from freezegun import freeze_time from freezegun import freeze_time
import app import app
from app.enums import ServicePermission
from notifications_python_client.errors import HTTPError from notifications_python_client.errors import HTTPError
from tests import service_json from tests import service_json
from tests.conftest import ( from tests.conftest import (
@@ -138,7 +139,7 @@ def test_existing_user_accept_invite_calls_api_and_redirects_to_dashboard(
client_request.logout() client_request.logout()
expected_service = service_one["id"] expected_service = service_one["id"]
expected_permissions = { expected_permissions = {
"view_activity", ServicePermission.VIEW_ACTIVITY,
"send_messages", "send_messages",
"manage_service", "manage_service",
"manage_api_keys", "manage_api_keys",
@@ -417,7 +418,7 @@ def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(
client_request.logout() client_request.logout()
expected_service = service_one["id"] expected_service = service_one["id"]
expected_permissions = { expected_permissions = {
"view_activity", ServicePermission.VIEW_ACTIVITY,
"send_messages", "send_messages",
"manage_service", "manage_service",
"manage_api_keys", "manage_api_keys",
@@ -649,7 +650,7 @@ def test_new_invited_user_verifies_and_added_to_service(
# when they post codes back to admin user should be added to # when they post codes back to admin user should be added to
# service and sent on to dash board # service and sent on to dash board
expected_permissions = { expected_permissions = {
"view_activity", ServicePermission.VIEW_ACTIVITY,
"send_messages", "send_messages",
"manage_service", "manage_service",
"manage_api_keys", "manage_api_keys",
+2 -1
View File
@@ -6,6 +6,7 @@ from unittest.mock import call
import pytest import pytest
from flask import url_for from flask import url_for
from app.enums import ServicePermission
from app.formatters import format_datetime_table from app.formatters import format_datetime_table
from tests import sample_uuid, validate_route_permission from tests import sample_uuid, validate_route_permission
from tests.conftest import SERVICE_ONE_ID, normalize_spaces from tests.conftest import SERVICE_ONE_ID, normalize_spaces
@@ -371,7 +372,7 @@ def test_route_invalid_permissions(
"GET", "GET",
403, 403,
url_for(route, service_id=service_one["id"], key_id=fake_uuid), url_for(route, service_id=service_one["id"], key_id=fake_uuid),
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
api_user_active, api_user_active,
service_one, service_one,
) )
+5 -5
View File
@@ -920,7 +920,7 @@ def test_menu_send_messages(
mocker, mocker,
api_user_active, api_user_active,
service_one, service_one,
["view_activity", "send_texts", "send_emails", "manage_service"], [ServicePermission.VIEW_ACTIVITY, "send_texts", ServicePermission.SEND_EMAILS, ServicePermission.MANAGE_SERVICE],
) )
page = str(page) page = str(page)
assert ( assert (
@@ -957,7 +957,7 @@ def test_menu_manage_service(
mocker, mocker,
api_user_active, api_user_active,
service_one, service_one,
["view_activity", ServicePermission.MANAGE_TEMPLATES, "manage_users", "manage_settings"], [ServicePermission.VIEW_ACTIVITY, ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_USERS, "manage_settings"],
) )
page = str(page) page = str(page)
assert ( assert (
@@ -994,7 +994,7 @@ def test_menu_main_settings(
mocker, mocker,
api_user_active, api_user_active,
service_one, service_one,
["view_activity", "user_profile", "manage_users", "manage_settings"], [ServicePermission.VIEW_ACTIVITY, "user_profile", ServicePermission.MANAGE_USERS, "manage_settings"],
) )
page = str(page) page = str(page)
assert ( assert (
@@ -1030,7 +1030,7 @@ def test_menu_manage_api_keys(
mocker, mocker,
api_user_active, api_user_active,
service_one, service_one,
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
) )
page = str(page) page = str(page)
@@ -1107,7 +1107,7 @@ def test_route_for_service_permissions(
"GET", "GET",
200, 200,
url_for("main.service_dashboard", service_id=service_one["id"]), url_for("main.service_dashboard", service_id=service_one["id"]),
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
api_user_active, api_user_active,
service_one, service_one,
) )
+12 -12
View File
@@ -304,7 +304,7 @@ def test_service_without_caseworking_doesnt_show_admin_vs_caseworker(
for idx in range(len(permission_checkboxes)): for idx in range(len(permission_checkboxes)):
assert permission_checkboxes[idx]["name"] == "permissions_field" assert permission_checkboxes[idx]["name"] == "permissions_field"
assert permission_checkboxes[0]["value"] == "view_activity" assert permission_checkboxes[0]["value"] == ServicePermission.VIEW_ACTIVITY
assert permission_checkboxes[1]["value"] == ServicePermission.SEND_MESSAGES assert permission_checkboxes[1]["value"] == ServicePermission.SEND_MESSAGES
assert permission_checkboxes[2]["value"] == ServicePermission.MANAGE_TEMPLATES assert permission_checkboxes[2]["value"] == ServicePermission.MANAGE_TEMPLATES
assert permission_checkboxes[3]["value"] == ServicePermission.MANAGE_SERVICE assert permission_checkboxes[3]["value"] == ServicePermission.MANAGE_SERVICE
@@ -387,7 +387,7 @@ def test_user_with_no_mobile_number_cant_be_set_to_sms_auth(
"main.edit_user_permissions", "main.edit_user_permissions",
{"user_id": sample_uuid()}, {"user_id": sample_uuid()},
[ [
("view_activity", True), (ServicePermission.VIEW_ACTIVITY, True),
(ServicePermission.SEND_MESSAGES, True), (ServicePermission.SEND_MESSAGES, True),
(ServicePermission.MANAGE_TEMPLATES, True), (ServicePermission.MANAGE_TEMPLATES, True),
(ServicePermission.MANAGE_SERVICE, True), (ServicePermission.MANAGE_SERVICE, True),
@@ -397,7 +397,7 @@ def test_user_with_no_mobile_number_cant_be_set_to_sms_auth(
"main.invite_user", "main.invite_user",
{}, {},
[ [
("view_activity", False), (ServicePermission.VIEW_ACTIVITY, False),
(ServicePermission.SEND_MESSAGES, False), (ServicePermission.SEND_MESSAGES, False),
(ServicePermission.MANAGE_TEMPLATES, False), (ServicePermission.MANAGE_TEMPLATES, False),
(ServicePermission.MANAGE_SERVICE, False), (ServicePermission.MANAGE_SERVICE, False),
@@ -483,14 +483,14 @@ def test_should_not_show_page_for_non_team_member(
( (
{ {
"permissions_field": [ "permissions_field": [
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
] ]
}, },
{ {
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
@@ -499,13 +499,13 @@ def test_should_not_show_page_for_non_team_member(
( (
{ {
"permissions_field": [ "permissions_field": [
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
] ]
}, },
{ {
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
}, },
@@ -668,7 +668,7 @@ def test_cant_edit_user_folder_permissions_for_platform_admin_users(
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
"view_activity", ServicePermission.VIEW_ACTIVITY,
}, },
folder_permissions=None, folder_permissions=None,
) )
@@ -1016,7 +1016,7 @@ def test_invite_user(
_data={ _data={
"email_address": email_address, "email_address": email_address,
"permissions_field": [ "permissions_field": [
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
@@ -1032,7 +1032,7 @@ def test_invite_user(
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
"view_activity", ServicePermission.VIEW_ACTIVITY,
} }
app.invite_api_client.create_invite.assert_called_once_with( app.invite_api_client.create_invite.assert_called_once_with(
@@ -1125,7 +1125,7 @@ def test_invite_user_with_email_auth_service(
_data={ _data={
"email_address": email_address, "email_address": email_address,
"permissions_field": [ "permissions_field": [
"view_activity", ServicePermission.VIEW_ACTIVITY,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
@@ -1144,7 +1144,7 @@ def test_invite_user_with_email_auth_service(
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
ServicePermission.MANAGE_TEMPLATES, ServicePermission.MANAGE_TEMPLATES,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
"view_activity", ServicePermission.VIEW_ACTIVITY,
} }
app.invite_api_client.create_invite.assert_called_once_with( app.invite_api_client.create_invite.assert_called_once_with(
+4 -3
View File
@@ -8,6 +8,7 @@ import pytest
from flask import url_for from flask import url_for
from freezegun import freeze_time from freezegun import freeze_time
from app.enums import ServicePermission
from app.main.views.platform_admin import ( from app.main.views.platform_admin import (
create_global_stats, create_global_stats,
format_stats_by_service, format_stats_by_service,
@@ -1177,13 +1178,13 @@ def test_get_users_report(client_request, platform_admin_user, mocker):
"password_changed_at": "2023-07-21 14:12:54.832850", "password_changed_at": "2023-07-21 14:12:54.832850",
"permissions": { "permissions": {
"test service": [ "test service": [
"manage_users", ServicePermission.MANAGE_USERS,
"manage_templates", "manage_templates",
"manage_settings", "manage_settings",
"send_texts", "send_texts",
"send_emails", ServicePermission.SEND_EMAILS,
"manage_api_keys", "manage_api_keys",
"view_activity", ServicePermission.VIEW_ACTIVITY,
] ]
}, },
"platform_admin": True, "platform_admin": True,
+1 -1
View File
@@ -300,7 +300,7 @@ def test_register_from_email_auth_invite(
"manage_api_keys", "manage_api_keys",
ServicePermission.MANAGE_SERVICE, ServicePermission.MANAGE_SERVICE,
ServicePermission.SEND_MESSAGES, ServicePermission.SEND_MESSAGES,
"view_activity", ServicePermission.VIEW_ACTIVITY,
}, },
[], [],
) )
+2 -2
View File
@@ -1717,7 +1717,7 @@ def test_send_one_off_email_to_self_without_placeholders_redirects_to_check_page
{}, {},
), ),
( (
{ServicePermission.SEND_MESSAGES, "view_activity"}, {ServicePermission.SEND_MESSAGES, ServicePermission.VIEW_ACTIVITY},
"main.choose_template", "main.choose_template",
{}, {},
), ),
@@ -2140,7 +2140,7 @@ def test_route_permissions(
"GET", "GET",
response_code, response_code,
url_for(route, service_id=service_one["id"], template_id=fake_uuid), url_for(route, service_id=service_one["id"], template_id=fake_uuid),
["view_activity", ServicePermission.SEND_MESSAGES], [ServicePermission.VIEW_ACTIVITY, ServicePermission.SEND_MESSAGES],
api_user_active, api_user_active,
service_one, service_one,
) )
@@ -3,6 +3,7 @@ import uuid
import pytest import pytest
from flask import abort, url_for from flask import abort, url_for
from app.enums import ServicePermission
from app.models.user import User from app.models.user import User
from notifications_python_client.errors import HTTPError from notifications_python_client.errors import HTTPError
from tests import sample_uuid from tests import sample_uuid
@@ -606,10 +607,10 @@ def test_get_manage_folder_viewing_permissions_for_users_not_visible_when_no_man
): ):
active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [ active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [
"send_texts", "send_texts",
"send_emails", ServicePermission.SEND_EMAILS,
"manage_templates", "manage_templates",
"manage_api_keys", "manage_api_keys",
"view_activity", ServicePermission.VIEW_ACTIVITY,
] ]
folder_id = str(uuid.uuid4()) folder_id = str(uuid.uuid4())
team_member = create_active_user_view_permissions(with_unique_id=True) team_member = create_active_user_view_permissions(with_unique_id=True)
@@ -860,10 +861,10 @@ def test_manage_folder_users_doesnt_change_permissions_current_user_cannot_manag
): ):
active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [ active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [
"send_texts", "send_texts",
"send_emails", ServicePermission.SEND_EMAILS,
"manage_templates", "manage_templates",
"manage_api_keys", "manage_api_keys",
"view_activity", ServicePermission.VIEW_ACTIVITY,
] ]
team_member = create_active_user_view_permissions(with_unique_id=True) team_member = create_active_user_view_permissions(with_unique_id=True)
mock_update = mocker.patch("app.template_folder_api_client.update_template_folder") mock_update = mocker.patch("app.template_folder_api_client.update_template_folder")
+4 -4
View File
@@ -518,7 +518,7 @@ def test_user_with_only_send_and_view_redirected_to_set_sender_for_one_off(
): ):
active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [ active_user_with_permissions["permissions"][SERVICE_ONE_ID] = [
"send_messages", "send_messages",
"view_activity", ServicePermission.VIEW_ACTIVITY,
] ]
client_request.login(active_user_with_permissions) client_request.login(active_user_with_permissions)
client_request.get( client_request.get(
@@ -538,7 +538,7 @@ def test_user_with_only_send_and_view_redirected_to_set_sender_for_one_off(
("permissions", "links_to_be_shown", "permissions_warning_to_be_shown"), ("permissions", "links_to_be_shown", "permissions_warning_to_be_shown"),
[ [
( (
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
[], [],
"If you need to send this text message or edit this template, contact your manager.", "If you need to send this text message or edit this template, contact your manager.",
), ),
@@ -575,7 +575,7 @@ def test_should_be_able_to_view_a_template_with_links(
permissions_warning_to_be_shown, permissions_warning_to_be_shown,
): ):
active_user_with_permissions["permissions"][SERVICE_ONE_ID] = permissions + [ active_user_with_permissions["permissions"][SERVICE_ONE_ID] = permissions + [
"view_activity" ServicePermission.VIEW_ACTIVITY
] ]
client_request.login(active_user_with_permissions) client_request.login(active_user_with_permissions)
@@ -1698,7 +1698,7 @@ def test_route_invalid_permissions(
template_type="sms", template_type="sms",
template_id=fake_uuid, template_id=fake_uuid,
), ),
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
api_user_active, api_user_active,
service_one, service_one,
) )
+3 -2
View File
@@ -2,6 +2,7 @@ import pytest
from flask import url_for from flask import url_for
from app import current_user from app import current_user
from app.enums import ServicePermission
from tests import validate_route_permission from tests import validate_route_permission
from tests.conftest import SERVICE_ONE_ID, create_template, normalize_spaces from tests.conftest import SERVICE_ONE_ID, create_template, normalize_spaces
@@ -113,7 +114,7 @@ def test_should_403_if_user_does_not_have_send_permissions_for_tour_start(
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
template_id=fake_uuid, template_id=fake_uuid,
), ),
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
api_user_active, api_user_active,
service_one, service_one,
) )
@@ -255,7 +256,7 @@ def test_should_403_if_user_does_not_have_send_permissions_for_tour_step(
template_id=fake_uuid, template_id=fake_uuid,
step_index=1, step_index=1,
), ),
["view_activity"], [ServicePermission.VIEW_ACTIVITY],
api_user_active, api_user_active,
service_one, service_one,
) )
+1 -1
View File
@@ -183,7 +183,7 @@ def test_set_permissions(
mock_event.assert_called_once_with( mock_event.assert_called_once_with(
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
user_id=active_user_view_permissions["id"], user_id=active_user_view_permissions["id"],
original_ui_permissions={"view_activity"}, original_ui_permissions={ServicePermission.VIEW_ACTIVITY},
new_ui_permissions={ServicePermission.MANAGE_TEMPLATES}, new_ui_permissions={ServicePermission.MANAGE_TEMPLATES},
set_by_id=fake_uuid, set_by_id=fake_uuid,
) )
+1 -1
View File
@@ -124,7 +124,7 @@ def test_set_user_permissions(client_request, mock_events):
"user_id": str(uuid.uuid4()), "user_id": str(uuid.uuid4()),
"service_id": str(uuid.uuid4()), "service_id": str(uuid.uuid4()),
"original_ui_permissions": {ServicePermission.MANAGE_TEMPLATES}, "original_ui_permissions": {ServicePermission.MANAGE_TEMPLATES},
"new_ui_permissions": set("view_activity"), "new_ui_permissions": {ServicePermission.VIEW_ACTIVITY},
"set_by_id": str(uuid.uuid4()), "set_by_id": str(uuid.uuid4()),
} }
+3 -3
View File
@@ -36,7 +36,7 @@ def test_permissions(
request.view_args.update({"service_id": "foo"}) request.view_args.update({"service_id": "foo"})
api_user_active["permissions"] = { api_user_active["permissions"] = {
"foo": ["manage_users", "manage_templates", "manage_settings"] "foo": [ServicePermission.MANAGE_USERS, "manage_templates", "manage_settings"]
} }
api_user_active["services"] = ["foo", "bar"] api_user_active["services"] = ["foo", "bar"]
@@ -66,7 +66,7 @@ def test_permissions_forbidden(
request.view_args.update({"service_id": "foo"}) request.view_args.update({"service_id": "foo"})
api_user_active["permissions"] = { api_user_active["permissions"] = {
"foo": ["manage_users", "manage_templates", "manage_settings"] "foo": [ServicePermission.MANAGE_USERS, "manage_templates", "manage_settings"]
} }
api_user_active["services"] = ["foo", "bar"] api_user_active["services"] = ["foo", "bar"]
@@ -179,7 +179,7 @@ def test_user_with_no_permissions_to_service_goes_to_templates(
api_user_active, api_user_active,
): ):
api_user_active["permissions"] = { api_user_active["permissions"] = {
"foo": ["manage_users", "manage_templates", "manage_settings"] "foo": [ServicePermission.MANAGE_USERS, "manage_templates", "manage_settings"]
} }
api_user_active["services"] = ["foo", "bar"] api_user_active["services"] = ["foo", "bar"]
client_request.login(api_user_active) client_request.login(api_user_active)
+2 -2
View File
@@ -17,7 +17,7 @@ from app.utils.user_permissions import (
( (
[ [
"send_texts", "send_texts",
"send_emails", ServicePermission.SEND_EMAILS,
"manage_templates", "manage_templates",
"some_unknown_permission", "some_unknown_permission",
], ],
@@ -47,7 +47,7 @@ def test_translate_permissions_from_ui_to_db():
assert db_permissions == { assert db_permissions == {
"send_texts", "send_texts",
"send_emails", ServicePermission.SEND_EMAILS,
"manage_templates", "manage_templates",
"some_unknown_permission", "some_unknown_permission",
} }