fix(dashboards): normalize naive/aware datetimes in resource task ordering
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
|
||||
# [SECTION: IMPORTS]
|
||||
from typing import List, Dict, Optional, Any
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from ..core.superset_client import SupersetClient
|
||||
from ..core.task_manager.models import Task
|
||||
from ..services.git_service import GitService
|
||||
@@ -179,12 +179,12 @@ class ResourceService:
|
||||
return None
|
||||
|
||||
def _task_time(task_obj: Any) -> datetime:
|
||||
return (
|
||||
raw_time = (
|
||||
getattr(task_obj, "started_at", None)
|
||||
or getattr(task_obj, "finished_at", None)
|
||||
or getattr(task_obj, "created_at", None)
|
||||
or datetime.min
|
||||
)
|
||||
return self._normalize_datetime_for_compare(raw_time)
|
||||
|
||||
last_task = max(matched_tasks, key=_task_time)
|
||||
raw_result = getattr(last_task, "result", None)
|
||||
@@ -229,6 +229,20 @@ class ResourceService:
|
||||
return status_text
|
||||
return "UNKNOWN"
|
||||
# [/DEF:_normalize_validation_status:Function]
|
||||
|
||||
# [DEF:_normalize_datetime_for_compare:Function]
|
||||
# @PURPOSE: Normalize datetime values to UTC-aware values for safe comparisons.
|
||||
# @PRE: value may be datetime or any scalar.
|
||||
# @POST: Returns UTC-aware datetime; non-datetime values map to minimal UTC datetime.
|
||||
# @PARAM: value (Any) - Candidate datetime-like value.
|
||||
# @RETURN: datetime - UTC-aware comparable datetime.
|
||||
def _normalize_datetime_for_compare(self, value: Any) -> datetime:
|
||||
if isinstance(value, datetime):
|
||||
if value.tzinfo is None:
|
||||
return value.replace(tzinfo=timezone.utc)
|
||||
return value.astimezone(timezone.utc)
|
||||
return datetime.min.replace(tzinfo=timezone.utc)
|
||||
# [/DEF:_normalize_datetime_for_compare:Function]
|
||||
|
||||
# [DEF:get_datasets_with_status:Function]
|
||||
# @PURPOSE: Fetch datasets from environment with mapping progress and last task status
|
||||
@@ -391,8 +405,11 @@ class ResourceService:
|
||||
if not resource_tasks:
|
||||
return None
|
||||
|
||||
# Get most recent task
|
||||
last_task = max(resource_tasks, key=lambda t: t.created_at)
|
||||
# Get most recent task with timezone-safe comparison.
|
||||
last_task = max(
|
||||
resource_tasks,
|
||||
key=lambda t: self._normalize_datetime_for_compare(getattr(t, "created_at", None)),
|
||||
)
|
||||
|
||||
return {
|
||||
'task_id': str(last_task.id),
|
||||
|
||||
Reference in New Issue
Block a user