Coverage for documents/templating/filters.py: 22%
28 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
1from datetime import date
2from datetime import datetime
4from babel import Locale
5from babel import dates
6from django.utils.dateparse import parse_date
7from django.utils.dateparse import parse_datetime
10def localize_date(value: date | datetime | str, format: str, locale: str) -> str:
11 """
12 Format a date, datetime or str object into a localized string using Babel.
14 Args:
15 value (date | datetime | str): The date or datetime to format. If a datetime
16 is provided, it should be timezone-aware (e.g., UTC from a Django DB object).
17 If str is provided it is parsed as date.
18 format (str): The format to use. Can be one of Babel's preset formats
19 ('short', 'medium', 'long', 'full') or a custom pattern string.
20 locale (str): The locale code (e.g., 'en_US', 'fr_FR') to use for
21 localization.
23 Returns:
24 str: The localized, formatted date string.
26 Raises:
27 TypeError: If `value` is not a date, datetime or str instance.
28 """
29 if isinstance(value, str):
30 value = parse_datetime(value)
32 try:
33 Locale.parse(locale)
34 except Exception as e:
35 raise ValueError(f"Invalid locale identifier: {locale}") from e
37 if isinstance(value, datetime):
38 return dates.format_datetime(value, format=format, locale=locale)
39 elif isinstance(value, date):
40 return dates.format_date(value, format=format, locale=locale)
41 else:
42 raise TypeError(f"Unsupported type {type(value)} for localize_date")
45def format_datetime(value: str | datetime, format: str) -> str:
46 if isinstance(value, str):
47 value = parse_date(value)
48 return value.strftime(format=format)
51def get_cf_value(
52 custom_field_data: dict[str, dict[str, str]],
53 name: str,
54 default: str | None = None,
55) -> str | None:
56 if name in custom_field_data and custom_field_data[name]["value"] is not None:
57 return custom_field_data[name]["value"]
58 elif default is not None:
59 return default
60 return None