diff --git a/airflow/www/static/js/dags.js b/airflow/www/static/js/dags.js index 99816c250867f..d93216d32d653 100644 --- a/airflow/www/static/js/dags.js +++ b/airflow/www/static/js/dags.js @@ -124,10 +124,13 @@ $('.typeahead').typeahead({ }, autoSelect: false, afterSelect(value) { - const dagId = value.trim(); - if (dagId) { - const query = new URLSearchParams(window.location.search); - window.location = `${gridUrl.replace('__DAG_ID__', dagId)}?${query}`; + const query = new URLSearchParams(window.location.search); + query.set('search', value.name); + if (value.type === 'owner') { + window.location = `${DAGS_INDEX}?${query}`; + } + if (value.type === 'dag') { + window.location = `${gridUrl.replace('__DAG_ID__', value.name)}?${query}`; } }, }); diff --git a/airflow/www/views.py b/airflow/www/views.py index f89dda378da58..14dc3ca0a9f66 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -5127,12 +5127,18 @@ def autocomplete(self, session=None): return wwwutils.json_response([]) # Provide suggestions of dag_ids and owners - dag_ids_query = session.query(DagModel.dag_id.label('item')).filter( - ~DagModel.is_subdag, DagModel.is_active, DagModel.dag_id.ilike('%' + query + '%') - ) + dag_ids_query = session.query( + sqla.literal('dag').label('type'), + DagModel.dag_id.label('name'), + ).filter(~DagModel.is_subdag, DagModel.is_active, DagModel.dag_id.ilike('%' + query + '%')) - owners_query = session.query(func.distinct(DagModel.owners).label('item')).filter( - ~DagModel.is_subdag, DagModel.is_active, DagModel.owners.ilike('%' + query + '%') + owners_query = ( + session.query( + sqla.literal('owner').label('type'), + DagModel.owners.label('name'), + ) + .distinct() + .filter(~DagModel.is_subdag, DagModel.is_active, DagModel.owners.ilike('%' + query + '%')) ) # Hide DAGs if not showing status: "all" @@ -5149,8 +5155,9 @@ def autocomplete(self, session=None): dag_ids_query = dag_ids_query.filter(DagModel.dag_id.in_(filter_dag_ids)) owners_query = owners_query.filter(DagModel.dag_id.in_(filter_dag_ids)) - payload = [row[0] for row in dag_ids_query.union(owners_query).limit(10).all()] - + payload = [ + row._asdict() for row in dag_ids_query.union(owners_query).order_by('name').limit(10).all() + ] return wwwutils.json_response(payload) diff --git a/tests/www/views/test_views_acl.py b/tests/www/views/test_views_acl.py index 85c787f492555..d96098a5c6d5d 100644 --- a/tests/www/views/test_views_acl.py +++ b/tests/www/views/test_views_acl.py @@ -244,11 +244,15 @@ def test_index_failure(dag_test_client): def test_dag_autocomplete_success(client_all_dags): resp = client_all_dags.get( - 'dagmodel/autocomplete?query=example_bash', + 'dagmodel/autocomplete?query=flow', follow_redirects=False, ) - check_content_in_response('example_bash_operator', resp) - check_content_not_in_response('example_subdag_operator', resp) + assert resp.json == [ + {'name': 'airflow', 'type': 'owner'}, + {'name': 'test_mapped_taskflow', 'type': 'dag'}, + {'name': 'tutorial_taskflow_api_etl', 'type': 'dag'}, + {'name': 'tutorial_taskflow_api_etl_virtualenv', 'type': 'dag'}, + ] @pytest.mark.parametrize(