import datetime as dt
from django.templatetags.static import static
from django.urls import reverse
from jinja2 import Environment
from typing import Any, Optional
GLOBAL_STYLES = {
'action-button': 'db ba b--black white f5 bg-dark-blue bold pa1 ph3 pointer hover-bg-blue bg-animate',
}
def duration(seconds: Optional[float]):
if seconds is None:
return '-'
secs = int(seconds % 60)
mins = int((seconds // 60) % 60)
hours = int(seconds // 3600)
if hours > 0:
return f'{hours:d}:{mins:02d}:{secs:02d}'
else:
return f'{mins:d}:{secs:02d}'
def distance(meters: Optional[float]):
if meters is None:
return '-'
return f'{meters/1000:0.1f} km'
def isodate(d: Optional[dt.datetime]) -> str:
if d is None:
return '-'
return d.strftime('%Y-%m-%d')
def isotime(d: Optional[dt.datetime]) -> str:
if d is None:
return '-'
return d.strftime('%H:%M')
def date(d: Optional[dt.datetime]) -> str:
if d is None:
return '-'
return d.strftime('%d.\u202f%m.\u202f%Y')
def datetime(d: Optional[dt.datetime]) -> str:
if d is None:
return '-'
return d.strftime('%d.\u202f%m.\u202f%Y\u202f%H:%M')
def optional_int(x: Optional[Any]) -> str:
if x is None:
return '-'
return str(round(x))
def environment(**options):
env = Environment(**options)
env.globals.update({
'now': dt.datetime.now,
'static': static,
'url': reverse,
'styles': GLOBAL_STYLES,
})
env.filters.update({
'date': date,
'datetime': datetime,
'distance': distance,
'duration': duration,
'isodate': isodate,
'isotime': isotime,
'optional_int': optional_int,
})
return env