Added current_service to flask context and template context.

Fix all tests and conflicts.

Removed comment line.
This commit is contained in:
Nicholas Staples
2016-04-04 16:53:52 +01:00
parent f444284580
commit c31c55666b
37 changed files with 207 additions and 202 deletions

View File

@@ -3,7 +3,15 @@ import re
import dateutil import dateutil
import urllib import urllib
from flask import (Flask, session, Markup, escape, render_template, make_response, current_app) from flask import (
Flask,
session,
Markup,
escape,
render_template,
make_response,
current_app,
request)
from flask._compat import string_types from flask._compat import string_types
from flask_login import LoginManager from flask_login import LoginManager
from flask_wtf import CsrfProtect from flask_wtf import CsrfProtect
@@ -27,6 +35,10 @@ from utils.recipients import validate_phone_number, InvalidPhoneError
import app.proxy_fix import app.proxy_fix
from config import configs from config import configs
from utils import logging from utils import logging
from werkzeug.local import LocalStack, LocalProxy
from flask.globals import _lookup_req_object
from functools import partial
login_manager = LoginManager() login_manager = LoginManager()
csrf = CsrfProtect() csrf = CsrfProtect()
@@ -41,6 +53,9 @@ invite_api_client = InviteApiClient()
statistics_api_client = StatisticsApiClient() statistics_api_client = StatisticsApiClient()
asset_fingerprinter = AssetFingerprinter() asset_fingerprinter = AssetFingerprinter()
# The current service attached to the request stack.
current_service = LocalProxy(partial(_lookup_req_object, 'service'))
def create_app(): def create_app():
application = Flask(__name__) application = Flask(__name__)
@@ -82,6 +97,12 @@ def create_app():
application.add_template_filter(linkable_name) application.add_template_filter(linkable_name)
application.after_request(useful_headers_after_request) application.after_request(useful_headers_after_request)
application.after_request(save_service_after_request)
application.before_request(load_service_before_request)
def _attach_current_service():
return {'current_service': current_service}
application.context_processor(_attach_current_service)
register_errorhandlers(application) register_errorhandlers(application)
return application return application
@@ -167,7 +188,26 @@ def load_user(user_id):
return user_api_client.get_user(user_id) return user_api_client.get_user(user_id)
# https://www.owasp.org/index.php/List_of_useful_HTTP_headers def load_service_before_request():
service_id = request.view_args.get('service_id', None) if request.view_args else None
if service_id:
from flask.globals import _request_ctx_stack
if _request_ctx_stack.top is not None:
setattr(
_request_ctx_stack.top,
'service',
service_api_client.get_service(service_id)['data'])
def save_service_after_request(response):
# Only save the current session if the request is 200
service_id = request.view_args.get('service_id', None) if request.view_args else None
if response.status_code == 200 and service_id:
session['service_id'] = service_id
return response
# https://www.owasp.org/index.php/List_of_useful_HTTP_headers
def useful_headers_after_request(response): def useful_headers_after_request(response):
response.headers.add('X-Frame-Options', 'deny') response.headers.add('X-Frame-Options', 'deny')
response.headers.add('X-Content-Type-Options', 'nosniff') response.headers.add('X-Content-Type-Options', 'nosniff')

View File

@@ -35,9 +35,8 @@ def add_service():
form = AddServiceForm(service_api_client.find_all_service_email_from) form = AddServiceForm(service_api_client.find_all_service_email_from)
heading = 'Which service do you want to set up notifications for?' heading = 'Which service do you want to set up notifications for?'
if form.validate_on_submit(): if form.validate_on_submit():
session['service_name'] = form.name.data email_from = email_safe(form.name.data)
email_from = email_safe(session['service_name']) service_id = service_api_client.create_service(service_name=form.name.data,
service_id = service_api_client.create_service(service_name=session['service_name'],
active=False, active=False,
limit=current_app.config['DEFAULT_SERVICE_LIMIT'], limit=current_app.config['DEFAULT_SERVICE_LIMIT'],
restricted=True, restricted=True,

View File

@@ -17,7 +17,6 @@ def documentation():
def api_keys(service_id): def api_keys(service_id):
return render_template( return render_template(
'views/api-keys.html', 'views/api-keys.html',
service_id=service_id,
keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys'] keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
) )
@@ -32,11 +31,10 @@ def create_api_key(service_id):
form = CreateKeyForm(key_names) form = CreateKeyForm(key_names)
if form.validate_on_submit(): if form.validate_on_submit():
secret = api_key_api_client.create_api_key(service_id=service_id, key_name=form.key_name.data) secret = api_key_api_client.create_api_key(service_id=service_id, key_name=form.key_name.data)
return render_template('views/api-keys/show.html', service_id=service_id, secret=secret, return render_template('views/api-keys/show.html', secret=secret,
key_name=form.key_name.data) key_name=form.key_name.data)
return render_template( return render_template(
'views/api-keys/create.html', 'views/api-keys/create.html',
service_id=service_id,
key_name=form.key_name key_name=form.key_name
) )
@@ -49,7 +47,6 @@ def revoke_api_key(service_id, key_id):
if request.method == 'GET': if request.method == 'GET':
return render_template( return render_template(
'views/api-keys/revoke.html', 'views/api-keys/revoke.html',
service_id=service_id,
key_name=key_name key_name=key_name
) )
elif request.method == 'POST': elif request.method == 'POST':

View File

@@ -23,4 +23,7 @@ def show_all_services_or_dashboard():
if 1 == len(services): if 1 == len(services):
return redirect(url_for('.service_dashboard', service_id=services[0]['id'])) return redirect(url_for('.service_dashboard', service_id=services[0]['id']))
else: else:
service_id = session.get('service_id', None)
if any([service_id == x['id'] for x in services]):
return redirect(url_for('.service_dashboard', service_id=service_id))
return redirect(url_for('.choose_service')) return redirect(url_for('.choose_service'))

View File

@@ -2,13 +2,14 @@ from flask import (
render_template, render_template,
session, session,
flash, flash,
jsonify jsonify,
request
) )
from datetime import date from datetime import date
from flask_login import login_required from flask_login import login_required
from app.main import main from app.main import main
from app import (job_api_client, statistics_api_client, service_api_client) from app import (job_api_client, statistics_api_client, service_api_client, current_service)
from app.utils import user_has_permissions from app.utils import user_has_permissions
@@ -19,14 +20,10 @@ def service_dashboard(service_id):
templates = service_api_client.get_service_templates(service_id)['data'] templates = service_api_client.get_service_templates(service_id)['data']
jobs = job_api_client.get_job(service_id)['data'] jobs = job_api_client.get_job(service_id)['data']
service = service_api_client.get_service(service_id)
session['service_name'] = service['data']['name']
session['service_id'] = service['data']['id']
if session.get('invited_user'): if session.get('invited_user'):
session.pop('invited_user', None) session.pop('invited_user', None)
service_name = service['data']['name'] message = 'You have successfully accepted your invitation and been added to {}'.format(
message = 'You have successfully accepted your invitation and been added to {}'.format(service_name) current_service['name'])
flash(message, 'default_with_tick') flash(message, 'default_with_tick')
statistics = statistics_api_client.get_statistics_for_service(service_id)['data'] statistics = statistics_api_client.get_statistics_for_service(service_id)['data']
@@ -37,7 +34,6 @@ def service_dashboard(service_id):
more_jobs_to_show=(len(jobs) > 5), more_jobs_to_show=(len(jobs) > 5),
free_text_messages_remaining='250,000', free_text_messages_remaining='250,000',
spent_this_month='0.00', spent_this_month='0.00',
service=service['data'],
statistics=add_rates_to(statistics), statistics=add_rates_to(statistics),
templates=templates, templates=templates,
service_id=str(service_id)) service_id=str(service_id))

