53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
from peewee import *
|
|
|
|
db = DatabaseProxy()
|
|
|
|
class BaseModel(Model):
|
|
class Meta:
|
|
database = db
|
|
|
|
class ListModel(BaseModel):
|
|
name = CharField(default="")
|
|
chat_id = IntegerField()
|
|
|
|
@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)
|
|
|
|
|
|
def set_db(db_path):
|
|
db.initialize(SqliteDatabase(db_path))
|
|
with db:
|
|
db.create_tables([ListModel, ListEntryModel], safe=True)
|