From e74d261ec33514d2e6ef91e3bf0e9d57d8d28e4c Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 29 Mar 2018 11:56:53 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Don=E2=80=99t=20store=20info=20about=20bad?= =?UTF-8?q?=20uploads=20in=20session?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because we now[1] store info about each file upload separately in the session the session isn’t overridden every time you upload a file. This is good because you can do multiple file uploads idempotently. Generally we are cleaning up after ourselves because we pop anything to do with that upload from the session. However there is an edge case: if you never send the file then the info about the file stays in the session in perpetuity[2]. This is generally happening when people are uploading files that are impossible to send, ie ones that have errors. So this commit makes two changes: 1. remove info about a file upload from the session as soon as we know that it contains errors 2. `POST` reuploads to the same endpoint as initial uploads because otherwise we need to keep info about bad uploads in the session, which would prevent us from doing 1. 1. https://github.com/alphagov/notifications-admin/pull/1968 2. or at least until the session is cleared by the user logging out --- app/main/views/send.py | 23 ++++----- app/templates/components/file-upload.html | 10 +++- app/templates/views/check/column-errors.html | 6 ++- app/templates/views/check/row-errors.html | 6 ++- tests/app/main/views/test_send.py | 49 ++++++++------------ 5 files changed, 46 insertions(+), 48 deletions(-) diff --git a/app/main/views/send.py b/app/main/views/send.py index e9066770c..0d419c513 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -541,8 +541,14 @@ def _check_messages(service_id, template_type, upload_id, preview_row, letters_a elif preview_row > 2: abort(404) - session['file_uploads'][upload_id]['notification_count'] = len(recipients) - session['file_uploads'][upload_id]['valid'] = not recipients.has_errors + original_file_name = session['file_uploads'][upload_id].get('original_file_name') + + if any(recipients) and not recipients.has_errors: + session['file_uploads'][upload_id]['notification_count'] = len(recipients) + session['file_uploads'][upload_id]['valid'] = True + else: + session['file_uploads'].pop(upload_id) + return dict( recipients=recipients, template=template, @@ -550,7 +556,7 @@ def _check_messages(service_id, template_type, upload_id, preview_row, letters_a row_errors=get_errors_for_csv(recipients, template.template_type), count_of_recipients=len(recipients), count_of_displayed_recipients=len(list(recipients.displayed_rows)), - original_file_name=session['file_uploads'][upload_id].get('original_file_name'), + original_file_name=original_file_name, upload_id=upload_id, form=CsvUploadForm(), remaining_messages=remaining_messages, @@ -610,17 +616,6 @@ def check_messages_preview(service_id, template_type, upload_id, filetype, row_i return TemplatePreview.from_utils_template(template, filetype) -@main.route("/services///check/", methods=['POST']) -@main.route("/services///check//row-", methods=['POST']) -@login_required -@user_has_permissions('send_messages', restrict_admin_usage=True) -def recheck_messages(service_id, template_type, upload_id, row_index=0): - if not session.get('file_uploads', {}).get(upload_id): - return redirect(url_for('main.choose_template', service_id=service_id), code=301) - - return send_messages(service_id, session['file_uploads'][upload_id].get('template_id')) - - @main.route("/services//start-job/", methods=['POST']) @login_required @user_has_permissions('send_messages', restrict_admin_usage=True) diff --git a/app/templates/components/file-upload.html b/app/templates/components/file-upload.html index a8bfe8cba..8843da7c3 100644 --- a/app/templates/components/file-upload.html +++ b/app/templates/components/file-upload.html @@ -1,5 +1,11 @@ -{% macro file_upload(field, button_text="Choose file", alternate_link=None, alternate_link_text=None) %} -
+{% macro file_upload( + field, + action=None, + button_text="Choose file", + alternate_link=None, + alternate_link_text=None +) %} +