From c425d5533116cc5a623ee2c614a68bf8e13513f6 Mon Sep 17 00:00:00 2001 From: Ethan Dalool Date: Wed, 9 Sep 2020 13:23:16 -0700 Subject: [PATCH] Use decorators in jinja_filters to automatically register them. --- frontends/etiquette_flask/backend/common.py | 9 +------ .../etiquette_flask/backend/jinja_filters.py | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/frontends/etiquette_flask/backend/common.py b/frontends/etiquette_flask/backend/common.py index 2fa24d4..0c6befc 100644 --- a/frontends/etiquette_flask/backend/common.py +++ b/frontends/etiquette_flask/backend/common.py @@ -32,14 +32,7 @@ site.config.update( site.jinja_env.add_extension('jinja2.ext.do') site.jinja_env.trim_blocks = True site.jinja_env.lstrip_blocks = True -site.jinja_env.filters['bytestring'] = jinja_filters.bytestring -site.jinja_env.filters['comma_join'] = jinja_filters.comma_join -site.jinja_env.filters['file_link'] = jinja_filters.file_link -site.jinja_env.filters['sort_tags'] = jinja_filters.sort_tags -site.jinja_env.filters['timestamp_to_8601'] = jinja_filters.timestamp_to_8601 -site.jinja_env.filters['timestamp_to_naturaldate'] = jinja_filters.timestamp_to_naturaldate -site.jinja_env.filters['users_to_usernames'] = jinja_filters.users_to_usernames -site.jinja_env.globals['make_attributes'] = jinja_filters.make_attributes +jinja_filters.register_all(site) site.debug = True P = etiquette.photodb.PhotoDB() diff --git a/frontends/etiquette_flask/backend/jinja_filters.py b/frontends/etiquette_flask/backend/jinja_filters.py index c68e875..e2f035d 100644 --- a/frontends/etiquette_flask/backend/jinja_filters.py +++ b/frontends/etiquette_flask/backend/jinja_filters.py @@ -3,24 +3,45 @@ import jinja2.filters import voussoirkit.bytestring +filter_functions = [] +global_functions = [] +def filter_function(function): + filter_functions.append(function) + return function + +def global_function(function): + global_functions.append(function) + return function + +def register_all(site): + for function in filter_functions: + site.jinja_env.filters[function.__name__] = function + + for function in global_functions: + site.jinja_env.globals[function.__name__] = function + +@filter_function def bytestring(x): try: return voussoirkit.bytestring.bytestring(x) except Exception as e: return '??? b' +@filter_function def comma_join(l): if not l: return '' return ', '.join(l) +@filter_function def file_link(photo, short=False): if short: return f'/file/{photo.id}{photo.dot_extension}' basename = jinja2.filters.do_urlencode(photo.basename) return f'/file/{photo.id}/{basename}' +@global_function def make_attributes(*booleans, **keyvalues): keyvalues = {key: value for (key, value) in keyvalues.items() if value is not None} attributes = [f'{key}="{jinja2.filters.escape(value)}"' for (key, value) in keyvalues.items()] @@ -28,20 +49,25 @@ def make_attributes(*booleans, **keyvalues): attributes = ' '.join(attributes) return attributes +@filter_function def sort_tags(tags): tags = sorted(tags, key=lambda x: x.name) return tags +@filter_function def timestamp_to_8601(timestamp): return datetime.datetime.utcfromtimestamp(timestamp).isoformat(' ') + ' UTC' +@filter_function def timestamp_to_string(timestamp, format): date = datetime.datetime.utcfromtimestamp(timestamp) return date.strftime(format) +@filter_function def timestamp_to_naturaldate(timestamp): return timestamp_to_string(timestamp, '%B %d, %Y') +@filter_function def users_to_usernames(users): if not users: return []