Backend: date dei filtri dei report e utenti setup in ora italiana/UTC esplicito (#42)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 11:59:07 +02:00
parent 486e1288bf
commit 7ac291b8ac
3 changed files with 17 additions and 7 deletions
+3 -3
View File
@@ -6,7 +6,7 @@ NOT protected by API Key auth (standalone access).
import hmac import hmac
import random import random
from datetime import datetime, timedelta from datetime import datetime, timedelta
from src.backend.utils.tempo import utcnow from src.backend.utils.tempo import iso_utc, utcnow
from pathlib import Path from pathlib import Path
from alembic import command from alembic import command
@@ -604,8 +604,8 @@ async def list_users(body: PasswordBody):
"roles": u.roles or [], "roles": u.roles or [],
"is_admin": u.is_admin, "is_admin": u.is_admin,
"active": u.active, "active": u.active,
"created_at": u.created_at.isoformat() if u.created_at else None, "created_at": iso_utc(u.created_at) or None,
"last_login": u.last_login.isoformat() if u.last_login else None, "last_login": iso_utc(u.last_login) or None,
} }
for u in users for u in users
], ],
+9 -4
View File
@@ -33,6 +33,11 @@ _jinja_env = Environment(
) )
def _giorno_locale(dt: datetime) -> str:
"""UTC naive filter bound -> local calendar day (YYYY-MM-DD)."""
return to_local(dt).strftime("%Y-%m-%d")
async def _query_measurements( async def _query_measurements(
db: AsyncSession, db: AsyncSession,
recipe_id: int, recipe_id: int,
@@ -324,9 +329,9 @@ async def generate_spc_report(
if version_id: if version_id:
filters_desc.append(f"Version: {version_id}") filters_desc.append(f"Version: {version_id}")
if date_from: if date_from:
filters_desc.append(f"From: {date_from.strftime('%Y-%m-%d')}") filters_desc.append(f"From: {_giorno_locale(date_from)}")
if date_to: if date_to:
filters_desc.append(f"To: {date_to.strftime('%Y-%m-%d')}") filters_desc.append(f"To: {_giorno_locale(date_to)}")
if lot_number: if lot_number:
filters_desc.append(f"Lot: {lot_number}") filters_desc.append(f"Lot: {lot_number}")
if serial_number: if serial_number:
@@ -415,9 +420,9 @@ async def generate_measurement_report(
if version_id: if version_id:
filters_desc.append(f"Version: {version_id}") filters_desc.append(f"Version: {version_id}")
if date_from: if date_from:
filters_desc.append(f"From: {date_from.strftime('%Y-%m-%d')}") filters_desc.append(f"From: {_giorno_locale(date_from)}")
if date_to: if date_to:
filters_desc.append(f"To: {date_to.strftime('%Y-%m-%d')}") filters_desc.append(f"To: {_giorno_locale(date_to)}")
if lot_number: if lot_number:
filters_desc.append(f"Lot: {lot_number}") filters_desc.append(f"Lot: {lot_number}")
if serial_number: if serial_number:
+5
View File
@@ -106,3 +106,8 @@ async def test_report_generated_at_is_local_time(
await report_service.generate_measurement_report(db_session, recipe.id) await report_service.generate_measurement_report(db_session, recipe.id)
assert "Generated 2026-10-06 10:00" in captured["html"] assert "Generated 2026-10-06 10:00" in captured["html"]
def test_report_filter_day_is_local():
"""UTC naive 22:00 of Oct 5 is already Oct 6 in Europe/Rome (#42)."""
assert report_service._giorno_locale(datetime(2026, 10, 5, 22, 0, 0)) == "2026-10-06"