This is an automated email from the ASF dual-hosted git repository.
uranusjr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 8572ede43d1 Show user display names for triggered runs and HITL
responses (#70836)
8572ede43d1 is described below
commit 8572ede43d10ffd7d10377792fefad25a3ab958f
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Mon Aug 3 09:39:01 2026 +0200
Show user display names for triggered runs and HITL responses (#70836)
---
.../api_fastapi/core_api/routes/public/assets.py | 2 +-
.../core_api/routes/public/backfills.py | 2 +-
.../api_fastapi/core_api/routes/public/dag_run.py | 2 +-
.../api_fastapi/core_api/routes/public/hitl.py | 2 +-
.../core_api/routes/public/test_assets.py | 10 ++++++++++
.../core_api/routes/public/test_backfills.py | 23 ++++++++++++++++++++++
.../core_api/routes/public/test_dag_run.py | 19 ++++++++++++++++++
.../core_api/routes/public/test_hitl.py | 20 +++++++++++++++++++
8 files changed, 76 insertions(+), 4 deletions(-)
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py
index 434ab8f1fdd..0a6818648cd 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/assets.py
@@ -502,7 +502,7 @@ def materialize_asset(
conf=params["conf"],
run_type=DagRunType.ASSET_MATERIALIZATION,
triggered_by=DagRunTriggeredByType.REST_API,
- triggering_user_name=user.get_name(),
+ triggering_user_name=user.get_display_name(),
state=DagRunState.QUEUED,
partition_key=params["partition_key"],
partition_date=params["partition_date"],
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py
index 62c43616c40..fb960e12ac5 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/backfills.py
@@ -306,7 +306,7 @@ def create_backfill(
max_active_runs=backfill_request.max_active_runs,
reverse=backfill_request.run_backwards,
dag_run_conf=backfill_request.dag_run_conf,
- triggering_user_name=user.get_name(),
+ triggering_user_name=user.get_display_name(),
reprocess_behavior=backfill_request.reprocess_behavior,
run_on_latest_version=resolved_run_on_latest,
)
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
index ea650963e35..1b857df06ce 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -800,7 +800,7 @@ def trigger_dag_run(
conf=params["conf"],
run_type=DagRunType.MANUAL,
triggered_by=triggered_by,
- triggering_user_name=user.get_name(),
+ triggering_user_name=user.get_display_name(),
state=DagRunState.QUEUED,
partition_key=params["partition_key"],
bundle_version=body.bundle_version,
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/hitl.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/hitl.py
index ccb2c3dd77f..301a3923dea 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/hitl.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/hitl.py
@@ -196,7 +196,7 @@ def update_hitl_detail(
if isinstance(user_id, int):
# FabAuthManager (ab_user) store user id as integer, but common
interface is string type
user_id = str(user_id)
- hitl_user = HITLUser(id=user_id, name=user_name)
+ hitl_user = HITLUser(id=user_id, name=user.get_display_name())
if hitl_detail_model.assigned_users:
# Convert assigned_users list to set of user IDs for authorization
check
assigned_user_ids = {assigned_user["id"] for assigned_user in
hitl_detail_model.assigned_users}
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py
index f0e60462bf3..fcf41162872 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_assets.py
@@ -1865,6 +1865,16 @@ class TestPostAssetMaterialize(TestAssets):
EmptyOperator(task_id="task")
session.commit()
+ @pytest.mark.usefixtures("configure_git_connection_for_dag_bundle")
+ @mock.patch(
+
"airflow.api_fastapi.auth.managers.simple.user.SimpleAuthManagerUser.get_display_name",
+ return_value="Jane Doe",
+ )
+ def test_materialize_records_triggering_user_display_name(self,
mock_display_name, test_client):
+ response = test_client.post("/assets/1/materialize")
+ assert response.status_code == 200
+ assert response.json()["triggering_user_name"] == "Jane Doe"
+
@pytest.mark.usefixtures("configure_git_connection_for_dag_bundle")
def test_should_respond_200(self, test_client):
response = test_client.post("/assets/1/materialize")
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
index a083087007d..fd9d0d5c9c3 100644
---
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
+++
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
@@ -434,6 +434,29 @@ class TestCreateBackfill(TestBackfillEndpoint):
}
check_last_log(session, dag_id="TEST_DAG_1", event="create_backfill",
logical_date=None)
+ @mock.patch(
+
"airflow.api_fastapi.auth.managers.simple.user.SimpleAuthManagerUser.get_display_name",
+ return_value="Jane Doe",
+ )
+ def test_create_backfill_records_triggering_user_display_name(
+ self, mock_display_name, session, dag_maker, test_client
+ ):
+ with dag_maker(session=session, dag_id="TEST_DAG_DISPLAY_NAME",
schedule="0 * * * *") as dag:
+ EmptyOperator(task_id="mytask")
+ session.commit()
+ data = {
+ "dag_id": dag.dag_id,
+ "from_date": to_iso(pendulum.parse("2024-01-01")),
+ "to_date": to_iso(pendulum.parse("2024-02-01")),
+ "max_active_runs": 5,
+ "run_backwards": False,
+ "dag_run_conf": {},
+ }
+ response = test_client.post(url="/backfills", json=data)
+ assert response.status_code == 200
+ backfill = session.scalars(select(Backfill).where(Backfill.dag_id ==
dag.dag_id)).one()
+ assert backfill.triggering_user_name == "Jane Doe"
+
def test_dag_not_exist(self, session, test_client):
session.scalars(select(DagModel)).all()
session.commit()
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
index f9893a3caaa..97a54d1ef57 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
@@ -3757,6 +3757,25 @@ class TestTriggerDagRun:
assert response_1.json()["dag_run_id"] !=
response_2.json()["dag_run_id"]
+ @mock.patch(
+
"airflow.api_fastapi.auth.managers.simple.user.SimpleAuthManagerUser.get_display_name",
+ return_value="Jane Doe",
+ )
+ def test_trigger_records_triggering_user_display_name(
+ self, mock_display_name, dag_maker, test_client, session
+ ):
+ dag_id = "test_trigger_display_name"
+ with dag_maker(dag_id=dag_id, schedule=None, session=session,
serialized=True):
+ EmptyOperator(task_id="task")
+ session.commit()
+ response = test_client.post(
+ f"/dags/{dag_id}/dagRuns",
+ json={"logical_date": "2024-01-01T00:00:00Z"},
+ )
+ assert response.status_code == 200
+ run = session.scalars(select(DagRun).where(DagRun.run_id ==
response.json()["dag_run_id"])).one()
+ assert run.triggering_user_name == "Jane Doe"
+
@time_machine.travel("2025-10-02 12:00:00", tick=False)
@pytest.mark.usefixtures("custom_timetable_plugin")
def test_custom_timetable_generate_run_id_for_manual_trigger(self,
dag_maker, test_client, session):
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_hitl.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_hitl.py
index 240c9334e80..ad7b069581e 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_hitl.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_hitl.py
@@ -309,6 +309,26 @@ def sample_update_payload() -> dict[str, Any]:
class TestUpdateHITLDetailEndpoint:
+ @time_machine.travel(datetime(2025, 7, 3, 0, 0, 0), tick=False)
+ @pytest.mark.usefixtures("sample_hitl_detail")
+ @mock.patch(
+
"airflow.api_fastapi.auth.managers.simple.user.SimpleAuthManagerUser.get_display_name",
+ return_value="Jane Doe",
+ )
+ def test_response_records_responder_display_name(
+ self,
+ mock_display_name: mock.MagicMock,
+ test_client: TestClient,
+ sample_ti_url_identifier: str,
+ sample_update_payload: dict[str, Any],
+ ) -> None:
+ response = test_client.patch(
+ f"{sample_ti_url_identifier}/hitlDetails",
+ json=sample_update_payload,
+ )
+ assert response.status_code == 200
+ assert response.json()["responded_by"] == {"id": "test", "name": "Jane
Doe"}
+
@time_machine.travel(datetime(2025, 7, 3, 0, 0, 0), tick=False)
@pytest.mark.usefixtures("sample_hitl_detail")
def test_should_respond_200_with_existing_response(