63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
import os
|
|
import shutil
|
|
|
|
from models.model import Model
|
|
|
|
|
|
def _maybe_migrate_tab_json_to_zone():
|
|
"""One-time copy ``db/tab.json`` → ``db/zone.json`` when upgrading."""
|
|
try:
|
|
base = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
db_dir = os.path.join(base, "db")
|
|
zone_path = os.path.join(db_dir, "zone.json")
|
|
tab_path = os.path.join(db_dir, "tab.json")
|
|
if not os.path.exists(zone_path) and os.path.exists(tab_path):
|
|
shutil.copy2(tab_path, zone_path)
|
|
print("Migrated db/tab.json -> db/zone.json")
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
class Zone(Model):
|
|
"""Preset layout row (stored in ``db/zone.json``); legacy storage was ``tab.json`` / Tab."""
|
|
|
|
def __init__(self):
|
|
if not getattr(Zone, "_migration_checked", False):
|
|
_maybe_migrate_tab_json_to_zone()
|
|
Zone._migration_checked = True
|
|
super().__init__()
|
|
|
|
def create(self, name="", names=None, presets=None):
|
|
next_id = self.get_next_id()
|
|
self[next_id] = {
|
|
"name": name,
|
|
"names": names if names else [],
|
|
"presets": presets if presets else [],
|
|
"default_preset": None,
|
|
}
|
|
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())
|