{# Sailfish Per-DAG Policy table — Airflow 2.x FAB-rendered. One form per row so saves are atomic and a malformed input on one row can't blow away other rows' settings. #} {% extends "appbuilder/base.html" %} {% block title %}Sailfish DAG Policies{% endblock %} {% block content %}

Sailfish DAG Policies

{% if connection_status == "connected" %} Connected {% else %} Offline {% endif %}
{% if save_status == "saved" %}
Policy saved{% if save_dag_id %} for {{ save_dag_id }}{% endif %}.
{% elif save_status == "reset" %}
Policy reset{% if save_dag_id %} for {{ save_dag_id }}{% endif %} (now using global policy).
{% endif %} {% if connection_status != "connected" %}
Cannot reach Sailfish at {{ sailfish_base_url }} ({{ connection_error or "unknown error" }}). Editing is disabled.
{% endif %} {% if empty %}
No DAGs registered in this Airflow deployment, and no policies on file in Sailfish. Once you add a DAG, it will appear here.
{% else %}

Per-DAG override of the global capture policy. Blocked is a hard "never capture" — for PII-sensitive jobs. Use Global means the row inherits the global Debugger setting.

{% for row in rows %} {% if csrf_token is defined %} {% endif %} {% endfor %}
DAG Policy Scope TTL (min) Redaction Actions
{{ row.dag_id }} {% for value, label in scope_choices %} {% endfor %} {# Reset is a separate form so it doesn't carry the row's Save-form fields. Both forms live in the same table cell. #}
{% if csrf_token is defined %} {% endif %}
{% endif %}
{% endblock %}