View File

@@ -12,7 +12,11 @@ from flask_login import login_required
from werkzeug.datastructures import MultiDict from werkzeug.datastructures import MultiDict
from utils.template import Template from utils.template import Template
from app import (job_api_client, notification_api_client, service_api_client) from app import (
job_api_client,
notification_api_client,
service_api_client,
current_service)
from app.main import main from app.main import main
from app.utils import ( from app.utils import (
get_page_from_request, get_page_from_request,
@@ -38,8 +42,7 @@ def view_jobs(service_id):
jobs = job_api_client.get_job(service_id)['data'] jobs = job_api_client.get_job(service_id)['data']
return render_template( return render_template(
'views/jobs/jobs.html', 'views/jobs/jobs.html',
jobs=jobs, jobs=jobs
service_id=service_id
) )
@@ -47,7 +50,6 @@ def view_jobs(service_id):
@login_required @login_required
@user_has_permissions('view_activity', admin_override=True) @user_has_permissions('view_activity', admin_override=True)
def view_job(service_id, job_id): def view_job(service_id, job_id):
service = service_api_client.get_service(service_id)['data']
job = job_api_client.get_job(service_id, job_id)['data'] job = job_api_client.get_job(service_id, job_id)['data']
template = service_api_client.get_service_template(service_id, job['template'])['data'] template = service_api_client.get_service_template(service_id, job['template'])['data']
notifications = notification_api_client.get_notifications_for_service(service_id, job_id) notifications = notification_api_client.get_notifications_for_service(service_id, job_id)
@@ -64,10 +66,8 @@ def view_job(service_id, job_id):
uploaded_file_name=job['original_file_name'], uploaded_file_name=job['original_file_name'],
template=Template( template=Template(
template, template,
prefix=service['name'] prefix=current_service['name']
), ),
service_id=service_id,
service=service,
job_id=job_id job_id=job_id
) )
@@ -76,7 +76,6 @@ def view_job(service_id, job_id):
@login_required @login_required
@user_has_permissions('view_activity') @user_has_permissions('view_activity')
def view_job_updates(service_id, job_id): def view_job_updates(service_id, job_id):
service = service_api_client.get_service(service_id)['data']
job = job_api_client.get_job(service_id, job_id)['data'] job = job_api_client.get_job(service_id, job_id)['data']
notifications = notification_api_client.get_notifications_for_service(service_id, job_id) notifications = notification_api_client.get_notifications_for_service(service_id, job_id)
finished = job['status'] == 'finished' finished = job['status'] == 'finished'
@@ -135,7 +134,6 @@ def view_notifications(service_id):
'page {}'.format(page + 1)) 'page {}'.format(page + 1))
return render_template( return render_template(
'views/notifications.html', 'views/notifications.html',
service_id=service_id,
notifications=notifications['notifications'], notifications=notifications['notifications'],
page=page, page=page,
prev_page=prev_page, prev_page=prev_page,
@@ -157,6 +155,5 @@ def view_notification(service_id, job_id, notification_id):
][0], ][0],
delivered_at=now, delivered_at=now,
uploaded_at=now, uploaded_at=now,
service_id=service_id,
job_id=job_id job_id=job_id
) )

View File

@@ -37,7 +37,6 @@ roles = {
def manage_users(service_id): def manage_users(service_id):
return render_template( return render_template(
'views/manage-users.html', 'views/manage-users.html',
service_id=service_id,
users=user_api_client.get_users_for_service(service_id=service_id), users=user_api_client.get_users_for_service(service_id=service_id),
current_user=current_user, current_user=current_user,
invited_users=[ invited_users=[
@@ -51,7 +50,6 @@ def manage_users(service_id):
@login_required @login_required
@user_has_permissions('manage_users', admin_override=True) @user_has_permissions('manage_users', admin_override=True)
def invite_user(service_id): def invite_user(service_id):
service = service_api_client.get_service(service_id)['data']
form = InviteUserForm(invalid_email_address=current_user.email_address) form = InviteUserForm(invalid_email_address=current_user.email_address)
@@ -75,7 +73,6 @@ def invite_user(service_id):
return render_template( return render_template(
'views/invite-user.html', 'views/invite-user.html',
service_id=service_id,
form=form form=form
) )
@@ -87,7 +84,6 @@ def edit_user_permissions(service_id, user_id):
# TODO we should probably using the service id here in the get user # TODO we should probably using the service id here in the get user
# call as well. eg. /user/<user_id>?&service=service_id # call as well. eg. /user/<user_id>?&service=service_id
user = user_api_client.get_user(user_id) user = user_api_client.get_user(user_id)
service = service_api_client.get_service(service_id)['data']
# Need to make the email address read only, or a disabled field? # Need to make the email address read only, or a disabled field?
# Do it through the template or the form class? # Do it through the template or the form class?
form = PermissionsForm(**{ form = PermissionsForm(**{
@@ -106,8 +102,7 @@ def edit_user_permissions(service_id, user_id):
return render_template( return render_template(
'views/edit-user-permissions.html', 'views/edit-user-permissions.html',
user=user, user=user,
form=form, form=form
service_id=service_id
) )
@@ -116,7 +111,6 @@ def edit_user_permissions(service_id, user_id):
@user_has_permissions('manage_users', admin_override=True) @user_has_permissions('manage_users', admin_override=True)
def remove_user_from_service(service_id, user_id): def remove_user_from_service(service_id, user_id):
user = user_api_client.get_user(user_id) user = user_api_client.get_user(user_id)
service = service_api_client.get_service(service_id)['data']
# Need to make the email address read only, or a disabled field? # Need to make the email address read only, or a disabled field?
# Do it through the template or the form class? # Do it through the template or the form class?
form = PermissionsForm(**{ form = PermissionsForm(**{
@@ -145,8 +139,7 @@ def remove_user_from_service(service_id, user_id):
return render_template( return render_template(
'views/edit-user-permissions.html', 'views/edit-user-permissions.html',
user=user, user=user,
form=form, form=form
service_id=service_id
) )

View File

@@ -25,8 +25,8 @@ from app.main.uploader import (
s3upload, s3upload,
s3download s3download
) )
from app import (job_api_client, service_api_client) from app import (job_api_client, service_api_client, current_service)
from app.utils import user_has_permissions, get_errors_for_csv from app.utils import (user_has_permissions, get_errors_for_csv)
def get_send_button_text(template_type, number_of_messages): def get_send_button_text(template_type, number_of_messages):
@@ -72,9 +72,6 @@ def get_example_csv_rows(template, number_of_rows=2):
'manage_api_keys', 'manage_api_keys',
admin_override=True, any_=True) admin_override=True, any_=True)
def choose_template(service_id, template_type): def choose_template(service_id, template_type):
service = service_api_client.get_service(service_id)['data']
if template_type not in ['email', 'sms']: if template_type not in ['email', 'sms']:
abort(404) abort(404)
@@ -83,14 +80,12 @@ def choose_template(service_id, template_type):
templates=[ templates=[
Template( Template(
template, template,
prefix=service['name'] prefix=current_service['name']
) for template in service_api_client.get_service_templates(service_id)['data'] ) for template in service_api_client.get_service_templates(service_id)['data']
if template['template_type'] == template_type if template['template_type'] == template_type
], ],
template_type=template_type, template_type=template_type,
page_heading=get_page_headings(template_type), page_heading=get_page_headings(template_type)
service=service,
service_id=service_id
) )
@@ -98,11 +93,9 @@ def choose_template(service_id, template_type):
@login_required @login_required
@user_has_permissions('send_texts', 'send_emails', 'send_letters') @user_has_permissions('send_texts', 'send_emails', 'send_letters')
def send_messages(service_id, template_id): def send_messages(service_id, template_id):
service = service_api_client.get_service(service_id)['data']
template = Template( template = Template(
service_api_client.get_service_template(service_id, template_id)['data'], service_api_client.get_service_template(service_id, template_id)['data'],
prefix=service['name'] prefix=current_service['name']
) )
form = CsvUploadForm() form = CsvUploadForm()
@@ -136,9 +129,7 @@ def send_messages(service_id, template_id):
template=template, template=template,
recipient_column=first_column_heading[template.template_type], recipient_column=first_column_heading[template.template_type],
example=get_example_csv_rows(template), example=get_example_csv_rows(template),
form=form, form=form
service=service,
service_id=service_id
) )
@@ -179,8 +170,8 @@ def send_message_to_self(service_id, template_id):
session['upload_data'] = {"template_id": template_id, "original_file_name": filedata['file_name']} session['upload_data'] = {"template_id": template_id, "original_file_name": filedata['file_name']}
return redirect(url_for('.check_messages', return redirect(url_for('.check_messages',
service_id=service_id,
upload_id=upload_id, upload_id=upload_id,
service_id=service_id,
template_type=template.template_type)) template_type=template.template_type))
@@ -201,8 +192,7 @@ def send_from_api(service_id, template_id):
return render_template( return render_template(
'views/send-from-api.html', 'views/send-from-api.html',
template=template, template=template,
payload=json.dumps(payload, indent=4), payload=json.dumps(payload, indent=4)
service_id=service_id
) )
@@ -214,8 +204,6 @@ def check_messages(service_id, template_type, upload_id):
if not session.get('upload_data'): if not session.get('upload_data'):
return redirect(url_for('main.choose_template', service_id=service_id, template_type=template_type)) return redirect(url_for('main.choose_template', service_id=service_id, template_type=template_type))
service = service_api_client.get_service(service_id)['data']
contents = s3download(service_id, upload_id) contents = s3download(service_id, upload_id)
if not contents: if not contents:
flash('There was a problem reading your upload file') flash('There was a problem reading your upload file')
@@ -227,7 +215,7 @@ def check_messages(service_id, template_type, upload_id):
template = Template( template = Template(
template, template,
prefix=service['name'] prefix=current_service['name']
) )
recipients = RecipientCSV( recipients = RecipientCSV(
@@ -259,8 +247,6 @@ def check_messages(service_id, template_type, upload_id):
), ),
original_file_name=session['upload_data'].get('original_file_name'), original_file_name=session['upload_data'].get('original_file_name'),
send_button_text=get_send_button_text(template.template_type, session['upload_data']['notification_count']), send_button_text=get_send_button_text(template.template_type, session['upload_data']['notification_count']),
service_id=service_id,
service=service,
upload_id=upload_id, upload_id=upload_id,
form=CsvUploadForm() form=CsvUploadForm()
) )
@@ -272,7 +258,6 @@ def check_messages(service_id, template_type, upload_id):
def start_job(service_id, upload_id): def start_job(service_id, upload_id):
upload_data = session['upload_data'] upload_data = session['upload_data']
service = service_api_client.get_service(service_id)['data']
if request.files or not upload_data.get('valid'): if request.files or not upload_data.get('valid'):
# The csv was invalid, validate the csv again # The csv was invalid, validate the csv again
@@ -289,5 +274,5 @@ def start_job(service_id, upload_id):
) )
return redirect( return redirect(
url_for('main.view_job', service_id=service_id, job_id=upload_id) url_for('main.view_job', job_id=upload_id, service_id=service_id)
) )

View File

@@ -18,27 +18,20 @@ from app.main import main
from app.utils import user_has_permissions, email_safe from app.utils import user_has_permissions, email_safe
from app.main.forms import ConfirmPasswordForm, ServiceNameForm from app.main.forms import ConfirmPasswordForm, ServiceNameForm
from app import user_api_client from app import user_api_client
from app import current_service
@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', admin_override=True)
def service_settings(service_id): def service_settings(service_id):
service = service_api_client.get_service(service_id)['data'] return render_template('views/service-settings.html')
return render_template(
'views/service-settings.html',
service=service,
service_id=service_id
)
@main.route("/services/<service_id>/service-settings/name", methods=['GET', 'POST']) @main.route("/services/<service_id>/service-settings/name", methods=['GET', 'POST'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_name_change(service_id): def service_name_change(service_id):
service = service_api_client.get_service(service_id)['data']
form = ServiceNameForm(service_api_client.find_all_service_email_from) form = ServiceNameForm(service_api_client.find_all_service_email_from)
if form.validate_on_submit(): if form.validate_on_submit():
@@ -47,16 +40,13 @@ def service_name_change(service_id):
return render_template( return render_template(
'views/service-settings/name.html', 'views/service-settings/name.html',
service=service, form=form)
form=form,
service_id=service_id)
@main.route("/services/<service_id>/service-settings/name/confirm", methods=['GET', 'POST']) @main.route("/services/<service_id>/service-settings/name/confirm", methods=['GET', 'POST'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_name_change_confirm(service_id): def service_name_change_confirm(service_id):
service = service_api_client.get_service(service_id)['data']
# Validate password for form # Validate password for form
def _check_password(pwd): def _check_password(pwd):
@@ -64,17 +54,17 @@ def service_name_change_confirm(service_id):
form = ConfirmPasswordForm(_check_password) form = ConfirmPasswordForm(_check_password)
if form.validate_on_submit(): if form.validate_on_submit():
service['name'] = session['service_name_change'] current_service['name'] = session['service_name_change']
service['email_from'] = email_safe(session['service_name_change']) current_service['email_from'] = email_safe(session['service_name_change'])
try: try:
service_api_client.update_service( service_api_client.update_service(
service['id'], current_service['id'],
service['name'], current_service['name'],
service['active'], current_service['active'],
service['limit'], current_service['limit'],
service['restricted'], current_service['restricted'],
service['users'], current_service['users'],
service['email_from']) current_service['email_from'])
except HTTPError as e: except HTTPError as e:
error_msg = "Duplicate service name '{}'".format(session['service_name_change']) error_msg = "Duplicate service name '{}'".format(session['service_name_change'])
if e.status_code == 400 and error_msg in e.message['name']: if e.status_code == 400 and error_msg in e.message['name']:
@@ -84,26 +74,21 @@ def service_name_change_confirm(service_id):
else: else:
raise e raise e
else: else:
session['service_name'] = service['name']
session.pop('service_name_change') session.pop('service_name_change')
return redirect(url_for('.service_settings', service_id=service_id)) return redirect(url_for('.service_settings', service_id=service_id))
return render_template( return render_template(
'views/service-settings/confirm.html', 'views/service-settings/confirm.html',
heading='Change your service name', heading='Change your service name',
form=form, form=form)
service_id=service_id)
@main.route("/services/<service_id>/service-settings/request-to-go-live", methods=['GET', 'POST']) @main.route("/services/<service_id>/service-settings/request-to-go-live", methods=['GET', 'POST'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_request_to_go_live(service_id): def service_request_to_go_live(service_id):
service = service_api_client.get_service(service_id)['data']
if request.method == 'GET': if request.method == 'GET':
return render_template( return render_template(
'views/service-settings/request-to-go-live.html', 'views/service-settings/request-to-go-live.html'
service=service,
service_id=service_id
) )
elif request.method == 'POST': elif request.method == 'POST':
flash('Thanks your request to go live is being processed', 'default') flash('Thanks your request to go live is being processed', 'default')
@@ -115,13 +100,9 @@ def service_request_to_go_live(service_id):
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_status_change(service_id): def service_status_change(service_id):
service = service_api_client.get_service(service_id)['data']
if request.method == 'GET': if request.method == 'GET':
return render_template( return render_template(
'views/service-settings/status.html', 'views/service-settings/status.html'
service=service,
service_id=service_id
) )
elif request.method == 'POST': elif request.method == 'POST':
return redirect(url_for('.service_status_change_confirm', service_id=service_id)) return redirect(url_for('.service_status_change_confirm', service_id=service_id))
@@ -131,43 +112,37 @@ def service_status_change(service_id):
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_status_change_confirm(service_id): def service_status_change_confirm(service_id):
service = service_api_client.get_service(service_id)['data']
# Validate password for form # Validate password for form
def _check_password(pwd): def _check_password(pwd):
return user_api_client.verify_password(current_user.id, pwd) return user_api_client.verify_password(current_user.id, pwd)
form = ConfirmPasswordForm(_check_password) form = ConfirmPasswordForm(_check_password)
if form.validate_on_submit(): if form.validate_on_submit():
service['active'] = True current_service['active'] = True
service_api_client.update_service( service_api_client.update_service(
service['id'], current_service['id'],
service['name'], current_service['name'],
service['active'], current_service['active'],
service['limit'], current_service['limit'],
service['restricted'], current_service['restricted'],
service['users'], current_service['users'],
service['email_from']) current_service['email_from'])
return redirect(url_for('.service_settings', service_id=service_id)) return redirect(url_for('.service_settings', service_id=service_id))
return render_template( return render_template(
'views/service-settings/confirm.html', 'views/service-settings/confirm.html',
heading='Turn off all outgoing notifications', heading='Turn off all outgoing notifications',
destructive=True, destructive=True,
form=form, form=form)
service_id=service_id)
@main.route("/services/<service_id>/service-settings/delete", methods=['GET', 'POST']) @main.route("/services/<service_id>/service-settings/delete", methods=['GET', 'POST'])
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_delete(service_id): def service_delete(service_id):
service = service_api_client.get_service(service_id)['data']
if request.method == 'GET': if request.method == 'GET':
return render_template( return render_template(
'views/service-settings/delete.html', 'views/service-settings/delete.html'
service=service,
service_id=service_id
) )
elif request.method == 'POST': elif request.method == 'POST':
return redirect(url_for('.service_delete_confirm', service_id=service_id)) return redirect(url_for('.service_delete_confirm', service_id=service_id))
@@ -177,7 +152,6 @@ def service_delete(service_id):
@login_required @login_required
@user_has_permissions('manage_settings', admin_override=True) @user_has_permissions('manage_settings', admin_override=True)
def service_delete_confirm(service_id): def service_delete_confirm(service_id):
service = service_api_client.get_service(service_id)['data']
# Validate password for form # Validate password for form
def _check_password(pwd): def _check_password(pwd):
@@ -185,12 +159,11 @@ def service_delete_confirm(service_id):
form = ConfirmPasswordForm(_check_password) form = ConfirmPasswordForm(_check_password)
if form.validate_on_submit(): if form.validate_on_submit():
service = service_api_client.delete_service(service_id) service_api_client.delete_service(service_id)
return redirect(url_for('.choose_service')) return redirect(url_for('.choose_service'))
return render_template( return render_template(
'views/service-settings/confirm.html', 'views/service-settings/confirm.html',
heading='Delete this service from Notify', heading='Delete this service from Notify',
destructive=True, destructive=True,
form=form, form=form)
service_id=service_id)

View File

@@ -23,8 +23,6 @@ page_headings = {
@user_has_permissions('manage_templates', admin_override=True) @user_has_permissions('manage_templates', admin_override=True)
def add_service_template(service_id, template_type): def add_service_template(service_id, template_type):
service = service_api_client.get_service(service_id)
if template_type not in ['sms', 'email']: if template_type not in ['sms', 'email']:
abort(404) abort(404)
@@ -46,7 +44,6 @@ def add_service_template(service_id, template_type):
'views/edit-{}-template.html'.format(template_type), 'views/edit-{}-template.html'.format(template_type),
form=form, form=form,
template_type=template_type, template_type=template_type,
service_id=service_id,
heading_action='Add' heading_action='Add'
) )
@@ -73,7 +70,6 @@ def edit_service_template(service_id, template_id):
return render_template( return render_template(
'views/edit-{}-template.html'.format(template['template_type']), 'views/edit-{}-template.html'.format(template['template_type']),
form=form, form=form,
service_id=service_id,
template_id=template_id, template_id=template_id,
template_type=template['template_type'], template_type=template['template_type'],
heading_action='Edit' heading_action='Edit'
@@ -101,5 +97,4 @@ def delete_service_template(service_id, template_id):
'views/edit-{}-template.html'.format(template['template_type']), 'views/edit-{}-template.html'.format(template['template_type']),
h1='Edit template', h1='Edit template',
form=form, form=form,
service_id=service_id,
template_id=template_id) template_id=template_id)

View File

@@ -9,7 +9,6 @@ from app.main import main
def tour(service_id, page): def tour(service_id, page):
return render_template( return render_template(
'views/tour/{}.html'.format(page), 'views/tour/{}.html'.format(page),
service_id=service_id, # TODO: fix when Nicks PR is merged
current_page=page, current_page=page,
next_page=(page + 1) next_page=(page + 1)
) )

View File

@@ -1,31 +1,31 @@
<nav class="navigation"> <nav class="navigation">
<h2 class="navigation-service-name"> <h2 class="navigation-service-name">
<a href="{{ url_for('.service_dashboard', service_id=service_id) }}">{{ session.get('service_name', 'Service') }}</a> <a href="{{ url_for('.service_dashboard', service_id=current_service.id) }}">{{ current_service.name }}</a>
</h2> </h2>
{% if current_user.has_permissions(['view_activity'], admin_override=True) %} {% if current_user.has_permissions(['view_activity'], admin_override=True) %}
<ul> <ul>
<li><a href="{{ url_for('.view_notifications', service_id=service_id, page=1) }}">History</a></li> <li><a href="{{ url_for('.view_notifications', service_id=current_service.id, page=1) }}">History</a></li>
</ul> </ul>
{% endif %} {% endif %}
{% if current_user.has_permissions(['view_activity', 'manage_templates', 'manage_api_keys'], admin_override=True, any_=True) %} {% if current_user.has_permissions(['view_activity', 'manage_templates', 'manage_api_keys'], admin_override=True, any_=True) %}
<ul> <ul>
<li><a href="{{ url_for('.choose_template', service_id=service_id, template_type='sms') }}">Text message templates</a></li> <li><a href="{{ url_for('.choose_template', service_id=current_service.id, template_type='sms') }}">Text message templates</a></li>
<li><a href="{{ url_for('.choose_template', service_id=service_id, template_type='email') }}">Email templates</a></li> <li><a href="{{ url_for('.choose_template', service_id=current_service.id, template_type='email') }}">Email templates</a></li>
</ul> </ul>
{% endif %} {% endif %}
{% if current_user.has_permissions(['manage_users', 'manage_settings'], admin_override=True) %} {% if current_user.has_permissions(['manage_users', 'manage_settings'], admin_override=True) %}
<ul> <ul>
<li><a href="{{ url_for('.manage_users', service_id=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('.service_settings', service_id=service_id) }}">Settings</a></li> <li><a href="{{ url_for('.service_settings', service_id=current_service.id) }}">Settings</a></li>
</ul> </ul>
{% elif current_user.has_permissions(['view_activity']) %} {% elif current_user.has_permissions(['view_activity']) %}
<ul> <ul>
<li><a href="{{ url_for('.manage_users', service_id=service_id) }}">Team members</a></li> <li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}">Team members</a></li>
</ul> </ul>
{% endif %} {% endif %}
{% if current_user.has_permissions(['manage_api_keys']) %} {% if current_user.has_permissions(['manage_api_keys']) %}
<ul> <ul>
<li><a href="{{ url_for('.api_keys', service_id=service_id) }}">API keys</a></li> <li><a href="{{ url_for('.api_keys', service_id=current_service.id) }}">API keys</a></li>
</ul> </ul>
{% endif %} {% endif %}
{% if current_user.has_permissions(admin_override=True) %} {% if current_user.has_permissions(admin_override=True) %}

View File

@@ -18,7 +18,7 @@
<p> <p>
API usage is described in API usage is described in
<a href="{{ url_for('.documentation', service_id=service_id) }}">the <a href="{{ url_for('.documentation', service_id=current_service.id) }}">the
developer documentation</a>. developer documentation</a>.
</p> </p>
@@ -26,7 +26,7 @@
Service ID Service ID
</h2> </h2>
<p class="api-key-key"> <p class="api-key-key">
{{ service_id }} {{ current_service.id }}
</p> </p>
{% call(item) list_table( {% call(item) list_table(
@@ -45,13 +45,13 @@
{% endcall %} {% endcall %}
{% else %} {% else %}
{% call field(align='right', status='error') %} {% call field(align='right', status='error') %}
<a href='{{ url_for('.revoke_api_key', service_id=service_id, key_id=item.id) }}'>Revoke</a> <a href='{{ url_for('.revoke_api_key', service_id=current_service.id, key_id=item.id) }}'>Revoke</a>
{% endcall %} {% endcall %}
{% endif %} {% endif %}
{% endcall %} {% endcall %}
<p class='table-show-more-link'> <p class='table-show-more-link'>
<a href="{{ url_for('.create_api_key', service_id=service_id) }}">Create a new API key</a> <a href="{{ url_for('.create_api_key', service_id=current_service.id) }}">Create a new API key</a>
</p> </p>
{% endblock %} {% endblock %}

View File

@@ -48,8 +48,8 @@
{{ email_message( {{ email_message(
template.subject, template.subject,
template.formatted_as_markup if errors else template.replaced, template.formatted_as_markup if errors else template.replaced,
from_address='{}@notifications.service.gov.uk'.format(service.email_from), from_address='{}@notifications.service.gov.uk'.format(current_service.email_from),
from_name=service.name from_name=current_service.name
)}} )}}
{% elif 'sms' == template.template_type %} {% elif 'sms' == template.template_type %}
<div class="grid-row"> <div class="grid-row">
@@ -64,10 +64,10 @@
{% if errors %} {% if errors %}
{{file_upload(form.file, button_text='Re-upload your file')}} {{file_upload(form.file, button_text='Re-upload your file')}}
{% else %} {% else %}
<form method="post" enctype="multipart/form-data" action="{{url_for('main.start_job', service_id=service_id, upload_id=upload_id)}}"> <form method="post" enctype="multipart/form-data" action="{{url_for('main.start_job', service_id=current_service.id, upload_id=upload_id)}}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<input type="submit" class="button" value="{{ send_button_text }}" /> <input type="submit" class="button" value="{{ send_button_text }}" />
<a href="{{url_for('.send_messages', service_id=service_id, template_id=template.id)}}" class="page-footer-back-link">Back</a> <a href="{{url_for('.send_messages', service_id=current_service.id, template_id=template.id)}}" class="page-footer-back-link">Back</a>
</form> </form>
{% endif %} {% endif %}

View File

@@ -19,7 +19,7 @@
You need a template before you can send You need a template before you can send
{{ 'emails' if 'email' == template_type else 'text messages' }} {{ 'emails' if 'email' == template_type else 'text messages' }}
</p> </p>
<a href="{{ url_for('.add_service_template', service_id=service_id, template_type=template_type) }}" class="button">Add a new template</a> <a href="{{ url_for('.add_service_template', service_id=current_service.id, template_type=template_type) }}" class="button">Add a new template</a>
{% else %} {% else %}
<p>You need to ask your service manager to add templates before you can send messages</p> <p>You need to ask your service manager to add templates before you can send messages</p>
{% endif %} {% endif %}
@@ -32,7 +32,7 @@
</div> </div>
{% if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) %} {% if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) %}
<div class="column-one-third"> <div class="column-one-third">
<a href="{{ url_for('.add_service_template', service_id=service_id, template_type=template_type) }}" class="button align-with-heading">Add new template</a> <a href="{{ url_for('.add_service_template', service_id=current_service.id, template_type=template_type) }}" class="button align-with-heading">Add new template</a>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@@ -46,7 +46,7 @@
template.formatted_as_markup, template.formatted_as_markup,
name=template.name, name=template.name,
edit_link=( edit_link=(
url_for(".edit_service_template", service_id=service_id, template_id=template.id) url_for(".edit_service_template", service_id=current_service.id, template_id=template.id)
if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) else if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) else
None None
) )
@@ -56,7 +56,7 @@
template.formatted_as_markup, template.formatted_as_markup,
name=template.name, name=template.name,
edit_link=( edit_link=(
url_for(".edit_service_template", service_id=service_id, template_id=template.id) url_for(".edit_service_template", service_id=current_service.id, template_id=template.id)
if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) else if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) else
None None
) )
@@ -66,11 +66,11 @@
<div class="column-one-third"> <div class="column-one-third">
<div class="sms-message-use-links"> <div class="sms-message-use-links">
{% if current_user.has_permissions(permissions=['send_texts', 'send_emails', 'send_letters']) %} {% if current_user.has_permissions(permissions=['send_texts', 'send_emails', 'send_letters']) %}
<a href="{{ url_for(".send_messages", service_id=service_id, template_id=template.id) }}">Send from a CSV file</a> <a href="{{ url_for(".send_messages", service_id=current_service.id, template_id=template.id) }}">Send from a CSV file</a>
<a href="{{ url_for(".send_message_to_self", service_id=service_id, template_id=template.id) }}">Send yourself a test</a> <a href="{{ url_for(".send_message_to_self", service_id=current_service.id, template_id=template.id) }}">Send yourself a test</a>
{% endif %} {% endif %}
{% if current_user.has_permissions(permissions=['manage_api_keys']) %} {% if current_user.has_permissions(permissions=['manage_api_keys']) %}
<a href="{{ url_for(".send_from_api", service_id=service_id, template_id=template.id) }}">API integration</a> <a href="{{ url_for(".send_from_api", service_id=current_service.id, template_id=template.id) }}">API integration</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@@ -1,23 +1,22 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% block page_title %} {% block page_title %}
{{ session.get('service_name', 'Dashboard') }} GOV.UK Notify {{ current_service.name }} GOV.UK Notify
{% endblock %} {% endblock %}
{% block maincolumn_content %} {% block maincolumn_content %}
{% if not templates and current_user.has_permissions(['send_texts', 'send_emails', 'send_letters'], any_=True) %} {% if not templates and current_user.has_permissions(['send_texts', 'send_emails', 'send_letters'], any_=True) %}
{% include 'views/dashboard/get-started.html' %} {% include 'views/dashboard/get-started.html' %}
{% elif service.restricted %} {% elif current_service.restricted %}
<div class="dashboard"> <div class="dashboard">
{% include 'views/dashboard/trial-mode-banner.html' %} {% include 'views/dashboard/trial-mode-banner.html' %}
</div> </div>
{% endif %} {% endif %}
<div <div
data-module="update-content" data-module="update-content"
data-resource="{{url_for(".service_dashboard_updates", service_id=service_id)}}" data-resource="{{url_for(".service_dashboard_updates", service_id=current_service.id)}}"
data-key="today" data-key="today"
data-interval-seconds="10" data-interval-seconds="10"
> >

View File

@@ -4,12 +4,12 @@
{% call banner_wrapper(type='tour') %} {% call banner_wrapper(type='tour') %}
<h2 class="heading-large">Youre ready to get started</h2> <h2 class="heading-large">Youre ready to get started</h2>
<p> <p>
<a href='{{ url_for(".add_service_template", service_id=service_id, template_type="sms") }}'> <a href='{{ url_for(".add_service_template", service_id=current_service.id, template_type="sms") }}'>
Set up a text message template Set up a text message template
</a> </a>
</p> </p>
<p> <p>
<a href='{{ url_for(".add_service_template", service_id=service_id, template_type="email") }}'> <a href='{{ url_for(".add_service_template", service_id=current_service.id, template_type="email") }}'>
Set up an email template Set up an email template
</a> </a>
</p> </p>

View File

@@ -7,7 +7,7 @@
field_headings=['File', 'Started', right_aligned_field_heading('Rows')] field_headings=['File', 'Started', right_aligned_field_heading('Rows')]
) %} ) %}
{% call field() %} {% call field() %}
<a href="{{ url_for('.view_job', service_id=service_id, job_id=item.id) }}">{{ item.original_file_name }}</a> <a href="{{ url_for('.view_job', service_id=current_service.id, job_id=item.id) }}">{{ item.original_file_name }}</a>
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
{{ item.created_at|format_datetime }} {{ item.created_at|format_datetime }}
@@ -19,7 +19,7 @@
{% if more_jobs_to_show %} {% if more_jobs_to_show %}
{% if current_user.has_permissions(['send_texts', 'send_emails', 'send_letters']) %} {% if current_user.has_permissions(['send_texts', 'send_emails', 'send_letters']) %}
<p class="table-show-more-link"> <p class="table-show-more-link">
<a href="{{ url_for('.view_jobs', service_id=service_id) }}">See all sent batch messages</a> <a href="{{ url_for('.view_jobs', service_id=current_service.id) }}">See all sent batch messages</a>
</p> </p>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@@ -36,5 +36,4 @@
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

