Update backend models, controllers, and session

This commit is contained in:
2026-01-16 22:31:24 +13:00
parent d41faddfca
commit 9c43a0a22b
16 changed files with 916 additions and 64 deletions

1
src/models/__init__.py Normal file
View File

@@ -0,0 +1 @@
# Models package

View File

@@ -1,18 +1,32 @@
import json
import wifi
import ubinascii
import machine
import os
class Model(dict):
def __new__(cls, *args, **kwargs):
# Singleton pattern: return existing instance if it exists
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
self.file = self.__class__.__name__ + ".json"
# Only initialize once (check if already initialized)
if hasattr(self, '_initialized'):
return
# Create /db directory if it doesn't exist (MicroPython compatible)
try:
os.mkdir("/db")
except OSError:
pass # Directory already exists, which is fine
self.class_name = self.__class__.__name__
self.file = f"/db/{self.class_name.lower()}.json"
super().__init__()
self.load() # Load settings from file during initialization
self._initialized = True
def set_defaults(self):
self = {}
self.clear()
def get_next_id(self):
"""Get the next available ID for creating a new record."""
@@ -23,20 +37,27 @@ class Model(dict):
def save(self):
try:
# Ensure directory exists
try:
os.mkdir("/db")
except OSError:
pass # Directory already exists
j = json.dumps(self)
with open(self.file, 'w') as file:
file.write(j)
print("Settings saved successfully.")
print(f"{self.class_name} saved successfully to {self.file}")
except Exception as e:
print(f"Error saving settings: {e}")
print(f"Error saving {self.class_name} to {self.file}: {e}")
import sys
sys.print_exception(e)
def load(self):
try:
with open(self.file, 'r') as file:
loaded_settings = json.load(file)
self.update(loaded_settings)
print("Settings loaded successfully.")
print(f"{self.class_name} loaded successfully.")
except Exception as e:
print(f"Error loading settings")
print(f"Error loading {self.class_name}")
self.set_defaults()
self.save()

38
src/models/pattern.py Normal file
View File

@@ -0,0 +1,38 @@
from models.model import Model
class Pattern(Model):
def __init__(self):
super().__init__()
def create(self, name="", data=None):
pattern_name = str(name).strip()
if not pattern_name:
pattern_name = self.get_next_id()
self[pattern_name] = data if isinstance(data, dict) else {}
self.save()
return pattern_name
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
if isinstance(data, dict):
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())

View File

@@ -18,6 +18,8 @@ class Preset(Model):
"n4": 0,
"n5": 0,
"n6": 0,
"n7": 0,
"n8": 0,
}
self.save()
return next_id

View File

@@ -4,13 +4,18 @@ class Profile(Model):
def __init__(self):
super().__init__()
def create(self, name=""):
def create(self, name="", profile_type="tabs"):
"""
Create a new profile.
profile_type: "tabs" or "scenes" (ignoring scenes for now)
"""
next_id = self.get_next_id()
self[next_id] = {
"name": name,
"tabs": {},
"palette": [],
"tab_order": []
"type": profile_type, # "tabs" or "scenes"
"tabs": [], # Array of tab IDs
"scenes": [], # Array of scene IDs (for future use)
"palette": []
}
self.save()
return next_id

38
src/models/scene.py Normal file
View File

@@ -0,0 +1,38 @@
from models.model import Model
class Scene(Model):
def __init__(self):
super().__init__()
def create(self, name="", sequences=None, groups=None):
next_id = self.get_next_id()
self[next_id] = {
"name": name,
"sequences": sequences if sequences else [],
"groups": groups if groups else []
}
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())