um-cseg/chez-betty

View on GitHub
chezbetty/jinja2_filters.py

Summary

Maintainability
B
4 hrs
Test Coverage
from .models import box
from .models import item
from .models import user
from .models import account
from .models import pool
from .models import vendor

import arrow
import jinja2

from sh import ErrorReturnCode, git

def format_currency(value):
    try:
        p = float(value)
    except ValueError:
        return value
    # We stored currency as floats, avoid the -$0.00 case
    if p <= -0.01:
         return '<span class="negative">-${:,.2f}</span>'.format(p*-1.0)
    else:
        return '<span class="positive">${:,.2f}</span>'.format(value)

def format_debt(value):
    try:
        p = float(value)
    except ValueError:
        return value
    # We stored currency as floats, avoid the -$0.00 case
    if p <= -0.01:
         return '<span class="negative">${:,.2f}</span>'.format(p*-1.0)
    print("WARN: format_debt expects a negative value")
    return format_currency(value)

# Convert UTC datetime object from the database to the local time
# of the Chez Betty instance.
# TODO: pass the timezone in to this somehow, but for now we just go
# with eastern. Sorry.
def pretty_date(datetime_obj):
    eastern = arrow.get(datetime_obj).to('US/Eastern')
    eastern_date = eastern.format('MMM D, YYYY')
    eastern_time = eastern.format('hh:mm A')
    return '<span class="prettydate">{} at {}</span>'.format(eastern_date, eastern_time)

def human_date(datetime_obj):
    eastern = arrow.get(datetime_obj).to('US/Eastern')
    return eastern.humanize()

# Shorten a string to l length
def shorten(s, l):
    if l == 0:
        return s
    elif len(s) <= l:
        return s
    else:
        return s[0:l-1] + '…'

def make_link(obj, str_len=0):
    if obj is None:
        return ''
    elif type(obj) is box.Box:
        return '<a href="/admin/box/edit/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    elif type(obj) is item.Item:
        return '<a href="/admin/item/edit/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    elif type(obj) is user.User:
        return '<a href="/admin/user/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    elif type(obj) is pool.Pool:
        return '<a href="/admin/pool/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    elif type(obj) is vendor.Vendor:
        return '<a href="/admin/vendor/edit/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    else:
        return obj.name

def make_user_link(obj, str_len=0):
    if type(obj) is pool.Pool:
        return '<a href="/user/pool/{}">{}</a>'.format(obj.id, shorten(obj.name, str_len))
    else:
        return obj.name

def add_git_version(s):
    try:
        return ' '+git.describe('--tags').strip()
    except ErrorReturnCode:
        pass