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>
967 lines
28 KiB
Python
967 lines
28 KiB
Python
"""
|
|
BreakPilot Studio - System Info Module
|
|
|
|
Zeigt System-Informationen und Dokumentation an, analog zu den Admin-Seiten
|
|
im Next.js Frontend.
|
|
"""
|
|
|
|
|
|
class SystemInfoModule:
|
|
"""System-Info Modul fuer BreakPilot Studio."""
|
|
|
|
@staticmethod
|
|
def get_css() -> str:
|
|
"""CSS fuer das System-Info Panel."""
|
|
return """
|
|
/* ==========================================
|
|
SYSTEM INFO MODULE
|
|
========================================== */
|
|
|
|
#panel-system-info {
|
|
display: none;
|
|
flex-direction: column;
|
|
padding: 24px;
|
|
min-height: calc(100vh - 104px);
|
|
}
|
|
|
|
#panel-system-info.active {
|
|
display: flex;
|
|
}
|
|
|
|
.system-info-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: flex-start;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.system-info-title {
|
|
font-size: 24px;
|
|
font-weight: 700;
|
|
color: var(--bp-text);
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.system-info-subtitle {
|
|
font-size: 14px;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
.system-info-version {
|
|
padding: 6px 12px;
|
|
background: var(--bp-accent-soft);
|
|
color: var(--bp-accent);
|
|
border-radius: 999px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Privacy Notes */
|
|
.privacy-notes {
|
|
background: rgba(59, 130, 246, 0.1);
|
|
border: 1px solid rgba(59, 130, 246, 0.3);
|
|
border-radius: 12px;
|
|
padding: 16px;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.privacy-notes-title {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: #3b82f6;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.privacy-notes-list {
|
|
list-style: none;
|
|
}
|
|
|
|
.privacy-notes-list li {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 8px;
|
|
font-size: 13px;
|
|
color: #60a5fa;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.privacy-notes-list li::before {
|
|
content: "✓";
|
|
color: #3b82f6;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
/* Tabs */
|
|
.system-info-tabs {
|
|
display: flex;
|
|
gap: 16px;
|
|
border-bottom: 1px solid var(--bp-border);
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.system-info-tab {
|
|
padding: 12px 4px;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
color: var(--bp-text-muted);
|
|
cursor: pointer;
|
|
border-bottom: 2px solid transparent;
|
|
transition: all 0.2s;
|
|
background: none;
|
|
border-top: none;
|
|
border-left: none;
|
|
border-right: none;
|
|
}
|
|
|
|
.system-info-tab:hover {
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.system-info-tab.active {
|
|
color: var(--bp-primary);
|
|
border-bottom-color: var(--bp-primary);
|
|
}
|
|
|
|
/* Tab Content */
|
|
.system-info-content {
|
|
flex: 1;
|
|
min-height: 400px;
|
|
}
|
|
|
|
.tab-pane {
|
|
display: none;
|
|
}
|
|
|
|
.tab-pane.active {
|
|
display: block;
|
|
}
|
|
|
|
/* Features Section */
|
|
.features-grid {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
.feature-card {
|
|
background: var(--bp-surface-elevated);
|
|
border: 1px solid var(--bp-border);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
}
|
|
|
|
.feature-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.feature-name {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.feature-status {
|
|
padding: 2px 8px;
|
|
border-radius: 999px;
|
|
font-size: 11px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.feature-status.active {
|
|
background: rgba(34, 197, 94, 0.15);
|
|
color: #22c55e;
|
|
}
|
|
|
|
.feature-status.planned {
|
|
background: rgba(245, 158, 11, 0.15);
|
|
color: #f59e0b;
|
|
}
|
|
|
|
.feature-status.disabled {
|
|
background: rgba(100, 116, 139, 0.15);
|
|
color: #64748b;
|
|
}
|
|
|
|
.feature-description {
|
|
font-size: 13px;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
/* Architecture Section */
|
|
.architecture-diagram {
|
|
background: var(--bp-surface-elevated);
|
|
border: 1px solid var(--bp-border);
|
|
border-radius: 12px;
|
|
padding: 24px;
|
|
}
|
|
|
|
.architecture-layer {
|
|
margin-bottom: 16px;
|
|
padding: 16px;
|
|
border-radius: 8px;
|
|
border: 2px solid;
|
|
text-align: center;
|
|
}
|
|
|
|
.architecture-layer-title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.architecture-components {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
justify-content: center;
|
|
}
|
|
|
|
.architecture-component {
|
|
padding: 4px 12px;
|
|
border-radius: 4px;
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.architecture-arrow {
|
|
text-align: center;
|
|
color: var(--bp-text-muted);
|
|
font-size: 20px;
|
|
margin: 8px 0;
|
|
}
|
|
|
|
/* Roadmap Section */
|
|
.roadmap-phases {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
.roadmap-phase {
|
|
background: var(--bp-surface-elevated);
|
|
border: 1px solid var(--bp-border);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
}
|
|
|
|
.roadmap-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.roadmap-title {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.roadmap-priority {
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
font-size: 10px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.roadmap-priority.high {
|
|
background: rgba(239, 68, 68, 0.15);
|
|
color: #ef4444;
|
|
}
|
|
|
|
.roadmap-priority.medium {
|
|
background: rgba(245, 158, 11, 0.15);
|
|
color: #f59e0b;
|
|
}
|
|
|
|
.roadmap-priority.low {
|
|
background: rgba(59, 130, 246, 0.15);
|
|
color: #3b82f6;
|
|
}
|
|
|
|
.roadmap-items {
|
|
list-style: none;
|
|
}
|
|
|
|
.roadmap-items li {
|
|
font-size: 13px;
|
|
color: var(--bp-text-muted);
|
|
padding: 4px 0;
|
|
padding-left: 16px;
|
|
position: relative;
|
|
}
|
|
|
|
.roadmap-items li::before {
|
|
content: "•";
|
|
position: absolute;
|
|
left: 0;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
/* Technical Table */
|
|
.technical-table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
background: var(--bp-surface-elevated);
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.technical-table th,
|
|
.technical-table td {
|
|
padding: 12px 16px;
|
|
text-align: left;
|
|
font-size: 13px;
|
|
border-bottom: 1px solid var(--bp-border);
|
|
}
|
|
|
|
.technical-table th {
|
|
background: var(--bp-surface);
|
|
font-weight: 600;
|
|
color: var(--bp-text-muted);
|
|
text-transform: uppercase;
|
|
font-size: 11px;
|
|
}
|
|
|
|
.technical-table td {
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.technical-table tr:last-child td {
|
|
border-bottom: none;
|
|
}
|
|
|
|
/* Audit Section */
|
|
.audit-sections {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
.audit-section {
|
|
background: var(--bp-surface-elevated);
|
|
border: 1px solid var(--bp-border);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
}
|
|
|
|
.audit-section-title {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--bp-text);
|
|
margin-bottom: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
.audit-section-title::before {
|
|
content: "✓";
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 20px;
|
|
height: 20px;
|
|
background: var(--bp-primary);
|
|
color: white;
|
|
border-radius: 50%;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.audit-items {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
.audit-item {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 8px 0;
|
|
border-bottom: 1px solid var(--bp-border-subtle);
|
|
}
|
|
|
|
.audit-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.audit-item-label {
|
|
font-size: 13px;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
.audit-item-value {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.audit-item-value.ok {
|
|
background: rgba(34, 197, 94, 0.15);
|
|
color: #22c55e;
|
|
}
|
|
|
|
.audit-item-value.warning {
|
|
background: rgba(245, 158, 11, 0.15);
|
|
color: #f59e0b;
|
|
}
|
|
|
|
.audit-item-value.critical {
|
|
background: rgba(239, 68, 68, 0.15);
|
|
color: #ef4444;
|
|
}
|
|
|
|
/* Documentation Section */
|
|
.documentation-container {
|
|
background: var(--bp-bg);
|
|
color: var(--bp-text);
|
|
padding: 24px;
|
|
border-radius: 12px;
|
|
overflow: auto;
|
|
max-height: 600px;
|
|
}
|
|
|
|
.documentation-container h2 {
|
|
font-size: 20px;
|
|
margin: 24px 0 12px 0;
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.documentation-container h2:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.documentation-container h3 {
|
|
font-size: 16px;
|
|
margin: 20px 0 8px 0;
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.documentation-container p {
|
|
font-size: 14px;
|
|
line-height: 1.6;
|
|
margin-bottom: 12px;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
.documentation-container pre {
|
|
background: var(--bp-surface);
|
|
padding: 16px;
|
|
border-radius: 8px;
|
|
overflow-x: auto;
|
|
font-size: 12px;
|
|
font-family: 'Monaco', 'Menlo', monospace;
|
|
margin: 12px 0;
|
|
color: var(--bp-text);
|
|
}
|
|
|
|
.documentation-container ul,
|
|
.documentation-container ol {
|
|
margin: 12px 0;
|
|
padding-left: 24px;
|
|
}
|
|
|
|
.documentation-container li {
|
|
font-size: 14px;
|
|
margin-bottom: 4px;
|
|
color: var(--bp-text-muted);
|
|
}
|
|
|
|
.documentation-container table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
margin: 12px 0;
|
|
}
|
|
|
|
.documentation-container th,
|
|
.documentation-container td {
|
|
padding: 8px 12px;
|
|
border: 1px solid var(--bp-border);
|
|
text-align: left;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.documentation-container th {
|
|
background: var(--bp-surface);
|
|
}
|
|
|
|
/* Export Buttons */
|
|
.export-buttons {
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
gap: 12px;
|
|
margin-top: 16px;
|
|
}
|
|
"""
|
|
|
|
@staticmethod
|
|
def get_html() -> str:
|
|
"""HTML fuer das System-Info Panel."""
|
|
return """
|
|
<!-- SYSTEM INFO PANEL -->
|
|
<div id="panel-system-info" class="module-panel">
|
|
<!-- Header -->
|
|
<div class="system-info-header">
|
|
<div>
|
|
<h1 class="system-info-title">BreakPilot Studio - System Info</h1>
|
|
<p class="system-info-subtitle">Plattform-Dokumentation und technische Details</p>
|
|
</div>
|
|
<span class="system-info-version">Version 2.0</span>
|
|
</div>
|
|
|
|
<!-- Privacy Notes -->
|
|
<div class="privacy-notes">
|
|
<h3 class="privacy-notes-title">Datenschutz-Hinweise</h3>
|
|
<ul class="privacy-notes-list">
|
|
<li>Alle Daten werden DSGVO-konform verarbeitet</li>
|
|
<li>Verschluesselte Datenuebertragung (TLS 1.3)</li>
|
|
<li>Daten werden in deutschen Rechenzentren gehostet</li>
|
|
<li>Regelmaessige Sicherheitsaudits</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Tabs -->
|
|
<div class="system-info-tabs">
|
|
<button class="system-info-tab active" data-tab="overview">Uebersicht</button>
|
|
<button class="system-info-tab" data-tab="architecture">Architektur</button>
|
|
<button class="system-info-tab" data-tab="roadmap">Roadmap</button>
|
|
<button class="system-info-tab" data-tab="technical">Technisch</button>
|
|
<button class="system-info-tab" data-tab="audit">Audit</button>
|
|
<button class="system-info-tab" data-tab="documentation">Dokumentation</button>
|
|
</div>
|
|
|
|
<!-- Tab Content -->
|
|
<div class="system-info-content">
|
|
<!-- Overview Tab -->
|
|
<div id="tab-overview" class="tab-pane active">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Features</h3>
|
|
<div class="features-grid">
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Arbeitsblaetter-Generator</span>
|
|
<span class="feature-status active">Aktiv</span>
|
|
</div>
|
|
<p class="feature-description">KI-gestuetzte Erstellung von Arbeitsblaettern und Lernmaterialien</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Klausurkorrektur</span>
|
|
<span class="feature-status active">Aktiv</span>
|
|
</div>
|
|
<p class="feature-description">Automatische Klausurkorrektur mit OCR und KI-Bewertung</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Elternkommunikation</span>
|
|
<span class="feature-status active">Aktiv</span>
|
|
</div>
|
|
<p class="feature-description">Rechtssichere Elternbriefe und Benachrichtigungen</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Videokonferenzen</span>
|
|
<span class="feature-status active">Aktiv</span>
|
|
</div>
|
|
<p class="feature-description">Integrierte Jitsi-Videokonferenzen fuer Elterngespraeche</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Messenger</span>
|
|
<span class="feature-status active">Aktiv</span>
|
|
</div>
|
|
<p class="feature-description">Sichere Matrix-basierte Kommunikation</p>
|
|
</div>
|
|
<div class="feature-card">
|
|
<div class="feature-header">
|
|
<span class="feature-name">Unified Inbox</span>
|
|
<span class="feature-status planned">Geplant</span>
|
|
</div>
|
|
<p class="feature-description">Zentrale E-Mail-Verwaltung mit KI-Unterstuetzung</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Architecture Tab -->
|
|
<div id="tab-architecture" class="tab-pane">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">System-Architektur</h3>
|
|
<div class="architecture-diagram">
|
|
<div class="architecture-layer" style="border-color: #3b82f6; background: rgba(59, 130, 246, 0.1);">
|
|
<div class="architecture-layer-title" style="color: #3b82f6;">Frontend (Next.js / Python)</div>
|
|
<div class="architecture-components">
|
|
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">Admin Dashboard</span>
|
|
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">Studio UI</span>
|
|
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">API Routes</span>
|
|
</div>
|
|
</div>
|
|
<div class="architecture-arrow">↓</div>
|
|
<div class="architecture-layer" style="border-color: #8b5cf6; background: rgba(139, 92, 246, 0.1);">
|
|
<div class="architecture-layer-title" style="color: #8b5cf6;">Backend Services</div>
|
|
<div class="architecture-components">
|
|
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">FastAPI Backend</span>
|
|
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">Consent Service (Go)</span>
|
|
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">Klausur Service</span>
|
|
</div>
|
|
</div>
|
|
<div class="architecture-arrow">↓</div>
|
|
<div class="architecture-layer" style="border-color: #10b981; background: rgba(16, 185, 129, 0.1);">
|
|
<div class="architecture-layer-title" style="color: #10b981;">KI & Processing</div>
|
|
<div class="architecture-components">
|
|
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">OpenAI GPT-4o</span>
|
|
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">Claude 3.5</span>
|
|
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">vast.ai GPU</span>
|
|
</div>
|
|
</div>
|
|
<div class="architecture-arrow">↓</div>
|
|
<div class="architecture-layer" style="border-color: #f59e0b; background: rgba(245, 158, 11, 0.1);">
|
|
<div class="architecture-layer-title" style="color: #f59e0b;">Datenbanken</div>
|
|
<div class="architecture-components">
|
|
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">PostgreSQL</span>
|
|
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">Qdrant</span>
|
|
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">Valkey</span>
|
|
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">MinIO</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Roadmap Tab -->
|
|
<div id="tab-roadmap" class="tab-pane">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Optimierungs-Roadmap</h3>
|
|
<div class="roadmap-phases">
|
|
<div class="roadmap-phase">
|
|
<div class="roadmap-header">
|
|
<span class="roadmap-title">Phase 1: KI-Erweiterung</span>
|
|
<span class="roadmap-priority high">High</span>
|
|
</div>
|
|
<ul class="roadmap-items">
|
|
<li>Multi-Provider LLM-Unterstuetzung</li>
|
|
<li>Lokale Modelle mit Ollama</li>
|
|
<li>RAG-Verbesserungen</li>
|
|
<li>Automatische Qualitaetspruefung</li>
|
|
</ul>
|
|
</div>
|
|
<div class="roadmap-phase">
|
|
<div class="roadmap-header">
|
|
<span class="roadmap-title">Phase 2: Collaboration</span>
|
|
<span class="roadmap-priority medium">Medium</span>
|
|
</div>
|
|
<ul class="roadmap-items">
|
|
<li>Echtzeit-Zusammenarbeit</li>
|
|
<li>Kommentar-System</li>
|
|
<li>Versionskontrolle</li>
|
|
<li>Team-Workspaces</li>
|
|
</ul>
|
|
</div>
|
|
<div class="roadmap-phase">
|
|
<div class="roadmap-header">
|
|
<span class="roadmap-title">Phase 3: Analytics</span>
|
|
<span class="roadmap-priority low">Low</span>
|
|
</div>
|
|
<ul class="roadmap-items">
|
|
<li>Nutzungsstatistiken</li>
|
|
<li>Lernfortschritt-Tracking</li>
|
|
<li>KI-Insights</li>
|
|
<li>Reporting-Dashboard</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Technical Tab -->
|
|
<div id="tab-technical" class="tab-pane">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Technische Details</h3>
|
|
<table class="technical-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Komponente</th>
|
|
<th>Technologie</th>
|
|
<th>Version</th>
|
|
<th>Beschreibung</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Backend</td>
|
|
<td style="font-family: monospace;">FastAPI</td>
|
|
<td>0.109+</td>
|
|
<td>Python Async API</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Consent Service</td>
|
|
<td style="font-family: monospace;">Go + Gin</td>
|
|
<td>1.21+</td>
|
|
<td>DSGVO-Consent-Verwaltung</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Database</td>
|
|
<td style="font-family: monospace;">PostgreSQL</td>
|
|
<td>16</td>
|
|
<td>Relationale Daten</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Vector DB</td>
|
|
<td style="font-family: monospace;">Qdrant</td>
|
|
<td>1.12+</td>
|
|
<td>RAG & Semantic Search</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Cache</td>
|
|
<td style="font-family: monospace;">Valkey</td>
|
|
<td>8.x</td>
|
|
<td>Redis-kompatibel</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Storage</td>
|
|
<td style="font-family: monospace;">MinIO</td>
|
|
<td>Latest</td>
|
|
<td>S3-kompatibel</td>
|
|
</tr>
|
|
<tr>
|
|
<td>KI</td>
|
|
<td style="font-family: monospace;">OpenAI / Anthropic</td>
|
|
<td>GPT-4o / Claude 3.5</td>
|
|
<td>LLM Provider</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- Audit Tab -->
|
|
<div id="tab-audit" class="tab-pane">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Audit-relevante Informationen</h3>
|
|
<div class="audit-sections">
|
|
<div class="audit-section">
|
|
<h4 class="audit-section-title">DSGVO-Compliance</h4>
|
|
<div class="audit-items">
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Art. 7 Einwilligung</span>
|
|
<span class="audit-item-value ok">Implementiert</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Art. 13/14 Informationspflichten</span>
|
|
<span class="audit-item-value ok">Implementiert</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Art. 17 Recht auf Loeschung</span>
|
|
<span class="audit-item-value ok">Implementiert</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Art. 20 Datenportabilitaet</span>
|
|
<span class="audit-item-value ok">Implementiert</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="audit-section">
|
|
<h4 class="audit-section-title">Technische Sicherheit</h4>
|
|
<div class="audit-items">
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Verschluesselung</span>
|
|
<span class="audit-item-value ok">AES-256 at rest</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">TLS</span>
|
|
<span class="audit-item-value ok">1.3</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Audit-Log</span>
|
|
<span class="audit-item-value ok">Lueckenlos</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Backup</span>
|
|
<span class="audit-item-value ok">Taeglich, 30 Tage</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="audit-section">
|
|
<h4 class="audit-section-title">Betrieb</h4>
|
|
<div class="audit-items">
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Hosting</span>
|
|
<span class="audit-item-value ok">Deutschland (Hetzner)</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Uptime SLA</span>
|
|
<span class="audit-item-value ok">> 99.9%</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Monitoring</span>
|
|
<span class="audit-item-value ok">24/7</span>
|
|
</div>
|
|
<div class="audit-item">
|
|
<span class="audit-item-label">Penetration Tests</span>
|
|
<span class="audit-item-value warning">Quartalsweise</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Documentation Tab -->
|
|
<div id="tab-documentation" class="tab-pane">
|
|
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Vollstaendige Dokumentation</h3>
|
|
<div class="documentation-container">
|
|
<h2>BreakPilot Studio - Plattformdokumentation</h2>
|
|
|
|
<h3>1. Uebersicht</h3>
|
|
<p>BreakPilot Studio ist eine umfassende Plattform fuer Lehrkraefte zur Erstellung von Lernmaterialien, Klausurkorrektur und Elternkommunikation. Die Plattform nutzt modernste KI-Technologie fuer automatisierte Workflows.</p>
|
|
|
|
<h3>2. Module</h3>
|
|
<table>
|
|
<tr><th>Modul</th><th>Beschreibung</th><th>Status</th></tr>
|
|
<tr><td>Arbeitsblaetter</td><td>KI-gestuetzte Erstellung von Lernmaterialien</td><td>Aktiv</td></tr>
|
|
<tr><td>Klausurkorrektur</td><td>Automatische Korrektur mit Feedback</td><td>Aktiv</td></tr>
|
|
<tr><td>Elternbriefe</td><td>Rechtssichere Kommunikation</td><td>Aktiv</td></tr>
|
|
<tr><td>Videokonferenz</td><td>Integrierte Jitsi-Meetings</td><td>Aktiv</td></tr>
|
|
<tr><td>Messenger</td><td>Matrix-basierte Kommunikation</td><td>Aktiv</td></tr>
|
|
<tr><td>Content Creator</td><td>Interaktive Lerneinheiten</td><td>Aktiv</td></tr>
|
|
</table>
|
|
|
|
<h3>3. API-Dokumentation</h3>
|
|
<p>Die API ist unter <code>/docs</code> (Swagger) und <code>/redoc</code> (ReDoc) dokumentiert.</p>
|
|
<pre>
|
|
# Beispiel: Arbeitsblatt generieren
|
|
POST /api/worksheets/generate
|
|
{
|
|
"topic": "Quadratische Funktionen",
|
|
"grade": 10,
|
|
"difficulty": "medium"
|
|
}
|
|
</pre>
|
|
|
|
<h3>4. Sicherheit</h3>
|
|
<ul>
|
|
<li>JWT-basierte Authentifizierung</li>
|
|
<li>Role-Based Access Control (RBAC)</li>
|
|
<li>Verschluesselte Datenspeicherung</li>
|
|
<li>Regelmaessige Security-Audits</li>
|
|
</ul>
|
|
|
|
<h3>5. Datenschutz</h3>
|
|
<p>Alle personenbezogenen Daten werden DSGVO-konform verarbeitet. Details finden sich in der Datenschutzerklaerung.</p>
|
|
|
|
<h3>6. Support</h3>
|
|
<p>Bei Fragen oder Problemen wenden Sie sich an den Support unter support@breakpilot.de</p>
|
|
</div>
|
|
|
|
<div class="export-buttons">
|
|
<button class="btn btn-ghost" onclick="exportSystemInfoJSON()">JSON Export</button>
|
|
<button class="btn btn-primary" onclick="printSystemInfo()">Drucken / PDF</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
"""
|
|
|
|
@staticmethod
|
|
def get_js() -> str:
|
|
"""JavaScript fuer das System-Info Panel."""
|
|
return """
|
|
// ==========================================
|
|
// SYSTEM INFO MODULE
|
|
// ==========================================
|
|
|
|
console.log('System Info Module loaded');
|
|
|
|
// Tab-Wechsel
|
|
document.querySelectorAll('.system-info-tab').forEach(tab => {
|
|
tab.addEventListener('click', function() {
|
|
const tabId = this.dataset.tab;
|
|
|
|
// Alle Tabs deaktivieren
|
|
document.querySelectorAll('.system-info-tab').forEach(t => t.classList.remove('active'));
|
|
document.querySelectorAll('.tab-pane').forEach(p => p.classList.remove('active'));
|
|
|
|
// Ausgewaehlten Tab aktivieren
|
|
this.classList.add('active');
|
|
document.getElementById('tab-' + tabId).classList.add('active');
|
|
});
|
|
});
|
|
|
|
// JSON Export
|
|
function exportSystemInfoJSON() {
|
|
const data = {
|
|
title: 'BreakPilot Studio System-Info',
|
|
version: '2.0',
|
|
exported_at: new Date().toISOString(),
|
|
features: [
|
|
{ name: 'Arbeitsblaetter-Generator', status: 'active' },
|
|
{ name: 'Klausurkorrektur', status: 'active' },
|
|
{ name: 'Elternkommunikation', status: 'active' },
|
|
{ name: 'Videokonferenzen', status: 'active' },
|
|
{ name: 'Messenger', status: 'active' },
|
|
{ name: 'Unified Inbox', status: 'planned' }
|
|
],
|
|
technical: [
|
|
{ component: 'Backend', technology: 'FastAPI', version: '0.109+' },
|
|
{ component: 'Consent Service', technology: 'Go + Gin', version: '1.21+' },
|
|
{ component: 'Database', technology: 'PostgreSQL', version: '16' },
|
|
{ component: 'Vector DB', technology: 'Qdrant', version: '1.12+' },
|
|
{ component: 'Cache', technology: 'Valkey', version: '8.x' }
|
|
]
|
|
};
|
|
|
|
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = 'breakpilot-system-info.json';
|
|
a.click();
|
|
URL.revokeObjectURL(url);
|
|
}
|
|
|
|
// Print/PDF
|
|
function printSystemInfo() {
|
|
const printWindow = window.open('', '_blank');
|
|
if (printWindow) {
|
|
const docContent = document.querySelector('.documentation-container')?.innerHTML || '';
|
|
printWindow.document.write(`
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>BreakPilot Studio - System-Info</title>
|
|
<style>
|
|
body { font-family: system-ui, sans-serif; padding: 40px; max-width: 800px; margin: 0 auto; }
|
|
h1, h2, h3 { color: #1e293b; }
|
|
pre { background: #f1f5f9; padding: 12px; border-radius: 6px; overflow-x: auto; }
|
|
code { background: #f1f5f9; padding: 2px 6px; border-radius: 4px; }
|
|
table { border-collapse: collapse; width: 100%; margin: 16px 0; }
|
|
th, td { border: 1px solid #e2e8f0; padding: 8px 12px; text-align: left; }
|
|
th { background: #f8fafc; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>BreakPilot Studio - System-Info</h1>
|
|
<p><em>Exportiert am: ${new Date().toLocaleString('de-DE')}</em></p>
|
|
<hr>
|
|
${docContent}
|
|
</body>
|
|
</html>
|
|
`);
|
|
printWindow.document.close();
|
|
printWindow.print();
|
|
}
|
|
}
|
|
|
|
// Show System Info Panel
|
|
function showSystemInfoPanel() {
|
|
console.log('Showing System Info Panel');
|
|
}
|
|
|
|
// Load function for module loader
|
|
function loadSystemInfoModule() {
|
|
console.log('System Info Module initialized');
|
|
showSystemInfoPanel();
|
|
}
|
|
|
|
// Expose globally
|
|
window.loadSystemInfoModule = loadSystemInfoModule;
|
|
window.exportSystemInfoJSON = exportSystemInfoJSON;
|
|
window.printSystemInfo = printSystemInfo;
|
|
"""
|