80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
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)
|