# Konfigurace Jinjových šablon a pomocné funkce from flask import url_for import json from html import escape from markupsafe import Markup from typing import Any import urllib.parse import mo.config as config import mo.db as db import mo.util_format as util_format from mo.web import app from mo.web.org_contest import contest_breadcrumbs from mo.web.org_place import place_breadcrumbs from mo.web.util import user_html_flags # Konfigurace Jinjy app.jinja_options['extensions'].append('jinja2.ext.do') app.jinja_env.lstrip_blocks = True app.jinja_env.trim_blocks = True # Filtry definované v mo.util_format app.jinja_env.filters.update(timeformat=util_format.timeformat) app.jinja_env.filters.update(timeformat_short=util_format.timeformat_short) app.jinja_env.filters.update(inflected=util_format.inflect_number) app.jinja_env.filters.update(inflected_by=util_format.inflect_by_number) app.jinja_env.filters.update(timedelta=util_format.timedelta) app.jinja_env.filters.update(time_and_timedelta=util_format.time_and_timedelta) app.jinja_env.filters.update(data_size=util_format.data_size) app.jinja_env.filters.update(decimal=util_format.format_decimal) # Exporty proměnných app.jinja_env.globals.update(web_flavor=config.WEB_FLAVOR) # Export enumů z mo.db: app.jinja_env.globals.update(RoundState=db.RoundState) app.jinja_env.globals.update(LogType=db.LogType) app.jinja_env.globals.update(PartState=db.PartState) app.jinja_env.globals.update(RoleType=db.RoleType) app.jinja_env.globals.update(PaperType=db.PaperType) app.jinja_env.globals.update(JobType=db.JobType) app.jinja_env.globals.update(JobState=db.JobState) # Další typy: app.jinja_env.globals.update(Markup=Markup) # Vlastní pomocné funkce app.jinja_env.globals.update(contest_breadcrumbs=contest_breadcrumbs) app.jinja_env.globals.update(place_breadcrumbs=place_breadcrumbs) # Funkce asset_url se přidává v mo.ext.assets @app.template_filter() def user_link(u: db.User) -> Markup: return Markup('<a href="{url}">{name}{test}</a>').format(url=user_url(u), name=u.full_name(), test=" (test)" if u.is_test else "") def user_url(u: db.User) -> str: if u.is_admin or u.is_org: return url_for('org_org', id=u.user_id) else: return url_for('org_user', id=u.user_id) @app.template_filter() def pion_link(u: db.User, contest_id: int) -> Markup: url = url_for('org_contest_user', contest_id=contest_id, user_id=u.user_id) return Markup('<a href="{url}">{name}{test}</a>').format(url=url, name=u.full_name(), test=" (test)" if u.is_test else "") @app.template_filter() def mailto(email: str) -> Markup: safe_email = urllib.parse.quote(email, safe='@') return Markup(f'<a href="mailto:{escape(safe_email)}">{escape(email)}</a>') @app.template_filter() def or_dash(s: Any) -> str: return str(s) if s else '–' @app.template_filter() def none_value(s: Any, none_value: Any) -> Any: return none_value if s is None else s @app.template_filter() def yes_no(a: bool) -> str: return "ano" if a else "ne" @app.template_filter() def jsescape(js: Any) -> str: return Markup(json_pretty(js)) @app.template_filter() def json_pretty(js: Any) -> str: return json.dumps(js, sort_keys=True, indent=4, ensure_ascii=False) @app.template_global() def log_url(typ: str, id: int) -> str: return url_for('org_log', typ=typ, id=id) @app.template_filter() def user_flags(u: db.User) -> Markup: return user_html_flags(u)