59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
"""Модели рангов и условий повышения."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import List
|
|
|
|
from sqlalchemy import ForeignKey, Integer, String, UniqueConstraint
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from app.models.base import Base, TimestampMixin
|
|
|
|
|
|
class Rank(Base, TimestampMixin):
|
|
"""Игровой ранг."""
|
|
|
|
__tablename__ = "ranks"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
title: Mapped[str] = mapped_column(String(120), unique=True, nullable=False)
|
|
description: Mapped[str] = mapped_column(String(512), nullable=False)
|
|
required_xp: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
|
|
|
|
pilots: Mapped[List["User"]] = relationship("User", back_populates="current_rank")
|
|
mission_requirements: Mapped[List["RankMissionRequirement"]] = relationship(
|
|
"RankMissionRequirement", back_populates="rank", cascade="all, delete-orphan"
|
|
)
|
|
competency_requirements: Mapped[List["RankCompetencyRequirement"]] = relationship(
|
|
"RankCompetencyRequirement", back_populates="rank", cascade="all, delete-orphan"
|
|
)
|
|
|
|
|
|
class RankMissionRequirement(Base, TimestampMixin):
|
|
"""Связка ранга и обязательных миссий."""
|
|
|
|
__tablename__ = "rank_mission_requirements"
|
|
__table_args__ = (UniqueConstraint("rank_id", "mission_id", name="uq_rank_mission"),)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
rank_id: Mapped[int] = mapped_column(ForeignKey("ranks.id"), nullable=False)
|
|
mission_id: Mapped[int] = mapped_column(ForeignKey("missions.id"), nullable=False)
|
|
|
|
rank = relationship("Rank", back_populates="mission_requirements")
|
|
mission = relationship("Mission", back_populates="rank_requirements")
|
|
|
|
|
|
class RankCompetencyRequirement(Base, TimestampMixin):
|
|
"""Требования к прокачке компетенций."""
|
|
|
|
__tablename__ = "rank_competency_requirements"
|
|
__table_args__ = (UniqueConstraint("rank_id", "competency_id", name="uq_rank_competency"),)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
rank_id: Mapped[int] = mapped_column(ForeignKey("ranks.id"), nullable=False)
|
|
competency_id: Mapped[int] = mapped_column(ForeignKey("competencies.id"), nullable=False)
|
|
required_level: Mapped[int] = mapped_column(Integer, default=0, nullable=False)
|
|
|
|
rank = relationship("Rank", back_populates="competency_requirements")
|
|
competency = relationship("Competency")
|