Update all dates to use utc, only in the template is it converted to british time.

Template versions and template version pages added.

Fix merge changes.
This commit is contained in:
Nicholas Staples
2016-05-11 11:20:45 +01:00
committed by Chris Hill-Scott
parent daf33b03ad
commit 64e7a7b010
12 changed files with 283 additions and 13 deletions

View File

@@ -21,7 +21,7 @@ page_headings = {
}
@main.route("/services/<service_id>/templates/<template_id>", methods=['GET'])
@main.route("/services/<service_id>/templates/<template_id>")
@login_required
@user_has_permissions(
'view_activity',
@@ -41,6 +41,27 @@ def view_template(service_id, template_id):
)
@main.route("/services/<service_id>/templates/<template_id>/version/<int:version>")
@login_required
@user_has_permissions(
'view_activity',
'send_texts',
'send_emails',
'manage_templates',
'manage_api_keys',
admin_override=True,
any_=True
)
def view_template_version(service_id, template_id, version):
return render_template(
'views/templates/template_history.html',
template=Template(
service_api_client.get_service_template(service_id, template_id, version)['data'],
prefix=current_service['name']
)
)
@main.route("/services/<service_id>/templates/add-<template_type>", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_templates', admin_override=True)
@@ -142,3 +163,30 @@ def delete_service_template(service_id, template_id):
h1='Edit template',
form=form,
template_id=template_id)
@main.route('/services/<service_id>/templates/<template_id>/versions')
@login_required
@user_has_permissions(
'view_activity',
'send_texts',
'send_emails',
'manage_templates',
'manage_api_keys',
admin_override=True,
any_=True
)
def view_template_versions(service_id, template_id):
return render_template(
'views/templates/choose_history.html',
template=Template(
service_api_client.get_service_template(service_id, template_id)['data'],
prefix=current_service['name']
),
versions=[
Template(
template,
prefix=current_service['name']
) for template in service_api_client.get_service_template_versions(service_id, template_id)['data']
]
)

View File

@@ -126,13 +126,25 @@ class ServiceAPIClient(NotificationsAPIClient):
endpoint = "/service/{0}/template/{1}".format(service_id, id_)
return self.post(endpoint, data)
def get_service_template(self, service_id, template_id, *params):
def get_service_template(self, service_id, template_id, version=None, *params):
"""
Retrieve a service template.
"""
endpoint = '/service/{service_id}/template/{template_id}'.format(
service_id=service_id,
template_id=template_id)
if version:
endpoint = '{base}/version/{version}'.format(base=endpoint, version=version)
return self.get(endpoint, *params)
def get_service_template_versions(self, service_id, template_id, *params):
"""
Retrieve a list of versions for a template
"""
endpoint = '/service/{service_id}/template/{template_id}/version'.format(
service_id=service_id,
template_id=template_id
)
return self.get(endpoint, *params)
def get_service_templates(self, service_id, *params):

View File

@@ -15,6 +15,7 @@
{% else %}
{{ name }}
{% endif %}
{% if created_at %}{{ created_at }}{% endif %}
</h3>
{% endif %}
<div class="email-message">

View File

@@ -14,6 +14,7 @@
{% else %}
{{ name }}
{% endif %}
{% if created_at %}{{ created_at }}{% endif %}
</h3>
{% endif %}
{% if recipient is not none %}

View File

@@ -25,6 +25,7 @@
{% if current_user.has_permissions(permissions=['manage_templates'], admin_override=True) %}
<a href="{{ url_for(".edit_service_template", service_id=current_service.id, template_id=template.id) }}">Edit template</a>
{% endif %}
<a href="{{ url_for('.view_template_versions', service_id=current_service.id, template_id=template.id) }}">Template versions</a>
<a href="{{ url_for(".send_from_api", service_id=current_service.id, template_id=template.id) }}">API info</a>
</div>
</div>

View File

@@ -0,0 +1,36 @@
{% from "components/email-message.html" import email_message %}
{% from "components/sms-message.html" import sms_message %}
<div class="column-two-thirds">
{% if 'email' == template.template_type %}
{{ email_message(
template.formatted_subject_as_markup,
template.formatted_as_markup,
name=template.name if show_title else None,
edit_link=url_for(
'.view_template_version',
service_id=current_service.id,
template_id=template.id,
version=template.get_raw('version')
)
) }}
{% elif 'sms' == template.template_type %}
{{ sms_message(
template.formatted_as_markup,
name=template.name if show_title else None,
edit_link=url_for(
'.view_template_version',
service_id=current_service.id,
template_id=template.id,
version=template.get_raw('version')
)
) }}
{% endif %}
</div>
<div class="column-one-third">
<div class="sms-message-use-links{% if show_title %}-with-title{% endif %}">
<p>Edited by {{ template.get_raw('created_by').name }}</p>
<p>Edited on {{ template.get_raw('created_at')|format_datetime }}</p>
</div>
</div>

View File

