Spaces:
Runtime error
Runtime error
import uuid | |
from datetime import datetime | |
from typing import Optional, Type, TypeVar | |
from sqlalchemy import DateTime, String, func | |
from sqlalchemy.ext.asyncio import AsyncSession | |
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column | |
from reworkd_platform.db.meta import meta | |
from reworkd_platform.web.api.http_responses import not_found | |
T = TypeVar("T", bound="Base") | |
class Base(DeclarativeBase): | |
"""Base for all models.""" | |
metadata = meta | |
id: Mapped[str] = mapped_column( | |
String, | |
primary_key=True, | |
default=lambda _: str(uuid.uuid4()), | |
unique=True, | |
nullable=False, | |
) | |
async def get(cls: Type[T], session: AsyncSession, id_: str) -> Optional[T]: | |
return await session.get(cls, id_) | |
async def get_or_404(cls: Type[T], session: AsyncSession, id_: str) -> T: | |
if model := await cls.get(session, id_): | |
return model | |
raise not_found(detail=f"{cls.__name__}[{id_}] not found") | |
async def save(self: T, session: AsyncSession) -> T: | |
session.add(self) | |
await session.flush() | |
return self | |
async def delete(self: T, session: AsyncSession) -> None: | |
await session.delete(self) | |
class TrackedModel(Base): | |
"""Base for all tracked models.""" | |
__abstract__ = True | |
create_date = mapped_column( | |
DateTime, name="create_date", server_default=func.now(), nullable=False | |
) | |
update_date = mapped_column( | |
DateTime, name="update_date", onupdate=func.now(), nullable=True | |
) | |
delete_date = mapped_column(DateTime, name="delete_date", nullable=True) | |
async def delete(self, session: AsyncSession) -> None: | |
"""Marks the model as deleted.""" | |
self.delete_date = datetime.now() | |
await self.save(session) | |
class UserMixin: | |
user_id = mapped_column(String, name="user_id", nullable=False) | |
organization_id = mapped_column(String, name="organization_id", nullable=True) | |