# SPDX-FileCopyrightText: 2025 Marlon W (Mawoka) # # SPDX-License-Identifier: MPL-2.0 from pydantic import BaseModel, field_validator, ValidationInfo from classquiz.db.models import QuizQuestion, QuizQuestionType, VotingQuizAnswer class JoinGameData(BaseModel): username: str game_pin: str captcha: str | None = None custom_field: str | None = None class RejoinGameData(BaseModel): old_sid: str game_pin: str username: str class RegisterAsAdminData(BaseModel): game_pin: str game_id: str class ABCDQuizAnswerWithoutSolution(BaseModel): answer: str color: str | None = None class RangeQuizAnswerWithoutSolution(BaseModel): min: int max: int class ReturnQuestion(QuizQuestion): answers: list[ABCDQuizAnswerWithoutSolution] | RangeQuizAnswerWithoutSolution | list[VotingQuizAnswer] type: QuizQuestionType = QuizQuestionType.ABCD @field_validator("answers") def answers_not_none_if_abcd_type(cls, v, info: ValidationInfo): if info.data["type"] == QuizQuestionType.ABCD and type(v[0]) is not ABCDQuizAnswerWithoutSolution: raise ValueError("Answers can't be none if type is ABCD") if info.data["type"] == QuizQuestionType.RANGE and type(v) is not RangeQuizAnswerWithoutSolution: raise ValueError("Answer must be from type RangeQuizAnswer if type is RANGE") # skipcq: PTC-W0047 if info.data["type"] == QuizQuestionType.VOTING and type(v[0]) is not VotingQuizAnswer: pass return v class SubmitAnswerDataOrderType(BaseModel): answer: str class SubmitAnswerData(BaseModel): question_index: int answer: str | int complex_answer: list[SubmitAnswerDataOrderType] | None = None class KickPlayerInput(BaseModel): username: str class ConnectSessionIdEvent(BaseModel): session_id: str