manage api keys permission should be able to see senders

This commit is contained in:
chrisw
2018-01-25 15:29:05 +00:00
parent 7f8e53ee96
commit 5d26d4457f
16 changed files with 133 additions and 62 deletions

View File

@@ -18,7 +18,7 @@ from flask import (
) )
from flask._compat import string_types from flask._compat import string_types
from flask.globals import _lookup_req_object, _request_ctx_stack from flask.globals import _lookup_req_object, _request_ctx_stack
from flask_login import LoginManager from flask_login import LoginManager, current_user
from flask_wtf import CSRFProtect from flask_wtf import CSRFProtect
from flask_wtf.csrf import CSRFError from flask_wtf.csrf import CSRFError
from functools import partial from functools import partial
@@ -153,6 +153,10 @@ def init_app(application):
def _attach_current_service(): def _attach_current_service():
return {'current_service': current_service} return {'current_service': current_service}
@application.context_processor
def _attach_current_user():
return{'current_user': current_user}
@application.before_request @application.before_request
def record_start_time(): def record_start_time():
g.start = monotonic() g.start = monotonic()

View File

@@ -43,7 +43,7 @@ from notifications_utils.formatters import formatted_list
@main.route("/services/<service_id>/service-settings") @main.route("/services/<service_id>/service-settings")
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True)
def service_settings(service_id): def service_settings(service_id):
letter_branding_organisations = email_branding_client.get_letter_email_branding() letter_branding_organisations = email_branding_client.get_letter_email_branding()
if current_service['email_branding']: if current_service['email_branding']:
@@ -340,7 +340,7 @@ def service_set_reply_to_email(service_id):
@main.route("/services/<service_id>/service-settings/email-reply-to", methods=['GET']) @main.route("/services/<service_id>/service-settings/email-reply-to", methods=['GET'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True)
def service_email_reply_to(service_id): def service_email_reply_to(service_id):
reply_to_email_addresses = service_api_client.get_reply_to_email_addresses(service_id) reply_to_email_addresses = service_api_client.get_reply_to_email_addresses(service_id)
return render_template( return render_template(
@@ -520,7 +520,7 @@ def service_set_auth_type(service_id):
@main.route("/services/<service_id>/service-settings/letter-contacts", methods=['GET']) @main.route("/services/<service_id>/service-settings/letter-contacts", methods=['GET'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True)
def service_letter_contact_details(service_id): def service_letter_contact_details(service_id):
letter_contact_details = service_api_client.get_letter_contacts(service_id) letter_contact_details = service_api_client.get_letter_contacts(service_id)
return render_template( return render_template(
@@ -576,7 +576,7 @@ def service_edit_letter_contact(service_id, letter_contact_id):
@main.route("/services/<service_id>/service-settings/sms-sender", methods=['GET']) @main.route("/services/<service_id>/service-settings/sms-sender", methods=['GET'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True)
def service_sms_senders(service_id): def service_sms_senders(service_id):
def attach_hint(sender): def attach_hint(sender):

View File

@@ -105,9 +105,11 @@
{% endcall %} {% endcall %}
{%- endmacro %} {%- endmacro %}
{% macro edit_field(text, link) -%} {% macro edit_field(text, link, permissions=[]) -%}
{% call field(align='right') %} {% call field(align='right') %}
<a href="{{ link }}">{{ text }}</a> {% if current_user.has_permissions(*permissions, **{'any_':True, 'admin_override': True}) or not permissions %}
<a href="{{ link }}">{{ text }}</a>
{% endif %}
{% endcall %} {% endcall %}
{%- endmacro %} {%- endmacro %}

View File

@@ -50,10 +50,12 @@
{% if current_user.has_permissions('manage_users', 'manage_settings', admin_override=True) %} {% if current_user.has_permissions('manage_users', 'manage_settings', admin_override=True) %}
<li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}">Team members</a></li> <li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}">Team members</a></li>
<li><a href="{{ url_for('.usage', service_id=current_service.id) }}">Usage</a></li> <li><a href="{{ url_for('.usage', service_id=current_service.id) }}">Usage</a></li>
<li><a href="{{ url_for('.service_settings', service_id=current_service.id) }}">Settings</a></li>
{% elif current_user.has_permissions('view_activity') %} {% elif current_user.has_permissions('view_activity') %}
<li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}">Team members</a></li> <li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}">Team members</a></li>
{% endif %} {% endif %}
{% if current_user.has_permissions('manage_api_keys', 'manage_settings', admin_override=True, any_=True) %}
<li><a href="{{ url_for('.service_settings', service_id=current_service.id) }}">Settings</a></li>
{% endif %}
{% if current_user.has_permissions('manage_api_keys', admin_override=True) %} {% if current_user.has_permissions('manage_api_keys', admin_override=True) %}
<li><a href="{{ url_for('.api_integration', service_id=current_service.id) }}">API integration</a></li> <li><a href="{{ url_for('.api_integration', service_id=current_service.id) }}">API integration</a></li>
{% endif %} {% endif %}

View File

@@ -1,7 +1,7 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/textbox.html" import textbox %} {% from "components/textbox.html" import textbox %}
{% from "components/page-footer.html" import page_footer %} {% from "components/page-footer.html" import page_footer %}
{% from "components/table.html" import mapping_table, row, text_field, edit_field, optional_text_field %} {% from "components/table.html" import mapping_table, row, text_field, edit_field, optional_text_field with context %}
{% block service_page_title %} {% block service_page_title %}
@@ -25,8 +25,8 @@
{% call row() %} {% call row() %}
{{ text_field('Callbacks for received text messages') }} {{ text_field('Callbacks for received text messages') }}
{{ optional_text_field(received_text_messages_callback) }} {{ optional_text_field(received_text_messages_callback) }}
{{ edit_field('Change', url_for('.received_text_messages_callback', service_id=current_service.id)) }} {{ edit_field('Change', url_for('.received_text_messages_callback', service_id=current_service.id)) }}
{% endcall %} {% endcall %}
{% endcall %} {% endcall %}
</div> </div>

View File

@@ -1,4 +1,4 @@
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field, row_heading%} {% from "components/table.html" import mapping_table, row, text_field, edit_field, field, row_heading with context %}
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}
{% block per_page_title %} {% block per_page_title %}

View File

@@ -1,5 +1,5 @@
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} {% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% from "components/sub-navigation.html" import sub_navigation %} {% from "components/sub-navigation.html" import sub_navigation %}
{% block per_page_title %} {% block per_page_title %}
@@ -81,5 +81,5 @@
<h2 class="heading-medium">Reliable and resilient</h2> <h2 class="heading-medium">Reliable and resilient</h2>
<p>Notify sends messages through multiple providers. If one provider fails, Notify automatically switches to another so that your messages arent affected.</p> <p>Notify sends messages through multiple providers. If one provider fails, Notify automatically switches to another so that your messages arent affected.</p>
{% endblock %} {% endblock %}

View File

@@ -1,4 +1,4 @@
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} {% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}
{% block per_page_title %} {% block per_page_title %}

View File

@@ -1,4 +1,4 @@
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} {% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% from "components/sub-navigation.html" import sub_navigation %} {% from "components/sub-navigation.html" import sub_navigation %}
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}

