#!/usr/bin/python3 """Web page to show upcoming events.""" import functools import inspect import sys import traceback from datetime import date, datetime import flask import werkzeug import werkzeug.debug.tbtools from agenda import get_data app = flask.Flask(__name__) app.debug = True @app.errorhandler(werkzeug.exceptions.InternalServerError) def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str, int]: """Handle exception.""" exec_type, exc_value, current_traceback = sys.exc_info() assert exc_value tb = werkzeug.debug.tbtools.DebugTraceback(exc_value) summary = tb.render_traceback_html(include_title=False) exc_lines = "".join(tb._te.format_exception_only()) last_frame = list(traceback.walk_tb(current_traceback))[-1][0] last_frame_args = inspect.getargs(last_frame.f_code) return ( flask.render_template( "show_error.html", plaintext=tb.render_traceback_text(), exception=exc_lines, exception_type=tb._te.exc_type.__name__, summary=summary, last_frame=last_frame, last_frame_args=last_frame_args, ), 500, ) def delta_days(today: date, when: date) -> str: """Return number of days from today as a string.""" delta = (when - today).days match delta: case 0: return "today" case 1: return "1 day" case _: return f"{delta:,d} days" @app.route("/") def index() -> str: """Index page.""" now = datetime.now() data = get_data(now) days = functools.partial(delta_days, now.date()) return flask.render_template("index.html", days=days, **data) if __name__ == "__main__": app.run(host="0.0.0.0")