From aed7a520bd30ac1603050b872cab1ff3ffa74408 Mon Sep 17 00:00:00 2001 From: Gregoo Date: Wed, 29 Jan 2025 22:44:08 +0100 Subject: [PATCH] Parametrable error names --- bricktracker/views/error.py | 80 ++++++++++++++++++++++++-------- bricktracker/views/exceptions.py | 2 + 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/bricktracker/views/error.py b/bricktracker/views/error.py index c034ea8..67a97a1 100644 --- a/bricktracker/views/error.py +++ b/bricktracker/views/error.py @@ -1,7 +1,7 @@ import logging from sqlite3 import Error, OperationalError import traceback -from typing import Tuple +from typing import Any, Tuple from flask import jsonify, redirect, request, render_template, url_for from werkzeug.wrappers.response import Response @@ -33,12 +33,16 @@ def error( *, json: bool = False, post_redirect: str | None = None, + error_name: str = 'error', **kwargs, ) -> str | Tuple[str | Response, int] | Response: # Back to the index if no error (not sure if this can happen) if error is None: if json: - return jsonify({'error': 'error() called without an error'}) + return json_error( + 'error() called without an error', + error_name=error_name + ) else: return redirect(url_for('index.index')) @@ -56,6 +60,7 @@ def error( error, json=json, post_redirect=post_redirect, + error_name=error_name, **kwargs ) @@ -71,13 +76,17 @@ def error( logger.debug(cleaned_exception(error)) if json: - return jsonify({'error': str(error)}) + return json_error( + str(error), + error_name=error_name + ) elif post_redirect is not None: - return redirect(url_for( + return redirect_error( post_redirect, error=str(error), + error_name=error_name, **kwargs, - )) + ) else: return render_template( 'error.html', @@ -96,18 +105,20 @@ def error( line = None if json: - return jsonify({ - 'error': 'Exception: {error}'.format(error=str(error)), - 'name': type(error).__name__, - 'line': line, - 'file': file, - }), 500 + return json_error( + 'Exception: {error}'.format(error=str(error)), + error_name=error_name, + name=type(error).__name__, + line=line, + file=file + ), 500 elif post_redirect is not None: - return redirect(url_for( + return redirect_error( post_redirect, error=str(error), + error_name=error_name, **kwargs, - )) + ) else: return render_template( 'exception.html', @@ -125,6 +136,7 @@ def error_404( *, json: bool = False, post_redirect: str | None = None, + error_name: str = 'error', **kwargs, ) -> Tuple[str | Response, int]: # Warning @@ -134,14 +146,44 @@ def error_404( )) if json: - return jsonify({ - 'error': 'Not found: {error}'.format(error=str(error)) - }), 404 + return json_error( + 'Not found: {error}'.format(error=str(error)), + error_name=error_name + ), 404 elif post_redirect is not None: - return redirect(url_for( + return redirect_error( post_redirect, error=str(error), - **kwargs - )), 404 + error_name=error_name, + **kwargs, + ), 404 else: return render_template('404.html', error=str(error)), 404 + + +# JSON error with parametric error name +def json_error( + error: str, + error_name: str = 'error', + **parameters: Any +) -> Response: + parameters[error_name] = error + + return jsonify(parameters) + + +# Redirect error with parametric error name +def redirect_error( + url: str, + error: str, + error_name: str = 'error', + **kwargs +) -> Response: + error_parameter: dict[str, str] = {} + error_parameter[error_name] = str(error) + + return redirect(url_for( + url, + **error_parameter, + **kwargs + )) diff --git a/bricktracker/views/exceptions.py b/bricktracker/views/exceptions.py index b78c390..aa01b79 100644 --- a/bricktracker/views/exceptions.py +++ b/bricktracker/views/exceptions.py @@ -28,6 +28,7 @@ def exception_handler( *, json: bool = False, post_redirect: str | None = None, + error_name: str = 'error', **superkwargs, ) -> Callable[[ViewCallable], ViewCallable]: def outer(function: ViewCallable, /) -> ViewCallable: @@ -42,6 +43,7 @@ def exception_handler( file, json=json, post_redirect=post_redirect, + error_name=error_name, **kwargs, **superkwargs, )