import enum from typing import TYPE_CHECKING 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() 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", ) tabs: Mapped[list["BuiltInModuleTab"]] = relationship( lazy="immediate", backref="module", cascade="all, delete-orphan" ) class DeviceType(enum.StrEnum): MOBILE = "mobile" DESKTOP = "desktop" BOTH = "both" class BuiltInModuleTab(BaseModel): __tablename__ = "built_in_module_tab" id: Mapped[int] = mapped_column(primary_key=True) key: Mapped[str] = mapped_column(unique=True) label: Mapped[str] = mapped_column() icon_name: Mapped[str] = mapped_column() module_id: Mapped[int] = mapped_column(ForeignKey("built_in_modules.id")) device: Mapped[DeviceType] = mapped_column(default=DeviceType.BOTH)