Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/household/webhook.py: 100%

35 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 03:04 +0000

1import datetime 

2import enum 

3 

4from isodate import parse_time 

5from pydantic import UUID4, ConfigDict, field_validator 

6 

7from mealie.schema._mealie import MealieModel 

8from mealie.schema._mealie.datetime_parse import parse_datetime 

9from mealie.schema.response.pagination import PaginationBase 

10 

11 

12class WebhookType(str, enum.Enum): 

13 mealplan = "mealplan" 

14 

15 

16class CreateWebhook(MealieModel): 

17 enabled: bool = True 

18 name: str = "" 

19 url: str = "" 

20 

21 webhook_type: WebhookType = WebhookType.mealplan 

22 scheduled_time: datetime.time 

23 

24 @field_validator("scheduled_time", mode="before") 

25 @classmethod 

26 def validate_scheduled_time(cls, v): 

27 """ 

28 Validator accepts both datetime and time values from external sources. 

29 DateTime types are parsed and converted to time objects without timezones 

30 

31 type: time is treated as a UTC value 

32 type: datetime is treated as a value with a timezone 

33 """ 

34 parser_funcs = [ 

35 lambda x: parse_datetime(x).astimezone(datetime.UTC).time(), 

36 parse_time, 

37 ] 

38 

39 if isinstance(v, datetime.time): 

40 return v 

41 

42 for parser_func in parser_funcs: 

43 try: 

44 return parser_func(v) 

45 except ValueError: 

46 continue 

47 

48 raise ValueError(f"Invalid scheduled time: {v}") 

49 

50 

51class SaveWebhook(CreateWebhook): 

52 group_id: UUID4 

53 household_id: UUID4 

54 

55 

56class ReadWebhook(SaveWebhook): 

57 id: UUID4 

58 model_config = ConfigDict(from_attributes=True) 

59 

60 

61class WebhookPagination(PaginationBase): 

62 items: list[ReadWebhook]