from typing import TYPE_CHECKING, Optional from sqlalchemy import Table, Column, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel if TYPE_CHECKING: from models import Project project_built_in_module = Table( "project_built_in_module", BaseModel.metadata, Column("project_id", ForeignKey("projects.id"), primary_key=True), Column("module_id", ForeignKey("built_in_modules.id"), primary_key=True), ) built_in_module_dependencies = Table( "built_in_module_dependencies", BaseModel.metadata, Column("module_id", ForeignKey("built_in_modules.id"), primary_key=True), Column("depends_on_id", ForeignKey("built_in_modules.id"), primary_key=True), ) class BuiltInModule(BaseModel): __tablename__ = "built_in_modules" id: Mapped[int] = mapped_column(primary_key=True) key: Mapped[str] = mapped_column(unique=True) label: Mapped[str] = mapped_column() description: Mapped[str] = mapped_column() icon_name: Mapped[Optional[str]] = mapped_column(unique=True) is_deleted: Mapped[bool] = mapped_column(default=False) depends_on: Mapped[list["BuiltInModule"]] = relationship( secondary=built_in_module_dependencies, primaryjoin="BuiltInModule.id == built_in_module_dependencies.c.module_id", secondaryjoin="BuiltInModule.id == built_in_module_dependencies.c.depends_on_id", back_populates="depended_on_by", lazy="immediate", ) depended_on_by: Mapped[list["BuiltInModule"]] = relationship( secondary="built_in_module_dependencies", primaryjoin="BuiltInModule.id == built_in_module_dependencies.c.depends_on_id", secondaryjoin="BuiltInModule.id == built_in_module_dependencies.c.module_id", back_populates="depends_on", lazy="noload", ) projects: Mapped[list["Project"]] = relationship( uselist=True, secondary="project_built_in_module", back_populates="built_in_modules", lazy="noload", )