mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 06:17:07 +00:00
Fix all day event coercion logic (#91169)
This commit is contained in:
parent
49079691d4
commit
cf9ada3b0e
@ -140,26 +140,6 @@ def _has_min_duration(
|
|||||||
return validate
|
return validate
|
||||||
|
|
||||||
|
|
||||||
def _has_all_day_event_duration(
|
|
||||||
start_key: str,
|
|
||||||
end_key: str,
|
|
||||||
) -> Callable[[dict[str, Any]], dict[str, Any]]:
|
|
||||||
"""Modify all day events to have a duration of one day."""
|
|
||||||
|
|
||||||
def validate(obj: dict[str, Any]) -> dict[str, Any]:
|
|
||||||
if (
|
|
||||||
(start := obj.get(start_key))
|
|
||||||
and (end := obj.get(end_key))
|
|
||||||
and not isinstance(start, datetime.datetime)
|
|
||||||
and not isinstance(end, datetime.datetime)
|
|
||||||
and start == end
|
|
||||||
):
|
|
||||||
obj[end_key] = start + datetime.timedelta(days=1)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
return validate
|
|
||||||
|
|
||||||
|
|
||||||
def _has_same_type(*keys: Any) -> Callable[[dict[str, Any]], dict[str, Any]]:
|
def _has_same_type(*keys: Any) -> Callable[[dict[str, Any]], dict[str, Any]]:
|
||||||
"""Verify that all values are of the same type."""
|
"""Verify that all values are of the same type."""
|
||||||
|
|
||||||
@ -267,7 +247,6 @@ CALENDAR_EVENT_SCHEMA = vol.Schema(
|
|||||||
_has_consistent_timezone("start", "end"),
|
_has_consistent_timezone("start", "end"),
|
||||||
_as_local_timezone("start", "end"),
|
_as_local_timezone("start", "end"),
|
||||||
_has_min_duration("start", "end", MIN_EVENT_DURATION),
|
_has_min_duration("start", "end", MIN_EVENT_DURATION),
|
||||||
_has_all_day_event_duration("start", "end"),
|
|
||||||
),
|
),
|
||||||
extra=vol.ALLOW_EXTRA,
|
extra=vol.ALLOW_EXTRA,
|
||||||
)
|
)
|
||||||
@ -375,6 +354,16 @@ class CalendarEvent:
|
|||||||
f"Failed to validate CalendarEvent: {err}"
|
f"Failed to validate CalendarEvent: {err}"
|
||||||
) from err
|
) from err
|
||||||
|
|
||||||
|
# It is common to set a start an end date to be the same thing for
|
||||||
|
# an all day event, but that is not a valid duration. Fix to have a
|
||||||
|
# duration of one day.
|
||||||
|
if (
|
||||||
|
not isinstance(self.start, datetime.datetime)
|
||||||
|
and not isinstance(self.end, datetime.datetime)
|
||||||
|
and self.start == self.end
|
||||||
|
):
|
||||||
|
self.end = self.start + datetime.timedelta(days=1)
|
||||||
|
|
||||||
|
|
||||||
def _event_dict_factory(obj: Iterable[tuple[str, Any]]) -> dict[str, str]:
|
def _event_dict_factory(obj: Iterable[tuple[str, Any]]) -> dict[str, str]:
|
||||||
"""Convert CalendarEvent dataclass items to dictionary of attributes."""
|
"""Convert CalendarEvent dataclass items to dictionary of attributes."""
|
||||||
|
@ -196,7 +196,7 @@ def _get_calendar_event(event: Event) -> CalendarEvent:
|
|||||||
else:
|
else:
|
||||||
start = event.start
|
start = event.start
|
||||||
end = event.end
|
end = event.end
|
||||||
if (end - start) <= timedelta(days=0):
|
if (end - start) < timedelta(days=0):
|
||||||
end = start + timedelta(days=1)
|
end = start + timedelta(days=1)
|
||||||
|
|
||||||
return CalendarEvent(
|
return CalendarEvent(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user