This is an automated email from the ASF dual-hosted git repository. rahulvats pushed a commit to branch py-client-sync in repository https://gitbox.apache.org/repos/asf/airflow.git
commit dd5e90a1f79e7b6c68b0758370393a34acf93a1e 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
