mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-08 23:13:12 -04:00
Merge pull request #1012 from alphagov/keys-and-trial-mode
Make relationship between keys, whitelist, trial mode and team clearer
This commit is contained in:
@@ -35,6 +35,10 @@
|
|||||||
margin-bottom: $gutter-half;
|
margin-bottom: $gutter-half;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.bottom-gutter-3-2 {
|
||||||
|
margin-bottom: $gutter * 3/2;
|
||||||
|
}
|
||||||
|
|
||||||
.bottom-gutter-2 {
|
.bottom-gutter-2 {
|
||||||
margin-bottom: $gutter * 2;
|
margin-bottom: $gutter * 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,3 +214,12 @@ summary::-webkit-details-marker {
|
|||||||
details .arrow {
|
details .arrow {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.block-label-hint {
|
||||||
|
@include core-16;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block-label input[disabled] {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|||||||
@@ -391,8 +391,8 @@ class RequestToGoLiveForm(Form):
|
|||||||
),
|
),
|
||||||
choices=[
|
choices=[
|
||||||
('yes', 'Yes'),
|
('yes', 'Yes'),
|
||||||
('no', 'No – we’ll send you a copy'),
|
('no', 'No'),
|
||||||
('don’t know', 'I don’t know – we’ll check for you')
|
('don’t know', 'I don’t know')
|
||||||
],
|
],
|
||||||
validators=[DataRequired()]
|
validators=[DataRequired()]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from flask import request, render_template, redirect, url_for, flash
|
from flask import request, render_template, redirect, url_for, flash, Markup, abort
|
||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
from app.main import main
|
from app.main import main
|
||||||
from app.main.forms import CreateKeyForm, Whitelist
|
from app.main.forms import CreateKeyForm, Whitelist
|
||||||
@@ -68,13 +68,22 @@ def create_api_key(service_id):
|
|||||||
key['name'] for key in api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
|
key['name'] for key in api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
|
||||||
]
|
]
|
||||||
form = CreateKeyForm(key_names)
|
form = CreateKeyForm(key_names)
|
||||||
form.key_type.choices = filter(None, [
|
form.key_type.choices = [
|
||||||
(KEY_TYPE_NORMAL, 'Send messages to anyone')
|
(KEY_TYPE_NORMAL, 'Send messages to anyone'),
|
||||||
if not current_service['restricted'] else None,
|
(KEY_TYPE_TEAM, 'Send messages to anyone on my whitelist'),
|
||||||
(KEY_TYPE_TEST, 'Simulate sending messages to anyone'),
|
(KEY_TYPE_TEST, 'Pretend to send messages to anyone'),
|
||||||
(KEY_TYPE_TEAM, 'Only send messages to your team or whitelist')
|
]
|
||||||
])
|
if current_service['restricted']:
|
||||||
|
disabled_options = [KEY_TYPE_NORMAL]
|
||||||
|
option_hints = {KEY_TYPE_NORMAL: Markup(
|
||||||
|
'This option is not available because your service is in '
|
||||||
|
'<a href="{}">trial mode</a>'.format(url_for(".trial_mode"))
|
||||||
|
)}
|
||||||
|
else:
|
||||||
|
disabled_options, option_hints = [], {}
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
|
if form.key_type.data in disabled_options:
|
||||||
|
abort(400)
|
||||||
secret = api_key_api_client.create_api_key(
|
secret = api_key_api_client.create_api_key(
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
key_name=form.key_name.data,
|
key_name=form.key_name.data,
|
||||||
@@ -88,7 +97,9 @@ def create_api_key(service_id):
|
|||||||
)
|
)
|
||||||
return render_template(
|
return render_template(
|
||||||
'views/api/keys/create.html',
|
'views/api/keys/create.html',
|
||||||
form=form
|
form=form,
|
||||||
|
disabled_options=disabled_options,
|
||||||
|
option_hints=option_hints
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{% macro radios(
|
{% macro radios(
|
||||||
field,
|
field,
|
||||||
hint=None
|
hint=None,
|
||||||
|
disable=[],
|
||||||
|
option_hints={}
|
||||||
) %}
|
) %}
|
||||||
<div class="form-group {% if field.errors %} error{% endif %}">
|
<div class="form-group {% if field.errors %} error{% endif %}">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@@ -14,8 +16,21 @@
|
|||||||
</legend>
|
</legend>
|
||||||
{% for option in field %}
|
{% for option in field %}
|
||||||
<label class="block-label" for="{{ option.id }}">
|
<label class="block-label" for="{{ option.id }}">
|
||||||
{{ option }}
|
<input
|
||||||
|
id="{{ option.id }}" name="{{ option.name }}" type="radio" value="{{ option.data }}"
|
||||||
|
{% if option.data in disable %}
|
||||||
|
disabled
|
||||||
|
{% endif %}
|
||||||
|
{% if option.checked %}
|
||||||
|
checked
|
||||||
|
{% endif %}
|
||||||
|
>
|
||||||
{{ option.label.text }}
|
{{ option.label.text }}
|
||||||
|
{% if option_hints[option.data] %}
|
||||||
|
<div class="block-label-hint">
|
||||||
|
{{ option_hints[option.data] }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</label>
|
</label>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|||||||
@@ -13,15 +13,6 @@
|
|||||||
API integration
|
API integration
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
{% if current_service.restricted %}
|
|
||||||
{% call banner_wrapper(type='warning') %}
|
|
||||||
<h2 class="heading-medium">Your service is in trial mode</h2>
|
|
||||||
<p>
|
|
||||||
You can only send messages to people in your team or whitelist.
|
|
||||||
</p>
|
|
||||||
{% endcall %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<nav class="grid-row bottom-gutter-1-2">
|
<nav class="grid-row bottom-gutter-1-2">
|
||||||
<div class="column-one-third">
|
<div class="column-one-third">
|
||||||
<a class="pill-separate-item" href="{{ url_for('.api_keys', service_id=current_service.id) }}">API keys</a>
|
<a class="pill-separate-item" href="{{ url_for('.api_keys', service_id=current_service.id) }}">API keys</a>
|
||||||
|
|||||||
@@ -37,9 +37,9 @@
|
|||||||
{% if item.key_type == 'normal' %}
|
{% if item.key_type == 'normal' %}
|
||||||
<span class="visually-hidden">Normal</span>
|
<span class="visually-hidden">Normal</span>
|
||||||
{% elif item.key_type == 'team' %}
|
{% elif item.key_type == 'team' %}
|
||||||
Only sends to team members or whitelist
|
Sends to anyone on your whitelist
|
||||||
{% elif item.key_type == 'test' %}
|
{% elif item.key_type == 'test' %}
|
||||||
Simulates sending messages
|
Pretends to send messages
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
{% from "components/page-footer.html" import page_footer %}
|
{% from "components/page-footer.html" import page_footer %}
|
||||||
{% from "components/textbox.html" import textbox %}
|
{% from "components/textbox.html" import textbox %}
|
||||||
{% from "components/radios.html" import radios %}
|
{% from "components/radios.html" import radios %}
|
||||||
|
{% from "components/banner.html" import banner_wrapper %}
|
||||||
|
|
||||||
{% block page_title %}
|
{% block page_title %}
|
||||||
Add a new API key – GOV.UK Notify
|
Create an API key – GOV.UK Notify
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block maincolumn_content %}
|
{% block maincolumn_content %}
|
||||||
@@ -14,8 +15,8 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{{ radios(form.key_type) }}
|
|
||||||
{{ textbox(form.key_name, label='Name for this key') }}
|
{{ textbox(form.key_name, label='Name for this key') }}
|
||||||
|
{{ radios(form.key_type, disable=disabled_options, option_hints=option_hints) }}
|
||||||
{{ page_footer('Continue') }}
|
{{ page_footer('Continue') }}
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,12 @@
|
|||||||
Whitelist
|
Whitelist
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You and members of
|
||||||
|
<a href="{{ url_for('main.manage_users', service_id=current_service.id) }}">your team</a>
|
||||||
|
are included in the whitelist automatically.
|
||||||
|
</p>
|
||||||
|
|
||||||
<form method="post">
|
<form method="post">
|
||||||
|
|
||||||
<div class="grid-row">
|
<div class="grid-row">
|
||||||
|
|||||||
@@ -11,24 +11,7 @@
|
|||||||
|
|
||||||
<h1 class="heading-large">Settings</h1>
|
<h1 class="heading-large">Settings</h1>
|
||||||
|
|
||||||
{% if current_service.restricted %}
|
<div class="bottom-gutter-3-2">
|
||||||
{% call banner_wrapper(type='warning') %}
|
|
||||||
<h2 class="heading-medium">Your service is in trial mode</h2>
|
|
||||||
|
|
||||||
<ul class='list list-bullet'>
|
|
||||||
<li>you can only send messages to yourself</li>
|
|
||||||
<li>you can add people to your team, then you can send messages to them too</li>
|
|
||||||
<li>you can only send 50 messages per day</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To remove these restrictions
|
|
||||||
<a href="{{ url_for('.service_request_to_go_live', service_id=current_service.id) }}">request to go live</a>.
|
|
||||||
</p>
|
|
||||||
{% endcall %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="bottom-gutter-2">
|
|
||||||
|
|
||||||
{% call mapping_table(
|
{% call mapping_table(
|
||||||
caption='Settings',
|
caption='Settings',
|
||||||
@@ -57,6 +40,34 @@
|
|||||||
{% endcall %}
|
{% endcall %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if current_service.restricted %}
|
||||||
|
<h2 class="heading-medium">Your service is in trial mode</h2>
|
||||||
|
|
||||||
|
<ul class='list list-bullet'>
|
||||||
|
<li>you can only send messages to yourself</li>
|
||||||
|
<li>you can add people to your team, then you can send messages to them too</li>
|
||||||
|
<li>you can only send 50 messages per day</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
To remove these restrictions
|
||||||
|
<a href="{{ url_for('.service_request_to_go_live', service_id=current_service.id) }}">request to go live</a>.
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
<h2 class="heading-medium">Your service is live</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You can send up to
|
||||||
|
{{ "{:,}".format(current_service.message_limit) }} messages
|
||||||
|
per day.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Problems or comments?
|
||||||
|
<a href="{{ url_for('main.feedback') }}">Give feedback</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if current_user.has_permissions([], admin_override=True) %}
|
{% if current_user.has_permissions([], admin_override=True) %}
|
||||||
|
|
||||||
<h2 class="heading-medium">Platform admin settings</h2>
|
<h2 class="heading-medium">Platform admin settings</h2>
|
||||||
|
|||||||
@@ -33,7 +33,10 @@
|
|||||||
<form method="post">
|
<form method="post">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<p>We need permission to process your data before we can make your service live.</p>
|
<p>We need permission to process your data before we can make your service live.</p>
|
||||||
{{ radios(form.mou) }}
|
{{ radios(form.mou, option_hints={
|
||||||
|
'no': 'We’ll send you a copy',
|
||||||
|
'don’t know': 'We’ll check for you',
|
||||||
|
}) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
{{ radios(form.channel) }}
|
{{ radios(form.channel) }}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ def test_should_show_api_page(
|
|||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||||
assert page.h1.string.strip() == 'API integration'
|
assert page.h1.string.strip() == 'API integration'
|
||||||
assert 'Your service is in trial mode' in page.find('div', {'class': 'banner-warning'}).text
|
|
||||||
rows = page.find_all('details')
|
rows = page.find_all('details')
|
||||||
assert len(rows) == 5
|
assert len(rows) == 5
|
||||||
for index, row in enumerate(rows):
|
for index, row in enumerate(rows):
|
||||||
@@ -201,10 +200,7 @@ def test_cant_create_normal_api_key_in_trial_mode(
|
|||||||
'key_type': 'normal'
|
'key_type': 'normal'
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 400
|
||||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
||||||
assert page.find('span', {'class': 'error-message'}).text.strip() == 'Not a valid choice'
|
|
||||||
|
|
||||||
mock_post.assert_not_called()
|
mock_post.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user