Auto-commit local changes before build (2026-01-16 16:24:35)

This commit is contained in:
Ivo Oskamp 2026-01-16 16:24:35 +01:00
parent 46cc5b10ab
commit f8a57efee0
2 changed files with 52 additions and 6 deletions

View File

@ -1 +1 @@
v20260116-11-autotask-ticket-sync-legacy v20260116-12-autotask-ticket-sync-circular-import-fix

View File

@ -1,13 +1,59 @@
from __future__ import annotations from __future__ import annotations
from datetime import datetime from datetime import datetime, date, timezone
from typing import Iterable, Optional from typing import Iterable, Optional
from zoneinfo import ZoneInfo
from flask import current_app
from sqlalchemy import text from sqlalchemy import text
from .database import db from .database import db
from .models import Job, JobRun, Ticket, TicketJobRun, TicketScope from .models import Job, JobRun, SystemSettings, Ticket, TicketJobRun, TicketScope
from .main.routes_shared import _get_ui_timezone_name, _to_amsterdam_date
def _get_ui_timezone_name() -> str:
"""Return the configured UI timezone name (IANA), with a safe fallback.
NOTE: This must not import from any routes_* modules to avoid circular imports.
"""
try:
settings = SystemSettings.query.first()
name = (getattr(settings, "ui_timezone", None) or "").strip()
if name:
return name
except Exception:
pass
try:
return (current_app.config.get("TIMEZONE") or "Europe/Amsterdam").strip()
except Exception:
return "Europe/Amsterdam"
def _to_ui_date(dt_utc_naive: datetime | None) -> date | None:
"""Convert a naive UTC datetime to a UI-local date."""
if not dt_utc_naive:
return None
try:
tz = ZoneInfo(_get_ui_timezone_name())
except Exception:
tz = None
if not tz:
return dt_utc_naive.date()
try:
if dt_utc_naive.tzinfo is None:
dt_utc = dt_utc_naive.replace(tzinfo=timezone.utc)
else:
dt_utc = dt_utc_naive.astimezone(timezone.utc)
return dt_utc.astimezone(tz).date()
except Exception:
return dt_utc_naive.date()
def ensure_internal_ticket_for_job( def ensure_internal_ticket_for_job(
@ -38,7 +84,7 @@ def ensure_internal_ticket_for_job(
ticket_code=code, ticket_code=code,
title=title, title=title,
description=description, description=description,
active_from_date=_to_amsterdam_date(active_from_dt) or _to_amsterdam_date(start_dt) or start_dt.date(), active_from_date=_to_ui_date(active_from_dt) or _to_ui_date(start_dt) or start_dt.date(),
start_date=start_dt, start_date=start_dt,
resolved_at=None, resolved_at=None,
) )
@ -122,7 +168,7 @@ def link_open_internal_tickets_to_run(*, run: JobRun, job: Job) -> None:
return return
ui_tz = _get_ui_timezone_name() ui_tz = _get_ui_timezone_name()
run_date = _to_amsterdam_date(getattr(run, "run_at", None)) or _to_amsterdam_date(datetime.utcnow()) run_date = _to_ui_date(getattr(run, "run_at", None)) or _to_ui_date(datetime.utcnow())
# Find open tickets scoped to this job for the run date window. # Find open tickets scoped to this job for the run date window.
# This matches the logic used by Job Details and Run Checks indicators. # This matches the logic used by Job Details and Run Checks indicators.