Skip to content
Snippets Groups Projects
Select Git revision
  • f045fcdd0353a296a34b61140082fc70e3c00e64
  • master default protected
2 results

splay_operation.py

Blame
  • jinja.py 4.32 KiB
    # Konfigurace Jinjových šablon a pomocné funkce
    
    import decimal
    from flask import url_for
    import json
    from html import escape
    from markupsafe import Markup
    from typing import Any, Union, Optional
    import urllib.parse
    
    import mo.config as config
    import mo.db as db
    import mo.place_level
    from mo.rights import Right
    import mo.util_format as util_format
    from mo.web import app
    from mo.web.org_place import place_breadcrumbs
    from mo.web.util import user_html_flags
    
    # Konfigurace Jinjy
    
    jenv = app.jinja_env
    jenv.add_extension('jinja2.ext.do')
    jenv.lstrip_blocks = True
    jenv.trim_blocks = True
    
    # Filtry definované v mo.util_format
    
    jf = jenv.filters
    jf.update(timeformat=util_format.timeformat)
    jf.update(timeformat_short=util_format.timeformat_short)
    jf.update(inflected=util_format.inflect_number)
    jf.update(inflected_by=util_format.inflect_by_number)
    jf.update(timedelta=util_format.timedelta)
    jf.update(time_and_timedelta=util_format.time_and_timedelta)
    jf.update(time_duration=util_format.time_duration)
    jf.update(data_size=util_format.data_size)
    jf.update(decimal=util_format.format_decimal)
    jf.update(parse_decimal=decimal.Decimal)
    
    # Exporty proměnných
    
    jg = jenv.globals
    jg.update(current_year=config.CURRENT_YEAR)
    jg.update(web_flavor=config.WEB_FLAVOR)
    jg.update(place_levels=mo.place_level.place_levels)
    
    # Export enumů z mo.db:
    jg.update(RoundState=db.RoundState)
    jg.update(RoundScoreMode=db.RoundScoreMode)
    jg.update(LogType=db.LogType)
    jg.update(PartState=db.PartState)
    jg.update(RoleType=db.RoleType)
    jg.update(PaperType=db.PaperType)
    jg.update(TaskType=db.TaskType)
    jg.update(JobType=db.JobType)
    jg.update(JobState=db.JobState)
    jg.update(RoundType=db.RoundType)
    
    # Další typy:
    jg.update(Markup=Markup)
    jg.update(Right=Right)
    
    # Vlastní pomocné funkce
    
    jg.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 "")
    
    
    @app.template_filter()
    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 place_link(p: db.Place) -> Markup:
        return Markup('<a href="{url}">{name}</a>').format(url=place_url(p), name=p.name)
    
    
    @app.template_filter()
    def place_url(p: db.Place) -> str:
        return url_for('org_place', id=p.place_id)
    
    
    @app.template_filter()
    def pion_link(u: db.User, contest_id: int) -> Markup:
        url = url_for('org_contest_user', ct_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)
    
    
    @app.template_filter()
    def sol_editable_points(s: Optional[db.Solution]) -> str:
        if s is None:
            return 'X'
        elif s.is_empty:
            return 'P'
        elif s.points is None:
            return ""
        else:
            return util_format.format_decimal(s.points)
    
    
    @app.template_filter()
    def sol_display_points(s: Optional[db.Solution], user: bool = False) -> Union[str, Markup]:
        if s is None:
            return ''
        elif s.is_empty:
            return Markup('<span title="Prázdný protokol">∅</span>')
        elif s.points is None:
            if user:
                return ''
            else:
                return Markup('<span class="unknown">?</span>')
        else:
            return util_format.format_decimal(s.points)