Remove the level input from the boss defeat modal since the app doesn't track levels elsewhere. Team selection is now just checkboxes without requiring level entry. - Remove level input UI from BossDefeatModal.tsx - Add alembic migration to make boss_result_team.level nullable - Update model and schemas to make level optional (defaults to null) - Conditionally render level in boss result display Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
145 lines
3.1 KiB
Python
145 lines
3.1 KiB
Python
from datetime import datetime
|
|
|
|
from app.schemas.base import CamelModel
|
|
from app.schemas.pokemon import PokemonResponse
|
|
|
|
|
|
class MoveRef(CamelModel):
|
|
id: int
|
|
name: str
|
|
|
|
|
|
class AbilityRef(CamelModel):
|
|
id: int
|
|
name: str
|
|
|
|
|
|
class BossPokemonResponse(CamelModel):
|
|
id: int
|
|
pokemon_id: int
|
|
level: int
|
|
order: int
|
|
condition_label: str | None
|
|
pokemon: PokemonResponse
|
|
# Detail fields
|
|
ability_id: int | None = None
|
|
ability: AbilityRef | None = None
|
|
held_item: str | None = None
|
|
nature: str | None = None
|
|
move1_id: int | None = None
|
|
move2_id: int | None = None
|
|
move3_id: int | None = None
|
|
move4_id: int | None = None
|
|
move1: MoveRef | None = None
|
|
move2: MoveRef | None = None
|
|
move3: MoveRef | None = None
|
|
move4: MoveRef | None = None
|
|
|
|
|
|
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
|
|
game_id: int | None
|
|
pokemon: list[BossPokemonResponse] = []
|
|
|
|
|
|
class BossResultTeamMemberResponse(CamelModel):
|
|
id: int
|
|
encounter_id: int
|
|
level: int | None
|
|
|
|
|
|
class BossResultResponse(CamelModel):
|
|
id: int
|
|
run_id: int
|
|
boss_battle_id: int
|
|
result: str
|
|
attempts: int
|
|
completed_at: datetime | None
|
|
team: list[BossResultTeamMemberResponse] = []
|
|
|
|
|
|
# --- 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
|
|
game_id: int | 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
|
|
game_id: int | None = None
|
|
|
|
|
|
class BossPokemonInput(CamelModel):
|
|
pokemon_id: int
|
|
level: int
|
|
order: int
|
|
condition_label: str | None = None
|
|
# Detail fields
|
|
ability_id: int | None = None
|
|
held_item: str | None = None
|
|
nature: str | None = None
|
|
move1_id: int | None = None
|
|
move2_id: int | None = None
|
|
move3_id: int | None = None
|
|
move4_id: int | None = None
|
|
|
|
|
|
class BossResultTeamMemberInput(CamelModel):
|
|
encounter_id: int
|
|
level: int | None = None
|
|
|
|
|
|
class BossResultCreate(CamelModel):
|
|
boss_battle_id: int
|
|
result: str
|
|
attempts: int = 1
|
|
team: list[BossResultTeamMemberInput] = []
|
|
|
|
|
|
class BossReorderItem(CamelModel):
|
|
id: int
|
|
order: int
|
|
|
|
|
|
class BossReorderRequest(CamelModel):
|
|
bosses: list[BossReorderItem]
|
|
|
|
|
|
class BossResultUpdate(CamelModel):
|
|
result: str | None = None
|
|
attempts: int | None = None
|