diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/exceldb.py b/exceldb.py index 504953c..cd58464 100644 --- a/exceldb.py +++ b/exceldb.py @@ -4,51 +4,76 @@ from openpyxl import Workbook, load_workbook class ExcelDB: - def __init__(self, path, password=None, offset_row=0, offset_column=0): + def __init__(self, path, password=None): 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 + def create(self, model): + wb, ws = self.get_worksheet(model) + if model.row is None: + next_row = len(tuple(ws.rows)) + 1 + else: + next_row = model.row + for e in self._get_params(model): + c = ws.cell(next_row, type(model).__dict__.get(e).column+model.offset_cols) + c.value = model.__dict__.get(e) + model.row = next_row 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 + def _get_element(self, search_for, elements): + for e in elements: + if e.value == search_for: + return e + return None + + def _get_params(self, model): + params = list() for e in model.__dict__: - if e in ['__module__', 'Meta', '__doc__']: + if e in ['offset_rows', 'offset_cols', '_row', '_init', 'Meta', ] or e.startswith('__'): continue - c = ws.cell(next_row, next_column) - c.value = model.__dict__.get(e) - next_column = next_column + 1 - wb.save(self._path) + else: + params.append(e) + return params def read(self, model): + wb, ws = self.get_worksheet(model) + entries = list() + model_params = self._get_params(model) + for row in ws.rows: + if row[0].row <= (model.offset_rows + 1): + continue + params = dict() + for p in model_params: + params[p] = row[model.__dict__.get(p).column-1].value + entries.append(model(**params)) + return entries + + def update(self, model): + self.create(model) + + def delete(self, model): + wb, ws = self.get_worksheet(model) + ws.delete_rows(model.row) + wb.save(self._path) + + def get_worksheet(self, model): wb = load_workbook(self._path) ws = wb[model.Meta.table] + return wb, ws - - def create_tables(self, tables): + def create_tables(self, models): wb = Workbook() wb.remove_sheet(wb.active) - for t in tables: - wb.create_sheet(t.Meta.table) - ws = wb[t.Meta.table] + for model in models: + wb.create_sheet(model.Meta.table) + ws = wb[model.Meta.table] i = 1 - for e in t.__dict__: - if e in ['__init__', '__module__', 'Meta', '__doc__']: - continue + for e in self._get_params(model): c = ws.cell(1, i) - c.value = t.__dict__.get(e).caption + c.value = model.__dict__.get(e).caption i = i + 1 wb.save(self._path) diff --git a/main.py b/main.py index 7b1ccd7..767eeb8 100644 --- a/main.py +++ b/main.py @@ -6,5 +6,15 @@ 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() +# test1 = TestModel(username='Cool Hacker', datum='2023-11-12', test="Alex") +# test1.create() +#test1.delete() +# test1.username = "Very cool Hacker" + + +Test1Model.Meta.database = edb +Test1Model(username="Natusik", nickname='Barabusik', creater='Alex').create() + +for t1 in edb.read(Test1Model): + print(t1.username, t1.creater) + diff --git a/model.py b/model.py index da45346..c4cd6c2 100644 --- a/model.py +++ b/model.py @@ -13,6 +13,16 @@ class BaseModel: self._init(type(self), **params) _column = None + offset_rows = 0 + offset_cols = 0 + + @property + def row(self): + return self._row + + @row.setter + def row(self, idx): + self._row = idx @classmethod def get_column(cls): @@ -26,12 +36,15 @@ class BaseModel: 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) + def update(self): + self.Meta.database.update(self) + + def delete(self): + self.Meta.database.delete(self) + class Meta: database = None diff --git a/models.py b/models.py index 7a31c23..36585ce 100644 --- a/models.py +++ b/models.py @@ -16,11 +16,12 @@ class TestModel(BaseModel): class Test1Model(BaseModel): - username = Field('NoName', 1) - nickname = Field("anoter name", 2) - datum = Field('datum', 3) - creater = Field('creater', 4) - test = Field('test', 5) + offset_rows = 9 + username = Field('NoName', 5) + nickname = Field("anoter name", 6) + datum = Field('datum', 7) + creater = Field('creater', 8) + test = Field('test', 9) class Meta: table = 'NoNames' diff --git a/testdata/data.xlsx b/testdata/data.xlsx index 8eed7dd..4313538 100644 Binary files a/testdata/data.xlsx and b/testdata/data.xlsx differ