View File

@@ -23,7 +23,7 @@ Manage users GOV.UK Notify
{{ page_footer( {{ page_footer(
'Save', 'Save',
delete_link=url_for('.remove_user_from_service', service_id=service_id, user_id=user.id) if user or None, delete_link=url_for('.remove_user_from_service', service_id=current_service.id, user_id=user.id) if user or None,
delete_link_text='Remove user from service' delete_link_text='Remove user from service'
) }} ) }}

View File

@@ -33,7 +33,7 @@
{% if not finished_at %} {% if not finished_at %}
<div <div
data-module="update-content" data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=service_id, job_id=job_id)}}" data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job_id)}}"
data-key="status" data-key="status"
> >
{% endif %} {% endif %}
@@ -45,7 +45,7 @@
{% if not finished_at %} {% if not finished_at %}
<div <div
data-module="update-content" data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=service_id, job_id=job_id)}}" data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job_id)}}"
data-key="counts" data-key="counts"
> >
{% endif %} {% endif %}
@@ -57,7 +57,7 @@
{% if not finished_at %} {% if not finished_at %}
<div <div
data-module="update-content" data-module="update-content"
data-resource="{{url_for(".view_job_updates", service_id=service_id, job_id=job_id)}}" data-resource="{{url_for(".view_job_updates", service_id=current_service.id, job_id=job_id)}}"
data-key="notifications" data-key="notifications"
> >
{% endif %} {% endif %}

