This is an automated email from the ASF dual-hosted git repository. ephraimanierobi pushed a commit to branch v2-7-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 21ecb41ff6a06a4d9fb34a96b5ef1fb469e7b4f0 Author: Ephraim Anierobi <[email protected]> AuthorDate: Mon Aug 14 21:58:53 2023 +0100 Bring back the decision buttons on DAG trigger (#33394) When show_trigger_form_if_no_params is set to True, the decision buttons to trigger with or without config should be shown just like we had it in 2.6.3 (cherry picked from commit 8cc68e244b511200f5b4ec29e3ae87e211493c28) --- airflow/www/templates/airflow/dag.html | 31 +++++++++++++++++++++++++++++++ airflow/www/templates/airflow/dags.html | 23 ++++++++++++++++++++++- airflow/www/views.py | 16 ++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/airflow/www/templates/airflow/dag.html b/airflow/www/templates/airflow/dag.html index 4fc11ea138..d324199d1f 100644 --- a/airflow/www/templates/airflow/dag.html +++ b/airflow/www/templates/airflow/dag.html @@ -220,6 +220,36 @@ </div> <div class="col-md-2"> <div class="btn-group pull-right"> + {% if show_trigger_form_if_no_params %} + <div class="dropdown"> + <a aria-label="Trigger DAG" class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn" data-toggle="dropdown"> + <span class="material-icons" aria-hidden="true">play_arrow</span> + </a> + <ul class="dropdown-menu trigger-dropdown-menu"> + <li> + <form method="POST" action="{{ url_for('Airflow.trigger', dag_id=dag.dag_id) }}"> + <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> + <input type="hidden" name="dag_id" value="{{ dag.dag_id }}"> + <input type="hidden" name="unpause" value="True"> + <!-- for task instance detail pages, dag_id is still a query param --> + {% if 'dag_id' in request.args %} + <input type="hidden" name="origin" value="{{ url_for(request.endpoint, **request.args) }}"> + {% else %} + <input type="hidden" name="origin" value="{{ url_for(request.endpoint, dag_id=dag.dag_id, **request.args) }}"> + {% endif %} + <button type="submit" class="dropdown-form-btn">Trigger DAG</button> + </form> + </li> + <li> + {% if 'dag_id' in request.args %} + <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, **request.args)) }}"> + {% else %} + <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, dag_id=dag.dag_id, **request.args)) }}"> + {% endif %} + Trigger DAG w/ config</a></li> + </ul> + </div> + {% else %} {% if 'dag_id' in request.args %} <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, **request.args)) }}" {% else %} @@ -230,6 +260,7 @@ class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn"> <span class="material-icons" aria-hidden="true">play_arrow</span> </a> + {% endif %} <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint, dag_id=dag.dag_id)) }}" title="Delete DAG" aria-label="Delete DAG" diff --git a/airflow/www/templates/airflow/dags.html b/airflow/www/templates/airflow/dags.html index 93d1d8189e..c2ccb03e5d 100644 --- a/airflow/www/templates/airflow/dags.html +++ b/airflow/www/templates/airflow/dags.html @@ -364,13 +364,34 @@ <div class="btn-group"> {# Use dag_id instead of dag.dag_id, because the DAG might not exist in the webserver's DagBag #} {% if dag %} + {% if show_trigger_form_if_no_params %} + <div class="dropdown"> + <a aria-label="Trigger DAG" + class="btn btn-sm btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn" + data-toggle="dropdown"> + <span class="material-icons" aria-hidden="true">play_arrow</span> + </a> + <ul class="dropdown-menu trigger-dropdown-menu"> + <li> + <form method="POST" action="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint)) }}"> + <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> + <input type="hidden" name="dag_id" value="{{ dag.dag_id }}"> + <input type="hidden" name="unpause" value="True"> + <button type="submit" class="dropdown-form-btn">Trigger DAG</button> + </form> + </li> + <li><a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint)) }}">Trigger DAG w/ config</a></li> + </ul> + </div> + {% else %} <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint)) }}" title="Trigger DAG" aria-label="Trigger DAG" class="btn btn-sm btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn"> <span class="material-icons" aria-hidden="true">play_arrow</span> </a> - <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint)) }}" + {% endif %} + <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint)) }}" onclick="return confirmDeleteDag(this, '{{ dag.dag_id }}')" title="Delete DAG" aria-label="Delete DAG" class="btn btn-sm btn-default btn-icon-only{{ ' disabled' if not dag.can_delete }}"> diff --git a/airflow/www/views.py b/airflow/www/views.py index ad9a9da98a..59c9bd31a7 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -989,6 +989,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/dags.html", dags=dags, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), dashboard_alerts=dashboard_alerts, migration_moved_data_alerts=sorted(set(_iter_parsed_moved_data_table_names())), current_page=current_page, @@ -1405,6 +1406,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/dag_details.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), dag_model=dag_model, title=title, root=root, @@ -1460,6 +1462,9 @@ class Airflow(AirflowBaseView): flash(f"there is no task instance with the provided map_index {map_index}", "error") return self.render_template( "airflow/ti_code.html", + show_trigger_form_if_no_params=conf.getboolean( + "webserver", "show_trigger_form_if_no_params" + ), html_dict=html_dict, dag=dag, task_id=task_id, @@ -1518,6 +1523,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/ti_code.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), html_dict=html_dict, dag=dag, task_id=task_id, @@ -1582,6 +1588,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/ti_code.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), html_dict={"k8s": content}, dag=dag, task_id=task_id, @@ -1717,6 +1724,7 @@ class Airflow(AirflowBaseView): root = request.args.get("root", "") return self.render_template( "airflow/ti_log.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), logs=logs, dag=dag_model, title="Log by attempts", @@ -1884,6 +1892,7 @@ class Airflow(AirflowBaseView): title = "Task Instance Details" return self.render_template( "airflow/task.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), task_attrs=task_attrs, ti_attrs=ti_attrs, failed_dep_reasons=failed_dep_reasons or no_failed_deps_result, @@ -1939,6 +1948,7 @@ class Airflow(AirflowBaseView): title = "XCom" return self.render_template( "airflow/xcom.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), attributes=attributes, task_id=task_id, execution_date=execution_date, @@ -2925,6 +2935,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/grid.html", + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), root=root, dag=dag, doc_md=doc_md, @@ -3072,6 +3083,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/calendar.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), doc_md=wwwutils.wrapped_markdown(getattr(dag, "doc_md", None)), data=htmlsafe_json_dumps(data, separators=(",", ":")), # Avoid spaces to reduce payload size. root=root, @@ -3275,6 +3287,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/duration_chart.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), root=root, form=form, chart=Markup(chart.htmlcontent), @@ -3370,6 +3383,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/chart.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), root=root, form=form, chart=Markup(chart.htmlcontent), @@ -3476,6 +3490,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/chart.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), chart=Markup(chart.htmlcontent), height=f"{chart_height + 100}px", root=root, @@ -4019,6 +4034,7 @@ class Airflow(AirflowBaseView): return self.render_template( "airflow/dag_audit_log.html", dag=dag, + show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), dag_model=dag_model, root=request.args.get("root"), dag_id=dag_id,
