update
This commit is contained in:
@@ -11,6 +11,7 @@ import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import config
|
||||
import db
|
||||
import pipeline
|
||||
from config import PROJECT_ROOT
|
||||
@@ -69,6 +70,11 @@ def _einfuegen(tabelle: str, zeilen: list[dict], **ersetzungen) -> dict:
|
||||
|
||||
def importieren(d: dict) -> None:
|
||||
topic = d["topic"]
|
||||
# Vor dem destruktiven topic_loeschen (rmtree) den Namen validieren — ein
|
||||
# manipulierter Export mit topic="../evil" würde sonst außerhalb von storage
|
||||
# löschen/schreiben.
|
||||
if not config.topic_name_ok(topic):
|
||||
raise ValueError(f"ungültiger Topic-Name: {topic!r}")
|
||||
if db.one("SELECT name FROM topics WHERE name=?", (topic,)):
|
||||
pipeline.topic_loeschen(topic) # Zielseite wird überschrieben
|
||||
|
||||
@@ -119,12 +125,21 @@ def importieren(d: dict) -> None:
|
||||
alt = int(m.group(1))
|
||||
return m.group(0).replace(m.group(1), str(a_map[alt]), 1) if alt in a_map else m.group(0)
|
||||
|
||||
def auftrag_remap(m: re.Match) -> str:
|
||||
alt = int(m.group(2))
|
||||
return f"{m.group(1)}{a_map[alt]}" if alt in a_map else m.group(0)
|
||||
|
||||
for z in d["sections"]: # PK ist baustein_id
|
||||
z = dict(z)
|
||||
z["baustein_id"] = b_map.get(z["baustein_id"])
|
||||
for feld in ("text_lang", "text_kompakt"):
|
||||
if z.get(feld):
|
||||
z[feld] = re.sub(r"<!--\s*atom:\s*(\d+)\s*\|", marker_remap, z[feld])
|
||||
# offene Fix-Aufträge nennen Atom-IDs im Klartext („Marker für Atom 123
|
||||
# fehlt") — mitremappen, sonst fixt der Prüfer gegen tote IDs
|
||||
if z.get("befunde"):
|
||||
z["befunde"] = db.j([re.sub(r"(Atom |Marker )(\d+)", auftrag_remap, str(a))
|
||||
for a in db.uj(z["befunde"])])
|
||||
db.insert("sections", **z)
|
||||
r_map = _einfuegen("runs", d["runs"])
|
||||
_einfuegen("befunde", d["befunde"], run_id=r_map)
|
||||
|
||||
Reference in New Issue
Block a user