397 lines
20 KiB
Python
397 lines
20 KiB
Python
import json
|
||
import os
|
||
import sys
|
||
from sqlalchemy import text
|
||
|
||
# Add project root to path
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
from app.database import engine, SessionLocal
|
||
from app.models import Question
|
||
|
||
NEW_QUESTIONS_DATA = [
|
||
# --- EASY (1-8) ---
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "easy",
|
||
"question_type": "multiple_choice",
|
||
"question": "Wie heißt der gutmütige Wildhüter von Hogwarts und treue Freund von Harry?",
|
||
"canonical_answer": "Rubeus Hagrid",
|
||
"options": ["Rubeus Hagrid", "Argus Filch", "Garrick Ollivander", "Cornelius Fudge"],
|
||
"hint": "Er liebt gefährliche magische Kreaturen wie Drachen und Riesenspinnen.",
|
||
"question_en": "What is the name of the kind Hogwarts gamekeeper and loyal friend of Harry?",
|
||
"answer_en": "Rubeus Hagrid",
|
||
"options_en": ["Rubeus Hagrid", "Argus Filch", "Garrick Ollivander", "Cornelius Fudge"],
|
||
"hint_en": "He loves dangerous magical creatures like dragons and giant spiders."
|
||
},
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "easy",
|
||
"question_type": "text",
|
||
"question": "Wie viele Jahre dauert die reguläre Schulzeit eines Schülers in Hogwarts von der 1. bis zur Abschlussklasse? (Bitte Zahl eingeben)",
|
||
"canonical_answer": "7",
|
||
"accepted_answers": json.dumps(["7", "sieben", "seven"]),
|
||
"options": None,
|
||
"hint": "Man startet mit 11 Jahren und legt im fünften Jahr die Z.A.G.-Prüfungen ab.",
|
||
"question_en": "How many years does a student typically attend Hogwarts from first year to final graduation? (Please enter as a number)",
|
||
"answer_en": "7",
|
||
"options_en": None,
|
||
"hint_en": "Students start at age 11 and take their N.E.W.T.s in their final year."
|
||
},
|
||
{
|
||
"category": "spells",
|
||
"difficulty": "easy",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welcher Zauberspruch erzeugt helles Licht an der Spitze des Zauberstabs?",
|
||
"canonical_answer": "Lumos",
|
||
"options": ["Lumos", "Nox", "Alohomora", "Accio"],
|
||
"hint": "Der Gegenfluch zum Erlöschen des Lichts lautet Nox.",
|
||
"question_en": "Which wand-lighting charm produces bright light at the tip of the wand?",
|
||
"answer_en": "Lumos",
|
||
"options_en": ["Lumos", "Nox", "Alohomora", "Accio"],
|
||
"hint_en": "Its counter-curse to extinguish the light is Nox."
|
||
},
|
||
{
|
||
"category": "creatures",
|
||
"difficulty": "easy",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welche Art von magischem Wesen bewacht die Falltür zum Stein der Weisen und hört auf den Namen Fluffy?",
|
||
"canonical_answer": "Dreiköpfiger Hund",
|
||
"options": ["Dreiköpfiger Hund", "Basilisken-Schlange", "Ungarischer Hornschwanz", "Zentaur"],
|
||
"hint": "Er schläft sofort ein, sobald er Musik hört.",
|
||
"question_en": "What kind of magical beast guards the trapdoor to the Philosopher's Stone and answers to the name Fluffy?",
|
||
"answer_en": "Three-headed dog",
|
||
"options_en": ["Three-headed dog", "Basilisk serpent", "Hungarian Horntail", "Centaur"],
|
||
"hint_en": "He instantly falls fast asleep the moment music plays."
|
||
},
|
||
{
|
||
"category": "quidditch",
|
||
"difficulty": "easy",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welchen berühmten Besen erhält Harry in seinem ersten Schuljahr von Professor McGonagall geschenkt?",
|
||
"canonical_answer": "Nimbus 2000",
|
||
"options": ["Nimbus 2000", "Feuerblitz", "Sauberwisch 7", "Komet 260"],
|
||
"hint": "Das damals schnellste Rennbesenmodell der Zauberwelt.",
|
||
"question_en": "Which famous broomstick does Harry receive in his first year as a gift from Professor McGonagall?",
|
||
"answer_en": "Nimbus 2000",
|
||
"options_en": ["Nimbus 2000", "Firebolt", "Cleansweep Seven", "Comet 260"],
|
||
"hint_en": "At the time, the fastest racing broom in the wizarding world."
|
||
},
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "easy",
|
||
"question_type": "text",
|
||
"question": "Wie heißt die berühmte Einkaufsstraße für Zauberbedarf im Herzen von London?",
|
||
"canonical_answer": "Winkelgasse",
|
||
"accepted_answers": json.dumps(["Winkelgasse", "Diagon Alley"]),
|
||
"options": None,
|
||
"hint": "Man erreicht sie durch das Klopfen an einer Backsteinmauer im Hinterhof des Tropfenden Kessels.",
|
||
"question_en": "What is the name of the famous wizarding shopping alley located in London?",
|
||
"answer_en": "Diagon Alley",
|
||
"options_en": None,
|
||
"hint_en": "Accessed by tapping bricks behind the Leaky Cauldron pub."
|
||
},
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "easy",
|
||
"question_type": "text",
|
||
"question": "Wie lautet der Rufname von Harrys rothaarigem bestem Schulfreund?",
|
||
"canonical_answer": "Ron",
|
||
"accepted_answers": json.dumps(["Ron", "Ronald", "Ron Weasley", "Ronald Weasley"]),
|
||
"options": None,
|
||
"hint": "Vollständiger Name: Ronald Bilius Weasley.",
|
||
"question_en": "What is the first name of Harry's red-haired best school friend?",
|
||
"answer_en": "Ron",
|
||
"options_en": None,
|
||
"hint_en": "Full name: Ronald Bilius Weasley."
|
||
},
|
||
{
|
||
"category": "general",
|
||
"difficulty": "easy",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welches magische Transportmittel bringt die Schüler alljährlich am 1. September nach Hogwarts?",
|
||
"canonical_answer": "Hogwarts-Express",
|
||
"options": ["Hogwarts-Express", "Fliegender Ford Anglia", "Flohpulver-Netzwerk", "Nachtbus"],
|
||
"hint": "Ein scharlachroter Dampfzug von Gleis 9 3/4.",
|
||
"question_en": "Which magical transport takes students to Hogwarts every year on September 1st?",
|
||
"answer_en": "Hogwarts Express",
|
||
"options_en": ["Hogwarts Express", "Flying Ford Anglia", "Floo Powder Network", "Knight Bus"],
|
||
"hint_en": "A scarlet steam engine leaving Platform 9 3/4."
|
||
},
|
||
|
||
# --- MEDIUM (9-18) ---
|
||
{
|
||
"category": "hogwarts",
|
||
"difficulty": "medium",
|
||
"question_type": "text",
|
||
"question": "In welchem Schuljahr müssen Hogwarts-Schüler ihre Z.A.G.-Prüfungen ablegen? (Bitte Zahl eingeben)",
|
||
"canonical_answer": "5",
|
||
"accepted_answers": json.dumps(["5", "fuenf", "five", "fünf", "5."]),
|
||
"options": None,
|
||
"hint": "In diesem Jahr treibt Großinquisitorin Dolores Umbridge ihr Unwesen an der Schule.",
|
||
"question_en": "In which school year do Hogwarts students sit their O.W.L. exams? (Please enter as a number)",
|
||
"answer_en": "5",
|
||
"options_en": None,
|
||
"hint_en": "The school year during which Dolores Umbridge torments Hogwarts."
|
||
},
|
||
{
|
||
"category": "spells",
|
||
"difficulty": "medium",
|
||
"question_type": "text",
|
||
"question": "Mit welchem Zauberspruch kann man verschlossene Schlösser, Türen und Fenster magisch entriegeln?",
|
||
"canonical_answer": "Alohomora",
|
||
"accepted_answers": json.dumps(["Alohomora"]),
|
||
"options": None,
|
||
"hint": "Hermine nutzt diesen Spruch im ersten Band, um dem Hausmeister Filch zu entkommen.",
|
||
"question_en": "Which unlocking charm opens locked doors and windows?",
|
||
"answer_en": "Alohomora",
|
||
"options_en": None,
|
||
"hint_en": "Hermione uses this spell in the first book to escape caretaker Filch."
|
||
},
|
||
{
|
||
"category": "creatures",
|
||
"difficulty": "medium",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welche Spezies magischer Wesen betreibt und bewacht die Zaubererbank Gringotts?",
|
||
"canonical_answer": "Kobolde",
|
||
"options": ["Kobolde", "Zwerge", "Hauselfen", "Zentauren"],
|
||
"hint": "Griphook gehört diesem stolzen und scharfsinnigen Volk an.",
|
||
"question_en": "Which species of magical beings operates and guards the wizarding bank Gringotts?",
|
||
"answer_en": "Goblins",
|
||
"options_en": ["Goblins", "Dwarves", "House-elves", "Centaurs"],
|
||
"hint_en": "Griphook belongs to this clever and proud species."
|
||
},
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "medium",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welcher verzauberte Gegenstand erlaubte es Hermine im 3. Schuljahr, mehrere Unterrichtsstunden gleichzeitig zu besuchen?",
|
||
"canonical_answer": "Zeitumkehrer",
|
||
"options": ["Zeitumkehrer", "Denkarium", "Tarnumhang", "Spickoskop"],
|
||
"hint": "Eine kleine Sanduhr an einer goldenen Halskette, vergeben von Professor McGonagall.",
|
||
"question_en": "Which enchanted object allowed Hermione to attend multiple classes at the same time in her 3rd year?",
|
||
"answer_en": "Time-Turner",
|
||
"options_en": ["Time-Turner", "Pensieve", "Invisibility Cloak", "Sneakoscope"],
|
||
"hint_en": "A miniature hourglass necklace authorized by Professor McGonagall."
|
||
},
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "medium",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welche Gestalt nimmt der mächtige Patronus von Harry Potter an?",
|
||
"canonical_answer": "Hirsch",
|
||
"options": ["Hirsch", "Silberne Hirschkuh", "Otter", "Phönix"],
|
||
"hint": "Prongs – das Animagus-Tier seines Vaters James Potter.",
|
||
"question_en": "What form does Harry Potter's corporeal Patronus take?",
|
||
"answer_en": "Stag",
|
||
"options_en": ["Stag", "Silver Doe", "Otter", "Phoenix"],
|
||
"hint_en": "Prongs – the Animagus form of his father James Potter."
|
||
},
|
||
{
|
||
"category": "quidditch",
|
||
"difficulty": "medium",
|
||
"question_type": "text",
|
||
"question": "Wie viele Spieler stehen insgesamt pro Quidditch-Mannschaft auf dem Spielfeld? (Bitte Zahl eingeben)",
|
||
"canonical_answer": "7",
|
||
"accepted_answers": json.dumps(["7", "sieben", "seven"]),
|
||
"options": None,
|
||
"hint": "3 Jäger, 2 Treiber, 1 Hüter und 1 Sucher.",
|
||
"question_en": "How many players are on the pitch for each Quidditch team? (Please enter as a number)",
|
||
"answer_en": "7",
|
||
"options_en": None,
|
||
"hint_en": "3 Chasers, 2 Beaters, 1 Keeper, and 1 Seeker."
|
||
},
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "medium",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welche Gestalt nimmt ein Irrwicht an, wenn er Professor Remus Lupin gegenübersteht?",
|
||
"canonical_answer": "Vollmond",
|
||
"accepted_answers": json.dumps(["Vollmond", "Mond", "Full Moon", "Moon"]),
|
||
"options": ["Vollmond", "Silberner Dolch", "Dementor", "Korsett"],
|
||
"hint": "Wegen seiner Lykanthropie fürchtet Lupin das Licht des Mondes.",
|
||
"question_en": "What shape does a boggart take when facing Professor Remus Lupin?",
|
||
"answer_en": "Full moon",
|
||
"options_en": ["Full moon", "Silver dagger", "Dementor", "Corset"],
|
||
"hint_en": "Because of his lycanthropy, Lupin fears the light of the moon."
|
||
},
|
||
{
|
||
"category": "spells",
|
||
"difficulty": "medium",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welcher dieser Zaubersprüche gehört NICHT zu den drei verbotenen Unverzeihlichen Flüchen?",
|
||
"canonical_answer": "Sectumsempra",
|
||
"options": ["Sectumsempra", "Crucio", "Imperio", "Avada Kedavra"],
|
||
"hint": "Diesen finsteren Fluch erfand der Halbblutprinz für seine Feinde.",
|
||
"question_en": "Which of these dark spells is NOT one of the three Unforgivable Curses?",
|
||
"answer_en": "Sectumsempra",
|
||
"options_en": ["Sectumsempra", "Crucio", "Imperio", "Avada Kedavra"],
|
||
"hint_en": "Invented by the Half-Blood Prince 'for enemies'."
|
||
},
|
||
{
|
||
"category": "creatures",
|
||
"difficulty": "medium",
|
||
"question_type": "text",
|
||
"question": "Wie heißt der stolze Hippogreif, der von Hagrid unterrichtet und später von Harry und Hermine gerettet wird?",
|
||
"canonical_answer": "Seidenschnabel",
|
||
"accepted_answers": json.dumps(["Seidenschnabel", "Buckbeak", "Witherwings"]),
|
||
"options": None,
|
||
"hint": "Vor seiner Berührung muss man ihm fest in die Augen blicken und sich verbeugen.",
|
||
"question_en": "What is the name of the majestic Hippogriff introduced by Hagrid and later rescued by Harry and Hermione?",
|
||
"answer_en": "Buckbeak",
|
||
"options_en": None,
|
||
"hint_en": "One must maintain eye contact and bow respectfully before approaching him."
|
||
},
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "medium",
|
||
"question_type": "text",
|
||
"question": "Aus welchem Holz und magischem Kern besteht Harrys originaler Zauberstab?",
|
||
"canonical_answer": "Stechpalme und Phönixfeder",
|
||
"accepted_answers": json.dumps(["Stechpalme und Phönixfeder", "Stechpalme", "Phönixfeder", "Holly and phoenix feather", "Holly"]),
|
||
"options": None,
|
||
"hint": "Der Phönix Fawkes spendete genau zwei Federn – eine für Harry, eine für Voldemort.",
|
||
"question_en": "What wood and core make up Harry Potter's original wand from Ollivanders?",
|
||
"answer_en": "Holly and Phoenix Feather",
|
||
"options_en": None,
|
||
"hint_en": "The phoenix Fawkes gave exactly two feathers – one to Harry's wand and one to Voldemort's."
|
||
},
|
||
|
||
# --- HARD (19-25) ---
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "hard",
|
||
"question_type": "text",
|
||
"question": "Wie alt muss eine Hexe oder ein Zauberer in Großbritannien sein, um die magische Volljährigkeit zu erreichen? (Bitte Zahl eingeben)",
|
||
"canonical_answer": "17",
|
||
"accepted_answers": json.dumps(["17", "siebzehn", "seventeen"]),
|
||
"options": None,
|
||
"hint": "Ab diesem Alter erlischt auch die magische 'Spur' des Zaubereiministeriums.",
|
||
"question_en": "At what age does a witch or wizard in Britain legally come of age in the magical world? (Please enter as a number)",
|
||
"answer_en": "17",
|
||
"options_en": None,
|
||
"hint_en": "At this age, the Ministry of Magic's 'Trace' breaks."
|
||
},
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "hard",
|
||
"question_type": "multiple_choice",
|
||
"question": "Wie lautet der vollständige Mädchenname von Lord Voldemorts unglücklicher Mutter?",
|
||
"canonical_answer": "Merope Gaunt",
|
||
"options": ["Merope Gaunt", "Morfin Gaunt", "Kendra Dumbledore", "Helena Ravenclaw"],
|
||
"hint": "Sie verliebte sich in den Muggel Tom Riddle Senior und stammte von Salazar Slytherin ab.",
|
||
"question_en": "What is the full maiden name of Lord Voldemort's tragic mother?",
|
||
"answer_en": "Merope Gaunt",
|
||
"options_en": ["Merope Gaunt", "Morfin Gaunt", "Kendra Dumbledore", "Helena Ravenclaw"],
|
||
"hint_en": "A direct descendant of Salazar Slytherin who bewitched Tom Riddle Sr."
|
||
},
|
||
{
|
||
"category": "creatures",
|
||
"difficulty": "hard",
|
||
"question_type": "multiple_choice",
|
||
"question": "Welche geflügelten, skelettartigen Wesen ziehen die scheinbar herrenlosen Kutschen von Hogsmeade zum Schloss?",
|
||
"canonical_answer": "Thestrale",
|
||
"options": ["Thestrale", "Abraxaner", "Hippogreife", "Gryffins"],
|
||
"hint": "Sie sind unsichtbar für alle, die noch nie den Tod eines Menschen miterlebt haben.",
|
||
"question_en": "Which winged, skeletal creatures pull the carriages from Hogsmeade to Hogwarts Castle?",
|
||
"answer_en": "Thestrals",
|
||
"options_en": ["Thestrals", "Abraxans", "Hippogriffs", "Griffins"],
|
||
"hint_en": "They can only be seen by those who have witnessed death."
|
||
},
|
||
{
|
||
"category": "lore",
|
||
"difficulty": "hard",
|
||
"question_type": "text",
|
||
"question": "Wie heißt das steinerne Becken im Büro des Schulleiters, in dem man Gedanken und Erinnerungen ablegen und betrachten kann?",
|
||
"canonical_answer": "Denkarium",
|
||
"accepted_answers": json.dumps(["Denkarium", "Pensieve"]),
|
||
"options": None,
|
||
"hint": "Auf Englisch wird es Pensieve genannt.",
|
||
"question_en": "What is the name of the stone basin in the Headmaster's office used to view stored memories?",
|
||
"answer_en": "Pensieve",
|
||
"options_en": None,
|
||
"hint_en": "In German it is known as Denkarium."
|
||
},
|
||
{
|
||
"category": "spells",
|
||
"difficulty": "hard",
|
||
"question_type": "text",
|
||
"question": "Welcher Zauberspruch wird verwendet, um Erinnerungen aus dem Gedächtnis einer Person zu löschen oder zu verändern?",
|
||
"canonical_answer": "Obliviate",
|
||
"accepted_answers": json.dumps(["Obliviate", "Vergisszauber"]),
|
||
"options": None,
|
||
"hint": "Gilderoy Lockharts Spezialgebiet, der sich damit am Ende selbst das Gedächtnis raubte.",
|
||
"question_en": "Which memory charm is used to erase or modify specific memories from a person's mind?",
|
||
"answer_en": "Obliviate",
|
||
"options_en": None,
|
||
"hint_en": "Gilderoy Lockhart's specialty, which ultimately backfired on him."
|
||
},
|
||
{
|
||
"category": "characters",
|
||
"difficulty": "hard",
|
||
"question_type": "multiple_choice",
|
||
"question": "In welches winzige Insekt konnte sich die Klatschreporterin Rita Kimmkorn als unregistrierter Animagus verwandeln?",
|
||
"canonical_answer": "Käfer",
|
||
"options": ["Käfer", "Fliege", "Spinne", "Wespe"],
|
||
"hint": "Hermine fängt sie in einem unzerbrechlichen Glasgefäß ein.",
|
||
"question_en": "Into which tiny insect could gossip reporter Rita Skeeter transform as an unregistered Animagus?",
|
||
"answer_en": "Beetle",
|
||
"options_en": ["Beetle", "Fly", "Spider", "Wasp"],
|
||
"hint_en": "Hermione captures her inside an unbreakable glass jar."
|
||
},
|
||
{
|
||
"category": "hogwarts",
|
||
"difficulty": "hard",
|
||
"question_type": "text",
|
||
"question": "Wie heißt der Poltergeist von Hogwarts, der Schülern Streiche spielt und nur vor dem Blutigen Baron Respekt hat?",
|
||
"canonical_answer": "Peeves",
|
||
"accepted_answers": json.dumps(["Peeves", "Peeves der Poltergeist"]),
|
||
"options": None,
|
||
"hint": "Er wirft gerne mit Kreide, Kandelabern und Stöcken nach Passanten.",
|
||
"question_en": "What is the name of the Hogwarts poltergeist who terrorizes students and only fears the Bloody Baron?",
|
||
"answer_en": "Peeves",
|
||
"options_en": None,
|
||
"hint_en": "He loves dropping chandeliers, throwing chalk, and singing mocking rhymes."
|
||
}
|
||
]
|
||
|
||
def seed_expand():
|
||
db = SessionLocal()
|
||
try:
|
||
inserted = 0
|
||
for item in NEW_QUESTIONS_DATA:
|
||
# Check if question already exists by question text
|
||
existing = db.query(Question).filter(Question.question == item["question"]).first()
|
||
if existing:
|
||
continue
|
||
|
||
opts_json = json.dumps(item["options"], ensure_ascii=False) if item.get("options") else None
|
||
opts_en_json = json.dumps(item["options_en"], ensure_ascii=False) if item.get("options_en") else None
|
||
|
||
q = Question(
|
||
category=item["category"],
|
||
difficulty=item["difficulty"],
|
||
question_type=item["question_type"],
|
||
question=item["question"],
|
||
canonical_answer=item["canonical_answer"],
|
||
accepted_answers=item.get("accepted_answers"),
|
||
options=opts_json,
|
||
hint=item.get("hint"),
|
||
question_en=item.get("question_en"),
|
||
answer_en=item.get("answer_en"),
|
||
options_en=opts_en_json,
|
||
hint_en=item.get("hint_en"),
|
||
status="active",
|
||
sort_order=0
|
||
)
|
||
db.add(q)
|
||
inserted += 1
|
||
|
||
db.commit()
|
||
total_count = db.query(Question).filter(Question.status == "active").count()
|
||
print(f"Successfully inserted {inserted} new questions! Total active questions: {total_count}")
|
||
finally:
|
||
db.close()
|
||
|
||
if __name__ == "__main__":
|
||
seed_expand()
|