import datetime as dt from sqlalchemy import Column, Integer, DateTime, Boolean from sqlalchemy.orm import declared_attr from sqlalchemy.ext.hybrid import hybrid_property class CrudMixin: id = Column(Integer, primary_key=True) created_at = Column(DateTime, default=dt.datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=dt.datetime.utcnow, onupdate=dt.datetime.utcnow, nullable=False) deleted = Column("deleted", Boolean, default=False, nullable=False) version = Column(Integer, default=1, nullable=False) @hybrid_property def is_deleted(self): return self.deleted def mark_deleted(self): self.deleted = True self.version += 1 @declared_attr def __mapper_args__(cls): return {"version_id_col": cls.version}