30 lines
1.0 KiB
Python
30 lines
1.0 KiB
Python
"""Base model for all database models."""
|
|
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
from uuid import uuid4
|
|
|
|
from sqlalchemy import Column, DateTime
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy.orm import DeclarativeBase, declared_attr
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
"""Base class for all database models."""
|
|
|
|
# Generate __tablename__ automatically from class name
|
|
@declared_attr.directive
|
|
def __tablename__(self) -> str:
|
|
"""Generate table name from class name."""
|
|
# Convert CamelCase to snake_case
|
|
name = self.__name__
|
|
return "".join(["_" + c.lower() if c.isupper() else c for c in name]).lstrip("_")
|
|
|
|
# Common columns for all models
|
|
id: Any = Column(UUID(as_uuid=True), primary_key=True, default=uuid4)
|
|
created_at: Any = Column(DateTime, default=lambda: datetime.now(timezone.utc), nullable=False)
|
|
|
|
def dict(self) -> dict[str, Any]:
|
|
"""Convert model to dictionary."""
|
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|