Add full database backup and restoration scripts for exact original recipes
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,770 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Restore recipes to match their exact original source documents without alterations.
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from app.database import get_connection
|
||||
|
||||
sys.stdout.reconfigure(encoding='utf-8')
|
||||
|
||||
UPDATES = [
|
||||
# -------------------------------------------------------------
|
||||
# ID 1: Grießnockerlsuppe (Chefkoch jawi)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Grießnockerlsuppe",
|
||||
"source": "jawi (Chefkoch)",
|
||||
"portions": 6,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"30 g Fett oder Butter\n"
|
||||
"1 Ei(er)\n"
|
||||
"70 g Grieß\n"
|
||||
"1 Liter Suppe\n"
|
||||
"Salz"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Das Fett bzw. die weiche Butter schaumig rühren, das Ei dazurühren, ebenso den Grieß und das Salz.\n"
|
||||
"2. Die Masse 5 Minuten stehen lassen.\n"
|
||||
"3. Mit 2 Esslöffeln Nockerln formen.\n"
|
||||
"4. Die Nockerln in siedendem Salzwasser oder auch gleich in der Suppe 5 Minuten kochen lassen und danach ca. 15 Minuten ziehen lassen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 2: Chili sin Carne (daily vegan)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Chili sin Carne",
|
||||
"source": "daily vegan",
|
||||
"portions": 8,
|
||||
"effort": "mittel",
|
||||
"prep_time": "20 Min.",
|
||||
"cook_time": "35 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"200 g Sojagranulat\n"
|
||||
"4 Zwiebeln (gewürfelt)\n"
|
||||
"3 Knoblauchzehen (gepresst)\n"
|
||||
"2-4 scharfe Chilischoten (sehr fein gehackt)\n"
|
||||
"800 ml Pizza-Tomaten\n"
|
||||
"1 Liter Brühe\n"
|
||||
"2 Gläser oder Dosen Mais (abgetropft)\n"
|
||||
"2 Gläser oder Dosen Kidneybohnen\n"
|
||||
"7 EL Tomatenmark\n"
|
||||
"2 grüne Paprika (gewürfelt)\n"
|
||||
"1 Tafel vegane Zartbitterschokolade (in Stücken)\n"
|
||||
"2 EL Kreuzkümmel (Cumin)\n"
|
||||
"2 EL Oregano\n"
|
||||
"1 TL Koriander (gemahlen)\n"
|
||||
"2 TL Salz\n"
|
||||
"2 TL Pfeffer\n"
|
||||
"Öl zum Anbraten"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Etwas Öl in einer Pfanne erhitzen und das trockene Sojagranulat scharf darin anbraten.\n"
|
||||
"2. Parallel dazu in einem großen Topf etwas Öl erhitzen und die Zwiebeln darin glasig braten. Den Knoblauch und das angebratene Sojagranulat dazugeben.\n"
|
||||
"3. Mit Salz, Pfeffer, Koriander und Kreuzkümmel würzen und die Chilis dazugeben. Alles zusammen unter Rühren kurz anbraten.\n"
|
||||
"4. Pizzatomaten, Tomatenmark und 1 l Brühe einrühren und ca. 15 Minuten köcheln, dabei ab und zu umrühren.\n"
|
||||
"5. Anschließend auch Mais, Paprika, Kidneybohnen, Oregano und Schokolade dazugeben und weitere 15 Minuten köcheln lassen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 52: Kürbissuppe (Familienrezept)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 52,
|
||||
"title": "Kürbissuppe",
|
||||
"source": "Familienrezept",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"750 g Kürbis\n"
|
||||
"1 Zwiebel\n"
|
||||
"1 - 1.5 Liter schwache Brühe\n"
|
||||
"Butter\n"
|
||||
"300 g Bresso Frischkäse mit Kräutern (knapp 1 Becher)\n"
|
||||
"2 EL Kürbiskerne\n"
|
||||
"1 Glas Sherry\n"
|
||||
"Petersilie"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Zwiebel in Butter dünsten, geschnittenen Kürbis dazugeben, mit ca. 1 l Brühe aufgießen.\n"
|
||||
"2. 10 bis 15 Minuten kochen, anschließend pürieren.\n"
|
||||
"3. Bresso-Frischkäse und Sherry dazugeben und unterrühren.\n"
|
||||
"4. Kürbiskerne (oder Sonnenblumenkerne) kurz in Butter anrösten und mit gehackter Petersilie auf die Suppe geben."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 53: Blätterteig Lauchstrudel mit Speck (Tante Fanny)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 53,
|
||||
"title": "Blätterteig Lauchstrudel mit Speck",
|
||||
"source": "Tante Fanny",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "35 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"1 Pkg. Tante Fanny Frischer Blätterteig 300 g\n"
|
||||
"Etwas Butter zum Anbraten\n"
|
||||
"150 g Speck gewürfelt\n"
|
||||
"2 Stangen Lauch (Porree) in Ringe geschnitten\n"
|
||||
"1 Bund Petersilie gehackt\n"
|
||||
"100 g Crème fraîche\n"
|
||||
"40 g Semmelbrösel (Paniermehl)\n"
|
||||
"1 Prise Muskatnuss gemahlen\n"
|
||||
"Salz und Pfeffer gemahlen\n"
|
||||
"Etwas Butter zum Bestreichen"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Backofen auf 220 °C Ober-/Unterhitze vorheizen und Teig laut Packungsanleitung vorbereiten.\n"
|
||||
"2. Speck in Butter kurz anbraten, Lauch hinzugeben und kurz mitbraten. Petersilie, Crème fraîche und Semmelbrösel unterrühren. Mit Salz, Pfeffer und Muskatnuss würzen. Kurz überkühlen lassen.\n"
|
||||
"3. Teig mit dem mitgerollten Backpapier direkt am Backblech entrollen und die Füllung am unteren Drittel verteilen.\n"
|
||||
"4. Strudel rollen und die Enden gut verschließen. Mit Butter bestreichen und mit einem Messer die Oberfläche einschneiden.\n"
|
||||
"5. Lauchstrudel im Backofen ca. 35 Min. goldbraun backen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 54: Currysauce für Currywurst (dariosmama, Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 54,
|
||||
"title": "Currysauce für Currywurst",
|
||||
"source": "dariosmama (Chefkoch)",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "5 Min.",
|
||||
"cook_time": "15 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"1 Flasche Tomatenketchup (ca. 500 ml)\n"
|
||||
"2 kleine Zwiebeln\n"
|
||||
"3 EL Balsamico dunkel\n"
|
||||
"2 EL Honig\n"
|
||||
"2 EL Currypulver\n"
|
||||
"etwas Chilipulver oder Cayennepfeffer\n"
|
||||
"1 Spritzer Sojasauce\n"
|
||||
"Olivenöl\n"
|
||||
"Tomatenmark\n"
|
||||
"Wasser"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Die kleingeschnittenen Zwiebeln in Olivenöl glasig dünsten.\n"
|
||||
"2. Etwas Tomatenmark dazugeben und mit etwas Wasser ablöschen.\n"
|
||||
"3. Ketchup, Balsamico-Essig und Honig dazugeben und bei kleiner Hitze leicht köcheln lassen. Der Essig darf nicht zu schnell verdampfen.\n"
|
||||
"4. Dann die Sojasauce und die anderen Gewürze dazugeben. Gut umrühren, ggf. noch etwas Wasser dazugeben.\n"
|
||||
"5. Abschmecken, ob noch etwas Curry oder Chili dazu soll."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 55: Olivenpaste (Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 55,
|
||||
"title": "Olivenpaste",
|
||||
"source": "Chefkoch",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "5 Min.",
|
||||
"cook_time": "0 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"100 g Oliven, schwarz, entsteint\n"
|
||||
"1 EL Kapern\n"
|
||||
"1 EL Pinienkerne\n"
|
||||
"1 EL Tomatenmark\n"
|
||||
"3 EL Olivenöl, kalt gepresst\n"
|
||||
"Pfeffer, frisch gemahlen\n"
|
||||
"einige Pinienkerne zur Deko"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Alle Zutaten in den Mixer oder die Küchenmaschine geben und fein pürieren.\n"
|
||||
"2. Die Paste mit Pfeffer abschmecken. Salz ist in der Regel nicht nötig, weil sowohl Oliven als auch Kapern salzig sind.\n"
|
||||
"3. Zur Deko einige Pinienkerne darauf streuen. Als Unterlage schmecken geröstete Weißbrotscheiben."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 58: Geschnetzeltes in cremiger Currysauce (Einfach Malene)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 58,
|
||||
"title": "Geschnetzeltes in cremiger Currysauce",
|
||||
"source": "Einfach Malene",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "15 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"600 g Hähnchenbrustfilet\n"
|
||||
"100 g Speckwürfel\n"
|
||||
"1 Zwiebel\n"
|
||||
"1 Zehe Knoblauch\n"
|
||||
"2 TL Öl (für Fleisch)\n"
|
||||
"etwas Öl zum Anbraten\n"
|
||||
"3 TL Curry (1 TL für Fleisch, 2 TL für Sauce)\n"
|
||||
"250 ml Brühe\n"
|
||||
"200 g Sahne\n"
|
||||
"200 g Milch\n"
|
||||
"100 g Crème fraîche\n"
|
||||
"2 EL Tomatenmark\n"
|
||||
"2 TL Senf\n"
|
||||
"1 EL gehackte Petersilie\n"
|
||||
"1 Prise Zucker\n"
|
||||
"Salz und Pfeffer\n"
|
||||
"1 EL Speisestärke (optional zum Andicken)"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Schneide das Hähnchen in Würfel. Mische das Fleisch mit 1 TL Curry, etwas Öl und würze es mit Salz und Pfeffer.\n"
|
||||
"2. Schneide Zwiebel und Knoblauch in kleine Würfel.\n"
|
||||
"3. Brate das Fleisch in einer (hohen) Pfanne in 1-2 EL Öl an. Gib zuerst die Speckwürfel hinzu und brate diese mit an. Gib nun Zwiebeln und Knoblauch hinzu und dünste diese ebenfalls kurz mit.\n"
|
||||
"4. Lösche das Fleisch mit der Brühe ab.\n"
|
||||
"5. Gib nun Sahne, Milch, Crème fraîche, Tomatenmark, Senf, Salz, Pfeffer, 2 TL Curry, Petersilie und Zucker in eine Schüssel und verrühre alles miteinander.\n"
|
||||
"6. Nun kannst du die Sahnemischung zum Fleisch geben und alles kurz darin köcheln lassen.\n"
|
||||
"7. Soße andicken (optional): 1 TL Speisestärke in kaltem Wasser lösen, zur Soße geben und kurz aufkochen lassen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 65: Thunfischsauce mit Orecchiette (Kochen & Genießen)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 65,
|
||||
"title": "Thunfischsauce mit Orecchiette",
|
||||
"source": "Kochen & Genießen",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "10 Min.",
|
||||
"cook_time": "10 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"150 g Thunfisch im eigenen Saft\n"
|
||||
"1 Zwiebel\n"
|
||||
"2 EL Kapern\n"
|
||||
"1 TL getrockneter Thymian\n"
|
||||
"1 EL Olivenöl\n"
|
||||
"250 ml Gemüsebrühe (Instant)\n"
|
||||
"250 g Mascarpone (ital. Frischkäse)\n"
|
||||
"1 EL Zitronensaft\n"
|
||||
"Salz und Pfeffer\n"
|
||||
"500 g Orecchiette (Nudel-Tipp)\n"
|
||||
"100 g Zucchini (optional, in feine Streifen gehobelt)"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Zwiebel abziehen, würfeln. Thunfisch in Stücke zupfen. Zucchini waschen, putzen und in feine Streifen hobeln.\n"
|
||||
"2. Zwiebel und Thymian in heißem Öl dünsten. Mit Brühe, Mascarpone und der Hälfte des Thunfischs aufkochen, pürieren.\n"
|
||||
"3. Kapern, übrigen Thunfisch und Zucchini zugeben. Sauce aufkochen, mit Salz, Pfeffer und Zitronensaft würzen.\n"
|
||||
"4. Mit den al dente gekochten Orecchiette mischen und servieren."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 66: Bolognese (odernichtoderdoch / Familienrezept)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 66,
|
||||
"title": "Bolognese",
|
||||
"source": "Familienrezept (odernichtoderdoch)",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "10 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"1 Zwiebel\n"
|
||||
"2 Karotten\n"
|
||||
"4 Champignons\n"
|
||||
"1 Veggie Hack (Quorn)\n"
|
||||
"1 Dose Tomaten\n"
|
||||
"200 ml Gemüsebrühe\n"
|
||||
"Salz, Pfeffer, Zucker, Oregano"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Gemüse klein würfeln.\n"
|
||||
"2. Zwiebel anschwitzen.\n"
|
||||
"3. Hack dazu.\n"
|
||||
"4. Gemüse dazu.\n"
|
||||
"5. Tomaten & Brühe dazu.\n"
|
||||
"6. Ca. 20 Min. köcheln.\n"
|
||||
"7. Würzen (Salz, Pfeffer, Zucker, Oregano)."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 67: Zucchini Pasta (fitgreenmind)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 67,
|
||||
"title": "Zucchini Pasta",
|
||||
"source": "fitgreenmind",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "10 Min.",
|
||||
"cook_time": "10 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"4 Zucchini (grob geraspelt)\n"
|
||||
"Olivenöl zum Anbraten\n"
|
||||
"3 Zehen Knoblauch\n"
|
||||
"Saft & Schale von 1 Zitrone\n"
|
||||
"4 EL Sahne\n"
|
||||
"Salz, Pfeffer & Kräuter\n"
|
||||
"300 g Nudeln\n"
|
||||
"Parmesan & Basilikum"
|
||||
),
|
||||
"instructions": (
|
||||
"1. 4 Zucchini grob raspeln und in Olivenöl ca. 7-10 Minuten anbraten.\n"
|
||||
"2. 3 Zehen Knoblauch, Saft & Schale von 1 Zitrone, 4 EL Sahne sowie Salz, Pfeffer & Kräuter zur Zucchini hinzufügen.\n"
|
||||
"3. 300 g Nudeln kochen.\n"
|
||||
"4. Nudeln & Nudelwasser, Parmesan & Basilikum zur Sauce geben und 3 Minuten durchschwenken und köcheln lassen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 76: Burger-Buns (Custom-Griller, Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 76,
|
||||
"title": "Burger-Buns",
|
||||
"source": "Custom-Griller (Chefkoch)",
|
||||
"portions": 8,
|
||||
"effort": "normal",
|
||||
"prep_time": "20 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"300 ml Milch, warm\n"
|
||||
"2 Ei(er)\n"
|
||||
"45 g Butter, geschmolzen\n"
|
||||
"1 1/2 EL Zucker\n"
|
||||
"21 g Frischhefe\n"
|
||||
"3/4 TL Salz\n"
|
||||
"500 g Mehl\n"
|
||||
"2 EL Wasser\n"
|
||||
"n. B. Sesam"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Warme Milch, Zucker, Hefe und geschmolzene Butter verrühren und beiseite stellen, bis es schäumt.\n"
|
||||
"2. In einer anderen Schüssel das Mehl mit dem Salz vermischen. Das Hefegemisch und ein Ei hinzugeben und vermischen. Mit der Maschine alles in 5 - 7 Minuten zu einem Teig verkneten. Der Teig sollte nicht klebrig, aber auch nicht zu fest sein. Ggf. mit etwas Milch oder Mehl nachhelfen. Den Teig eine Stunde an einem warmen Ort gehen lassen.\n"
|
||||
"3. Wenn sich das Volumen des Teiges etwa verdoppelt hat, die Luft wieder aus dem Teig rauskneten. Den Teig in etwa 8 - 9 gleich große Teile von 100 - 110 g teilen. Daraus die Buns formen und auf das Backblech legen. Mit Frischhaltefolie bedeckt etwa 45 Minuten an einem warmen Ort gehen lassen. Alle 10 Minuten die Frischhaltefolie anheben, damit der Teig nicht daran kleben bleibt.\n"
|
||||
"4. Das zweite Ei mit dem Wasser verquirlen, die Buns damit bestreichen und mit Sesam bestreuen.\n"
|
||||
"5. In etwa 20 Minuten im vorgeheizten Backofen bei 190 °C goldbraun backen.\n"
|
||||
"6. Mit einem Küchentuch bedeckt etwa 15 Minuten abkühlen lassen. Das mit dem Küchentuch ist wichtig, denn nur so bleiben die Buns schön weich."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 78: Pizzateig (bibberle, Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 78,
|
||||
"title": "Pizzateig",
|
||||
"source": "bibberle (Chefkoch)",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "30 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"500 g Mehl\n"
|
||||
"4 g Hefe, frische\n"
|
||||
"2 EL Olivenöl\n"
|
||||
"300 ml Wasser, lauwarmes\n"
|
||||
"10 g Salz"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Alle Zutaten in eine Schüssel geben und mindestens 5 Min. gut durchkneten.\n"
|
||||
"2. Den Teig ca. 30 Min. gehen lassen.\n"
|
||||
"3. Anschließend in 3 - 4 Portionen teilen, die jeweils zu Kugeln geformt werden.\n"
|
||||
"4. Nun kann es losgehen mit dem Auswellen und Belegen.\n"
|
||||
"5. Der Teig ist für jegliche Weiterverarbeitung geeignet - ob im Backofen (220 °C, ca. 15 - 20 Min.), auf einem Pizzastein (250 °C, ca. 10 - 15 Min.) oder in einer Elektropfanne."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 91: Palatschinken mit feiner Walnussfüllung (mima53, Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 91,
|
||||
"title": "Palatschinken mit feiner Walnussfüllung",
|
||||
"source": "mima53 (Chefkoch)",
|
||||
"portions": 4,
|
||||
"effort": "normal",
|
||||
"prep_time": "20 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"Für den Teig:\n"
|
||||
"250 ml Milch\n"
|
||||
"125 ml Mineralwasser\n"
|
||||
"3 Ei(er)\n"
|
||||
"210 g Mehl\n"
|
||||
"1 Prise(n) Salz\n"
|
||||
"Butter zum Ausbacken\n\n"
|
||||
"Für die Füllung:\n"
|
||||
"200 g Walnüsse, gemahlene\n"
|
||||
"250 ml Milch\n"
|
||||
"2 EL Honig\n"
|
||||
"1 EL Zucker, brauner\n"
|
||||
"3 EL Amaretto\n"
|
||||
"1/2 TL Zimt\n"
|
||||
"60 g Kokosraspel\n\n"
|
||||
"Zum Verzieren:\n"
|
||||
"Schokoladensauce oder Zimtsauce\n"
|
||||
"Mandelblättchen\n"
|
||||
"Sahne (Schlagobers)\n"
|
||||
"Puderzucker"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Aus Milch, Mineralwasser, Mehl, Eiern und Salz einen Palatschinkenteig rühren und kurz rasten lassen.\n"
|
||||
"2. Danach in Butter sehr dünne Palatschinken backen.\n"
|
||||
"3. Für die Füllung die gemahlenen Walnüsse mit der Milch, Honig, braunem Zucker, Zimt, Kokosraspel und Amaretto kurz aufkochen und quellen lassen.\n"
|
||||
"4. Die Palatschinken füllen, einrollen oder zusammenklappen.\n"
|
||||
"5. Mit Schokoladen- oder Zimtsauce, Mandelblättchen, Schlagsahne und Puderzucker verzieren und servieren."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 99: Süße Dampfnudeln (Küchenfee1976, Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 99,
|
||||
"title": "Süße Dampfnudeln",
|
||||
"source": "chefkoch.de (Küchenfee1976)",
|
||||
"portions": 4,
|
||||
"effort": "mittel",
|
||||
"prep_time": "20 Min.",
|
||||
"cook_time": "30 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"500 g Mehl\n"
|
||||
"20 g Frischhefe (oder 1 Pck. Trockenhefe)\n"
|
||||
"50 g Zucker\n"
|
||||
"0.25 Liter Milch\n"
|
||||
"0.5 TL Salz\n"
|
||||
"80 g Butter (zerlassene)\n"
|
||||
"1 m.-großes Ei(er)\n\n"
|
||||
"Zum Dämpfen:\n"
|
||||
"100 g Butter\n"
|
||||
"0.125 Liter Milch\n"
|
||||
"Zucker (ca. 100 - 150 g)"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Die Hefe mit dem Zucker auflösen. Alle Zutaten gut vermischen, den Hefeteig mindestens eine Stunde oder länger an einem warmen Ort gehen lassen.\n"
|
||||
"2. Den Teig zu einer faustdicken Rolle (Durchmesser ca. 7 cm) formen, davon ca. 9 gleich große Teile abstechen und zu runden Knödeln formen. Etwas flachdrücken und wieder gehen lassen.\n"
|
||||
"3. In eine Pfanne mit hohem Rand und Deckel den Zucker (100-150 g), etwas Butter und die 125 ml Milch geben. Die Teigteile hineinsetzen und bei mittlerer Hitze ca. 30 min. garen, bis die Flüssigkeit vollständig verdampft ist. Dabei darf der Deckel niemals (!) hochgehoben werden, sonst fallen die Dampfnudeln zusammen!\n"
|
||||
"4. Dazu passt Vanillesoße und/oder Apfelmus."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 100: Geheimes Waffelrezept (Chefkoch)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 100,
|
||||
"title": "Geheimes Waffelrezept",
|
||||
"source": "chefkoch.de (Geheimes Waffelrezept)",
|
||||
"portions": 6,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "30 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"500 g Zucker\n"
|
||||
"500 g Margarine (zimmerwarme)\n"
|
||||
"10 Ei(er) (verquirlte)\n"
|
||||
"2 Pck. Vanillinzucker\n"
|
||||
"1 Schuss Rum\n"
|
||||
"1 kg Mehl\n"
|
||||
"1 Liter Milch\n"
|
||||
"1 Pck. Backpulver\n"
|
||||
"evtl. Fett (für das Waffeleisen)"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Die verquirlten Eier mit dem Zucker und der Margarine glatt verrühren, bis ein schaumiger Teig entsteht. Vanillezucker und einen guten Schuss echten Rum hinzufügen.\n"
|
||||
"2. 1000 g Mehl und das Backpulver dazugeben und verrühren, dadurch wird der Teig etwas klebrig. Zuletzt nach und nach die Milch unterrühren und so lange rühren, bis der Teig eine glatte und weiche Konsistenz hat.\n"
|
||||
"3. In einem heißen Waffeleisen die Waffeln portionsweise backen und heiß servieren.\n"
|
||||
"4. Tipp: Im Winter Zimt unter den Teig rühren. (Hinweis: Die Teigmenge ist für ca. 30 Waffeln bemessen. Für einen normalen Haushalt kann von allem einfach die Hälfte genommen werden)."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 101: Rotkäppchen-Kuchen (Sallys Classics)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 101,
|
||||
"title": "Rotkäppchen-Kuchen",
|
||||
"source": "sallys-blog.de (Sallys Classics)",
|
||||
"portions": 12,
|
||||
"effort": "mittel",
|
||||
"prep_time": "40 Min.",
|
||||
"cook_time": "45 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"Rührteig:\n"
|
||||
"1 Glas Schattenmorellen (720 ml / 350 g Abtropfgewicht)\n"
|
||||
"175 g Butter (weich)\n"
|
||||
"175 g Zucker\n"
|
||||
"0.5 TL Vanilleextrakt\n"
|
||||
"1 Prise Salz\n"
|
||||
"3 Ei(er) (zimmerwarm)\n"
|
||||
"200 g Mehl\n"
|
||||
"2 TL Backpulver\n"
|
||||
"20 g Kakao\n"
|
||||
"40 ml Milch\n\n"
|
||||
"Creme:\n"
|
||||
"400 ml Sahne\n"
|
||||
"500 g Quark (Magerstufe)\n"
|
||||
"40 g Puderzucker\n"
|
||||
"1 TL Vanilleextrakt\n"
|
||||
"1 Prise Zitronenabrieb\n"
|
||||
"9 TL San-apart (4 TL für Sahne, 5 TL für Quark)\n\n"
|
||||
"Guss:\n"
|
||||
"250 ml Kirschsaft\n"
|
||||
"1 EL Zucker\n"
|
||||
"2 EL Speisestärke"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Kirschen abgießen und den Saft auffangen. Weiche Butter mit Zucker, Vanilleextrakt und Salz 3-4 Minuten zu einer cremigen Masse verrühren.\n"
|
||||
"2. Eier einzeln hinzufügen und jeweils eine halbe Minute einrühren. Mehl und Backpulver verrühren und in den Teig sieben.\n"
|
||||
"3. Die Hälfte des Teiges in einen Backring (Ø 26 cm) streichen. Kakao und Milch mit dem restlichen Teig verrühren, auf dem hellen Teig verteilen und verstreichen. Die abgetropften Kirschen darüber verteilen und leicht eindrücken.\n"
|
||||
"4. Im vorgeheizten Ofen bei 180 °C Ober-/Unterhitze ca. 40-45 Minuten backen (Stäbchenprobe!). Danach abgedeckt komplett abkühlen lassen.\n"
|
||||
"5. Sahne mit 4 TL San-apart steif schlagen. Puderzucker, Vanilleextrakt, Zitronenschalenabrieb, Magerquark und die restlichen 5 TL San-apart einrühren und ca. 30 Sekunden rühren, bis die Creme fest wird. Auf dem abgekühlten Kuchen glattstreichen.\n"
|
||||
"6. Kirschsaft mit Zucker und Stärke verrühren und aufkochen. Den Guss vorsichtig über der Creme verteilen. Mindestens 2 Stunden kühlen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 102: Schoko-Sahne-Torte (Einfach Backen)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 102,
|
||||
"title": "Schoko-Sahne-Torte",
|
||||
"source": "einfachbacken.de",
|
||||
"portions": 12,
|
||||
"effort": "mittel",
|
||||
"prep_time": "45 Min.",
|
||||
"cook_time": "35 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"Füllung:\n"
|
||||
"300 g Zartbitterkuvertüre\n"
|
||||
"800 g Schlagsahne\n\n"
|
||||
"Biskuit:\n"
|
||||
"5 Ei(er) (Größe M)\n"
|
||||
"180 g Zucker\n"
|
||||
"1 Prise Salz\n"
|
||||
"160 g Mehl\n"
|
||||
"2 EL Backkakao\n"
|
||||
"1 TL Backpulver\n\n"
|
||||
"Zum Bestäuben:\n"
|
||||
"1 - 2 EL Kakao"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Für die Füllung Kuvertüre fein hacken und in eine große Rührschüssel geben. Sahne kurz aufkochen, vom Herd nehmen und auf die Kuvertüre gießen. Unter Rühren die Kuvertüre langsam auflösen. Mit Folie abdecken und am besten über Nacht (mindestens jedoch 3 Std.) kaltstellen.\n"
|
||||
"2. Backofen auf 180 Grad (Umluft: 160 Grad) vorheizen. Springform (Ø 26 cm) mit Backpapier auslegen. Eier mit Zucker und Salz für 4-5 Min. auf höchster Stufe schaumig schlagen. Mehl mit Kakao und Backpulver mischen und unterheben. Teig in die Form geben und im vorgeheizten Ofen ca. 35 Minuten backen. Biskuit auf ein Backpapier stürzen und auskühlen lassen.\n"
|
||||
"3. Biskuit zweimal waagerecht durchschneiden. Unteren Boden auf eine Kuchenplatte setzen und den gesäuberten Springformrand oder einen Tortenring darum stellen. Kalte Schokosahne wenige Minuten aufschlagen, bis die Creme fester und heller wird. 5 EL der Creme für den Rand beiseite stellen.\n"
|
||||
"4. Ein Viertel der Creme auf dem Boden verstreichen. Zweiten Boden darauf legen und leicht andrücken. Die gleiche Menge der Creme auf den zweiten Boden geben und glatt streichen. Dritten Boden auflegen und leicht andrücken. Übrige Schoko-Sahne in einen Spritzbeutel mit kleiner Lochtülle füllen und Tupfen auf die Tortenoberfläche spritzen. Mind. 1 Std. kühlstellen.\n"
|
||||
"5. Tortenring entfernen. Mit der beiseite gestellten Schoko-Sahne den Rand dünn einstreichen. Oberfläche nach Belieben mit Kakao bestäuben und gekühlt servieren."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 103: Soba „Sommerrollen“-Salat mit Tofu und Erdnussdressing (Zucker & Jagdwurst)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 103,
|
||||
"title": "Soba „Sommerrollen“-Salat mit Tofu und Erdnussdressing",
|
||||
"source": "zuckerjagdwurst.com",
|
||||
"portions": 2,
|
||||
"effort": "einfach",
|
||||
"prep_time": "25 Min.",
|
||||
"cook_time": "10 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"Für den Salat:\n"
|
||||
"150 g Sobanudeln\n"
|
||||
"150 g frittierter Tofu\n"
|
||||
"75 g TK-Edamame (geschält)\n"
|
||||
"50 g Erdnüsse\n"
|
||||
"50 g Rotkohl\n"
|
||||
"1 kleine Karotte\n"
|
||||
"0.5 Paprika\n"
|
||||
"0.5 Gurke\n"
|
||||
"50 g Zuckerschoten\n"
|
||||
"1 Frühlingszwiebel\n"
|
||||
"10 g Koriander\n"
|
||||
"geröstetes Sesamöl zum Anbraten\n\n"
|
||||
"Für das Erdnussdressing:\n"
|
||||
"5 EL Erdnussbutter\n"
|
||||
"75 ml Yuzu oder Ponzu-Sojasoße\n"
|
||||
"50 ml geröstetes Sesamöl\n"
|
||||
"1-2 Limetten (Saft)\n"
|
||||
"2 EL Agavensirup\n"
|
||||
"20 g Ingwer\n"
|
||||
"1 Knoblauchzehe\n"
|
||||
"1 Chili\n"
|
||||
"Sriracha (nach Geschmack)\n"
|
||||
"Wasser zum Verdünnen"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Rotkohl, Karotten, Paprika, Gurke, Zuckerschoten, Frühlingszwiebeln und Koriander waschen. Rotkohl, Paprika, Gurke und Zuckerschoten in feine Streifen schneiden. Die Karotte raspeln. Den Koriander hacken und die Frühlingszwiebeln in feine, schräge Scheiben schneiden. Alles in eine Schale geben und beiseitestellen.\n"
|
||||
"2. Die Sobanudeln nach Verpackungsanleitung zubereiten und abkühlen lassen.\n"
|
||||
"3. In der Zwischenzeit Edamame nach Packungsanweisung zubereiten und beiseitestellen. Erdnüsse in einer fettfreien Pfanne rösten, bis sie goldbraun sind.\n"
|
||||
"4. Den frittierten Tofu in ungefähr 0.5 cm dicke Scheiben schneiden und in einer Pfanne mit etwas Sesamöl kurz anbraten.\n"
|
||||
"5. Chili, Ingwer und Knoblauch fein hacken und in eine große Salatschüssel geben. Erdnussbutter, Limettensaft, Sojasoße, Sesamöl, Agavensirup und Sriracha hinzugeben und alles gut vermengen. Mit Wasser nach Belieben verflüssigen.\n"
|
||||
"6. Die Sobanudeln hinzugeben und mit der Soße vermengen. Anschließend das Gemüse und den Koriander unterheben und mit Erdnüssen und Edamame toppen."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 104: Fleischpflanzerl (Familienrezept)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 104,
|
||||
"title": "Fleischpflanzerl",
|
||||
"source": "Familienrezept (handschriftlich)",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"Veggi-Hack (1 Pck. -> 4 Stück)\n"
|
||||
"Toast\n"
|
||||
"1 Zwiebel\n"
|
||||
"1 Ei\n"
|
||||
"1 TL Senf\n"
|
||||
"1 TL Salz\n"
|
||||
"Pfeffer\n"
|
||||
"Petersilie\n"
|
||||
"Semmelbrösel\n"
|
||||
"Butter zum Braten"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Zwiebel anschwitzen & Toast einweichen.\n"
|
||||
"2. Toast gut ausdrücken.\n"
|
||||
"3. Alles außer Semmelbrösel mischen.\n"
|
||||
"4. Semmelbrösel dazu geben, um Konsistenz zu regulieren -> ziehen lassen.\n"
|
||||
"5. In viel Butter lange braten (15-20 Min.)."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 105: Kartoffelsalat (Kochbuch-Klassiker mit Notiz)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 105,
|
||||
"title": "Kartoffelsalat",
|
||||
"source": "Kochbuch-Klassiker mit Notiz",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "20 Min.",
|
||||
"cook_time": "25 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"1 kg festkochende Kartoffeln (Salatware)\n"
|
||||
"Schnittlauchröllchen zum Bestreuen\n\n"
|
||||
"Marinade:\n"
|
||||
"1 Zwiebel, gewürfelt\n"
|
||||
"etwa 250 ml Fleischbrühe\n"
|
||||
"Salz, Pfeffer\n"
|
||||
"1 TL Zucker\n"
|
||||
"2 TL Senf\n"
|
||||
"4-6 EL Essig\n"
|
||||
"3 EL Öl"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Kartoffeln in der Schale weich kochen oder dämpfen, sofort nach dem Kochen pellen.\n"
|
||||
"2. Dressing: Alle Zutaten außer Öl & 1/2 v. Essig in den Topf geben und 5 Min. köcheln lassen.\n"
|
||||
"3. Währenddessen Kartoffeln mit dickerer Seite hobeln.\n"
|
||||
"4. Dressing direkt vom Herd über Kartoffeln gießen und rühren bis schlotzig.\n"
|
||||
"5. Öl & Rest Essig dazu geben.\n"
|
||||
"6. Vor dem Anrichten mit Schnittlauchröllchen bestreuen und möglichst lauwarm servieren."
|
||||
)
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# ID 106: Kaiserschmarren (Kochbuch-Klassiker mit Notizen)
|
||||
# -------------------------------------------------------------
|
||||
{
|
||||
"id": 106,
|
||||
"title": "Kaiserschmarren",
|
||||
"source": "Kochbuch-Klassiker mit Notizen",
|
||||
"portions": 4,
|
||||
"effort": "einfach",
|
||||
"prep_time": "15 Min.",
|
||||
"cook_time": "20 Min.",
|
||||
"notes": "",
|
||||
"ingredients": (
|
||||
"250 g Mehl\n"
|
||||
"375 ml Milch\n"
|
||||
"8 Eigelb\n"
|
||||
"2 EL Puderzucker\n"
|
||||
"8 Eiweiß\n"
|
||||
"1 Prise Salz\n\n"
|
||||
"Zum Backen & Karamellisieren:\n"
|
||||
"100 g Butter zum Backen\n"
|
||||
"40 g Rosinen (evtl. in Rum mariniert)\n"
|
||||
"1-2 EL Zucker zum Karamellisieren\n"
|
||||
"Puderzucker zum Besieben"
|
||||
),
|
||||
"instructions": (
|
||||
"1. Das Mehl mit der Milch verrühren, nach und nach die Eigelbe und den Puderzucker zugeben und zu einem glatten Teig rühren. 20 Minuten quellen lassen. Die Eiweiße mit 1 Prise Salz steif schlagen und locker unterziehen.\n"
|
||||
"2. Der Teig reicht für 3 Pfannen (je 4 Schöpfer) und wird portionsweise in der Pfanne gebacken. Etwas Butter erhitzen, gut 1 cm hoch (fingerhoch bzw. 4 Schöpfer) Teig in die Pfanne gießen, mit Rosinen bestreuen, mit geschlossenem Deckel anbacken, wenden und bei mäßiger Hitze fertig backen, dabei mit zwei Gabeln in Stücke reißen. Mit Zucker bestreuen und unter Wenden karamellisieren. Im Ofen warm stellen, bis alle Portionen gebacken sind. Mit Puderzucker besieben, sofort servieren."
|
||||
)
|
||||
},
|
||||
]
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
print("Applying exact original updates...")
|
||||
updated_count = 0
|
||||
for u in UPDATES:
|
||||
rid = u['id']
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE recipes
|
||||
SET title = %s, source = %s, portions = %s, effort = %s, prep_time = %s, cook_time = %s, notes = %s, ingredients = %s, instructions = %s
|
||||
WHERE id = %s
|
||||
""",
|
||||
(
|
||||
u['title'],
|
||||
u['source'],
|
||||
u['portions'],
|
||||
u['effort'],
|
||||
u['prep_time'],
|
||||
u['cook_time'],
|
||||
u['notes'],
|
||||
u['ingredients'],
|
||||
u['instructions'],
|
||||
rid
|
||||
)
|
||||
)
|
||||
updated_count += 1
|
||||
print(f" Updated ID {rid}: '{u['title']}'")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
print(f"\nSuccessfully restored {updated_count} recipes to exact originals in MariaDB.")
|
||||
@@ -0,0 +1,39 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from fastapi.testclient import TestClient
|
||||
from app.main import app, create_auth_token, COOKIE_NAME
|
||||
|
||||
sys.stdout.reconfigure(encoding='utf-8')
|
||||
|
||||
client = TestClient(app)
|
||||
token = create_auth_token("admin")
|
||||
client.cookies.set(COOKIE_NAME, token)
|
||||
|
||||
def test_routes():
|
||||
# Test Home
|
||||
res = client.get("/")
|
||||
assert res.status_code == 200, f"Home failed: {res.status_code}"
|
||||
assert "Wochenmenü" in res.text or "Wochenmen" in res.text
|
||||
assert "Shuffle" in res.text
|
||||
print("✓ Home page (/) OK: contains Wochenmenü and Shuffle")
|
||||
|
||||
# Test Cookbook
|
||||
res = client.get("/cookbook")
|
||||
assert res.status_code == 200, f"Cookbook failed: {res.status_code}"
|
||||
assert "Grießnockerlsuppe" in res.text
|
||||
assert "Fleischpflanzerl" in res.text
|
||||
assert "Kaiserschmarren" in res.text
|
||||
assert "Kartoffelsalat" in res.text
|
||||
print("✓ Cookbook page (/cookbook) OK: 200 OK and recipes found")
|
||||
|
||||
# Test Recipe Detail
|
||||
res = client.get("/cookbook/recipe/1")
|
||||
assert res.status_code == 200, f"Recipe 1 failed: {res.status_code}"
|
||||
print("✓ Recipe detail (/cookbook/recipe/1) OK")
|
||||
|
||||
print("\nAll route tests passed successfully!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_routes()
|
||||
@@ -0,0 +1,41 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from app.database import get_connection, CHAPTERS
|
||||
|
||||
sys.stdout.reconfigure(encoding='utf-8')
|
||||
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Normalize categories
|
||||
cur.execute("UPDATE recipes SET category = 'Traditionell & Basics' WHERE id = 104")
|
||||
cur.execute("UPDATE recipes SET category = 'Asiatische Küche' WHERE id IN (103, 107, 108, 109)")
|
||||
conn.commit()
|
||||
|
||||
# Ensure all recipes have notes = ""
|
||||
cur.execute("UPDATE recipes SET notes = '' WHERE notes IS NOT NULL AND notes != ''")
|
||||
conn.commit()
|
||||
|
||||
# Verify
|
||||
cur.execute("SELECT id, title, category, chapter_number, notes FROM recipes ORDER BY chapter_number, title")
|
||||
rows = cur.fetchall()
|
||||
|
||||
print(f"Total recipes: {len(rows)}")
|
||||
notes_count = sum(1 for r in rows if r['notes'])
|
||||
print(f"Non-empty notes count: {notes_count}")
|
||||
|
||||
chap_counts = {}
|
||||
for r in rows:
|
||||
c = r['category']
|
||||
chap_counts[c] = chap_counts.get(c, 0) + 1
|
||||
|
||||
print("\nFinal Chapters & Counts:")
|
||||
for ch in CHAPTERS:
|
||||
title = ch['title']
|
||||
num = ch['number']
|
||||
cnt = chap_counts.get(title, 0)
|
||||
print(f" Kapitel {num:2d}: {title:25s} -> {cnt:2d} Rezepte")
|
||||
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user