"""Base model for all database models.""" from typing import Any from uuid import uuid4 from sqlalchemy import Column, DateTime, func 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, server_default=func.now(), 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}