|
@@ -101,8 +101,8 @@ class RoomCalCoordinator(DataUpdateCoordinator[CoordinatorData]):
|
|
|
self._current_last_refresh = now
|
|
self._current_last_refresh = now
|
|
|
self._next_last_refresh = now
|
|
self._next_last_refresh = now
|
|
|
|
|
|
|
|
- store_current = self.store.get(STORE_CURRENT) or self._empty_reservation()
|
|
|
|
|
- store_next = self.store.get(STORE_NEXT) or self._empty_reservation()
|
|
|
|
|
|
|
+ store_current = self._with_defaults(self.store.get(STORE_CURRENT))
|
|
|
|
|
+ store_next = self._with_defaults(self.store.get(STORE_NEXT))
|
|
|
|
|
|
|
|
if self._override is not None:
|
|
if self._override is not None:
|
|
|
displayed_next = self._override.next if self._override.next is not None else store_next
|
|
displayed_next = self._override.next if self._override.next is not None else store_next
|
|
@@ -390,3 +390,20 @@ class RoomCalCoordinator(DataUpdateCoordinator[CoordinatorData]):
|
|
|
return ReservationData()
|
|
return ReservationData()
|
|
|
raw = {f.name: defaults.get(f.name) for f in dataclass_fields(ReservationData)}
|
|
raw = {f.name: defaults.get(f.name) for f in dataclass_fields(ReservationData)}
|
|
|
return ReservationData.from_dict(raw)
|
|
return ReservationData.from_dict(raw)
|
|
|
|
|
+
|
|
|
|
|
+ def _with_defaults(self, res: ReservationData | None) -> ReservationData:
|
|
|
|
|
+ """Return res with configured defaults merged into any None fields.
|
|
|
|
|
+
|
|
|
|
|
+ If res is None, returns a fully defaulted empty reservation.
|
|
|
|
|
+ """
|
|
|
|
|
+ if res is None:
|
|
|
|
|
+ return self._empty_reservation()
|
|
|
|
|
+ defaults = self.entry.options.get(CONF_RESERVATION_DEFAULTS, {})
|
|
|
|
|
+ if not defaults:
|
|
|
|
|
+ return res
|
|
|
|
|
+ partial = {
|
|
|
|
|
+ f.name: defaults[f.name]
|
|
|
|
|
+ for f in dataclass_fields(ReservationData)
|
|
|
|
|
+ if getattr(res, f.name) is None and defaults.get(f.name) is not None
|
|
|
|
|
+ }
|
|
|
|
|
+ return res.apply_partial(partial) if partial else res
|