From e03cce48f0eee78f46fafee0975be52a6d5d0cef Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 2 Dec 2023 10:45:44 +0100 Subject: [PATCH] Database works Items could be created --- exceldb.py | 54 +++++++++++++++++++++++++++++++++++++++++++ main.py | 10 ++++++++ model.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ models.py | 27 ++++++++++++++++++++++ requirements.txt | 4 ++++ testdata/data.xlsx | Bin 0 -> 5455 bytes 6 files changed, 151 insertions(+) create mode 100644 exceldb.py create mode 100644 main.py create mode 100644 model.py create mode 100644 models.py create mode 100644 requirements.txt create mode 100644 testdata/data.xlsx diff --git a/exceldb.py b/exceldb.py new file mode 100644 index 0000000..504953c --- /dev/null +++ b/exceldb.py @@ -0,0 +1,54 @@ +from abc import ABCMeta +from openpyxl import Workbook, load_workbook + + +class ExcelDB: + + def __init__(self, path, password=None, offset_row=0, offset_column=0): + self._path = path + self._pass = password + self._offset_row = offset_row + self._offset_column = offset_column + + def init(self): + pass + + def save(self, model): + wb = load_workbook(self._path) + ws = wb[model.Meta.table] + ws["A1"] = model.username + wb.save(self._path) + + def create(self, model): + wb = load_workbook(self._path) + ws = wb[model.Meta.table] + next_row = len(tuple(ws.rows)) + 1 + next_column = 1 + self._offset_column + for e in model.__dict__: + if e in ['__module__', 'Meta', '__doc__']: + continue + c = ws.cell(next_row, next_column) + c.value = model.__dict__.get(e) + next_column = next_column + 1 + wb.save(self._path) + + def read(self, model): + wb = load_workbook(self._path) + ws = wb[model.Meta.table] + + + def create_tables(self, tables): + wb = Workbook() + wb.remove_sheet(wb.active) + for t in tables: + wb.create_sheet(t.Meta.table) + ws = wb[t.Meta.table] + i = 1 + for e in t.__dict__: + if e in ['__init__', '__module__', 'Meta', '__doc__']: + continue + c = ws.cell(1, i) + c.value = t.__dict__.get(e).caption + i = i + 1 + wb.save(self._path) + diff --git a/main.py b/main.py new file mode 100644 index 0000000..7b1ccd7 --- /dev/null +++ b/main.py @@ -0,0 +1,10 @@ +from models import TestModel, Test1Model +from exceldb import ExcelDB + + +edb = ExcelDB("./testdata/data.xlsx") +# edb.create_tables([TestModel, Test1Model]) + +TestModel.Meta.database = edb +test1 = TestModel(username='Cool Hacker', datum='2023-11-12') +test1.create() diff --git a/model.py b/model.py new file mode 100644 index 0000000..da45346 --- /dev/null +++ b/model.py @@ -0,0 +1,56 @@ +from abc import ABCMeta, abstractclassmethod + + +class BaseModel: + def _init(self, model, **params): + for k, v in params.items(): + pp = model.__dict__.get(k) + if pp is not None: + self.__dict__[k] = v + + def __init__(self, **params): + self._row = None + self._init(type(self), **params) + + _column = None + + @classmethod + def get_column(cls): + return cls._column + + @classmethod + def get(cls): + return "GET" + + @classmethod + def get_by_id(cls, id): + return "GET " + str(id) + + def save(self): + self.Meta.database.save(self) + + def create(self): + self.Meta.database.create(self) + + class Meta: + database = None + + +class Field: + def __init__(self, caption, column): + self._caption = caption + self._column = column + + @property + def caption(self): + return self._caption + + @property + def column(self): + return self._column + + def __repr__(self): + return self._caption + + def __str__(self): + return self._caption diff --git a/models.py b/models.py new file mode 100644 index 0000000..7a31c23 --- /dev/null +++ b/models.py @@ -0,0 +1,27 @@ +from model import BaseModel, Field + + +class TestModel(BaseModel): + + username = Field("Username", 1) + nickname = Field("anoter name", 2) + datum = Field('datum', 3) + creater = Field('creater', 4) + test = Field('test', 5) + + + + class Meta: + table = "Users" + + +class Test1Model(BaseModel): + username = Field('NoName', 1) + nickname = Field("anoter name", 2) + datum = Field('datum', 3) + creater = Field('creater', 4) + test = Field('test', 5) + + class Meta: + table = 'NoNames' + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f23abce --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +et-xmlfile==1.1.0 +openpyxl==3.1.2 +setuptools==69.0.2 +wheel==0.42.0 diff --git a/testdata/data.xlsx b/testdata/data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8eed7dd6bb9cc19c32ff20169b8bda80bff4f756 GIT binary patch literal 5455 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 NFA$xzs!4u4{R>T5Xp;Z{ literal 0 HcmV?d00001