From 49a7fb10070e1f77dfe65a8310db839b6209b2c6 Mon Sep 17 00:00:00 2001 From: Vivek Santayana Date: Mon, 20 Jun 2022 11:27:05 +0100 Subject: [PATCH] More elegant error handling --- ref-test/app/admin/views.py | 30 ++++++++++-------------------- ref-test/app/quiz/views.py | 4 ++-- ref-test/app/tools/forms.py | 7 ++++++- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/ref-test/app/admin/views.py b/ref-test/app/admin/views.py index cfea08f..36799b8 100644 --- a/ref-test/app/admin/views.py +++ b/ref-test/app/admin/views.py @@ -1,7 +1,7 @@ from ..forms.admin import AddTimeAdjustment, CreateTest, CreateUser, DeleteUser, Login, Register, ResetPassword, UpdatePassword, UpdateUser, UploadData from ..models import Dataset, Entry, Test, User from ..tools.auth import disable_if_logged_in, require_account_creation -from ..tools.forms import get_dataset_choices, get_time_options +from ..tools.forms import get_dataset_choices, get_time_options, send_errors_to_client from ..tools.data import check_is_json, validate_json from ..tools.test import answer_options, get_correct_answers @@ -61,8 +61,7 @@ def _login(): return jsonify({'success': f'Successfully logged in.'}), 200 return jsonify({'error': f'The password you entered is incorrect.'}), 401 return jsonify({'error': f'The username you entered does not exist.'}), 401 - errors = [*form.username.errors, *form.password.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) if 'remembered_username' in session: form.username.data = session.pop('remembered_username') next = request.args.get('next') return render_template('/admin/auth/login.html', form=form, next=next) @@ -90,8 +89,7 @@ def _register(): return jsonify({'success': message}), 200 flash(message=message, category='error') return jsonify({'error': message}), 401 - errors = [*form.username.errors, *form.email.errors, *form.password.errors, *form.password_reenter.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) return render_template('admin/auth/register.html', form=form) @admin.route('/reset/', methods=['GET','POST']) @@ -108,8 +106,7 @@ def _reset(): if not user: return jsonify({'error': 'The user account does not exist.'}), 400 if not user.get_email() == request.form.get('email'): return jsonify({'error': 'The email address does not match the user account.'}), 400 return user.reset_password() - errors = [*form.username.errors, *form.email.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) token = request.args.get('token') if token: @@ -134,8 +131,7 @@ def _update_password(): session['remembered_username'] = user.get_username() flash('Your password has been reset.', 'success') return jsonify({'success':'Your password has been reset'}), 200 - errors = [*form.password.errors, *form.password_reenter.errors] - return jsonify({ 'error': errors}), 401 + return send_errors_to_client(form=form) @admin.route('/settings/users/', methods=['GET', 'POST']) @login_required @@ -152,8 +148,7 @@ def _users(): success, message = new_user.register(notify=request.form.get('notify'), password=password) if success: return jsonify({'success': message}), 200 return jsonify({'error': message}), 401 - errors = [*form.username.errors, *form.email.errors, *form.password.errors] - return jsonify({ 'error': errors}), 401 + return send_errors_to_client(form=form) return render_template('/admin/settings/users.html', form = form, users = users) @admin.route('/settings/users/delete/', methods=['GET', 'POST']) @@ -170,8 +165,7 @@ def _delete_user(id:str): success, message = user.delete(notify=request.form.get('notify')) if success: return jsonify({'success': message}), 200 return jsonify({'error': message}), 400 - errors = form.password.errors - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) if id == current_user.id: flash('Cannot delete your own user account.', 'error') @@ -199,8 +193,7 @@ def _update_user(id:str): flash(message, 'success') return jsonify({'success': message}), 200 return jsonify({'error': message}), 400 - errors = [*form.confirm_password.errors, *form.email.errors, *form.password.errors, *form.password_reenter.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) if not user: flash('User not found.', 'error') return redirect(url_for('admin._users')) @@ -222,8 +215,7 @@ def _questions(): ) if success: return jsonify({'success': message}), 200 return jsonify({'error': message}), 400 - errors = form.data_file.errors - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) data = Dataset.query.all() return render_template('/admin/settings/questions.html', form=form, data=data) @@ -299,9 +291,7 @@ def _create_test(): flash(message=message, category='success') return jsonify({'success': message}), 200 return jsonify({'error': message}), 400 - else: - errors = [*form.start_date.errors, *form.expiry_date.errors, *form.time_limit.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) @admin.route('/tests/edit/', methods=['POST']) @login_required diff --git a/ref-test/app/quiz/views.py b/ref-test/app/quiz/views.py index 8c8000c..c6c437b 100644 --- a/ref-test/app/quiz/views.py +++ b/ref-test/app/quiz/views.py @@ -1,5 +1,6 @@ from ..forms.quiz import StartQuiz from ..models import Entry, Test +from ..tools.forms import send_errors_to_client from ..tools.test import redirect_if_started from flask import abort, Blueprint, jsonify, redirect, render_template, request, session @@ -52,8 +53,7 @@ def _start(): 'id': entry.id }), 200 return jsonify({'error': 'There was an error processing the user test and/or user codes.'}), 400 - errors = [*form.test_code.errors, *form.user_code.errors, *form.first_name.errors, *form.surname.errors, *form.email.errors, *form.club.errors] - return jsonify({ 'error': errors}), 400 + return send_errors_to_client(form=form) return render_template('/quiz/start_quiz.html', form = form) @quiz.route('/quiz/') diff --git a/ref-test/app/tools/forms.py b/ref-test/app/tools/forms.py index cef280d..eeea160 100644 --- a/ref-test/app/tools/forms.py +++ b/ref-test/app/tools/forms.py @@ -1,6 +1,7 @@ from ..extensions import db +from flask import jsonify from wtforms.validators import ValidationError import json @@ -53,4 +54,8 @@ def get_dataset_choices(): label = f'{label} (Default)' if dataset.default else label choice = (dataset.id, label) dataset_choices.append(choice) - return dataset_choices \ No newline at end of file + return dataset_choices + +def send_errors_to_client(form): + errors = [*form.errors] + return jsonify({ 'error': errors}), 400 \ No newline at end of file