Wire up the existing condition_label column on boss_pokemon to support variant teams throughout the UI. Boss battles can now have multiple team configurations based on conditions (e.g., starter choice in Gen 1). - Add condition_label to BossPokemonInput schema (frontend + backend bulk import) - Rewrite BossTeamEditor with variant tabs (Default + named conditions) - Add variant pill selector to BossDefeatModal team preview - Add BossTeamPreview component to RunEncounters boss cards - Fix MissingGreenlet error in set_boss_team via session.expunge_all() - Fix PokemonSelector state bleed between tabs via composite React key - Add Alembic migration for condition_label column Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
98 lines
2.0 KiB
Python
98 lines
2.0 KiB
Python
from datetime import datetime
|
|
|
|
from app.schemas.base import CamelModel
|
|
from app.schemas.pokemon import PokemonResponse
|
|
|
|
|
|
class BossPokemonResponse(CamelModel):
|
|
id: int
|
|
pokemon_id: int
|
|
level: int
|
|
order: int
|
|
condition_label: str | None
|
|
pokemon: PokemonResponse
|
|
|
|
|
|
class BossBattleResponse(CamelModel):
|
|
id: int
|
|
version_group_id: int
|
|
name: str
|
|
boss_type: str
|
|
specialty_type: str | None
|
|
badge_name: str | None
|
|
badge_image_url: str | None
|
|
level_cap: int
|
|
order: int
|
|
after_route_id: int | None
|
|
location: str
|
|
section: str | None
|
|
sprite_url: str | None
|
|
pokemon: list[BossPokemonResponse] = []
|
|
|
|
|
|
class BossResultResponse(CamelModel):
|
|
id: int
|
|
run_id: int
|
|
boss_battle_id: int
|
|
result: str
|
|
attempts: int
|
|
completed_at: datetime | None
|
|
|
|
|
|
# --- Input schemas ---
|
|
|
|
|
|
class BossBattleCreate(CamelModel):
|
|
name: str
|
|
boss_type: str
|
|
specialty_type: str | None = None
|
|
badge_name: str | None = None
|
|
badge_image_url: str | None = None
|
|
level_cap: int
|
|
order: int
|
|
after_route_id: int | None = None
|
|
location: str
|
|
section: str | None = None
|
|
sprite_url: str | None = None
|
|
|
|
|
|
class BossBattleUpdate(CamelModel):
|
|
name: str | None = None
|
|
boss_type: str | None = None
|
|
specialty_type: str | None = None
|
|
badge_name: str | None = None
|
|
badge_image_url: str | None = None
|
|
level_cap: int | None = None
|
|
order: int | None = None
|
|
after_route_id: int | None = None
|
|
location: str | None = None
|
|
section: str | None = None
|
|
sprite_url: str | None = None
|
|
|
|
|
|
class BossPokemonInput(CamelModel):
|
|
pokemon_id: int
|
|
level: int
|
|
order: int
|
|
condition_label: str | None = None
|
|
|
|
|
|
class BossResultCreate(CamelModel):
|
|
boss_battle_id: int
|
|
result: str
|
|
attempts: int = 1
|
|
|
|
|
|
class BossReorderItem(CamelModel):
|
|
id: int
|
|
order: int
|
|
|
|
|
|
class BossReorderRequest(CamelModel):
|
|
bosses: list[BossReorderItem]
|
|
|
|
|
|
class BossResultUpdate(CamelModel):
|
|
result: str | None = None
|
|
attempts: int | None = None
|