A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
2.1 KiB
Python
74 lines
2.1 KiB
Python
import re
|
|
from pathlib import Path
|
|
|
|
|
|
def extract_app_ui_body(source_text: str) -> str:
|
|
"""
|
|
Extrahiert den HTML-Block aus der alten app_ui()-Funktion.
|
|
"""
|
|
match = re.search(r"def app_ui[^(]*\([^)]*\):\s*\n(\s*)return \"\"\"", source_text)
|
|
if not match:
|
|
raise RuntimeError("Konnte def app_ui() mit return \"\"\" nicht finden.")
|
|
|
|
indent = match.group(1)
|
|
start = match.end() # direkt hinter return \"\"\" beginnt der HTML-Code
|
|
close_pattern = "\n" + indent + '"""'
|
|
end = source_text.find(close_pattern, start)
|
|
|
|
if end == -1:
|
|
raise RuntimeError("Konnte schließende \"\"\" nicht finden.")
|
|
|
|
body = source_text[start:end]
|
|
return body
|
|
|
|
|
|
def build_frontend_studio_file(html_body: str) -> str:
|
|
"""
|
|
Baut die vollständige Datei studio.py mit APIRouter + HTML-Block.
|
|
"""
|
|
header = (
|
|
"from fastapi import APIRouter\n"
|
|
"from fastapi.responses import HTMLResponse\n\n"
|
|
"router = APIRouter()\n\n\n"
|
|
"@router.get(\"/app\", response_class=HTMLResponse)\n"
|
|
"def app_ui():\n"
|
|
" return \"\"\""
|
|
)
|
|
|
|
footer = "\n \"\"\"\n"
|
|
return header + html_body + footer
|
|
|
|
|
|
def main():
|
|
backend_dir = Path(__file__).parent
|
|
|
|
# 1) Sicherungsdatei bevorzugt
|
|
backup_path = backend_dir / "frontend_app_backup.py"
|
|
if backup_path.exists():
|
|
source_path = backup_path
|
|
print(f"Verwende Sicherungsdatei: {source_path}")
|
|
else:
|
|
# 2) Fallback auf frontend/app.py
|
|
candidate = backend_dir / "frontend" / "app.py"
|
|
if not candidate.exists():
|
|
raise RuntimeError(
|
|
"Keine Quelle gefunden: frontend_app_backup.py oder frontend/app.py fehlen."
|
|
)
|
|
source_path = candidate
|
|
print(f"Verwende Datei: {source_path}")
|
|
|
|
source_text = source_path.read_text(encoding="utf-8")
|
|
html_body = extract_app_ui_body(source_text)
|
|
|
|
studio_text = build_frontend_studio_file(html_body)
|
|
|
|
studio_path = backend_dir / "frontend" / "studio.py"
|
|
studio_path.write_text(studio_text, encoding="utf-8")
|
|
|
|
print(f"frontend/studio.py erfolgreich erzeugt: {studio_path}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|