from sqlalchemy import text from sqlalchemy.ext.hybrid import hybrid_property from .base import db from .mixins import TrackableMixin from .queries.template import TemplateQuery, TemplateVersionQuery class Template(TrackableMixin, db.Model): __tablename__ = "template" query_class = TemplateQuery id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(), nullable=False) subject = db.Column(db.String(), nullable=False, default="") source = db.Column(db.String(), nullable=False) context = db.Column(db.String(), nullable=False) created_by_id = db.Column( db.Integer, db.ForeignKey("dna_account.id"), nullable=True ) updated_by_id = db.Column( db.Integer, db.ForeignKey("dna_account.id"), nullable=True ) is_active = db.Column(db.Boolean(), nullable=False, default=False) created_by = db.relationship( "DNAAccount", backref="created_templates", foreign_keys=[created_by_id] ) updated_by = db.relationship( "DNAAccount", backref="updated_templates", foreign_keys=[updated_by_id] ) # Relations versions = db.relationship("TemplateVersion", back_populates="template") def __repr__(self): return f"" def __str__(self): return self.name @hybrid_property def created_by_name(self): return self.created_by.name @created_by_name.expression def created_by_name(cls): return cls.query_class.CREATED_ALIAS.name @hybrid_property def updated_by_name(self): return self.updated_by.name @updated_by_name.expression def updated_by_name(cls): return cls.query_class.UPDATED_ALIAS.name class TemplateVersion(db.Model): __tablename__ = "template_version" query_class = TemplateVersionQuery id = db.Column(db.Integer, primary_key=True) template_id = db.Column( db.Integer, db.ForeignKey("template.id"), nullable=False ) name = db.Column(db.String(), nullable=False) subject = db.Column(db.String(), nullable=False, default="") source = db.Column(db.String(), nullable=False) context = db.Column(db.String(), nullable=False) created_at = db.Column( db.DateTime, nullable=False, server_default=text("TIMEZONE('utc', CURRENT_TIMESTAMP)"), ) created_by_id = db.Column( db.Integer, db.ForeignKey("dna_account.id"), nullable=True ) # Relations created_by = db.relationship( "DNAAccount", backref="created_templates_versions", foreign_keys=[created_by_id], ) template = db.relationship("Template", back_populates="versions") def __repr__(self): return f"" def __str__(self): return self.name @hybrid_property def created_by_name(self): return self.created_by.name @created_by_name.expression def created_by_name(cls): return cls.query_class.CREATED_ALIAS.name @classmethod def from_template(cls, template: Template): return cls( template_id=template.id, name=template.name, subject=template.subject, source=template.source, context=template.context, created_by=template.updated_by, )