92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
import re
|
|
from atat.utils.localization import translate
|
|
from flask import render_template
|
|
from jinja2 import contextfilter
|
|
from jinja2.exceptions import TemplateNotFound
|
|
from urllib.parse import urlparse, urlunparse, parse_qs, urlencode
|
|
from decimal import DivisionByZero as DivisionByZeroException, InvalidOperation
|
|
|
|
|
|
def iconSvg(name):
|
|
with open("static/icons/" + name + ".svg") as contents:
|
|
return contents.read()
|
|
|
|
|
|
def dollars(value):
|
|
try:
|
|
numberValue = float(value)
|
|
except ValueError:
|
|
numberValue = 0
|
|
return "${:,.2f}".format(numberValue)
|
|
|
|
|
|
def with_extra_params(url, **params):
|
|
"""
|
|
Takes an existing url and safely appends additional query parms.
|
|
"""
|
|
parsed_url = urlparse(url)
|
|
parsed_params = parse_qs(parsed_url.query)
|
|
new_params = {**parsed_params, **params}
|
|
parsed_url = parsed_url._replace(query=urlencode(new_params))
|
|
return urlunparse(parsed_url)
|
|
|
|
|
|
def usPhone(number):
|
|
if not number:
|
|
return ""
|
|
phone = re.sub(r"\D", "", number)
|
|
return "+1 ({}) {} - {}".format(phone[0:3], phone[3:6], phone[6:])
|
|
|
|
|
|
def obligatedFundingGraphWidth(values):
|
|
numerator, denominator = values
|
|
try:
|
|
return (numerator / denominator) * 100
|
|
except (DivisionByZeroException, InvalidOperation):
|
|
return 0
|
|
|
|
|
|
def formattedDate(value, formatter="%m/%d/%Y"):
|
|
if value:
|
|
return value.strftime(formatter)
|
|
else:
|
|
return "-"
|
|
|
|
|
|
def pageWindow(pagination, size=2):
|
|
page = pagination.page
|
|
num_pages = pagination.pages
|
|
|
|
over = max(0, page + size - num_pages)
|
|
under = min(0, page - size - 1)
|
|
|
|
return (max(1, (page - size) - over), min(num_pages, (page + size) - under))
|
|
|
|
|
|
def renderAuditEvent(event):
|
|
template_name = "audit_log/events/{}.html".format(event.resource_type)
|
|
try:
|
|
return render_template(template_name, event=event)
|
|
except TemplateNotFound:
|
|
return render_template("audit_log/events/default.html", event=event)
|
|
|
|
|
|
def register_filters(app):
|
|
app.jinja_env.filters["iconSvg"] = iconSvg
|
|
app.jinja_env.filters["dollars"] = dollars
|
|
app.jinja_env.filters["usPhone"] = usPhone
|
|
app.jinja_env.filters["formattedDate"] = formattedDate
|
|
app.jinja_env.filters["pageWindow"] = pageWindow
|
|
app.jinja_env.filters["renderAuditEvent"] = renderAuditEvent
|
|
app.jinja_env.filters["withExtraParams"] = with_extra_params
|
|
app.jinja_env.filters["obligatedFundingGraphWidth"] = obligatedFundingGraphWidth
|
|
|
|
@contextfilter
|
|
def translateWithoutCache(context, *kwargs):
|
|
return translate(*kwargs)
|
|
|
|
if app.config["DEBUG"]:
|
|
app.jinja_env.filters["translate"] = translateWithoutCache
|
|
else:
|
|
app.jinja_env.filters["translate"] = translate
|