This is an automated email from the ASF dual-hosted git repository.
bbovenzi 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 eba12409a7 Add support to search by dag_display_name. (#39008)
eba12409a7 is described below
commit eba12409a7148a0a4a432a3cddc29c0e15be4a22
Author: Karthikeyan Singaravelan <[email protected]>
AuthorDate: Wed Apr 24 00:09:29 2024 +0530
Add support to search by dag_display_name. (#39008)
* Add support to search by dag_display_name.
* Return None as dag_display_name for owners and add test.
---
airflow/www/static/js/dags.js | 3 +++
airflow/www/views.py | 16 ++++++++++++++--
tests/www/views/test_views_acl.py | 24 ++++++++++++++++++------
3 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/airflow/www/static/js/dags.js b/airflow/www/static/js/dags.js
index 6c20a1681b..acd5159226 100644
--- a/airflow/www/static/js/dags.js
+++ b/airflow/www/static/js/dags.js
@@ -126,6 +126,9 @@ $(".typeahead").typeahead({
success: callback,
});
},
+ displayText(value) {
+ return value.dag_display_name || value.name;
+ },
autoSelect: false,
afterSelect(value) {
const query = new URLSearchParams(window.location.search);
diff --git a/airflow/www/views.py b/airflow/www/views.py
index 328312658b..486b404f57 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -71,7 +71,7 @@ from jinja2.utils import htmlsafe_json_dumps, pformat #
type: ignore
from markupsafe import Markup, escape
from pendulum.datetime import DateTime
from pendulum.parsing.exceptions import ParserError
-from sqlalchemy import and_, case, desc, func, inspect, select, union_all
+from sqlalchemy import and_, case, desc, func, inspect, or_, select, union_all
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import joinedload
from wtforms import BooleanField, validators
@@ -791,6 +791,9 @@ class Airflow(AirflowBaseView):
escaped_arg_search_query = arg_search_query.replace("_", r"\_")
dags_query = dags_query.where(
DagModel.dag_id.ilike("%" + escaped_arg_search_query +
"%", escape="\\")
+ | DagModel._dag_display_property_value.ilike(
+ "%" + escaped_arg_search_query + "%", escape="\\"
+ )
| DagModel.owners.ilike("%" + escaped_arg_search_query +
"%", escape="\\")
)
@@ -5422,12 +5425,21 @@ class AutocompleteView(AirflowBaseView):
dag_ids_query = select(
sqla.literal("dag").label("type"),
DagModel.dag_id.label("name"),
- ).where(~DagModel.is_subdag, DagModel.is_active,
DagModel.dag_id.ilike(f"%{query}%"))
+ DagModel._dag_display_property_value.label("dag_display_name"),
+ ).where(
+ ~DagModel.is_subdag,
+ DagModel.is_active,
+ or_(
+ DagModel.dag_id.ilike(f"%{query}%"),
+ DagModel._dag_display_property_value.ilike(f"%{query}%"),
+ ),
+ )
owners_query = (
select(
sqla.literal("owner").label("type"),
DagModel.owners.label("name"),
+ sqla.literal(None).label("dag_display_name"),
)
.distinct()
.where(~DagModel.is_subdag, DagModel.is_active,
DagModel.owners.ilike(f"%{query}%"))
diff --git a/tests/www/views/test_views_acl.py
b/tests/www/views/test_views_acl.py
index ead809e081..51bf56adac 100644
--- a/tests/www/views/test_views_acl.py
+++ b/tests/www/views/test_views_acl.py
@@ -253,12 +253,16 @@ def test_dag_autocomplete_success(client_all_dags):
follow_redirects=False,
)
expected = [
- {"name": "airflow", "type": "owner"},
- {"name": "example_dynamic_task_mapping_with_no_taskflow_operators",
"type": "dag"},
- {"name": "example_setup_teardown_taskflow", "type": "dag"},
- {"name": "test_mapped_taskflow", "type": "dag"},
- {"name": "tutorial_taskflow_api", "type": "dag"},
- {"name": "tutorial_taskflow_api_virtualenv", "type": "dag"},
+ {"name": "airflow", "type": "owner", "dag_display_name": None},
+ {
+ "name": "example_dynamic_task_mapping_with_no_taskflow_operators",
+ "type": "dag",
+ "dag_display_name": None,
+ },
+ {"name": "example_setup_teardown_taskflow", "type": "dag",
"dag_display_name": None},
+ {"name": "test_mapped_taskflow", "type": "dag", "dag_display_name":
None},
+ {"name": "tutorial_taskflow_api", "type": "dag", "dag_display_name":
None},
+ {"name": "tutorial_taskflow_api_virtualenv", "type": "dag",
"dag_display_name": None},
]
assert resp.json == expected
@@ -281,6 +285,14 @@ def test_dag_autocomplete_empty(client_all_dags, query,
expected):
assert resp.json == expected
+def test_dag_autocomplete_dag_display_name(client_all_dags):
+ url = "dagmodel/autocomplete?query=Sample"
+ resp = client_all_dags.get(url, follow_redirects=False)
+ assert resp.json == [
+ {"name": "example_display_name", "type": "dag", "dag_display_name":
"Sample DAG with Display Name"}
+ ]
+
+
@pytest.fixture
def setup_paused_dag():
"""Pause a DAG so we can test filtering."""