113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
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)} 场比赛"
|
||
)
|
||
)
|