Просмотр исходного кода

Re-apply defaults to existing records on each coordinator refresh

Previously defaults only filled completely empty slots. Now _with_defaults()
merges configured defaults into any None fields on stored records, so updating
defaults in the Options flow takes effect on the next refresh (including Force
Refresh) without requiring a backend re-sync.
ZiB 4 месяцев назад
Родитель
Сommit
806118177f
1 измененных файлов с 19 добавлено и 2 удалено
  1. 19 2
      custom_components/room_cal_ha/coordinator.py

+ 19 - 2
custom_components/room_cal_ha/coordinator.py

@@ -101,8 +101,8 @@ class RoomCalCoordinator(DataUpdateCoordinator[CoordinatorData]):
       self._current_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:
       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()
     raw = {f.name: defaults.get(f.name) for f in dataclass_fields(ReservationData)}
     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