This is an automated email from the ASF dual-hosted git repository. ephraimanierobi pushed a commit to branch v2-9-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 670b255cba6de4bbdcd1406c446aac1b01e1f667 Author: Rodrigo GanĂ¢ncia <[email protected]> AuthorDate: Fri May 31 16:43:51 2024 +0100 Fix Mark Instance state buttons stay disabled if user lacks permission (#37451). (#38732) (cherry picked from commit c8c97b5067468683a5eb44b1a5e3ff6966025e5c) --- .../js/dag/details/taskInstance/taskActions/ClearInstance.tsx | 5 +++-- .../js/dag/details/taskInstance/taskActions/MarkInstanceAs.tsx | 5 +++-- airflow/www/templates/airflow/grid.html | 1 + airflow/www/views.py | 6 ++++++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/airflow/www/static/js/dag/details/taskInstance/taskActions/ClearInstance.tsx b/airflow/www/static/js/dag/details/taskInstance/taskActions/ClearInstance.tsx index 746ba9ca92..f2a63fcb89 100644 --- a/airflow/www/static/js/dag/details/taskInstance/taskActions/ClearInstance.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/taskActions/ClearInstance.tsx @@ -38,6 +38,7 @@ import keyboardShortcutIdentifier from "src/dag/keyboardShortcutIdentifier"; import ActionButton from "./ActionButton"; import ActionModal from "./ActionModal"; +const canEditTaskInstance = getMetaValue("can_edit_taskinstance") === "True"; const canEdit = getMetaValue("can_edit") === "True"; const dagId = getMetaValue("dag_id"); @@ -248,7 +249,7 @@ const ClearInstance = ({ <Button title={clearLabel} aria-label={clearLabel} - isDisabled={!canEdit} + isDisabled={!canEdit || !canEditTaskInstance} colorScheme="blue" onClick={onOpen} {...otherProps} @@ -256,7 +257,7 @@ const ClearInstance = ({ Clear task </Button> {/* Only mount modal if user can edit */} - {canEdit && ( + {canEdit && canEditTaskInstance && ( <ClearModal runId={runId} taskId={taskId} diff --git a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkInstanceAs.tsx b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkInstanceAs.tsx index 512b15931c..d2373b4ddd 100644 --- a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkInstanceAs.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkInstanceAs.tsx @@ -50,6 +50,7 @@ import { SimpleStatus } from "../../../StatusBox"; import ActionButton from "./ActionButton"; import ActionModal from "./ActionModal"; +const canEditTaskInstance = getMetaValue("can_edit_taskinstance") === "True"; const canEdit = getMetaValue("can_edit") === "True"; const dagId = getMetaValue("dag_id"); @@ -288,7 +289,7 @@ const MarkInstanceAs = ({ transition="all 0.2s" title={markLabel} aria-label={markLabel} - disabled={!canEdit} + disabled={!canEdit || !canEditTaskInstance} {...otherProps} > <Flex> @@ -308,7 +309,7 @@ const MarkInstanceAs = ({ </MenuList> </Menu> {/* Only load modal is user can edit */} - {canEdit && ( + {canEdit && canEditTaskInstance && ( <MarkAsModal runId={runId} taskId={taskId} diff --git a/airflow/www/templates/airflow/grid.html b/airflow/www/templates/airflow/grid.html index 3c7bb236e1..3f3f0ece8e 100644 --- a/airflow/www/templates/airflow/grid.html +++ b/airflow/www/templates/airflow/grid.html @@ -28,6 +28,7 @@ <meta name="base_date" content="{{ request.args.get('base_date') if request.args.get('base_date') else '' }}"> <meta name="default_wrap" content="{{ default_wrap }}"> <meta name="dataset_events_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dataset_endpoint_get_dataset_events') }}"> + <meta name="can_edit_taskinstance" content="{{ can_edit_taskinstance }}"> {% endblock %} {% block content %} diff --git a/airflow/www/views.py b/airflow/www/views.py index 4d69095807..2a17a9de47 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -2825,6 +2825,11 @@ class Airflow(AirflowBaseView): if default_dag_run_display_number not in num_runs_options: insort_left(num_runs_options, default_dag_run_display_number) + can_edit_taskinstance = get_auth_manager().is_authorized_dag( + method="PUT", + access_entity=DagAccessEntity.TASK_INSTANCE, + ) + return self.render_template( "airflow/grid.html", show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), @@ -2832,6 +2837,7 @@ class Airflow(AirflowBaseView): dag=dag, doc_md=doc_md, num_runs=num_runs, + can_edit_taskinstance=can_edit_taskinstance, show_external_log_redirect=task_log_reader.supports_external_link, external_log_name=external_log_name, dag_model=dag_model,
