#!/usr/bin/python3 """Web page to show upcoming events.""" import inspect import sys import traceback from datetime import date, datetime, timezone 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, ) @app.route("/") def index() -> str: """Index page.""" now = datetime.now() today = now.date() data = get_data(now) now_utc = datetime.now(timezone.utc) def days_hours(when: datetime) -> str: delta = when - (now if when.tzinfo is None else now_utc) return f"{delta.days:>5,d} days {delta.seconds // 3600:>2.0f} hours" def days(when: date) -> str: return "today" if when == today else f"{(when - today).days:,d} days" return flask.render_template("index.html", days=days, days_hours=days_hours, **data) if __name__ == "__main__": app.run(host="0.0.0.0")