Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.web.framework.helpers

"""
Galaxy web framework helpers

The functions in this module should be considered part of the API used by
visualizations in their mako files through the `$h` object, see
GalaxyWebTransaction in galaxy/webapps/base/webapp.py
"""
from datetime import (
    datetime,
    timedelta,
)

from babel import default_locale
from babel.dates import format_timedelta
from routes import url_for

from galaxy.util import (
    hash_util,
    smart_str,
    unicodify,
)
from galaxy.util.json import safe_dumps as dumps  # noqa: F401
from .tags import (
    javascript_link,
    stylesheet_link,
)
from ..base import server_starttime


[docs]def time_ago(x): """ Convert a datetime to a string. """ # If the date is more than one week ago, then display the actual date instead of in words if datetime.utcnow() - x > timedelta(weeks=1): # Greater than a week difference return x.strftime("%b %d, %Y") else: # Workaround https://github.com/python-babel/babel/issues/137 kwargs = dict() if not default_locale("LC_TIME"): kwargs["locale"] = "en_US_POSIX" return format_timedelta(x - datetime.utcnow(), threshold=1, add_direction=True, **kwargs)
[docs]def iff(a, b, c): """ Ternary shortcut """ if a: return b else: return c
[docs]def truncate(content, length=100, suffix="..."): """ Smart string truncation """ if len(content) <= length: return content else: return content[:length].rsplit(" ", 1)[0] + suffix
# Quick helpers for static content
[docs]def css(*args): """ Take a list of stylesheet names (no extension) and return appropriate string of link tags. Cache-bust with time that server started running on """ urls = (url_for(f"/static/style/{name}.css?v={server_starttime}") for name in args) return stylesheet_link(*urls)
[docs]def dist_css(*args): """ Transition function 'css' helper -- this is the modern way where all bundled artifacts are in the unified 'dist'. """ urls = (url_for(f"/static/dist/{name}.css?v={server_starttime}") for name in args) return stylesheet_link(*urls)
[docs]def js_helper(prefix, *args): """ Take a prefix and list of javascript names and return appropriate string of script tags. Cache-bust with time that server started running on """ urls = (url_for(f"/{prefix}{name}.js?v={server_starttime}") for name in args) return javascript_link(*urls)
[docs]def dist_js(*args): """ Take a prefix and list of javascript names and return appropriate string of script tags. """ return js_helper("static/dist/", *args)
# Hashes
[docs]def md5(s): """ Return hex encoded md5 hash of string s """ m = hash_util.md5() m.update(smart_str(s)) return m.hexdigest()
# Unicode help
[docs]def to_unicode(a_string): """ Convert a string to unicode in utf-8 format; if string is already unicode, does nothing because string's encoding cannot be determined by introspection. """ return unicodify(a_string, "utf-8")
[docs]def is_true(val): """ Returns true if input is a boolean and true or is a string and looks like a true value. """ return val is True or val in ["True", "true", "T", "t"]
[docs]def to_js_bool(val): """ Prints javascript boolean for passed value. TODO: isn't there a standard python JSON parser we should be using instead of all these manual conversions? """ return iff(is_true(val), "true", "false")
[docs]def js_nullable(val): """ Prints javascript null instead of python None TODO: isn't there a standard python JSON parser we should be using instead of all these manual conversions? """ return iff(val is None, "null", val)