|
|
""" |
|
|
BASE MODEL - Common functionality for all database models |
|
|
""" |
|
|
|
|
|
from sqlalchemy.ext.declarative import declarative_base |
|
|
from sqlalchemy import inspect |
|
|
|
|
|
Base = declarative_base() |
|
|
|
|
|
class ModelMixin: |
|
|
"""Mixin with common model methods""" |
|
|
|
|
|
def to_dict(self, exclude: list = None): |
|
|
"""Convert model to dictionary, excluding specified columns""" |
|
|
if exclude is None: |
|
|
exclude = [] |
|
|
|
|
|
result = {} |
|
|
for column in inspect(self.__class__).columns: |
|
|
column_name = column.name |
|
|
if column_name in exclude: |
|
|
continue |
|
|
|
|
|
value = getattr(self, column_name) |
|
|
|
|
|
|
|
|
if hasattr(value, 'isoformat'): |
|
|
value = value.isoformat() |
|
|
elif isinstance(value, list): |
|
|
|
|
|
value = [str(v) if hasattr(v, 'hex') else v for v in value] |
|
|
elif hasattr(value, 'hex'): |
|
|
value = str(value) |
|
|
|
|
|
result[column_name] = value |
|
|
|
|
|
return result |
|
|
|
|
|
@classmethod |
|
|
def from_dict(cls, session, data: dict): |
|
|
"""Create model instance from dictionary""" |
|
|
instance = cls() |
|
|
for key, value in data.items(): |
|
|
if hasattr(instance, key): |
|
|
setattr(instance, key, value) |
|
|
return instance |
|
|
|
|
|
def update_from_dict(self, data: dict): |
|
|
"""Update model instance from dictionary""" |
|
|
for key, value in data.items(): |
|
|
if hasattr(self, key) and key != 'id': |
|
|
setattr(self, key, value) |
|
|
|