# Model.py from sqlalchemy import Column, DateTime, String, Integer, Text, BigInteger, func from sqlalchemy.ext.declarative import declared_attr, as_declarative from datetime import datetime from backend.db.base import Base # tu Base declarativa class Model_base(Base): __abstract__ = True # ID autoincremental por defecto en todos los modelos id = Column(BigInteger, primary_key=True, autoincrement=True) @declared_attr def sys_created_at(cls): # timestamptz + default en BD return Column(DateTime(timezone=True), server_default=func.now(), nullable=False) @declared_attr def sys_created_by(cls): return Column(String, nullable=True) @declared_attr def sys_updated_at(cls): # onupdate lo pone la BD al actualizar return Column(DateTime(timezone=True), onupdate=func.now(), nullable=True) @declared_attr def sys_updated_by(cls): return Column(String, nullable=True) @declared_attr def sys_version(cls): return Column(Integer, default=1, nullable=False) @declared_attr def sys_notes(cls): return Column(Text, nullable=True) @declared_attr def sys_deleted_at(cls): return Column(DateTime(timezone=True), nullable=True) def __repr__(self): id_val = getattr(self, "id", None) return f"<{self.__class__.__name__} id={id_val}>" def __str__(self): cls = self.__class__.__name__ id_val = getattr(self, "id", None) return f"{cls}(id={id_val})" def __json__(self) -> dict: out = {} if not hasattr(self, "__table__"): return out for c in self.__table__.columns: v = getattr(self, c.name, None) out[c.name] = v.isoformat() if isinstance(v, datetime) else v return out