v0.166.0
 1import datetime
 2from itertools import islice
 3from typing import Any
 4
 5from plain.utils.html import json_script
 6from plain.utils.timesince import timesince, timeuntil
 7from plain.utils.timezone import localtime
 8
 9
10def localtime_filter(
11    value: datetime.datetime | None, timezone: Any = None
12) -> datetime.datetime:
13    """Converts a datetime to local time in a template."""
14    if not value:
15        # Without this, we get the current localtime
16        # which doesn't make sense as a filter
17        raise ValueError("localtime filter requires a datetime")
18    return localtime(value, timezone)
19
20
21def pluralize_filter(value: Any, singular: str = "", plural: str = "s") -> str:
22    """Returns plural suffix based on the value count.
23
24    Usage:
25        {{ count }} item{{ count|pluralize }}
26        {{ count }} ox{{ count|pluralize("en") }}
27        {{ count }} cact{{ count|pluralize("us","i") }}
28    """
29    try:
30        count = int(value)
31    except ValueError, TypeError:
32        return singular
33
34    if count == 1:
35        return singular
36
37    return plural
38
39
40default_filters = {
41    # The standard Python ones
42    "strftime": datetime.datetime.strftime,
43    "strptime": datetime.datetime.strptime,
44    "fromtimestamp": datetime.datetime.fromtimestamp,
45    "fromisoformat": datetime.datetime.fromisoformat,
46    # To convert to user time zone
47    "localtime": localtime_filter,
48    "timeuntil": timeuntil,
49    "timesince": timesince,
50    "json_script": json_script,
51    "islice": islice,  # slice for dict.items()
52    "pluralize": pluralize_filter,
53}