from sqlalchemy.dialects.mysql import LONGTEXT from sqlalchemy.orm import relationship from sqlalchemy import Column, String, ForeignKey from Utils.DataBase.SqlAlchemyUtils import Base, engine class ScoreCard(Base): __tablename__ = "scorecard" id = Column(String(16), primary_key=True) name = Column(String(16), unique=True, index=True) description = Column(LONGTEXT) major_category_id = Column(String(16), ForeignKey("scorecard_major_category.id")) subcategory_id = Column(String(16), ForeignKey("scorecard_subcategory.id")) major_category = relationship("ScoreCardMajorCategory", backref="scorecard", uselist=False) subcategory = relationship("ScoreCardSubCategory", backref="scorecard", uselist=False) data_table = relationship("ScoreCardDataTable", backref="scorecard", uselist=False, cascade="all, delete-orphan") index_table = relationship("ScoreCardIndexTable", backref="scorecard", uselist=False, cascade="all, delete-orphan") rank_table = relationship("ScoreCardRankTable", backref="scorecard", uselist=False, cascade="all, delete-orphan") process_table = relationship("ScoreCardProcessTable", backref="scorecard", uselist=False, cascade="all, delete-orphan") scorecard_dp_ac_auth = relationship("ScoreCardDpAcAuth", back_populates="scorecard", cascade="all, delete-orphan") class ScoreCardDataTable(Base): __tablename__ = "scorecard_data_table" id = Column(String(16), primary_key=True) obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id", ondelete="CASCADE")) class ScoreCardIndexTable(Base): __tablename__ = "scorecard_index_table" id = Column(String(16), primary_key=True) obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id", ondelete="CASCADE")) class ScoreCardRankTable(Base): __tablename__ = "scorecard_rank_table" id = Column(String(16), primary_key=True) obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id", ondelete="CASCADE")) class ScoreCardProcessTable(Base): __tablename__ = "scorecard_process_table" id = Column(String(16), primary_key=True) obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id", ondelete="CASCADE")) class ScoreCardDpAcAuth(Base): __tablename__ = "scorecard_dp_ac_auth" id = Column(String(16), primary_key=True) department_id = Column(String(16)) scorecard_id = Column(String(16), ForeignKey("scorecard.id", ondelete="CASCADE")) scorecard = relationship("ScoreCard", back_populates="scorecard_dp_ac_auth") class ScoreCardSubCategory(Base): __tablename__ = "scorecard_subcategory" id = Column(String(16), primary_key=True) name = Column(String(32), unique=True, index=True) major_category_id = Column(String(16), ForeignKey("scorecard_major_category.id")) def __str__(self): return self.name def dict(self): __dict = {c.name: getattr(self, c.name, None) for c in self.__table__.columns} __dict.pop("major_category_id") return __dict class ScoreCardMajorCategory(Base): __tablename__ = "scorecard_major_category" id = Column(String(16), primary_key=True) name = Column(String(32), unique=True, index=True) subcategories = relationship("ScoreCardSubCategory", backref="scorecard_major_category") def __str__(self): return self.name def dict(self): __dict = {c.name: getattr(self, c.name, None) for c in self.__table__.columns} __dict.update({"subcategories": [subcategory.dict() for subcategory in list(self.subcategories)]}) return __dict Base.metadata.create_all(bind=engine)