This is an automated email from the ASF dual-hosted git repository.
vincbeck 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 32d242f18ac Add display_filename parameter to SlackAPIFileOperator
(#62112)
32d242f18ac is described below
commit 32d242f18ac18ba9994e239faf98c661e1da668a
Author: yuseok89 <[email protected]>
AuthorDate: Thu Feb 19 07:14:05 2026 +0900
Add display_filename parameter to SlackAPIFileOperator (#62112)
* feat(slack): add display_filename to SlackAPIFileOperator
* fix(slack): fix Sphinx spellcheck for display_filename docstring
---
.../src/airflow/providers/slack/operators/slack.py | 19 +++++++-
.../slack/tests/unit/slack/operators/test_slack.py | 50 ++++++++++++++++++++++
2 files changed, 68 insertions(+), 1 deletion(-)
diff --git a/providers/slack/src/airflow/providers/slack/operators/slack.py
b/providers/slack/src/airflow/providers/slack/operators/slack.py
index 0eb502624b0..20f6ef7516c 100644
--- a/providers/slack/src/airflow/providers/slack/operators/slack.py
+++ b/providers/slack/src/airflow/providers/slack/operators/slack.py
@@ -183,7 +183,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
filetype="txt",
)
- # Send file content
+ # Send file content with a custom display name
slack_operator_file_content = SlackAPIFileOperator(
task_id="slack_file_upload_2",
dag=dag,
@@ -191,6 +191,17 @@ class SlackAPIFileOperator(SlackAPIOperator):
channels="#general",
initial_comment="Hello World!",
content="file content in txt",
+ display_filename="test.txt",
+ )
+
+ # Upload a file with a custom display name
+ slack_operator_file_display = SlackAPIFileOperator(
+ task_id="slack_file_upload_3",
+ dag=dag,
+ slack_conn_id="slack",
+ channels="#general",
+ filename="/files/dags/test.txt",
+ display_filename="custom_test.txt",
)
:param channels: Comma-separated list of channel names or IDs where the
file will be shared.
@@ -200,6 +211,8 @@ class SlackAPIFileOperator(SlackAPIOperator):
:param filetype: slack filetype. (templated) See:
https://api.slack.com/types/file#file_types
:param content: file content. (templated)
:param title: title of file. (templated)
+ :param display_filename: displayed filename in Slack. Overrides the
default name
+ derived from ``filename``. (templated)
:param snippet_type: Syntax type for the snippet being uploaded.(templated)
:param method_version: The version of the method of Slack SDK Client to be
used, either "v1" or "v2".
"""
@@ -211,6 +224,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
"filetype",
"content",
"title",
+ "display_filename",
"snippet_type",
)
ui_color = "#44BEDF"
@@ -223,6 +237,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
filetype: str | None = None,
content: str | None = None,
title: str | None = None,
+ display_filename: str | None = None,
method_version: Literal["v1", "v2"] | None = None,
snippet_type: str | None = None,
**kwargs,
@@ -234,6 +249,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
self.filetype = filetype
self.content = content
self.title = title
+ self.display_filename = display_filename
self.method_version = method_version
self.snippet_type = snippet_type
@@ -257,6 +273,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
# For historical reason SlackAPIFileOperator use filename as
reference to file
file=self.filename,
content=self.content,
+ filename=self.display_filename,
initial_comment=self.initial_comment,
title=self.title,
snippet_type=self.snippet_type,
diff --git a/providers/slack/tests/unit/slack/operators/test_slack.py
b/providers/slack/tests/unit/slack/operators/test_slack.py
index 304cd8ee8b2..dc4d5cde672 100644
--- a/providers/slack/tests/unit/slack/operators/test_slack.py
+++ b/providers/slack/tests/unit/slack/operators/test_slack.py
@@ -234,6 +234,7 @@ class TestSlackAPIFileOperator:
channels="#test-channel",
content="test-content",
file=None,
+ filename=None,
initial_comment=initial_comment,
title=title,
snippet_type=snippet_type,
@@ -260,7 +261,56 @@ class TestSlackAPIFileOperator:
channels="C1234567890",
content=None,
file="/dev/null",
+ filename=None,
initial_comment=initial_comment,
title=title,
snippet_type=snippet_type,
)
+
+ def test_api_call_params_with_content_and_display_filename(self):
+ """Test that content upload uses display_filename as the displayed
name."""
+ op = SlackAPIFileOperator(
+ task_id="slack",
+ slack_conn_id=SLACK_API_TEST_CONNECTION_ID,
+ channels="#test-channel",
+ content="test-content",
+ display_filename="test.txt",
+ initial_comment="test",
+ )
+ with mock.patch(
+
"airflow.providers.slack.operators.slack.SlackHook.send_file_v1_to_v2"
+ ) as mock_send_file:
+ op.execute({})
+ mock_send_file.assert_called_once_with(
+ channels="#test-channel",
+ content="test-content",
+ file=None,
+ filename="test.txt",
+ initial_comment="test",
+ title=None,
+ snippet_type=None,
+ )
+
+ def test_api_call_params_with_file_and_display_filename(self):
+ """Test that file upload uses display_filename as the displayed
name."""
+ op = SlackAPIFileOperator(
+ task_id="slack",
+ slack_conn_id=SLACK_API_TEST_CONNECTION_ID,
+ channels="#test-channel",
+ filename="/path/to/file.txt",
+ display_filename="custom_test.txt",
+ initial_comment="test",
+ )
+ with mock.patch(
+
"airflow.providers.slack.operators.slack.SlackHook.send_file_v1_to_v2"
+ ) as mock_send_file:
+ op.execute({})
+ mock_send_file.assert_called_once_with(
+ channels="#test-channel",
+ content=None,
+ file="/path/to/file.txt",
+ filename="custom_test.txt",
+ initial_comment="test",
+ title=None,
+ snippet_type=None,
+ )