from models.model import Model from models.pallet import Palette class Profile(Model): def __init__(self): """Profile model. Each profile owns a single, unique palette stored in the Palette model. The profile stores a `palette_id` that points to its palette; any legacy inline `palette` arrays are migrated to a dedicated Palette entry. """ super().__init__() self._palette_model = Palette() # Migrate legacy inline palettes to separate Palette entries. changed = False for pid, pdata in list(self.items()): if isinstance(pdata, dict): if "palette" in pdata and "palette_id" not in pdata: colors = pdata.get("palette") or [] palette_id = self._palette_model.create(colors=colors) pdata.pop("palette", None) pdata["palette_id"] = str(palette_id) changed = True if changed: self.save() def create(self, name="", profile_type="tabs"): """Create a new profile and its own empty palette. profile_type: "tabs" or "scenes" (ignoring scenes for now) """ next_id = self.get_next_id() # Create a unique palette for this profile. palette_id = self._palette_model.create(colors=[]) self[next_id] = { "name": name, "type": profile_type, # "tabs" or "scenes" "tabs": [], # Array of tab IDs "scenes": [], # Array of scene IDs (for future use) "palette_id": str(palette_id), } self.save() return next_id def read(self, id): id_str = str(id) return self.get(id_str, None) def update(self, id, data): id_str = str(id) if id_str not in self: return False self[id_str].update(data) self.save() return True def delete(self, id): id_str = str(id) if id_str not in self: return False self.pop(id_str) self.save() return True def list(self): return list(self.keys())