You can slightly improve it by using the @contextfunction decorator from Jinja 
and user_defined_macros at the DAG level:

```
from datetime import datetime
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from jinja2 import contextfunction
import pendulum
import airflow.utils.timezone


@contextfunction
def ts_no_tz(context):
    dag = context['dag']

    return context['execution_date'].strftime("%Y-%m-%dT%H:%M:%S")


start = datetime(2019, 2, 18, 0, 0, 0, 
tzinfo=pendulum.timezone("America/Los_Angeles"))
dag = DAG(
    'test',
    start_date=start,
    catchup=False,
    max_active_runs=1,
    default_args={
        'retries': 2,
        'retry_delay': 60,
    },
    user_defined_macros={'ts_no_tz': ts_no_tz},
)

with dag:
    tasks = [BashOperator(task_id='test_' + str(i), bash_command='echo {{ts}} 
{{ ts_no_tz() }}') for i in range(6)]
```

You could also use the policy() hook 
<http://airflow.apache.org/concepts.html#cluster-policy 
<http://airflow.apache.org/concepts.html#cluster-policy>> to set this globally:

```
def policy(task):
    if not task.dag.user_defined_macros:
        task.dag.user_defined_macros = {}
    task.dag.user_defined_macros.setdefault('ts_no_tz', ts_no_tz)
```

HTH,
Ash
      

> On 28 May 2019, at 18:46, Shaw, Damian P. <[email protected]> 
> wrote:
> 
> Thanks, I will test this and if it works generally switch my own non-user 
> facing code to this approach.
>  
> However for exposing Airflow to my end users  it has 2 drawbacks that make it 
> unlikely to be used: 1) For date variables the approach appears to be to 
> create a function that you pass the task instance to. 2) The name spacing is 
> more verbose. E.g. My current custom template variable “local_cal_ds” becomes 
> “macros.local_cal_ds(ti)”
> This might seem small but awkward apis slow down or halt adoption when 
> dealing with users who are only lightly technical.
>  
> Regards
> Damian
>                                                                               
>                             
> From: James Meickle [mailto:[email protected]] 
> Sent: Tuesday, May 28, 2019 1:16 PM
> To: [email protected]
> Subject: Re: Global Custom Template Variables? Or is there another best 
> practise here?
>  
> You can do this via the "macros" section in a plugin: 
> https://airflow.apache.org/plugins.html#example 
> <https://airflow.apache.org/plugins.html#example>
>  
> On Tue, May 28, 2019 at 12:42 PM Shaw, Damian P. 
> <[email protected] <mailto:[email protected]>> 
> wrote:
> Hi all,
>  
> Is there a way to create template variables (e.g. ‘ds’, ‘ds_nodash’, etc.) 
> that are available to every situation where Airflow renders templates? Or 
> otherwise is there a best practice on providing these?
>  
> My motivation is I am developing an Airflow environment for my business 
> users. To make it easy for them I have created several custom date variables 
> (they are set at the end of the tasks processing period in the timezone of 
> the DAG)  that they can access so they don’t have to write their own date 
> logic.
>  
> My current implementation is to subclass all the operators and sensors I need 
> and to override the render_template and execute method injecting the extra 
> variables in to the context dictionary. This has 2 major drawbacks, it needs 
> to be done for every Operator and Sensor we are using, and it is not 
> available to logic outside Operators and Sensors such as setting email alert 
> configuration:https://airflow.apache.org/concepts.html#email-configuration 
> <https://airflow.apache.org/concepts.html#email-configuration>
>  
> Thanks for any input,
> Damian
>  
> 
> ==============================================================================
> Please access the attached hyperlink for an important electronic 
> communications disclaimer:
> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html 
> <http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html>
> ==============================================================================
> 
> 
> ==============================================================================
> Please access the attached hyperlink for an important electronic 
> communications disclaimer:
> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html 
> <http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html>
> ==============================================================================

Reply via email to