79 lines
1.8 KiB
Python
79 lines
1.8 KiB
Python
"""
|
|
ⒸAngelaMos | 2025
|
|
Base model class
|
|
Common fields and methods for all models
|
|
"""
|
|
|
|
from typing import Any
|
|
from sqlalchemy import (
|
|
Column,
|
|
DateTime,
|
|
Integer,
|
|
)
|
|
from datetime import datetime, UTC
|
|
from sqlalchemy.ext.declarative import declared_attr
|
|
|
|
from ..core.database import Base
|
|
|
|
|
|
class BaseModel(Base):
|
|
"""
|
|
Abstract base model with common fields and methods
|
|
All models inherit from this class
|
|
"""
|
|
__abstract__ = True
|
|
|
|
id = Column(
|
|
Integer,
|
|
primary_key = True,
|
|
index = True,
|
|
autoincrement = True
|
|
)
|
|
created_at = Column(
|
|
DateTime(timezone = True),
|
|
default = lambda: datetime.now(UTC)
|
|
)
|
|
updated_at = Column(
|
|
DateTime(timezone = True),
|
|
default = lambda: datetime.now(UTC),
|
|
onupdate = lambda: datetime.now(UTC),
|
|
)
|
|
|
|
@declared_attr
|
|
def __tablename__(cls) -> str:
|
|
"""
|
|
Auto-generate table name from class name
|
|
"""
|
|
return cls.__name__.lower()
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
"""
|
|
Convert model instance to dictionary
|
|
|
|
Returns:
|
|
dict: Dictionary representation of the model
|
|
"""
|
|
return {
|
|
column.name: getattr(self,
|
|
column.name)
|
|
for column in self.__table__.columns
|
|
}
|
|
|
|
def update(self, **kwargs: Any) -> None:
|
|
"""
|
|
Update model fields from keyword arguments
|
|
|
|
Args:
|
|
**kwargs: Field names and values to update
|
|
"""
|
|
for key, value in kwargs.items():
|
|
if hasattr(self, key):
|
|
setattr(self, key, value)
|
|
self.updated_at = datetime.now(UTC)
|
|
|
|
def __repr__(self) -> str:
|
|
"""
|
|
String representation of model
|
|
"""
|
|
return f"<{self.__class__.__name__}(id={self.id})>"
|