View File

@@ -27,7 +27,7 @@
field_headings=['Job', 'Time', right_aligned_field_heading('Status')] field_headings=['Job', 'Time', right_aligned_field_heading('Status')]
) %} ) %}
{% call field() %} {% call field() %}
<a href="{{ url_for('.view_job', service_id=service_id, job_id=item.id) }}">{{ item.original_file_name }}</a> <a href="{{ url_for('.view_job', service_id=current_service.id, job_id=item.id) }}">{{ item.original_file_name }}</a>
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
{{ item.created_at | format_datetime}} {{ item.created_at | format_datetime}}

View File

@@ -24,7 +24,7 @@ Manage users GOV.UK Notify
</div> </div>
{% if current_user.has_permissions(['manage_users']) %} {% if current_user.has_permissions(['manage_users']) %}
<div class="column-one-third"> <div class="column-one-third">
<a href="{{ url_for('.invite_user', service_id=service_id) }}" class="button align-with-heading">Invite team member</a> <a href="{{ url_for('.invite_user', service_id=current_service.id) }}" class="button align-with-heading">Invite team member</a>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@@ -41,7 +41,7 @@ Manage users GOV.UK Notify
{% call field(align='right') %} {% call field(align='right') %}
{% if current_user.has_permissions(['manage_users']) %} {% if current_user.has_permissions(['manage_users']) %}
{% if current_user.id != item.id %} {% if current_user.id != item.id %}
<a href="{{ url_for('.edit_user_permissions', service_id=service_id, user_id=item.id)}}">Edit</a> <a href="{{ url_for('.edit_user_permissions', service_id=current_service.id, user_id=item.id)}}">Edit</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endcall %} {% endcall %}
@@ -60,7 +60,7 @@ Manage users GOV.UK Notify
{% if item.status == 'pending' %} {% if item.status == 'pending' %}
{% call field(align='right') %} {% call field(align='right') %}
{% if current_user.has_permissions(['manage_users']) %} {% if current_user.has_permissions(['manage_users']) %}
<a href="{{ url_for('.cancel_invited_user', service_id=service_id, invited_user_id=item.id)}}">Cancel invitation</a> <a href="{{ url_for('.cancel_invited_user', service_id=current_service.id, invited_user_id=item.id)}}">Cancel invitation</a>
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{% else %} {% else %}

