Quiiz system

This commit is contained in:
2026-07-26 16:46:41 +02:00
parent 7f17d69f5c
commit 4780016980
192 changed files with 15031 additions and 566 deletions
+23
View File
@@ -99,6 +99,8 @@ from devplacepy.schemas.backups import (
BackupStoragePathOut,
)
from devplacepy.schemas.admin import (
AdminDeviiTaskItemOut,
AdminDeviiTasksOut,
AdminGameOut,
AdminMediaItemOut,
AdminMediaOut,
@@ -143,6 +145,27 @@ from devplacepy.schemas.dbapi import (
DbTableOut,
NlQueryOut,
)
from devplacepy.schemas.quiz import (
QuizAnswerOut,
QuizAnswerResultOut,
QuizAttemptOut,
QuizAttemptPageOut,
QuizBuilderOut,
QuizDetailOut,
QuizDocumentOut,
QuizFormPageOut,
QuizLeaderboardEntryOut,
QuizLeaderboardOut,
QuizListItemOut,
QuizOptionOut,
QuizOut,
QuizProgressOut,
QuizQuestionOut,
QuizResultOut,
QuizScoreboardEntryOut,
QuizScoreboardOut,
QuizzesOut,
)
from devplacepy.schemas.game import (
GameCropOut,
GameFarmOut,
+25
View File
@@ -74,6 +74,31 @@ class AdminTrashOut(_Out):
admin_section: Optional[str] = None
class AdminDeviiTaskItemOut(_Out):
uid: str
label: Optional[str] = None
owner_uid: str = ""
owner: str = ""
owner_is_admin: bool = False
schedule: str = ""
status: str = ""
enabled: bool = False
run_count: int = 0
max_runs: Optional[int] = None
failure_count: int = 0
next_run_at: Optional[str] = None
expires_at: Optional[str] = None
last_error: Optional[str] = None
class AdminDeviiTasksOut(_Out):
items: list[AdminDeviiTaskItemOut] = []
state: str = "active"
tabs: list[dict] = []
limits: dict = {}
admin_section: Optional[str] = None
class AdminGameOut(_Out):
era_active: bool = False
era_name: str = ""
+9
View File
@@ -37,6 +37,8 @@ class GamePlotOut(_Out):
steal_reason: str = ""
is_golden: bool = False
fertilize_cost: int = 0
raided_fraction: float = 0.0
raided_pct: int = 0
class GamePerkOut(_Out):
@@ -144,6 +146,7 @@ class GameFarmOut(_Out):
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] = []
@@ -161,6 +164,12 @@ class GameFarmOut(_Out):
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
+230
View File
@@ -0,0 +1,230 @@
# retoor <retoor@molodetz.nl>
from __future__ import annotations
from typing import Any, Optional
from devplacepy.schemas.base import _Out
from devplacepy.schemas.content import CommentItemOut, UserOut
class QuizOptionOut(_Out):
uid: str = ""
position: int = 0
label: str = ""
is_correct: Optional[bool] = None
match_value: Optional[str] = None
class QuizAnswerOut(_Out):
uid: str = ""
question_uid: str = ""
position: int = 0
answer_text: str = ""
option_uids: list[str] = []
answered: bool = False
answered_at: str = ""
is_correct: bool = False
awarded_points: float = 0.0
feedback: str = ""
graded_by: str = ""
confidence: float = 0.0
class QuizQuestionOut(_Out):
uid: str = ""
quiz_uid: str = ""
position: int = 0
kind: str = ""
kind_label: str = ""
prompt: str = ""
explanation: str = ""
points: int = 1
media_attachment_uid: str = ""
case_sensitive: bool = False
options: list[QuizOptionOut] = []
option_count: int = 0
match_choices: list[str] = []
correct_boolean: Optional[bool] = None
expected_answer: Optional[str] = None
grading_criteria: Optional[str] = None
numeric_value: Optional[float] = None
numeric_tolerance: Optional[float] = None
answer: Optional[QuizAnswerOut] = None
class QuizOut(_Out):
uid: str = ""
slug: str = ""
url: str = ""
title: str = ""
description: str = ""
status: str = "draft"
published_at: str = ""
shuffle_questions: bool = False
shuffle_options: bool = False
reveal_answers: bool = False
allow_review: bool = True
time_limit_seconds: int = 0
pass_percent: int = 0
question_count: int = 0
total_points: int = 0
attempt_count: int = 0
stars: int = 0
created_at: str = ""
author: Optional[UserOut] = None
viewer_owns: bool = False
viewer_is_admin: bool = False
viewer_can_edit: bool = False
viewer_can_play: bool = False
viewer_state: str = "todo"
validation_errors: list[str] = []
class QuizDetailOut(_Out):
quiz: QuizOut = QuizOut()
questions: list[QuizQuestionOut] = []
comments: list[CommentItemOut] = []
attachments: list[Any] = []
reactions: dict = {}
bookmarked: bool = False
star_count: int = 0
my_vote: int = 0
leaderboard: list[Any] = []
viewer_state: str = "todo"
viewer_attempt_uid: str = ""
class QuizListItemOut(_Out):
uid: str = ""
slug: str = ""
url: str = ""
title: str = ""
description: str = ""
status: str = "published"
created_at: str = ""
time_ago: str = ""
author: Optional[UserOut] = None
question_count: int = 0
total_points: int = 0
attempt_count: int = 0
time_limit_seconds: int = 0
pass_percent: int = 0
stars: int = 0
my_vote: int = 0
comment_count: int = 0
bookmarked: bool = False
reactions: dict = {}
recent_comments: list[CommentItemOut] = []
viewer_state: str = "todo"
viewer_best_percent: float = 0.0
viewer_best_points: float = 0.0
viewer_attempt_uid: str = ""
class QuizScoreboardEntryOut(_Out):
rank: int = 0
user: Optional[UserOut] = None
total_points: float = 0.0
quizzes_completed: int = 0
avg_percent: float = 0.0
perfect_count: int = 0
class QuizProgressOut(_Out):
completed: int = 0
todo: int = 0
avg_percent: float = 0.0
total_points: float = 0.0
rank: int = 0
perfect_count: int = 0
class QuizScoreboardOut(_Out):
scoreboard: list[QuizScoreboardEntryOut] = []
viewer_standing: Optional[QuizScoreboardEntryOut] = None
limit: int = 0
class QuizzesOut(_Out):
quizzes: list[QuizListItemOut] = []
search: str = ""
filter: str = "all"
counts: dict = {}
pagination: dict = {}
scoreboard: list[QuizScoreboardEntryOut] = []
viewer_standing: Optional[QuizScoreboardEntryOut] = None
viewer_progress: QuizProgressOut = QuizProgressOut()
viewer_can_create: bool = False
class QuizAttemptOut(_Out):
uid: str = ""
quiz_uid: str = ""
quiz_slug: str = ""
quiz_title: str = ""
user_uid: str = ""
status: str = ""
started_at: str = ""
expires_at: str = ""
completed_at: str = ""
remaining_seconds: int = 0
answered_count: int = 0
question_count: int = 0
score_points: float = 0.0
max_points: int = 0
score_percent: float = 0.0
passed: bool = False
pass_percent: int = 0
allow_review: bool = True
questions: list[QuizQuestionOut] = []
class QuizAttemptPageOut(_Out):
quiz: QuizOut = QuizOut()
attempt: QuizAttemptOut = QuizAttemptOut()
class QuizResultOut(_Out):
quiz: QuizOut = QuizOut()
attempt: QuizAttemptOut = QuizAttemptOut()
review: list[QuizQuestionOut] = []
fallback_count: int = 0
class QuizAnswerResultOut(_Out):
ok: bool = True
answer: QuizAnswerOut = QuizAnswerOut()
attempt: QuizAttemptOut = QuizAttemptOut()
class QuizLeaderboardEntryOut(_Out):
rank: int = 0
user: Optional[UserOut] = None
score_points: float = 0.0
score_percent: float = 0.0
passed: bool = False
completed_at: str = ""
class QuizLeaderboardOut(_Out):
quiz_uid: str = ""
entries: list[QuizLeaderboardEntryOut] = []
class QuizDocumentOut(_Out):
title: str = ""
description: str = ""
settings: dict = {}
questions: list[Any] = []
class QuizBuilderOut(_Out):
quiz: QuizOut = QuizOut()
questions: list[QuizQuestionOut] = []
kinds: list[Any] = []
validation_errors: list[str] = []
class QuizFormPageOut(_Out):
viewer_can_create: bool = False