Skip to content
Snippets Groups Projects
Commit a142afd7 authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Pomocné formátovací funkce v mo.util_format a jejich registrace jako jinja filtery

* Funkce timedelta pro vyrábění řetězců styl "za 3 minuty"
* Funkce time_and_timedelta vyrábějící řetězce
  "2020-01-09 12:00 (za 2 hodiny)"
* Přesun funkcí timeformat a inflect_number z mo.web
parent 2742e071
Branches
No related tags found
2 merge requests!12Účastnická část webu podporuje všechny stavy kola,!9WIP: Zárodek uživatelské části webu a submitování
This commit is part of merge request !12. Comments created here will be created in the context of that merge request.
# Utils that do not depend on any other in mo (to avoid circular dependency)
from datetime import datetime
from typing import Optional
import mo
def inflect_number(n: int, w1: str, w234: str, wother: str, unitprefix: str = '') -> str:
if n == 1:
return f'{n} {unitprefix}{w1}'
elif 2 <= n <= 4:
return f'{n} {unitprefix}{w234}'
else:
return f'{n} {unitprefix}{wother}'
def timeformat(dt: datetime) -> str:
if dt is None:
return ''
else:
return dt.astimezone().strftime("%Y-%m-%d %H:%M")
def timedelta(d: datetime, ref: Optional[datetime] = None, descriptive: bool = False) -> str:
"""Vyrábí česky formátované řetězece 'za 3 minuty', 'před 27 dny' a podobně
z rozdílu daného datetime a referenčního času (například now).
Pokud se předá `descriptive=True`, tak vyrábí "deskriptivní" popis
ve stylu '3 minuty po', '27 dní před' a podobně.
"""
if ref is None:
ref = mo.now
(prefix, suffix) = ("", "")
if ref > d:
delta = ref - d
if descriptive:
suffix = " před"
else:
prefix = "před "
before = True
else:
delta = d - ref
if descriptive:
suffix = " po"
else:
prefix = "za "
before = False
if delta.days > 0:
unitprefix = ''
if before:
value = inflect_number(delta.days, 'den' if descriptive else 'dnem', 'dny', 'dny')
else:
value = inflect_number(delta.days, 'den', 'dny', 'dní')
else:
if delta.seconds > 3600:
unitprefix = 'hodin'
number = delta.seconds // 3600
elif delta.seconds > 60:
unitprefix = 'minut'
number = delta.seconds // 60
else:
unitprefix = 'sekund'
number = delta.seconds
if before:
# 1 minuta před, 3 minuty před, 5 minut před / před 1 minutou, před 3 minutami, před 5 minutami
if descriptive:
value = inflect_number(number, 'a', 'y', '', unitprefix=unitprefix)
else:
value = inflect_number(number, 'ou', 'ami', 'ami', unitprefix=unitprefix),
else:
# 1 minuta po, 3 minuty po, 5 minut po / za 1 minutu, za 3 minuty, za 5 minut
value = inflect_number(number, 'a' if descriptive else 'u', 'y', '', unitprefix=unitprefix)
return f"{prefix}{value}{suffix}"
def time_and_timedelta(d: datetime, ref: Optional[datetime] = None):
return f"{timeformat(d)} ({timedelta(d, ref)})"
import datetime import datetime
from mo import util_format
import dateutil.tz import dateutil.tz
from flask import Flask, request, g, session from flask import Flask, request, g, session
import flask.logging import flask.logging
...@@ -32,27 +33,12 @@ logger.addHandler(flask.logging.default_handler) ...@@ -32,27 +33,12 @@ logger.addHandler(flask.logging.default_handler)
# Budeme používat české locale # Budeme používat české locale
locale.setlocale(locale.LC_COLLATE, 'cs_CZ.UTF-8') locale.setlocale(locale.LC_COLLATE, 'cs_CZ.UTF-8')
# Naše filtry pro Jinju # Naše filtry pro Jinju
def filter_timeformat(dt: datetime.datetime) -> str: app.jinja_env.filters.update(timeformat=util_format.timeformat)
if dt is None: app.jinja_env.filters.update(inflected=util_format.inflect_number)
return '' app.jinja_env.filters.update(timedelta=util_format.timedelta)
else: app.jinja_env.filters.update(time_and_timedelta=util_format.time_and_timedelta)
return dt.astimezone().strftime("%Y-%m-%d %H:%M")
def filter_inflected(n: int, w1: str, w234: str, wother: str) -> str:
if n == 1:
return f'{n} {w1}'
elif 2 <= n <= 4:
return f'{n} {w234}'
else:
return f'{n} {wother}'
app.jinja_env.filters['timeformat'] = filter_timeformat
app.jinja_env.filters['inflected'] = filter_inflected
# Inicializace požadavků a nucená autorizace # Inicializace požadavků a nucená autorizace
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment