import uuid from datetime import datetime from typing import Any from sqlalchemy import Boolean, Column, DateTime, String from app.timeutil import utc_now_naive class TimestampMixin: created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column( DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False ) class SoftDeleteMixin: is_deleted = Column(Boolean, default=False, nullable=True) deleted_at = Column(DateTime, nullable=True) deleted_by = Column(String(50), nullable=True) def soft_delete(self, deleted_by_user: str = "system", **_: Any) -> None: """Мягкое удаление сущности. Дополнительные аргументы игнорируются, чтобы сохранить совместимость с вызовами из легаси-кода (reason, request и т.п.). """ if self.is_deleted: return self.is_deleted = True self.deleted_at = utc_now_naive() self.deleted_by = deleted_by_user def default_uuid() -> str: return str(uuid.uuid4())