From 79da21bc30b6781bf4a6a435593b23b4f0ceab42 Mon Sep 17 00:00:00 2001 From: Kian Eliasi Date: Mon, 8 Aug 2022 13:11:44 +0430 Subject: [PATCH 1/2] Fix the errors raised when None is passed to template filters --- airflow/templates.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/airflow/templates.py b/airflow/templates.py index 6ec010f618fd3..4dcd59a291638 100644 --- a/airflow/templates.py +++ b/airflow/templates.py @@ -45,23 +45,28 @@ class SandboxedEnvironment(_AirflowEnvironmentMixin, jinja2.sandbox.SandboxedEnv def ds_filter(value): - return value.strftime('%Y-%m-%d') + if value is not None: + return value.strftime('%Y-%m-%d') def ds_nodash_filter(value): - return value.strftime('%Y%m%d') + if value is not None: + return value.strftime('%Y%m%d') def ts_filter(value): - return value.isoformat() + if value is not None: + return value.isoformat() def ts_nodash_filter(value): - return value.strftime('%Y%m%dT%H%M%S') + if value is not None: + return value.strftime('%Y%m%dT%H%M%S') def ts_nodash_with_tz_filter(value): - return value.isoformat().replace('-', '').replace(':', '') + if value is not None: + return value.isoformat().replace('-', '').replace(':', '') FILTERS = { From b0f0939a6c790984d4c1c2c09204348e6b72b628 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 9 Aug 2022 16:39:26 +0800 Subject: [PATCH 2/2] Typing update --- airflow/templates.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/airflow/templates.py b/airflow/templates.py index 4dcd59a291638..73c8635836ee4 100644 --- a/airflow/templates.py +++ b/airflow/templates.py @@ -16,6 +16,10 @@ # specific language governing permissions and limitations # under the License. +from __future__ import annotations + +import datetime + import jinja2.nativetypes import jinja2.sandbox @@ -44,29 +48,34 @@ class SandboxedEnvironment(_AirflowEnvironmentMixin, jinja2.sandbox.SandboxedEnv """SandboxedEnvironment for Airflow task templates.""" -def ds_filter(value): - if value is not None: - return value.strftime('%Y-%m-%d') +def ds_filter(value: datetime.date | datetime.time | None) -> str | None: + if value is None: + return None + return value.strftime('%Y-%m-%d') -def ds_nodash_filter(value): - if value is not None: - return value.strftime('%Y%m%d') +def ds_nodash_filter(value: datetime.date | datetime.time | None) -> str | None: + if value is None: + return None + return value.strftime('%Y%m%d') -def ts_filter(value): - if value is not None: - return value.isoformat() +def ts_filter(value: datetime.date | datetime.time | None) -> str | None: + if value is None: + return None + return value.isoformat() -def ts_nodash_filter(value): - if value is not None: - return value.strftime('%Y%m%dT%H%M%S') +def ts_nodash_filter(value: datetime.date | datetime.time | None) -> str | None: + if value is None: + return None + return value.strftime('%Y%m%dT%H%M%S') -def ts_nodash_with_tz_filter(value): - if value is not None: - return value.isoformat().replace('-', '').replace(':', '') +def ts_nodash_with_tz_filter(value: datetime.date | datetime.time | None) -> str | None: + if value is None: + return None + return value.isoformat().replace('-', '').replace(':', '') FILTERS = {