@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from contest.models import Contest, ContestQuestion, Question, QuestionVersion
|
||||
|
||||
|
||||
QUESTIONS = {
|
||||
Question.Track.BEGINNER: [
|
||||
("b-12-plus-19", "12 + 19", "31"),
|
||||
("b-8-times-7", "8 × 7", "56"),
|
||||
("b-90-minus-37", "90 - 37", "53"),
|
||||
("b-144-div-12", "144 ÷ 12", "12"),
|
||||
("b-25-times-4", "25 × 4", "100"),
|
||||
],
|
||||
Question.Track.STANDARD: [
|
||||
("s-17-times-23", "17 × 23", "391"),
|
||||
("s-625-div-25", "625 ÷ 25", "25"),
|
||||
("s-48-times-15", "48 × 15", "720"),
|
||||
("s-1000-minus-387", "1000 - 387", "613"),
|
||||
("s-35-squared", "35²", "1225"),
|
||||
],
|
||||
Question.Track.ADVANCED: [
|
||||
("a-mod-2pow10", "2¹⁰ 除以 7 的余数", "2"),
|
||||
("a-sum-1-50", "1 到 50 的整数和", "1275"),
|
||||
("a-15-choose-2", "C(15,2)", "105"),
|
||||
("a-sqrt-2025", "√2025", "45"),
|
||||
("a-3pow6", "3⁶", "729"),
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "创建首批分层题目、实时 1v1、每日赛和单人练习"
|
||||
|
||||
def handle(self, *args, **options):
|
||||
versions = {}
|
||||
for track, questions in QUESTIONS.items():
|
||||
versions[track] = []
|
||||
for slug, prompt, answer in questions:
|
||||
question, _ = Question.objects.update_or_create(
|
||||
slug=slug,
|
||||
defaults={"track": track, "tags": ["口算"], "is_active": True},
|
||||
)
|
||||
version, _ = QuestionVersion.objects.update_or_create(
|
||||
question=question,
|
||||
version=1,
|
||||
defaults={
|
||||
"prompt": prompt,
|
||||
"answer": answer,
|
||||
"explanation": f"答案为 {answer}",
|
||||
},
|
||||
)
|
||||
versions[track].append(version)
|
||||
|
||||
contest_specs = []
|
||||
for track, label in (
|
||||
(Question.Track.BEGINNER, "入门"),
|
||||
(Question.Track.STANDARD, "标准"),
|
||||
(Question.Track.ADVANCED, "进阶"),
|
||||
):
|
||||
contest_specs.extend(
|
||||
[
|
||||
(
|
||||
f"realtime-{track}",
|
||||
f"{label}实时 1v1",
|
||||
Contest.Kind.REALTIME,
|
||||
track,
|
||||
60,
|
||||
),
|
||||
(
|
||||
f"daily-{track}",
|
||||
f"{label}今日挑战",
|
||||
Contest.Kind.DAILY,
|
||||
track,
|
||||
180,
|
||||
),
|
||||
(
|
||||
f"practice-{track}",
|
||||
f"{label}单人闯关",
|
||||
Contest.Kind.PRACTICE,
|
||||
track,
|
||||
300,
|
||||
),
|
||||
]
|
||||
)
|
||||
for slug, title, kind, track, duration in contest_specs:
|
||||
contest, _ = Contest.objects.update_or_create(
|
||||
slug=slug,
|
||||
defaults={
|
||||
"title": title,
|
||||
"kind": kind,
|
||||
"track": track,
|
||||
"duration_seconds": duration,
|
||||
"status": Contest.Status.PUBLISHED,
|
||||
},
|
||||
)
|
||||
ContestQuestion.objects.filter(contest=contest).delete()
|
||||
ContestQuestion.objects.bulk_create(
|
||||
[
|
||||
ContestQuestion(
|
||||
contest=contest,
|
||||
question_version=version,
|
||||
order=index,
|
||||
points=100,
|
||||
)
|
||||
for index, version in enumerate(versions[track], start=1)
|
||||
]
|
||||
)
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(
|
||||
f"已创建 {sum(map(len, QUESTIONS.values()))} 道题和 {len(contest_specs)} 场比赛"
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user