From 4f675fe74cba8674ed7b8ecccfe7bed4f5982c55 Mon Sep 17 00:00:00 2001 From: Steve Dogiakos Date: Sat, 28 Mar 2026 22:58:37 -0600 Subject: [PATCH] feat: display admin timestamps in America/Denver time Convert UTC timestamps from SQLite to Mountain Time (America/Denver) using a Jinja2 template filter backed by zoneinfo; add tzdata dependency for IANA timezone data in the slim Docker image. --- app.py | 15 +++++++++++++++ requirements.txt | 3 ++- templates/admin.html | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index d9aa7da..19dc0ea 100644 --- a/app.py +++ b/app.py @@ -3,6 +3,8 @@ import os import re import sqlite3 import threading +from datetime import datetime, timezone +from zoneinfo import ZoneInfo from email_validator import validate_email, EmailNotValidError from flask import Flask, render_template, request, redirect, url_for, jsonify, abort @@ -23,6 +25,19 @@ app.secret_key = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-producti limiter = Limiter(get_remote_address, app=app, default_limits=[]) +_DISPLAY_TZ = ZoneInfo('America/Denver') + +@app.template_filter('localtime') +def localtime_filter(value): + if not value: + return value + try: + dt = datetime.strptime(str(value), '%Y-%m-%d %H:%M:%S') + dt = dt.replace(tzinfo=timezone.utc) + return dt.astimezone(_DISPLAY_TZ).strftime('%Y-%m-%d %H:%M') + except ValueError: + return value + login_manager = LoginManager(app) login_manager.login_view = 'admin_login' diff --git a/requirements.txt b/requirements.txt index 4c1dbd9..079758a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ Werkzeug>=3.0.6 Flask-Limiter>=3.0 Flask-Login>=0.6 email-validator>=2.0 -gunicorn \ No newline at end of file +gunicorn +tzdata \ No newline at end of file diff --git a/templates/admin.html b/templates/admin.html index 678d155..a6976ab 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -42,7 +42,7 @@ {{ g[4] }} {{ g[5] or '—' }} {{ 'Yes' if g[6] else 'No' }} - {{ g[7] }} + {{ g[7] | localtime }} {% if current_user.role != 'viewer' %}