68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
from peewee import *
|
|
|
|
db = DatabaseProxy()
|
|
|
|
class BaseModel(Model):
|
|
class Meta:
|
|
database = db
|
|
|
|
class ListModel(BaseModel):
|
|
name = CharField(default="")
|
|
|
|
@property
|
|
def content(self) -> dict:
|
|
return {e.id: e.entry for e in self.entries}
|
|
|
|
@content.setter
|
|
def content(self, new_content: dict):
|
|
old_content = self.content
|
|
if len(old_content) < len(new_content):
|
|
# we assume: only 1 item added (last item)
|
|
new_item = list(new_content.values())[-1]
|
|
ListEntryModel.create(list_model=self, entry = new_item)
|
|
|
|
elif len(old_content) > len(new_content):
|
|
to_delete_ids = set(old_content.keys()) - set(new_content.keys())
|
|
ListEntryModel.delete().where(ListEntryModel.id.in_(list(to_delete_ids))).execute()
|
|
|
|
@property
|
|
def done_dict(self):
|
|
return {e.id: e.done for e in self.entries}
|
|
|
|
@done_dict.setter
|
|
def done_dict(self, new_done: dict):
|
|
old_done_dict = self.done_dict
|
|
for k,d in new_done.items():
|
|
if d != old_done_dict[k]:
|
|
ListEntryModel.update(done = d).where(ListEntryModel.id == k).execute()
|
|
|
|
|
|
|
|
|
|
class ListEntryModel(BaseModel):
|
|
list_model = ForeignKeyField(ListModel, backref="entries", on_delete="CASCADE")
|
|
entry = TextField(default="")
|
|
done = BooleanField(default=None, null=True)
|
|
|
|
|
|
# class ListModel(BaseModel):
|
|
# name = CharField(unique=True)
|
|
# content = TextField(default="") # unlimited length, use to serialise list into
|
|
|
|
# @property
|
|
# def content_list(self):
|
|
# return json.loads(self.content or '[]')
|
|
|
|
# @content_list.setter
|
|
# def content_list(self, list_content):
|
|
# self.content = json.dumps(list_content)
|
|
# with db:
|
|
# self.save()
|
|
|
|
|
|
|
|
def set_db(db_path):
|
|
db.initialize(SqliteDatabase(db_path))
|
|
with db:
|
|
db.create_tables([ListModel, ListEntryModel], safe=True)
|