All mock reporting data was moved to a JSON file. The concept of what JEDI CLIN a particular environment drew money from was added to the data. This change had a cascade effect to the reporting class methods, templates, and Vue components that ingested that reporting data. Many of these files were modified to adapt to these changes. This also included modifying the obligated funding bar graphs to reflect new design changes.
98 lines
2.8 KiB
Python
98 lines
2.8 KiB
Python
import re
|
|
import datetime
|
|
from atst.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
|
|
|
|
|
|
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:
|
|
return 0
|
|
|
|
|
|
def formattedDate(value, formatter="%m/%d/%Y"):
|
|
if value:
|
|
return value.strftime(formatter)
|
|
else:
|
|
return "-"
|
|
|
|
|
|
def dateFromString(value, formatter="%m/%Y"):
|
|
return datetime.datetime.strptime(value, formatter)
|
|
|
|
|
|
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["dateFromString"] = dateFromString
|
|
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
|