"""Base model for all database models.""" from datetime import datetime 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=datetime.utcnow, 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}