View File

@@ -26,7 +26,7 @@
</div> </div>
{{ page_footer( {{ page_footer(
secondary_link = url_for('.view_job', service_id=service_id, job_id=job_id), secondary_link = url_for('.view_job', service_id=current_service.id, job_id=job_id),
secondary_link_text = 'View other messages in this job' secondary_link_text = 'View other messages in this job'
) }} ) }}

View File

@@ -31,14 +31,14 @@
{{ item.to }} {{ item.to }}
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
<a href="{{ url_for(".choose_template", service_id=service_id, template_type=item.template.template_type, _anchor=item.template.name|linkable_name) }}">{{ item.template.name }}</a> <a href="{{ url_for(".choose_template", service_id=current_service.id, template_type=item.template.template_type, _anchor=item.template.name|linkable_name) }}">{{ item.template.name }}</a>
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
{{ item.template.template_type }} {{ item.template.template_type }}
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
{% if item.job %} {% if item.job %}
<a href="{{ url_for(".view_job", service_id=service_id, job_id=item.job.id) }}">{{ item.job.original_file_name }}</a> <a href="{{ url_for(".view_job", service_id=current_service.id, job_id=item.job.id) }}">{{ item.job.original_file_name }}</a>
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}

View File

@@ -23,8 +23,8 @@
{{ email_message( {{ email_message(
template.subject, template.subject,
template.formatted_as_markup, template.formatted_as_markup,
from_address='{}@notifications.service.gov.uk'.format(service.email_from), from_address='{}@notifications.service.gov.uk'.format(current_service.email_from),
from_name=service.name from_name=current_service.name
) }} ) }}
{% endif %} {% endif %}
@@ -51,10 +51,9 @@
{% endcall %} {% endcall %}
<p class="bottom-gutter"> <p class="bottom-gutter">
<a href="{{ url_for('.get_example_csv', service_id=service_id, template_id=template.id) }}">Download this example</a> <a href="{{ url_for('.get_example_csv', service_id=current_service.id, template_id=template.id) }}">Download this example</a>
</p> </p>
{{file_upload(form.file, button_text='Upload your CSV file')}} {{file_upload(form.file, button_text='Upload your CSV file')}}
{% endblock %} {% endblock %}

