alabuga/backend/app/models/rank.py
danilgryaznev e050bd46ef 1 vers
2025-09-21 19:30:55 +02:00

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")