@@ -0,0 +1,16 @@
{% extends "withnav_template.html" %}
{% block page_title %}
{{ template.name }} GOV.UK Notify
{% endblock %}
{% block maincolumn_content %}
<h1 class="heading-large">{{ template.name }} version history</h1>
<div class="grid-row">
{% for template in versions %}
{% with show_title=True %}
{% include 'views/templates/_template_history.html' %}
{% endwith %}
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,22 @@
{% extends "withnav_template.html" %}
{% from "components/email-message.html" import email_message %}
{% from "components/sms-message.html" import sms_message %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/textbox.html" import textbox %}
{% block page_title %}
{{ template.name }} GOV.UK Notify
{% endblock %}
{% block maincolumn_content %}
<h1 class="heading-large">{{ template.name }}</h1>
<div class="grid-row">
{% with show_title=False %}
{% include 'views/templates/_template_history.html' %}
{% endwith %}
</div>
{% endblock %}

View File

@@ -10,4 +10,4 @@ blinker==1.4
git+https://github.com/alphagov/notifications-python-client.git@1.0.0#egg=notifications-python-client==1.0.0
git+https://github.com/alphagov/notifications-utils.git@5.2.0#egg=notifications-utils==5.2.0
git+https://github.com/alphagov/notifications-utils.git@5.2.1#egg=notifications-utils==5.2.1

View File

@@ -1,6 +1,6 @@
import pytest
import uuid
import datetime
from datetime import datetime, timedelta
from flask.testing import FlaskClient
from flask import url_for
from flask_login import login_user
@@ -52,19 +52,41 @@ def template_json(service_id,
name="sample template",
type_="sms",
content="template content",
subject=None):
subject=None,
versions=['1']):
template = {
'id': id_,
'name': name,
'template_type': type_,
'content': content,
'service': service_id
'service': service_id,
'versions': versions
}
if subject is not None:
template['subject'] = subject
return template
def template_version_json(service_id,
id_,
created_by,
version=1,
created_at=None,
**kwargs):
template = template_json(service_id, id_, **kwargs)
template['created_by'] = {
'id': created_by.id,
'name': created_by.name,
'email_address': created_by.email_address
}
if created_at is None:
created_at = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')
template['created_at'] = created_at
template['version'] = version
del template['versions']
return template
def api_key_json(id_, name, expiry_date=None):
return {'id': id_,
'name': name,
@@ -102,7 +124,7 @@ def create_test_api_user(state, permissions={}):
def job_json():
job_id = str(generate_uuid())
created_at = str(datetime.datetime.utcnow().time())
created_at = str(datetime.utcnow().time())
data = {
'id': job_id,
'service': 1,
@@ -122,7 +144,7 @@ def job_json_with_created_by(service_id=None, job_id=None):
'service': service_id if service_id else str(generate_uuid()),
'template': 1,
'original_file_name': 'thisisatest.csv',
'created_at': str(datetime.datetime.now().time()),
'created_at': str(datetime.now().time()),
'notification_count': 1,
'notifications_sent': 1,
'status': '',
@@ -145,11 +167,11 @@ def notification_json(service_id,
if template is None:
template = template_json(service_id, str(generate_uuid()))
if sent_at is None:
sent_at = str(datetime.datetime.utcnow().time())
sent_at = str(datetime.utcnow().time())
if created_at is None:
created_at = str(datetime.datetime.utcnow().time())
created_at = str(datetime.utcnow().time())
if updated_at is None:
updated_at = str((datetime.datetime.utcnow() + datetime.timedelta(minutes=1)).time())
updated_at = str((datetime.utcnow() + timedelta(minutes=1)).time())
links = {}
if with_links:
links = {

View File

@@ -0,0 +1,68 @@
import json
from flask import url_for
def test_view_template_version(app_,
api_user_active,
mock_login,
mock_get_service,
mock_get_template_version,
mock_get_user,
mock_get_user_by_email,
mock_has_permissions,
fake_uuid):
with app_.test_request_context():
with app_.test_client() as client:
client.login(api_user_active)
service_id = fake_uuid
template_id = fake_uuid
version = 1
resp = client.get(url_for(
'.view_template_version',
service_id=service_id,
template_id=template_id,
version=version))
assert resp.status_code == 200
resp_data = resp.get_data(as_text=True)
template = mock_get_template_version(service_id, template_id, version)
assert api_user_active.name in resp_data
assert template['data']['content'] in resp_data
mock_get_template_version.assert_called_with(
service_id,
template_id,
version
)
def test_view_template_versions(app_,
api_user_active,
mock_login,
mock_get_service,
mock_get_template_versions,
mock_get_service_template,
mock_get_user,
mock_get_user_by_email,
mock_has_permissions,
fake_uuid):
with app_.test_request_context():
with app_.test_client() as client:
client.login(api_user_active)
service_id = fake_uuid
template_id = fake_uuid
version = 1
resp = client.get(url_for(
'.view_template_versions',
service_id=service_id,
template_id=template_id
))
assert resp.status_code == 200
resp_data = resp.get_data(as_text=True)
versions = mock_get_template_versions(service_id, template_id)
assert api_user_active.name in resp_data
assert versions['data'][0]['content'] in resp_data
mock_get_template_versions.assert_called_with(
service_id,
template_id
)

View File

@@ -9,6 +9,7 @@ from . import (
service_json,
TestClient,
template_json,
template_version_json,
api_key_json,
job_json,
notification_json,
@@ -208,7 +209,47 @@ def mock_get_service_template(mocker):
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template', side_effect=_get)
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_template_version(mocker, fake_uuid, user=None):
if user is None:
user = api_user_active(fake_uuid)
def _get(service_id, template_id, version):
template_version = template_version_json(
service_id,
template_id,
user,
version=version
)
return {'data': template_version}
return mocker.patch(
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')
def mock_get_template_versions(mocker, fake_uuid, user=None):
if user is None:
user = api_user_active(fake_uuid)
def _get(service_id, template_id):
template_version = template_version_json(
service_id,
template_id,
user,
version=1
)
return {'data': [template_version]}
return mocker.patch(
'app.service_api_client.get_service_template_versions',
side_effect=_get
)
@pytest.fixture(scope='function')
@@ -220,7 +261,9 @@ def mock_get_service_template_with_placeholders(mocker):
return {'data': template}
return mocker.patch(
'app.service_api_client.get_service_template', side_effect=_get)
'app.service_api_client.get_service_template',
side_effect=_get
)
@pytest.fixture(scope='function')