View File

@@ -12,21 +12,21 @@
{{ browse_list([ {{ browse_list([
{ {
'title': 'Change your service name', 'title': 'Change your service name',
'link': url_for('.service_name_change', service_id=service_id) 'link': url_for('.service_name_change', service_id=current_service.id)
}, },
{ {
'title': 'Request to go live and turn off sending restrictions', 'title': 'Request to go live and turn off sending restrictions',
'link': url_for('.service_request_to_go_live', service_id=service_id), 'link': url_for('.service_request_to_go_live', service_id=current_service.id),
'hint': 'A live service can send notifications to any phone number or email address', 'hint': 'A live service can send notifications to any phone number or email address',
} if not service.live else { } if not current_service.live else {
}, },
{ {
'title': 'Temporarily suspend API keys', 'title': 'Temporarily suspend API keys',
'link': url_for('.service_status_change', service_id=service_id), 'link': url_for('.service_status_change', service_id=current_service.id),
'destructive': True 'destructive': True
} if not service.active else { } if not current_service.active else {
'title': 'Reactivate API keys', 'title': 'Reactivate API keys',
'link': url_for('.service_status_change', service_id=service_id) 'link': url_for('.service_status_change', service_id=current_service.id)
} }
]) }} ]) }}

View File

@@ -18,7 +18,7 @@
{{ page_footer( {{ page_footer(
'Confirm', 'Confirm',
destructive=destructive, destructive=destructive,
back_link=url_for('.service_settings', service_id=service_id) back_link=url_for('.service_settings', service_id=current_service.id)
) }} ) }}
</form> </form>
</div> </div>

View File

@@ -35,9 +35,9 @@
<form method="post"> <form method="post">
{{ page_footer( {{ page_footer(
'Yes, delete {}'.format(service.name), 'Yes, delete {}'.format(current_service.name),
destructive=True, destructive=True,
back_link=url_for('.service_settings', service_id=service_id) back_link=url_for('.service_settings', service_id=current_service.id)
) }} ) }}
</form> </form>

View File

@@ -24,7 +24,7 @@
{{ textbox(form.name) }} {{ textbox(form.name) }}
{{ page_footer( {{ page_footer(
'Save', 'Save',
back_link=url_for('.service_settings', service_id=service_id), back_link=url_for('.service_settings', service_id=current_service.id),
back_link_text='Back to settings' back_link_text='Back to settings'
) }} ) }}
</form> </form>

View File

@@ -25,7 +25,7 @@
{{ page_footer( {{ page_footer(
'Suspend API keys', 'Suspend API keys',
destructive=True, destructive=True,
back_link=url_for('.service_settings', service_id=service_id), back_link=url_for('.service_settings', service_id=current_service.id),
back_link_text='Back to settings' back_link_text='Back to settings'
) }} ) }}
</form> </form>

View File

@@ -13,6 +13,7 @@ def test_existing_user_accept_invite_calls_api_and_redirects_to_dashboard(app_,
service_one, service_one,
api_user_active, api_user_active,
sample_invite, sample_invite,
mock_get_service,
mock_check_invite_token, mock_check_invite_token,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_users_by_service, mock_get_users_by_service,
@@ -43,7 +44,8 @@ def test_existing_user_with_no_permissions_accept_invite(app_,
mock_check_invite_token, mock_check_invite_token,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_users_by_service, mock_get_users_by_service,
mock_add_user_to_service): mock_add_user_to_service,
mock_get_service):
expected_service = service_one['id'] expected_service = service_one['id']
sample_invite['permissions'] = '' sample_invite['permissions'] = ''
@@ -61,7 +63,8 @@ def test_existing_user_with_no_permissions_accept_invite(app_,
def test_if_existing_user_accepts_twice_they_redirect_to_sign_in(app_, def test_if_existing_user_accepts_twice_they_redirect_to_sign_in(app_,
mocker, mocker,
sample_invite): sample_invite,
mock_get_service):
sample_invite['status'] = 'accepted' sample_invite['status'] = 'accepted'
invite = InvitedUser(**sample_invite) invite = InvitedUser(**sample_invite)
@@ -82,6 +85,7 @@ def test_existing_user_of_service_get_redirected_to_signin(app_,
mocker, mocker,
api_user_active, api_user_active,
sample_invite, sample_invite,
mock_get_service,
mock_get_user_by_email, mock_get_user_by_email,
mock_accept_invite): mock_accept_invite):
sample_invite['email_address'] = api_user_active.email_address sample_invite['email_address'] = api_user_active.email_address
@@ -109,7 +113,8 @@ def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(app_,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_users_by_service, mock_get_users_by_service,
mock_add_user_to_service, mock_add_user_to_service,
mock_accept_invite): mock_accept_invite,
mock_get_service):
expected_service = service_one['id'] expected_service = service_one['id']
expected_permissions = ['send_messages', 'manage_service', 'manage_api_keys'] expected_permissions = ['send_messages', 'manage_service', 'manage_api_keys']
@@ -136,7 +141,8 @@ def test_new_user_accept_invite_calls_api_and_redirects_to_registration(app_,
mock_check_invite_token, mock_check_invite_token,
mock_dont_get_user_by_email, mock_dont_get_user_by_email,
mock_add_user_to_service, mock_add_user_to_service,
mock_get_users_by_service): mock_get_users_by_service,
mock_get_service):
expected_redirect_location = 'http://localhost/register-from-invite' expected_redirect_location = 'http://localhost/register-from-invite'
@@ -157,7 +163,8 @@ def test_new_user_accept_invite_calls_api_and_views_registration_page(app_,
mock_check_invite_token, mock_check_invite_token,
mock_dont_get_user_by_email, mock_dont_get_user_by_email,
mock_add_user_to_service, mock_add_user_to_service,
mock_get_users_by_service): mock_get_users_by_service,
mock_get_service):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -215,7 +222,8 @@ def test_new_user_accept_invite_completes_new_registration_redirects_to_verify(a
mock_register_user, mock_register_user,
mock_send_verify_code, mock_send_verify_code,
mock_get_users_by_service, mock_get_users_by_service,
mock_add_user_to_service): mock_add_user_to_service,
mock_get_service):
expected_service = service_one['id'] expected_service = service_one['id']
expected_email = sample_invite['email_address'] expected_email = sample_invite['email_address']
@@ -261,7 +269,8 @@ def test_signed_in_existing_user_cannot_use_anothers_invite(app_,
api_user_active, api_user_active,
sample_invite, sample_invite,
mock_get_user, mock_get_user,
mock_accept_invite): mock_accept_invite,
mock_get_service):
invite = InvitedUser(**sample_invite) invite = InvitedUser(**sample_invite)
mocker.patch('app.invite_api_client.check_token', return_value=invite) mocker.patch('app.invite_api_client.check_token', return_value=invite)
mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active]) mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active])
@@ -287,7 +296,8 @@ def test_signed_out_existing_user_cannot_use_anothers_invite(app_,
mock_get_user_by_email, mock_get_user_by_email,
mock_verify_password, mock_verify_password,
mock_send_verify_code, mock_send_verify_code,
mock_accept_invite): mock_accept_invite,
mock_get_service):
invite = InvitedUser(**sample_invite) invite = InvitedUser(**sample_invite)
mocker.patch('app.invite_api_client.check_token', return_value=invite) mocker.patch('app.invite_api_client.check_token', return_value=invite)
mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active]) mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active])