View File

@@ -1,5 +1,5 @@
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} {% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% from "components/sub-navigation.html" import sub_navigation %} {% from "components/sub-navigation.html" import sub_navigation %}
{% block per_page_title %} {% block per_page_title %}

View File

@@ -1,7 +1,7 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/banner.html" import banner_wrapper %} {% from "components/banner.html" import banner_wrapper %}
{% from "components/browse-list.html" import browse_list %} {% from "components/browse-list.html" import browse_list %}
{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field %} {% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field with context %}
{% block service_page_title %} {% block service_page_title %}
Settings Settings
@@ -23,7 +23,12 @@
{% call row() %} {% call row() %}
{{ text_field('Service name') }} {{ text_field('Service name') }}
{{ text_field(current_service.name) }} {{ text_field(current_service.name) }}
{{ edit_field('Change', url_for('.service_name_change', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_name_change', service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% call row() %} {% call row() %}
@@ -33,7 +38,13 @@
if 'email_auth' in current_service.permissions if 'email_auth' in current_service.permissions
else 'Text message code' else 'Text message code'
) }} ) }}
{{ edit_field('Change', url_for('.service_set_auth_type', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_auth_type',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% endcall %} {% endcall %}
@@ -48,7 +59,13 @@
{% call row() %} {% call row() %}
{{ text_field('Send emails') }} {{ text_field('Send emails') }}
{{ boolean_field('email' in current_service.permissions) }} {{ boolean_field('email' in current_service.permissions) }}
{{ edit_field('Change', url_for('.service_set_email', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_email',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% if 'email' in current_service.permissions %} {% if 'email' in current_service.permissions %}
@@ -65,8 +82,11 @@
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{{ edit_field( {{ edit_field(
'Manage' if reply_to_email_address_count else 'Change', 'Manage' if reply_to_email_address_count else 'Change',
url_for('.service_email_reply_to', service_id=current_service.id)) url_for('.service_email_reply_to',
service_id=current_service.id),
permissions=['manage_settings','manage_api_keys']
)
}} }}
{% endcall %} {% endcall %}
@@ -84,7 +104,13 @@
{% call row() %} {% call row() %}
{{ text_field('Send text messages') }} {{ text_field('Send text messages') }}
{{ boolean_field('sms' in current_service.permissions) }} {{ boolean_field('sms' in current_service.permissions) }}
{{ edit_field('Change', url_for('.service_set_sms', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_sms',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% if 'sms' in current_service.permissions %} {% if 'sms' in current_service.permissions %}
@@ -99,25 +125,49 @@
</div> </div>
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{{ edit_field('Manage' if sms_sender_count else 'Change', url_for('.service_sms_senders', service_id=current_service.id)) }} {{ edit_field(
'Manage' if sms_sender_count else 'Change',
url_for('.service_sms_senders',
service_id=current_service.id),
permissions=['manage_settings','manage_api_keys']
)
}}
{% endcall %} {% endcall %}
{% call row() %} {% call row() %}
{{ text_field('Text messages start with service name') }} {{ text_field('Text messages start with service name') }}
{{ boolean_field(prefix_sms) }} {{ boolean_field(prefix_sms) }}
{{ edit_field('Change', url_for('.service_set_sms_prefix', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_sms_prefix',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% call row() %} {% call row() %}
{{ text_field('International text messages') }} {{ text_field('International text messages') }}
{{ boolean_field('international_sms' in current_service.permissions) }} {{ boolean_field('international_sms' in current_service.permissions) }}
{{ edit_field('Change', url_for('.service_set_international_sms', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_international_sms',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% call row() %} {% call row() %}
{{ text_field('Receive text messages') }} {{ text_field('Receive text messages') }}
{{ boolean_field('inbound_sms' in current_service.permissions) }} {{ boolean_field('inbound_sms' in current_service.permissions) }}
{{ edit_field('Change', url_for('.service_set_inbound_sms', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_inbound_sms',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% endif %} {% endif %}
@@ -134,7 +184,13 @@
{% call row() %} {% call row() %}
{{ text_field('Send letters') }} {{ text_field('Send letters') }}
{{ boolean_field('letter' in current_service.permissions) }} {{ boolean_field('letter' in current_service.permissions) }}
{{ edit_field('Change', url_for('.service_set_letters', service_id=current_service.id)) }} {{ edit_field(
'Change',
url_for('.service_set_letters',
service_id=current_service.id),
permissions=['manage_settings']
)
}}
{% endcall %} {% endcall %}
{% if 'letter' in current_service.permissions %} {% if 'letter' in current_service.permissions %}
@@ -148,7 +204,13 @@
</div> </div>
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{{ edit_field('Manage' if letter_contact_details_count else 'Change', url_for('.service_letter_contact_details', service_id=current_service.id)) }} {{ edit_field(
'Manage' if letter_contact_details_count else 'Change',
url_for('.service_letter_contact_details',
service_id=current_service.id),
permissions=['manage_settings','manage_api_keys']
)
}}
{% endcall %} {% endcall %}
{% endif %} {% endif %}

View File

@@ -1,7 +1,7 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/api-key.html" import api_key %} {% from "components/api-key.html" import api_key %}
{% from "components/page-footer.html" import page_footer %} {% from "components/page-footer.html" import page_footer %}
{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} {% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context %}
{% block service_page_title %} {% block service_page_title %}
Email reply to addresses Email reply to addresses
@@ -15,9 +15,11 @@
Email reply to addresses Email reply to addresses
</h1> </h1>
</div> </div>
<div class="column-one-third"> {% if current_user.has_permissions('manage_settings', admin_override=True) %}
<a href="{{ url_for('.service_add_email_reply_to', service_id=current_service.id) }}" class="button align-with-heading">Add email address</a> <div class="column-one-third">
</div> <a href="{{ url_for('.service_add_email_reply_to', service_id=current_service.id) }}" class="button align-with-heading">Add email address</a>
</div>
{% endif %}
</div> </div>
<div class="user-list"> <div class="user-list">
{% if not reply_to_email_addresses %} {% if not reply_to_email_addresses %}
@@ -34,11 +36,9 @@
{% endif %} {% endif %}
</span> </span>
</h3> </h3>
<ul class="tick-cross-list"> {% if current_user.has_permissions('manage_settings', admin_override=True) %}
<li class="tick-cross-list-edit-link"> <a class="user-list-edit-link" href="{{ url_for('.service_edit_email_reply_to', service_id =current_service.id, reply_to_email_id = item.id) }}">Change</a>
<a href="{{ url_for('.service_edit_email_reply_to', service_id =current_service.id, reply_to_email_id = item.id) }}">Change</a> {% endif %}
</li>
</ul>
{% if reply_to_email_addresses|length > 1 %} {% if reply_to_email_addresses|length > 1 %}
{{ api_key(item.id, thing="ID") }} {{ api_key(item.id, thing="ID") }}
{% endif %} {% endif %}

View File

@@ -1,7 +1,7 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/api-key.html" import api_key %} {% from "components/api-key.html" import api_key %}
{% from "components/page-footer.html" import page_footer %} {% from "components/page-footer.html" import page_footer %}
{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} {% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context %}
{% block service_page_title %} {% block service_page_title %}
Sender addresses Sender addresses
@@ -15,9 +15,11 @@
Sender addresses Sender addresses
</h1> </h1>
</div> </div>
<div class="column-one-third"> {% if current_user.has_permissions('manage_settings', admin_override=True) %}
<a href="{{ url_for('.service_add_letter_contact', service_id=current_service.id) }}" class="button align-with-heading">Add a new address</a> <div class="column-one-third">
</div> <a href="{{ url_for('.service_add_letter_contact', service_id=current_service.id) }}" class="button align-with-heading">Add a new address</a>
</div>
{% endif %}
</div> </div>
<div class="user-list"> <div class="user-list">
{% if not letter_contact_details %} {% if not letter_contact_details %}
@@ -35,8 +37,9 @@
(default) (default)
{% endif %} {% endif %}
</p> </p>
{% if current_user.has_permissions('manage_settings', admin_override=True) %}
<a class="user-list-edit-link" href="{{ url_for('.service_edit_letter_contact', service_id =current_service.id, letter_contact_id = item.id) }}">Change</a> <a class="user-list-edit-link" href="{{ url_for('.service_edit_letter_contact', service_id =current_service.id, letter_contact_id = item.id) }}">Change</a>
{% endif %}
{% if letter_contact_details|length > 1 %} {% if letter_contact_details|length > 1 %}
{{ api_key(item.id, thing="ID") }} {{ api_key(item.id, thing="ID") }}
{% endif %} {% endif %}

View File

@@ -1,7 +1,7 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/api-key.html" import api_key %} {% from "components/api-key.html" import api_key %}
{% from "components/page-footer.html" import page_footer %} {% from "components/page-footer.html" import page_footer %}
{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} {% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context%}
{% block service_page_title %} {% block service_page_title %}
Text message senders Text message senders
@@ -14,16 +14,18 @@
Text message senders Text message senders
</h1> </h1>
</div> </div>
<div class="column-one-third"> {% if current_user.has_permissions('manage_settings', admin_override=True) %}
<a href="{{ url_for('.service_add_sms_sender', service_id=current_service.id) }}" class="button align-with-heading">Add text message sender</a> <div class="column-one-third">
</div> <a href="{{ url_for('.service_add_sms_sender', service_id=current_service.id) }}" class="button align-with-heading">Add text message sender</a>
</div>
{% endif %}
</div> </div>
<div class="user-list"> <div class="user-list">
{% if not sms_senders %} {% if not sms_senders %}
<div class="user-list-item"> <div class="user-list-item">
<span class="hint">You havent added any sms senders yet</span> <span class="hint">You havent added any sms senders yet</span>
</div> </div>
{% endif %} {% endif %}
{% for item in sms_senders %} {% for item in sms_senders %}
<div class="user-list-item"> <div class="user-list-item">
<h3> <h3>
@@ -35,11 +37,9 @@
</span> </span>
{% endif %} {% endif %}
</h3> </h3>
<ul class="tick-cross-list"> {% if current_user.has_permissions('manage_settings', admin_override=True) %}
<li class="tick-cross-list-edit-link"> <a class="user-list-edit-link" href="{{ url_for('.service_edit_sms_sender', service_id=current_service.id, sms_sender_id = item.id) }}">Change</a>
<a href="{{ url_for('.service_edit_sms_sender', service_id=current_service.id, sms_sender_id = item.id) }}">Change</a> {% endif %}
</li>
</ul>
{% if sms_senders|length > 1 %} {% if sms_senders|length > 1 %}
{{ api_key(item.id, thing="ID") }} {{ api_key(item.id, thing="ID") }}
{% endif %} {% endif %}

View File

@@ -1,6 +1,6 @@
{% extends "withoutnav_template.html" %} {% extends "withoutnav_template.html" %}
{% from "components/table.html" import list_table, row, field %} {% from "components/table.html" import list_table, row, field %}
{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field %} {% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field with context %}
{% block per_page_title %} {% block per_page_title %}
Your profile Your profile

View File

@@ -827,14 +827,12 @@ def test_menu_manage_api_keys(
api_user_active, api_user_active,
service_one, service_one,
['view_activity', 'manage_api_keys']) ['view_activity', 'manage_api_keys'])
page = resp.get_data(as_text=True)
assert url_for(
'main.choose_template',
service_id=service_one['id'],
) in page
assert url_for('main.manage_users', service_id=service_one['id']) in page
assert url_for('main.service_settings', service_id=service_one['id']) not in page
page = resp.get_data(as_text=True)
assert url_for('main.choose_template', service_id=service_one['id'],) in page
assert url_for('main.manage_users', service_id=service_one['id']) in page
assert url_for('main.service_settings', service_id=service_one['id']) in page
assert url_for('main.api_integration', service_id=service_one['id']) in page assert url_for('main.api_integration', service_id=service_one['id']) in page