Added DbObjects

This commit is contained in:
2025-11-10 23:12:07 +01:00
parent d302261d07
commit c641f3fd63
10 changed files with 189 additions and 14 deletions

View File

@@ -0,0 +1,62 @@
from dbengine.dbengine import DbEngine
from myfasthtml.controls.helpers import Ids
from myfasthtml.core.instances import SingleInstance, InstancesManager
from myfasthtml.core.utils import retrieve_user_info
class DbManager(SingleInstance):
def __init__(self, session, root=".myFastHtmlDb", auto_register: bool = True):
super().__init__(session, Ids.DbManager, auto_register=auto_register)
self.db = DbEngine(root=root)
def save(self, entry, obj):
self.db.save(self.get_tenant(), self.get_user(), entry, obj)
def load(self, entry):
return self.db.load(self.get_tenant(), entry)
def exists_entry(self, entry):
return self.db.exists(self.get_tenant(), entry)
def get_tenant(self):
return retrieve_user_info(self._session)["id"]
def get_user(self):
return retrieve_user_info(self._session)["email"]
class DbObject:
"""
When you set the attribute, it persists in DB
It loads from DB at startup
"""
def __init__(self, session, name=None, db_manager=None):
self._session = session
self._name = name or self.__class__.__name__
self._db_manager = db_manager or InstancesManager.get(self._session, Ids.DbManager, DbManager)
# init is possible
if self._db_manager.exists_entry(self._name):
props = self._db_manager.load(self._name)
for k, v in props.items():
setattr(self, k, v)
else:
self._save_self()
def __setattr__(self, name: str, value: str):
if name.startswith("_"):
super().__setattr__(name, value)
return
old_value = getattr(self, name, None)
if old_value == value:
return
super().__setattr__(name, value)
self._save_self()
def _save_self(self):
props = {k: getattr(self, k) for k, v in self.__class__.__dict__.items() if not k.startswith("_")}
self._db_manager.save(self._name, props)