69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
# 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
|