@@ -0,0 +1,37 @@
|
||||
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())
|
||||
|
||||
Reference in New Issue
Block a user