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}