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,

Reply via email to