This is an automated email from the ASF dual-hosted git repository.
jedcunningham 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 8cc68e244b Bring back the decision buttons on DAG trigger (#33394)
8cc68e244b is described below
commit 8cc68e244b511200f5b4ec29e3ae87e211493c28
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
---
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 8bfd15ef97..8838785f45 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -992,6 +992,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,
@@ -1408,6 +1409,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,
@@ -1463,6 +1465,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,
@@ -1521,6 +1526,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,
@@ -1585,6 +1591,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,
@@ -1720,6 +1727,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",
@@ -1887,6 +1895,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,
@@ -1942,6 +1951,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,
@@ -2928,6 +2938,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,
@@ -3075,6 +3086,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,
@@ -3277,6 +3289,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),
@@ -3371,6 +3384,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),
@@ -3477,6 +3491,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,
@@ -4024,6 +4039,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,