View File

@@ -6,9 +6,10 @@ from tests import validate_route_permission
def test_should_show_api_keys_and_documentation_page(app_, def test_should_show_api_keys_and_documentation_page(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login): mock_get_service):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
client.login(api_user_active) client.login(api_user_active)
@@ -20,9 +21,10 @@ def test_should_show_api_keys_and_documentation_page(app_,
def test_should_show_empty_api_keys_page(app_, def test_should_show_empty_api_keys_page(app_,
api_user_active, api_user_active,
mock_get_user, mock_get_user,
mock_login,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_no_api_keys, mock_get_no_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -38,10 +40,11 @@ def test_should_show_empty_api_keys_page(app_,
def test_should_show_api_keys_page(app_, def test_should_show_api_keys_page(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_api_keys, mock_get_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -58,10 +61,11 @@ def test_should_show_api_keys_page(app_,
def test_should_show_name_api_key_page(app_, def test_should_show_name_api_key_page(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_api_keys, mock_get_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -74,11 +78,12 @@ def test_should_show_name_api_key_page(app_,
def test_should_render_show_api_key(app_, def test_should_render_show_api_key(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_create_api_key, mock_create_api_key,
mock_get_api_keys, mock_get_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -94,10 +99,11 @@ def test_should_render_show_api_key(app_,
def test_should_show_confirm_revoke_api_key(app_, def test_should_show_confirm_revoke_api_key(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_get_api_keys, mock_get_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -112,11 +118,12 @@ def test_should_show_confirm_revoke_api_key(app_,
def test_should_redirect_after_revoking_api_key(app_, def test_should_redirect_after_revoking_api_key(app_,
api_user_active, api_user_active,
mock_login,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_revoke_api_key, mock_revoke_api_key,
mock_get_api_keys, mock_get_api_keys,
mock_login, mock_get_service,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -130,7 +137,11 @@ def test_should_redirect_after_revoking_api_key(app_,
mock_get_api_keys.assert_called_once_with(service_id=service_id, key_id=321) mock_get_api_keys.assert_called_once_with(service_id=service_id, key_id=321)
def test_route_permissions(mocker, app_, api_user_active, service_one, mock_get_api_keys): def test_route_permissions(mocker,
app_,
api_user_active,
service_one,
mock_get_api_keys):
routes = [ routes = [
'main.api_keys', 'main.api_keys',
'main.create_api_key', 'main.create_api_key',
@@ -148,7 +159,11 @@ def test_route_permissions(mocker, app_, api_user_active, service_one, mock_get_
service_one) service_one)
def test_route_invalid_permissions(mocker, app_, api_user_active, service_one, mock_get_api_keys): def test_route_invalid_permissions(mocker,
app_,
api_user_active,
service_one,
mock_get_api_keys):
routes = [ routes = [
'main.api_keys', 'main.api_keys',
'main.create_api_key', 'main.create_api_key',

View File

@@ -9,6 +9,7 @@ def test_should_return_list_of_all_jobs(app_,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login, mock_login,
mock_get_service,
mock_get_jobs, mock_get_jobs,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():

View File

@@ -283,10 +283,10 @@ def test_should_redirect_after_status_confirmation(app_,
def test_should_show_delete_page(app_, def test_should_show_delete_page(app_,
api_user_active, api_user_active,
mock_login,
mock_get_service, mock_get_service,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:

View File

@@ -7,10 +7,11 @@ from flask import url_for
def test_should_show_page_for_one_templates(app_, def test_should_show_page_for_one_templates(app_,
api_user_active, api_user_active,
mock_login,
mock_get_service,
mock_get_service_template, mock_get_service_template,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -31,11 +32,12 @@ def test_should_show_page_for_one_templates(app_,
def test_should_redirect_when_saving_a_template(app_, def test_should_redirect_when_saving_a_template(app_,
api_user_active, api_user_active,
mock_login,
mock_get_service_template, mock_get_service_template,
mock_update_service_template, mock_update_service_template,
mock_get_user, mock_get_user,
mock_get_service,
mock_get_user_by_email, mock_get_user_by_email,
mock_login,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -65,10 +67,11 @@ def test_should_redirect_when_saving_a_template(app_,
def test_should_show_delete_template_page(app_, def test_should_show_delete_template_page(app_,
api_user_active, api_user_active,
mock_login,
mock_get_service,
mock_get_service_template, mock_get_service_template,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
@@ -91,11 +94,12 @@ def test_should_show_delete_template_page(app_,
def test_should_redirect_when_deleting_a_template(app_, def test_should_redirect_when_deleting_a_template(app_,
api_user_active, api_user_active,
mock_login,
mock_get_service,
mock_get_service_template, mock_get_service_template,
mock_delete_service_template, mock_delete_service_template,
mock_get_user, mock_get_user,
mock_get_user_by_email, mock_get_user_by_email,
mock_login,
mock_has_permissions): mock_has_permissions):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:

View File

@@ -9,6 +9,7 @@ def test_should_render_tour_pages(
app_, app_,
api_user_active, api_user_active,
mocker, mocker,
mock_get_service,
page page
): ):
with app_.test_request_context(): with app_.test_request_context():