This is an automated email from the ASF dual-hosted git repository.

pierrejeambrun pushed a commit to branch v3-0-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-0-test by this push:
     new 8d120ee4c83 [v3-0-test] Fix no_status and duration for grid summaries 
#53087 (#53092)
8d120ee4c83 is described below

commit 8d120ee4c834f8813818e812d18cd3f022952884
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Wed Jul 9 20:10:19 2025 +0200

    [v3-0-test] Fix no_status and duration for grid summaries #53087 (#53092)
    
    * [v3-0-test] Fix no_status and duration for grid summaries #53087
    
    * Fix CI
---
 .../src/airflow/api_fastapi/core_api/datamodels/ui/common.py   |  8 +++++---
 .../src/airflow/api_fastapi/core_api/routes/ui/grid.py         |  1 -
 .../src/airflow/api_fastapi/core_api/services/ui/grid.py       |  2 +-
 .../tests/unit/api_fastapi/core_api/routes/ui/test_grid.py     | 10 +++++-----
 4 files changed, 11 insertions(+), 10 deletions(-)

diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py 
b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py
index 0f315326194..4fedad08e1c 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/common.py
@@ -23,6 +23,7 @@ from typing import Generic, Literal, TypeVar
 from pydantic import computed_field
 
 from airflow.api_fastapi.core_api.base import BaseModel
+from airflow.utils import timezone
 from airflow.utils.state import TaskInstanceState
 from airflow.utils.types import DagRunType
 
@@ -81,9 +82,10 @@ class GridRunsResponse(BaseModel):
 
     @computed_field
     def duration(self) -> int | None:
-        if self.start_date and self.end_date:
-            return (self.end_date - self.start_date).seconds
-        return None
+        if self.start_date:
+            end_date = self.end_date or timezone.utcnow()
+            return (end_date - self.start_date).seconds
+        return 0
 
 
 class BaseGraphResponse(BaseModel, Generic[E, N]):
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py
index ce1a582a511..6af0f4e85c6 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py
@@ -480,7 +480,6 @@ def get_grid_runs(
             )
         ),
     ],
-    response_model_exclude_none=True,
 )
 def get_grid_ti_summaries(
     dag_id: str,
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py 
b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py
index 04b031455a6..73f70ea3f7e 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.py
@@ -323,7 +323,7 @@ def agg_state(states):
     for state in state_priority:
         if state in states:
             return state
-    return "no_status"
+    return None
 
 
 def _find_aggregates(
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py
index 908ebb24beb..9196fb74b10 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.py
@@ -1251,13 +1251,13 @@ class TestGetGridDataEndpoint:
 
         expected = [
             {"task_id": "mapped_task_group", "state": "running"},
-            {"task_id": "task_group.inner_task_group"},
-            {"task_id": "task_group"},
-            {"task_id": "mapped_task_2"},
+            {"task_id": "task_group.inner_task_group", "state": None},
+            {"task_id": "task_group", "state": None},
+            {"task_id": "mapped_task_2", "state": None},
             {"task_id": "mapped_task_group.subtask", "state": "running"},
             {"task_id": "task", "state": "success"},
-            {"task_id": 
"task_group.inner_task_group.inner_task_group_sub_task"},
-            {"task_id": "task_group.mapped_task"},
+            {"task_id": 
"task_group.inner_task_group.inner_task_group_sub_task", "state": None},
+            {"task_id": "task_group.mapped_task", "state": None},
         ]
         expected = sort_dict(expected)
         actual = sort_dict(actual)

Reply via email to