130 lines
2.8 KiB
Python
130 lines
2.8 KiB
Python
from ninja import ModelSchema, Schema
|
|
from typing import List, Optional
|
|
|
|
from submissions.models import PuzzleResponse
|
|
from submissions.schemas import SteamCollectionItemOut
|
|
|
|
|
|
class PuzzleResponseRankingOut(ModelSchema):
|
|
class Meta:
|
|
model = PuzzleResponse
|
|
fields = [
|
|
"id",
|
|
"puzzle_name",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
|
|
points: int | None = None
|
|
rank_points: int | None = None
|
|
puzzle_user_rank: int
|
|
user_response_rank: int
|
|
|
|
user_id: int
|
|
|
|
final_cost: int | None
|
|
final_cycles: int | None
|
|
final_area: int | None
|
|
|
|
@staticmethod
|
|
def resolve_user_id(obj) -> int:
|
|
return obj.submission.user.id
|
|
|
|
|
|
class UserDisplayOut(Schema):
|
|
id: int
|
|
username: str
|
|
is_staff: bool
|
|
|
|
|
|
class RankingSchema(Schema):
|
|
users: list[UserDisplayOut]
|
|
puzzles: list[SteamCollectionItemOut]
|
|
responses_by_userid: dict[int, list[PuzzleResponseRankingOut]]
|
|
ranking_by_puzzle: dict[int, list[PuzzleResponseRankingOut]]
|
|
|
|
|
|
class WinnerFileOut(Schema):
|
|
"""Schema for winner submission file"""
|
|
|
|
file_url: str
|
|
original_filename: str
|
|
|
|
|
|
class WinnerResponseOut(Schema):
|
|
"""Schema for winner response with files"""
|
|
|
|
user_id: int
|
|
username: str
|
|
final_cost: Optional[int]
|
|
final_cycles: Optional[int]
|
|
final_area: Optional[int]
|
|
rank_points: Optional[int]
|
|
total_coef: Optional[int]
|
|
files: List[WinnerFileOut]
|
|
|
|
|
|
class PuzzleWinnerOut(Schema):
|
|
"""Schema for puzzle with winner info"""
|
|
|
|
puzzle_id: int
|
|
puzzle_title: str
|
|
winner: Optional[WinnerResponseOut]
|
|
|
|
|
|
class PuzzleSubmissionsOut(Schema):
|
|
"""Schema for puzzle with all top submissions"""
|
|
|
|
puzzle_id: int
|
|
puzzle_title: str
|
|
submissions: List[WinnerResponseOut]
|
|
|
|
|
|
class TournamentWinnersOut(Schema):
|
|
"""Schema for tournament winners results"""
|
|
|
|
winners: List[PuzzleWinnerOut]
|
|
|
|
|
|
class TournamentSubmissionsOut(Schema):
|
|
"""Schema for tournament top submissions results"""
|
|
|
|
submissions: List[PuzzleSubmissionsOut]
|
|
|
|
|
|
class PuzzlePointsFactorOut(Schema):
|
|
"""Schema for puzzle points factor"""
|
|
|
|
cost: int
|
|
cycles: int
|
|
area: int
|
|
|
|
|
|
class PuzzleSubmissionWithRankOut(Schema):
|
|
"""Schema for puzzle submission with rank"""
|
|
|
|
rank: int
|
|
user_id: int
|
|
username: str
|
|
final_cost: Optional[int]
|
|
final_cycles: Optional[int]
|
|
final_area: Optional[int]
|
|
rank_points: Optional[int]
|
|
total_coef: Optional[int]
|
|
files: List[WinnerFileOut]
|
|
|
|
|
|
class PuzzleResultsOut(Schema):
|
|
"""Schema for puzzle-specific results with coefficients"""
|
|
|
|
puzzle_id: int
|
|
puzzle_title: str
|
|
points_factor: Optional[PuzzlePointsFactorOut]
|
|
submissions: List[PuzzleSubmissionWithRankOut]
|
|
|
|
|
|
class TournamentPuzzleResultsOut(Schema):
|
|
"""Schema for tournament puzzle-specific results"""
|
|
|
|
results: List[PuzzleResultsOut]
|