2023-10-02 20:35:30 +01:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
"""Web page to show upcoming events."""
|
|
|
|
|
2023-10-06 23:29:22 +01:00
|
|
|
import inspect
|
|
|
|
import sys
|
|
|
|
import traceback
|
2023-10-02 20:35:30 +01:00
|
|
|
from datetime import date, datetime, timezone
|
|
|
|
|
2023-10-06 23:29:22 +01:00
|
|
|
import flask
|
|
|
|
import werkzeug
|
|
|
|
import werkzeug.debug.tbtools
|
2023-10-02 20:35:30 +01:00
|
|
|
|
|
|
|
from agenda import get_data
|
|
|
|
|
2023-10-06 23:29:22 +01:00
|
|
|
app = flask.Flask(__name__)
|
2023-10-02 20:35:30 +01:00
|
|
|
app.debug = True
|
|
|
|
|
|
|
|
|
2023-10-06 23:29:22 +01:00
|
|
|
@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,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-10-02 20:35:30 +01:00
|
|
|
@app.route("/")
|
|
|
|
def index() -> str:
|
|
|
|
"""Index page."""
|
|
|
|
now = datetime.now()
|
|
|
|
today = now.date()
|
2023-10-06 22:23:34 +01:00
|
|
|
data = get_data(now)
|
2023-10-02 20:35:30 +01:00
|
|
|
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:
|
2023-10-05 11:07:01 +01:00
|
|
|
return "today" if when == today else f"{(when - today).days:,d} days"
|
2023-10-02 20:35:30 +01:00
|
|
|
|
2023-10-06 23:29:22 +01:00
|
|
|
return flask.render_template("index.html", days=days, days_hours=days_hours, **data)
|
2023-10-02 20:35:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
app.run(host="0.0.0.0")
|