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

1from datetime import date 

2from datetime import datetime 

3 

4from babel import Locale 

5from babel import dates 

6from django.utils.dateparse import parse_date 

7from django.utils.dateparse import parse_datetime 

8 

9 

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. 

13 

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. 

22 

23 Returns: 

24 str: The localized, formatted date string. 

25 

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) 

31 

32 try: 

33 Locale.parse(locale) 

34 except Exception as e: 

35 raise ValueError(f"Invalid locale identifier: {locale}") from e 

36 

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") 

43 

44 

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) 

49 

50 

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