Add update_letter_branding view function

This works in a similar way to the create_letter_branding view function,
but with a few minor differences:
* Since we already have a file, uploading a file is no longer required
(since we can just use the current file if a new one is not uploaded)
* We save the changes in the database, then upload the new files to S3.
If saving to S3 raises an error, we now rollback the database changes to
prevent any errors when trying to view letters with the original logo.
This commit is contained in:
Katie Smith
2019-02-11 15:31:12 +00:00
parent 53627fd1ba
commit 1cb1ce310a
6 changed files with 428 additions and 22 deletions

View File

@@ -1,3 +1,4 @@
from botocore.exceptions import ClientError as BotoClientError
from flask import (
current_app,
redirect,
@@ -45,6 +46,92 @@ def letter_branding():
)
@main.route("/letter-branding/<branding_id>/edit", methods=['GET', 'POST'])
@main.route("/letter-branding/<branding_id>/edit/<path:logo>", methods=['GET', 'POST'])
@login_required
@user_is_platform_admin
def update_letter_branding(branding_id, logo=None):
letter_branding = letter_branding_client.get_letter_branding(branding_id)
file_upload_form = SVGFileUpload()
letter_branding_details_form = ServiceLetterBrandingDetails(
name=letter_branding['name'],
domain=letter_branding['domain']
)
file_upload_form_submitted = file_upload_form.file.data
details_form_submitted = request.form.get('operation') == 'branding-details'
logo = logo if logo else permanent_letter_logo_name(letter_branding['filename'], 'svg')
if file_upload_form_submitted and file_upload_form.validate_on_submit():
upload_filename = upload_letter_temp_logo(
file_upload_form.file.data.filename,
file_upload_form.file.data,
current_app.config['AWS_REGION'],
user_id=session["user_id"]
)
if logo.startswith(LETTER_TEMP_TAG.format(user_id=session['user_id'])):
delete_letter_temp_file(logo)
return redirect(url_for('.update_letter_branding', branding_id=branding_id, logo=upload_filename))
if details_form_submitted and letter_branding_details_form.validate_on_submit():
db_filename = letter_filename_for_db(logo, session['user_id'])
try:
if db_filename == letter_branding['filename']:
letter_branding_client.update_letter_branding(
branding_id=branding_id,
filename=db_filename,
name=letter_branding_details_form.name.data,
domain=letter_branding_details_form.domain.data
)
return redirect(url_for('main.letter_branding'))
else:
png_file = get_png_file_from_svg(logo)
letter_branding_client.update_letter_branding(
branding_id=branding_id,
filename=db_filename,
name=letter_branding_details_form.name.data,
domain=letter_branding_details_form.domain.data
)
upload_letter_logos(logo, db_filename, png_file, session['user_id'])
return redirect(url_for('main.letter_branding'))
except HTTPError as e:
if 'domain' in e.message:
letter_branding_details_form.domain.errors.append(e.message['domain'][0])
elif 'name' in e.message:
letter_branding_details_form.name.errors.append(e.message['name'][0])
else:
raise e
except BotoClientError:
# we had a problem saving the file - rollback the db changes
letter_branding_client.update_letter_branding(
branding_id=branding_id,
filename=letter_branding['filename'],
name=letter_branding['name'],
domain=letter_branding['domain']
)
file_upload_form.file.errors = ['Error saving uploaded file - try uploading again']
return render_template(
'views/letter-branding/manage-letter-branding.html',
file_upload_form=file_upload_form,
letter_branding_details_form=letter_branding_details_form,
cdn_url=get_logo_cdn_domain(),
logo=logo,
is_update=True
)
@main.route("/letter-branding/create", methods=['GET', 'POST'])
@main.route("/letter-branding/create/<path:logo>", methods=['GET', 'POST'])
@login_required

View File

@@ -88,6 +88,7 @@ class HeaderNavigation(Navigation):
'suspend_service',
'trial_services',
'update_email_branding',
'update_letter_branding',
'user_information',
'view_provider',
'view_providers',
@@ -499,6 +500,7 @@ class MainNavigation(Navigation):
'two_factor_email',
'two_factor_email_sent',
'update_email_branding',
'update_letter_branding',
'user_information',
'user_profile',
'user_profile_email',
@@ -731,6 +733,7 @@ class CaseworkNavigation(Navigation):
'two_factor_email',
'two_factor_email_sent',
'update_email_branding',
'update_letter_branding',
'usage',
'user_information',
'user_profile',
@@ -964,6 +967,7 @@ class OrgNavigation(Navigation):
'two_factor_email',
'two_factor_email_sent',
'update_email_branding',
'update_letter_branding',
'usage',
'user_information',
'user_profile',

View File

@@ -5,12 +5,12 @@
{% from "components/form.html" import form_wrapper %}
{% block per_page_title %}
Create letter branding
{{ '{} letter branding'.format('Update' if is_update else 'Create')}}
{% endblock %}
{% block platform_admin_content %}
<h1 class="heading-large">Add letter branding</h1>
<h1 class="heading-large">{{ '{} letter branding'.format('Update' if is_update else 'Add')}}</h1>
<div class="grid-row">
<div class="column-three-quarters">
{% if logo %}
@@ -18,7 +18,7 @@
<img src="https://{{ cdn_url }}/{{ logo }}"/>
</div>
{% endif %}
{{ file_upload(file_upload_form.file) }}
{{ file_upload(file_upload_form.file, button_text='{} logo'.format('Update' if is_update else 'Upload')) }}
{% call form_wrapper() %}
<div class="form-group">
<div style='margin-top:15px;'>{{textbox(letter_branding_details_form.name)}}</div>

View File

@@ -20,7 +20,9 @@
{% for brand in letter_brandings %}
<div class="letter-brand">
<div class="message-name">
{{ brand.name }}
<a href="{{ url_for('.update_letter_branding', branding_id=brand.id) }}">
{{ brand.name }}
</a>
</div>
<p class="message-type">
{% if brand.domain %}