From 3fdc1d0b91cf4be7768e940cf930e74005768177 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Wed, 27 Oct 2021 11:20:27 +0800 Subject: Provide exception messages UmbrellaNotFoundError: serial UmbrellaValueError: field --- jimbrella/admin.py | 25 ++++++++++++++++++++++--- jimbrella/database.py | 8 ++++---- jimbrella/exceptions.py | 10 ++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/jimbrella/admin.py b/jimbrella/admin.py index df751ee..4c604be 100644 --- a/jimbrella/admin.py +++ b/jimbrella/admin.py @@ -1,6 +1,7 @@ from flask import Blueprint, request, render_template, redirect, url_for from user_agents import parse as user_agent from .database import Database +from .exceptions import * from .config import * bp = Blueprint("admin", __name__, url_prefix="/admin") @@ -25,11 +26,17 @@ def index(): def umbrellas(): umbrellas = db.read() edit = request.args.get("edit") + error = request.args.get("error") + template = ( + "admin/umbrellas_mobile.html" + if user_agent(request.user_agent.string).is_mobile + else "admin/umbrellas_desktop.html" + ) return render_template( - "admin/umbrellas.html", + template, umbrellas=umbrellas, edit=int(edit) if edit else None, - mobile=user_agent(request.user_agent.string).is_mobile, + error=error, ) @@ -48,5 +55,17 @@ def umbrellas_edit(): ]: data[key] = request.form.get(key) - db.update(data) + error = None + try: + db.update(data) + except UmbrellaValueError as e: + # invalid field is in `e.message`. + return redirect( + "{0}?edit={1}&error={2}".format( + url_for("admin.umbrellas"), request.form.get("serial"), e.message + ) + ) + except UmbrellaNotFoundError: + pass # impossible on web console + return redirect(url_for("admin.umbrellas")) diff --git a/jimbrella/database.py b/jimbrella/database.py index ab945da..e43b8f2 100644 --- a/jimbrella/database.py +++ b/jimbrella/database.py @@ -190,7 +190,7 @@ class Database: umb["serial"] = int(umb["serial"]) umb_in_db = self._find_by_serial(umb["serial"]) if umb_in_db is None: - raise UmbrellaNotFoundError + raise UmbrellaNotFoundError(umb["serial"]) status = umb_in_db["status"] if "status" in umb and umb["status"]: @@ -261,7 +261,7 @@ class Database: """When a user has borrowed an umbrella.""" umb = self._find_by_serial(serial) if umb is None: - raise UmbrellaNotFoundError + raise UmbrellaNotFoundError(serial) elif umb["status"] != "available": raise UmbrellaStatusError umb["status"] = "lent" @@ -276,7 +276,7 @@ class Database: """When a user has returned an umbrella.""" umb = self._find_by_serial(serial) if umb is None: - raise UmbrellaNotFoundError + raise UmbrellaNotFoundError(serial) elif umb["status"] not in ("lent", "overdue"): raise UmbrellaStatusError umb["status"] = "available" @@ -289,7 +289,7 @@ class Database: """When an umbrella is overdue, change its status to "overdue".""" umb = self._find_by_serial(serial) if umb is None: - raise UmbrellaNotFoundError + raise UmbrellaNotFoundError(serial) elif umb["status"] != "lent": raise UmbrellaStatusError umb["status"] = "overdue" diff --git a/jimbrella/exceptions.py b/jimbrella/exceptions.py index 2c62bc4..ad92b50 100644 --- a/jimbrella/exceptions.py +++ b/jimbrella/exceptions.py @@ -4,7 +4,10 @@ class UmbrellaNotFoundError(Exception): """For when an umbrella with required serial is not found in database.""" - pass + def __init__(self, serial): + self.serial = serial + self.message = f"No umbrella {serial} found." + super().__init__(self.message) class UmbrellaStatusError(Exception): @@ -18,4 +21,7 @@ class UmbrellaStatusError(Exception): class UmbrellaValueError(Exception): """For when an admin enters an invalid value when modifying the database.""" - pass + def __init__(self, field: str): + self.field = field + self.message = f"Invalid field: {field}." + super().__init__(self.message) -- cgit v1.2.3