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:
Chris Hill-Scott
2016-11-04 15:11:19 +01:00
committed by GitHub
12 changed files with 96 additions and 49 deletions

View File

@@ -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;
} }

View File

@@ -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;
}

View File

@@ -391,8 +391,8 @@ class RequestToGoLiveForm(Form):
), ),
choices=[ choices=[
('yes', 'Yes'), ('yes', 'Yes'),
('no', 'No well send you a copy'), ('no', 'No'),
('dont know', 'I dont know well check for you') ('dont know', 'I dont know')
], ],
validators=[DataRequired()] validators=[DataRequired()]
) )

View File

@@ -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
) )

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">

View File

@@ -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>

View File

@@ -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': 'Well send you a copy',
'dont know': 'Well check for you',
}) }}
</div> </div>
<div class="form-group"> <div class="form-group">
{{ radios(form.channel) }} {{ radios(form.channel) }}

View File

@@ -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()