Files
devplacepy/devplacepy/schemas/game.py
T
retoorandClaude Sonnet 5 9d7b3db314 Fix fanout gaps: statistics JSON 500, schema drops, undocumented admin routes
- Fix StatisticsOut to match the real admin_statistics page context
  (active_tab/tabs/window_hours/initial), which was raising a
  ValidationError and 500ing GET /admin/statistics with
  Accept: application/json.
- Add missing *Out fields dropped from JSON responses: IsslopSourceOut
  (source_lines, marked_lines, focus_line, report_url), IsslopReportOut
  (report_url, badge_url, events_url, topic), IssuesOut
  (viewer_is_admin), GameStateOut/GameFarmViewOut (game_error),
  QuizAttemptPageOut (answer_max_chars, quiz_error), QuizBuilderOut
  (quiz_error).
- Convert GET /admin/issues/planning to respond() with a new
  AdminIssuesPlanningOut schema so it serves JSON like every sibling
  admin dashboard, and document it in docs_api.
- Document previously-undocumented admin endpoint families in
  docs_api: services page routes, gateway provider/model CRUD, admin
  workspaces (11 routes), and trash list/restore/purge.
- Correct stale references to services/devii/actions/catalog.py as a
  single file; it is the actions/catalog/ package.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VL9Xn57W5UR3HZbbuuzxdK
2026-09-03 08:47:57 +02:00

218 lines
4.9 KiB
Python

# retoor <retoor@molodetz.nl>
from __future__ import annotations
from typing import Optional
from devplacepy.schemas.base import _Out
class GameCropOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
cost: int = 0
reward_coins: int = 0
reward_xp: int = 0
min_level: int = 1
min_mastery: int = 0
grow_seconds: int = 0
locked: bool = False
locked_reason: str = ""
locked_text: str = ""
market_state: str = "normal"
class GamePlotOut(_Out):
slot: int = 0
state: str = "empty"
crop_key: str = ""
crop_name: str = ""
crop_icon: str = ""
reward_coins: int = 0
reward_xp: int = 0
ready_at: str = ""
remaining_seconds: int = 0
watered_count: int = 0
max_waters: int = 0
can_water: bool = False
can_steal: bool = False
steal_coins: int = 0
steal_cooldown_seconds: int = 0
steal_reason: str = ""
is_golden: bool = False
fertilize_cost: int = 0
raided_fraction: float = 0.0
raided_pct: int = 0
class GamePerkOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
description: str = ""
level: int = 0
max_level: int = 0
cost: int = 0
maxed: bool = False
effect: str = ""
class GameLegacyOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
description: str = ""
level: int = 0
max_level: int = 0
cost: int = 0
maxed: bool = False
effect: str = ""
class GameMasteryOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
description: str = ""
level: int = 0
max_level: int = 0
cost: int = 0
maxed: bool = False
effect: str = ""
class GameInfrastructureOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
description: str = ""
cost: int = 0
min_prestige: int = 0
owned: bool = False
class GameCosmeticOut(_Out):
key: str = ""
name: str = ""
icon: str = ""
description: str = ""
cost_coins: int = 0
kind: str = ""
owned: bool = False
class GameQuestOut(_Out):
kind: str = ""
label: str = ""
goal: int = 0
progress: int = 0
reward_coins: int = 0
reward_xp: int = 0
claimed: bool = False
can_claim: bool = False
scope: str = "daily"
reward_stars: int = 0
class GameFarmOut(_Out):
owner_username: str = ""
owner_uid: str = ""
is_owner: bool = False
coins: int = 0
xp: int = 0
level: int = 1
level_into: int = 0
level_span: int = 0
level_is_max: bool = False
total_harvests: int = 0
plot_count: int = 0
max_plots: int = 0
next_plot_cost: int = 0
ci_tier: int = 1
ci_label: str = ""
ci_speed: float = 1.0
ci_next_tier: int = 0
ci_next_label: str = ""
ci_next_cost: int = 0
plots: list[GamePlotOut] = []
crops: list[GameCropOut] = []
prestige: int = 0
prestige_multiplier: float = 1.0
prestige_min_level: int = 0
prestige_available: bool = False
refactor_cost: int = 0
refactor_affordable: bool = False
refactor_carryover_pct: int = 0
refactor_carryover_preview: int = 0
grant_available: bool = False
grant_amount: int = 0
grant_reason: str = ""
treasury_balance: int = 0
streak: int = 0
daily_available: bool = False
daily_streak_reset: bool = False
daily_reward: int = 0
perks: list[GamePerkOut] = []
quests: list[GameQuestOut] = []
stars: int = 0
legacy: list[GameLegacyOut] = []
steal_cooldown_seconds: int = 0
mastery_points: int = 0
mastery_points_earned_total: int = 0
mastery: list[GameMasteryOut] = []
infrastructure: list[GameInfrastructureOut] = []
defense_level: int = 0
defense_tier_name: str = ""
defense_upkeep_daily: int = 0
defense_next_cost: int = 0
cosmetics: list[GameCosmeticOut] = []
active_title: str = ""
underdog_boost_seconds_remaining: int = 0
contract_boost_seconds_remaining: int = 0
auto_harvested: int = 0
auto_harvest_coins: int = 0
auto_harvest_xp: int = 0
steal_max_per_victim_per_day: int = 0
defense_downgrade_available: bool = False
mastery_analytics_unlocked: bool = False
lifetime_coins_earned: int = 0
lifetime_harvests: int = 0
harvests_week: int = 0
era_active: bool = False
era_name: str = ""
era_coins: int = 0
era_harvests: int = 0
class GameStateOut(_Out):
ok: bool = True
farm: GameFarmOut
game_error: Optional[str] = None
class GameFarmViewOut(_Out):
farm: GameFarmOut
page_title: str = ""
meta_description: str = ""
stole_coins: int = 0
game_error: Optional[str] = None
class GameLeaderboardEntryOut(_Out):
rank: int = 0
username: str = ""
level: int = 1
xp: int = 0
coins: int = 0
total_harvests: int = 0
prestige: int = 0
score: int = 0
raid_avg: float = 0.0
time_to_kernel_seconds: int = 0
title: str = ""
class GameLeaderboardOut(_Out):
entries: list[GameLeaderboardEntryOut] = []