-
Notifications
You must be signed in to change notification settings - Fork 0
/
helpers.py
103 lines (79 loc) · 2.79 KB
/
helpers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""
Some of these are lifted from Mozilla's Funfactory.
"""
import jingo
import jinja2
from django.conf import settings
from django.core.urlresolvers import reverse
from django.template import defaultfilters
from django.utils import html, encoding, formats, timesince
from typogrify.templatetags import jinja2_filters
jinja2_filters.register(jingo.env)
jingo.register.filter(html.linebreaks)
jingo.register.filter(timesince.timesince)
jingo.register.filter(timesince.timeuntil)
jingo.register.filter(defaultfilters.timesince)
jingo.register.filter(defaultfilters.truncatewords)
@jingo.register.filter
def iriencode(value):
return encoding.force_unicode(encoding.iri_to_uri(value))
@jingo.register.filter
def date(value, arg=None):
"""Formats a date according to the given format."""
if not value:
return u''
if arg is None:
arg = settings.DATE_FORMAT
try:
return formats.date_format(value, arg)
except AttributeError:
try:
from django.utils.dateformat import format
return format(value, arg)
except AttributeError:
return ''
@jingo.register.function
@jinja2.contextfunction
def firstof(context, *args):
for arg in args:
if arg:
return encoding.smart_unicode(arg)
return ''
@jingo.register.filter
def spaceless(value):
return jinja2.Markup(' '.join(value.strip('\n').split()))
@jingo.register.function
def thisyear():
"""The current year."""
return jinja2.Markup(datetime.date.today().year)
@jingo.register.function
def url(viewname, *args, **kwargs):
"""Helper for Django's ``reverse`` in templates."""
return reverse(viewname, args=args, kwargs=kwargs)
@jingo.register.filter
def urlparams(url_, hash=None, **query):
"""Add a fragment and/or query paramaters to a URL.
New query params will be appended to exising parameters, except duplicate
names, which will be replaced.
"""
url = urlparse.urlparse(url_)
fragment = hash if hash is not None else url.fragment
# Use dict(parse_qsl) so we don't get lists of values.
q = url.query
query_dict = dict(urlparse.parse_qsl(smart_str(q))) if q else {}
query_dict.update((k, v) for k, v in query.items())
query_string = _urlencode([(k, v) for k, v in query_dict.items()
if v is not None])
new = urlparse.ParseResult(url.scheme, url.netloc, url.path, url.params,
query_string, fragment)
return new.geturl()
def _urlencode(items):
"""A Unicode-safe URLencoder."""
try:
return urllib.urlencode(items)
except UnicodeEncodeError:
return urllib.urlencode([(k, smart_str(v)) for k, v in items])
@jingo.register.filter
def urlencode(txt):
"""Url encode a path."""
return urllib.quote_plus(txt)