This is an automated email from the ASF dual-hosted git repository.
eladkal 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 01f5f66033b set `object_name`, `payload`, `external_id_field` as
templated fields in `SalesforceBulkOperator` (#63109)
01f5f66033b is described below
commit 01f5f66033bdc119b4710718cebb58d0de61208f
Author: Sagar Gupta <[email protected]>
AuthorDate: Tue Mar 24 01:16:05 2026 +0530
set `object_name`, `payload`, `external_id_field` as templated fields in
`SalesforceBulkOperator` (#63109)
Add template_fields (object_name, payload, external_id_field) to
SalesforceBulkOperator so Jinja templates can be used for these
parameters at runtime.
Validation remains in __init__ as operation is not templated.
Closes: #62375
---
.../airflow/providers/salesforce/operators/bulk.py | 4 ++-
.../tests/unit/salesforce/operators/test_bulk.py | 35 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git
a/providers/salesforce/src/airflow/providers/salesforce/operators/bulk.py
b/providers/salesforce/src/airflow/providers/salesforce/operators/bulk.py
index f2bb5007fc7..7b5d21030db 100644
--- a/providers/salesforce/src/airflow/providers/salesforce/operators/bulk.py
+++ b/providers/salesforce/src/airflow/providers/salesforce/operators/bulk.py
@@ -16,7 +16,7 @@
# under the License.
from __future__ import annotations
-from collections.abc import Iterable
+from collections.abc import Iterable, Sequence
from typing import TYPE_CHECKING, cast
from airflow.providers.common.compat.sdk import BaseOperator
@@ -48,6 +48,8 @@ class SalesforceBulkOperator(BaseOperator):
:param salesforce_conn_id: The :ref:`Salesforce Connection id
<howto/connection:salesforce>`.
"""
+ template_fields: Sequence[str] = ("object_name", "payload",
"external_id_field")
+
available_operations = ("insert", "update", "upsert", "delete",
"hard_delete")
def __init__(
diff --git a/providers/salesforce/tests/unit/salesforce/operators/test_bulk.py
b/providers/salesforce/tests/unit/salesforce/operators/test_bulk.py
index fe4dc973793..96589ff1c93 100644
--- a/providers/salesforce/tests/unit/salesforce/operators/test_bulk.py
+++ b/providers/salesforce/tests/unit/salesforce/operators/test_bulk.py
@@ -29,6 +29,41 @@ class TestSalesforceBulkOperator:
Test class for SalesforceBulkOperator
"""
+ def test_template_fields(self):
+ """
+ Test that template_fields are correctly defined and renderable.
+ """
+ operator = SalesforceBulkOperator(
+ task_id="test_template_fields",
+ operation="insert",
+ object_name="Account",
+ payload=[],
+ )
+ assert operator.template_fields == ("object_name", "payload",
"external_id_field")
+
+ @pytest.mark.db_test
+ def test_template_rendering(self, create_task_instance_of_operator):
+ """
+ Test that template_fields actually render Jinja templates.
+ """
+ ti = create_task_instance_of_operator(
+ SalesforceBulkOperator,
+ operation="upsert",
+ object_name="{{ params.obj }}",
+ payload="{{ params.data }}",
+ external_id_field="{{ params.ext_id }}",
+ params={
+ "obj": "Contact",
+ "data": "[{'Name': 'Test'}]",
+ "ext_id": "Email",
+ },
+ dag_id="test_salesforce_bulk_template",
+ task_id="test_render",
+ )
+ rendered = ti.render_templates()
+ assert rendered.object_name == "Contact"
+ assert rendered.external_id_field == "Email"
+
def test_execute_missing_operation(self):
"""
Test execute missing operation