60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
"""Pydantic-схемы для отображения прогресса по рангу."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class ProgressRank(BaseModel):
|
||
"""Краткое описание ранга, пригодное для отображения на дашборде."""
|
||
|
||
id: int
|
||
title: str
|
||
description: str
|
||
required_xp: int
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
|
||
class ProgressXPMetrics(BaseModel):
|
||
"""Статистика по опыту: от базового значения до целевого порога."""
|
||
|
||
baseline: int = Field(description="Количество XP, с которого начинается текущий этап прогресса")
|
||
current: int = Field(description="Текущее значение XP пользователя")
|
||
target: int = Field(description="Порог XP, необходимый для следующего ранга")
|
||
remaining: int = Field(description="Сколько XP осталось набрать")
|
||
progress_percent: float = Field(description="Прогресс на отрезке от baseline до target в долях единицы")
|
||
|
||
|
||
class ProgressMissionRequirement(BaseModel):
|
||
"""Статус обязательной миссии для следующего ранга."""
|
||
|
||
mission_id: int
|
||
mission_title: str
|
||
is_completed: bool
|
||
|
||
|
||
class ProgressCompetencyRequirement(BaseModel):
|
||
"""Статус требования по компетенции."""
|
||
|
||
competency_id: int
|
||
competency_name: str
|
||
required_level: int
|
||
current_level: int
|
||
is_met: bool
|
||
|
||
|
||
class ProgressSnapshot(BaseModel):
|
||
"""Итоговая структура прогресса: XP, обязательные миссии и компетенции."""
|
||
|
||
current_rank: ProgressRank | None
|
||
next_rank: ProgressRank | None
|
||
xp: ProgressXPMetrics
|
||
mission_requirements: list[ProgressMissionRequirement]
|
||
competency_requirements: list[ProgressCompetencyRequirement]
|
||
completed_missions: int
|
||
total_missions: int
|
||
met_competencies: int
|
||
total_competencies: int
|