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

Reply via email to