🎉 Update project documentation and conversion scripts to Markdown format, optimize logs directory structure. 🐛
This commit is contained in:
parent
a27b978fc5
commit
31d1a3eaf6
Binary file not shown.
@ -0,0 +1,442 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Erweiterte Konvertierung der IHK-Projektdokumentation von Markdown nach Word (DOCX)
|
||||
mit vollständiger IHK-konformer Formatierung.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
from docx import Document
|
||||
from docx.shared import Pt, Inches, RGBColor, Cm
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
|
||||
from docx.enum.style import WD_STYLE_TYPE
|
||||
from docx.enum.section import WD_SECTION
|
||||
from docx.oxml import OxmlElement
|
||||
from docx.oxml.ns import qn
|
||||
|
||||
def create_element(name):
|
||||
"""Hilfsfunktion zum Erstellen von XML-Elementen"""
|
||||
return OxmlElement(name)
|
||||
|
||||
def create_attribute(element, name, value):
|
||||
"""Hilfsfunktion zum Setzen von XML-Attributen"""
|
||||
element.set(qn(name), value)
|
||||
|
||||
def add_page_numbers(doc):
|
||||
"""Fügt Seitenzahlen in die Fußzeile ein"""
|
||||
for section in doc.sections:
|
||||
footer = section.footer
|
||||
footer_para = footer.paragraphs[0]
|
||||
footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
|
||||
# Füge Seitenzahl hinzu
|
||||
fldChar1 = create_element('w:fldChar')
|
||||
create_attribute(fldChar1, 'w:fldCharType', 'begin')
|
||||
|
||||
instrText = create_element('w:instrText')
|
||||
instrText.text = " PAGE "
|
||||
|
||||
fldChar2 = create_element('w:fldChar')
|
||||
create_attribute(fldChar2, 'w:fldCharType', 'end')
|
||||
|
||||
footer_para._p.append(fldChar1)
|
||||
footer_para._p.append(instrText)
|
||||
footer_para._p.append(fldChar2)
|
||||
|
||||
def add_header(doc):
|
||||
"""Fügt Kopfzeile mit Projektinformationen hinzu"""
|
||||
for section in doc.sections[1:]: # Skip erste Seite (Titelseite)
|
||||
header = section.header
|
||||
header_para = header.paragraphs[0]
|
||||
header_para.text = "IHK-Projektdokumentation - MYP – Manage Your Printer"
|
||||
header_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
header_para.style.font.size = Pt(10)
|
||||
header_para.style.font.italic = True
|
||||
|
||||
def create_ihk_styles(doc):
|
||||
"""Erstellt erweiterte IHK-konforme Formatvorlagen"""
|
||||
|
||||
# Normaler Text mit IHK-Spezifikationen
|
||||
normal_style = doc.styles['Normal']
|
||||
normal_style.font.name = 'Arial'
|
||||
normal_style.font.size = Pt(11)
|
||||
normal_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
|
||||
normal_style.paragraph_format.space_after = Pt(6)
|
||||
normal_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
|
||||
normal_style.paragraph_format.first_line_indent = Cm(0.5) # Einzug erste Zeile
|
||||
|
||||
# Überschrift 1 - Hauptkapitel
|
||||
h1_style = doc.styles['Heading 1']
|
||||
h1_style.font.name = 'Arial'
|
||||
h1_style.font.size = Pt(16)
|
||||
h1_style.font.bold = True
|
||||
h1_style.font.color.rgb = RGBColor(0, 0, 0)
|
||||
h1_style.paragraph_format.space_before = Pt(24)
|
||||
h1_style.paragraph_format.space_after = Pt(12)
|
||||
h1_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
||||
h1_style.paragraph_format.keep_with_next = True
|
||||
h1_style.paragraph_format.page_break_before = False # Kein automatischer Seitenumbruch
|
||||
|
||||
# Überschrift 2 - Unterkapitel
|
||||
h2_style = doc.styles['Heading 2']
|
||||
h2_style.font.name = 'Arial'
|
||||
h2_style.font.size = Pt(14)
|
||||
h2_style.font.bold = True
|
||||
h2_style.font.color.rgb = RGBColor(0, 0, 0)
|
||||
h2_style.paragraph_format.space_before = Pt(18)
|
||||
h2_style.paragraph_format.space_after = Pt(6)
|
||||
h2_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
||||
h2_style.paragraph_format.keep_with_next = True
|
||||
|
||||
# Überschrift 3 - Abschnitte
|
||||
h3_style = doc.styles['Heading 3']
|
||||
h3_style.font.name = 'Arial'
|
||||
h3_style.font.size = Pt(12)
|
||||
h3_style.font.bold = True
|
||||
h3_style.font.color.rgb = RGBColor(0, 0, 0)
|
||||
h3_style.paragraph_format.space_before = Pt(12)
|
||||
h3_style.paragraph_format.space_after = Pt(6)
|
||||
h3_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
||||
h3_style.paragraph_format.keep_with_next = True
|
||||
|
||||
# Aufzählungsstil
|
||||
bullet_style = doc.styles['List Bullet']
|
||||
bullet_style.font.name = 'Arial'
|
||||
bullet_style.font.size = Pt(11)
|
||||
bullet_style.paragraph_format.left_indent = Cm(1.0)
|
||||
bullet_style.paragraph_format.first_line_indent = Cm(-0.5)
|
||||
bullet_style.paragraph_format.space_after = Pt(3)
|
||||
|
||||
# Code-Style für technische Begriffe
|
||||
try:
|
||||
code_style = doc.styles.add_style('Code', WD_STYLE_TYPE.CHARACTER)
|
||||
except:
|
||||
code_style = doc.styles['Code']
|
||||
code_style.font.name = 'Courier New'
|
||||
code_style.font.size = Pt(10)
|
||||
code_style.font.color.rgb = RGBColor(0, 0, 139) # Dunkelblau
|
||||
|
||||
# Zitat-Style
|
||||
try:
|
||||
quote_style = doc.styles.add_style('Quote', WD_STYLE_TYPE.PARAGRAPH)
|
||||
except:
|
||||
quote_style = doc.styles['Quote']
|
||||
quote_style.font.name = 'Arial'
|
||||
quote_style.font.size = Pt(10)
|
||||
quote_style.font.italic = True
|
||||
quote_style.paragraph_format.left_indent = Cm(1.0)
|
||||
quote_style.paragraph_format.right_indent = Cm(1.0)
|
||||
quote_style.paragraph_format.space_before = Pt(6)
|
||||
quote_style.paragraph_format.space_after = Pt(6)
|
||||
|
||||
return doc
|
||||
|
||||
def setup_document_layout(doc):
|
||||
"""Richtet das erweiterte Dokumentlayout nach IHK-Vorgaben ein"""
|
||||
for section in doc.sections:
|
||||
# IHK-Standard Seitenränder
|
||||
section.top_margin = Cm(2.5)
|
||||
section.bottom_margin = Cm(2.0)
|
||||
section.left_margin = Cm(2.5)
|
||||
section.right_margin = Cm(2.0)
|
||||
|
||||
# A4 Format
|
||||
section.page_height = Cm(29.7)
|
||||
section.page_width = Cm(21.0)
|
||||
|
||||
# Kopf- und Fußzeilenabstand
|
||||
section.header_distance = Cm(1.25)
|
||||
section.footer_distance = Cm(1.25)
|
||||
|
||||
def add_enhanced_title_page(doc):
|
||||
"""Fügt eine erweiterte IHK-konforme Titelseite hinzu"""
|
||||
|
||||
# Logo-Platzhalter
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
p.add_run('[Mercedes-Benz Logo]').italic = True
|
||||
|
||||
# Leerzeilen
|
||||
for _ in range(3):
|
||||
doc.add_paragraph()
|
||||
|
||||
# Prüfungsinformationen
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Abschlussprüfung Sommer 2025')
|
||||
run.font.size = Pt(14)
|
||||
run.font.bold = True
|
||||
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Industrie- und Handelskammer Berlin')
|
||||
run.font.size = Pt(12)
|
||||
|
||||
doc.add_paragraph()
|
||||
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Fachinformatiker für digitale Vernetzung')
|
||||
run.font.size = Pt(16)
|
||||
run.font.bold = True
|
||||
|
||||
for _ in range(2):
|
||||
doc.add_paragraph()
|
||||
|
||||
# Dokumenttyp
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Dokumentation der betrieblichen Projektarbeit')
|
||||
run.font.size = Pt(14)
|
||||
|
||||
for _ in range(2):
|
||||
doc.add_paragraph()
|
||||
|
||||
# Projekttitel
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('MYP – Manage Your Printer')
|
||||
run.font.size = Pt(20)
|
||||
run.font.bold = True
|
||||
|
||||
doc.add_paragraph()
|
||||
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
p.add_run('Digitalisierung des 3D-Drucker-Reservierungsprozesses\n')
|
||||
p.add_run('durch Etablierung der cyberphysischen Kommunikation\n')
|
||||
p.add_run('mit relevanten Hardwarekomponenten')
|
||||
|
||||
# Füllung
|
||||
for _ in range(6):
|
||||
doc.add_paragraph()
|
||||
|
||||
# Informationsblock am Seitenende
|
||||
table = doc.add_table(rows=2, cols=2)
|
||||
table.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
table.style = 'Table Grid'
|
||||
|
||||
# Ausbildungsbetrieb
|
||||
cell = table.cell(0, 0)
|
||||
p = cell.paragraphs[0]
|
||||
p.add_run('Ausbildungsbetrieb:').bold = True
|
||||
cell.add_paragraph('Mercedes-Benz AG')
|
||||
cell.add_paragraph('Daimlerstraße 143')
|
||||
cell.add_paragraph('12277 Berlin')
|
||||
|
||||
# Prüfungsbewerber
|
||||
cell = table.cell(0, 1)
|
||||
p = cell.paragraphs[0]
|
||||
p.add_run('Prüfungsbewerber:').bold = True
|
||||
cell.add_paragraph('Till Tomczak')
|
||||
cell.add_paragraph('Hainbuchenstraße 19')
|
||||
cell.add_paragraph('16761 Hennigsdorf')
|
||||
|
||||
# Abgabedatum
|
||||
cell = table.cell(1, 0)
|
||||
p = cell.paragraphs[0]
|
||||
p.add_run('Abgabedatum:').bold = True
|
||||
cell.add_paragraph('5. Juni 2025')
|
||||
|
||||
# Prüflingsnummer
|
||||
cell = table.cell(1, 1)
|
||||
p = cell.paragraphs[0]
|
||||
p.add_run('Prüflingsnummer:').bold = True
|
||||
cell.add_paragraph('[Wird von IHK vergeben]')
|
||||
|
||||
# Seitenumbruch
|
||||
doc.add_page_break()
|
||||
|
||||
def process_enhanced_content(content):
|
||||
"""Erweiterte Verarbeitung des Markdown-Inhalts"""
|
||||
# Entferne den Header-Bereich
|
||||
content = re.sub(r'^.*?(?=# 1\. Einleitung)', '', content, flags=re.DOTALL)
|
||||
|
||||
# Verbessere Formatierung
|
||||
content = re.sub(r'–', '–', content) # Korrekter Gedankenstrich
|
||||
content = re.sub(r'\.\.\.', '…', content) # Auslassungspunkte
|
||||
content = re.sub(r'"([^"]*)"', '„\\1"', content) # Deutsche Anführungszeichen
|
||||
|
||||
return content
|
||||
|
||||
def add_enhanced_content(doc, content):
|
||||
"""Fügt Inhalt mit erweiterter Formatierung hinzu"""
|
||||
lines = content.split('\n')
|
||||
current_paragraph = None
|
||||
in_list = False
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
# Überschriften
|
||||
if line.startswith('# '):
|
||||
heading = line[2:].strip()
|
||||
doc.add_heading(heading, level=1)
|
||||
current_paragraph = None
|
||||
in_list = False
|
||||
|
||||
elif line.startswith('## '):
|
||||
heading = line[3:].strip()
|
||||
doc.add_heading(heading, level=2)
|
||||
current_paragraph = None
|
||||
in_list = False
|
||||
|
||||
elif line.startswith('### '):
|
||||
heading = line[4:].strip()
|
||||
doc.add_heading(heading, level=3)
|
||||
current_paragraph = None
|
||||
in_list = False
|
||||
|
||||
elif line.startswith('#### '):
|
||||
heading = line[5:].strip()
|
||||
p = doc.add_paragraph()
|
||||
p.add_run(heading + ':').bold = True
|
||||
current_paragraph = None
|
||||
in_list = False
|
||||
|
||||
# Listen
|
||||
elif line.strip().startswith('- '):
|
||||
text = line.strip()[2:]
|
||||
p = doc.add_paragraph(text, style='List Bullet')
|
||||
in_list = True
|
||||
current_paragraph = None
|
||||
|
||||
# Normaler Text
|
||||
elif line.strip():
|
||||
if not in_list:
|
||||
if current_paragraph is None:
|
||||
current_paragraph = doc.add_paragraph()
|
||||
else:
|
||||
current_paragraph.add_run(' ')
|
||||
|
||||
process_enhanced_inline_formatting(current_paragraph, line.strip())
|
||||
else:
|
||||
in_list = False
|
||||
current_paragraph = doc.add_paragraph()
|
||||
process_enhanced_inline_formatting(current_paragraph, line.strip())
|
||||
|
||||
# Leerzeile
|
||||
else:
|
||||
current_paragraph = None
|
||||
if not in_list:
|
||||
in_list = False
|
||||
|
||||
def process_enhanced_inline_formatting(paragraph, text):
|
||||
"""Erweiterte Inline-Formatierung mit besserer Erkennung"""
|
||||
# Komplexere Regex für verschachtelte Formatierungen
|
||||
pattern = r'(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`|„[^"]+"|‚[^\']+\')'
|
||||
parts = re.split(pattern, text)
|
||||
|
||||
for part in parts:
|
||||
if not part:
|
||||
continue
|
||||
|
||||
if part.startswith('**') and part.endswith('**'):
|
||||
# Fett
|
||||
paragraph.add_run(part[2:-2]).bold = True
|
||||
elif part.startswith('*') and part.endswith('*') and not part.startswith('**'):
|
||||
# Kursiv
|
||||
paragraph.add_run(part[1:-1]).italic = True
|
||||
elif part.startswith('`') and part.endswith('`'):
|
||||
# Code/Technische Begriffe
|
||||
run = paragraph.add_run(part[1:-1])
|
||||
run.font.name = 'Courier New'
|
||||
run.font.size = Pt(10)
|
||||
run.font.color.rgb = RGBColor(0, 0, 139)
|
||||
elif part.startswith('„') or part.startswith('"'):
|
||||
# Zitate
|
||||
run = paragraph.add_run(part)
|
||||
run.italic = True
|
||||
else:
|
||||
# Normaler Text
|
||||
paragraph.add_run(part)
|
||||
|
||||
def add_appendix_placeholder(doc):
|
||||
"""Fügt Platzhalter für Anhänge hinzu"""
|
||||
doc.add_page_break()
|
||||
doc.add_heading('Anlagen', level=1)
|
||||
|
||||
doc.add_heading('A. Netzwerkdiagramme und Systemarchitektur', level=2)
|
||||
p = doc.add_paragraph('[Hier Netzwerkdiagramme einfügen]')
|
||||
p.italic = True
|
||||
|
||||
doc.add_heading('B. API-Dokumentation', level=2)
|
||||
p = doc.add_paragraph('[Hier API-Dokumentation einfügen]')
|
||||
p.italic = True
|
||||
|
||||
doc.add_heading('C. Benutzerhandbuch', level=2)
|
||||
p = doc.add_paragraph('[Hier Benutzerhandbuch einfügen]')
|
||||
p.italic = True
|
||||
|
||||
doc.add_heading('D. Testprotokolle', level=2)
|
||||
p = doc.add_paragraph('[Hier Testprotokolle einfügen]')
|
||||
p.italic = True
|
||||
|
||||
doc.add_heading('E. Screenshots der Benutzeroberfläche', level=2)
|
||||
p = doc.add_paragraph('[Hier Screenshots einfügen]')
|
||||
p.italic = True
|
||||
|
||||
doc.add_heading('F. Konfigurationsdateien und Deployment-Skripte', level=2)
|
||||
p = doc.add_paragraph('[Hier relevante Konfigurationsdateien einfügen]')
|
||||
p.italic = True
|
||||
|
||||
def main():
|
||||
"""Hauptfunktion"""
|
||||
input_file = 'Dokumentation_Final_Markdown/Dokumentation.md'
|
||||
output_file = 'IHK_Projektdokumentation_Final_Enhanced.docx'
|
||||
|
||||
print("Lese Markdown-Datei...")
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
print("Erstelle Word-Dokument mit erweiterten IHK-Formatierungen...")
|
||||
doc = Document()
|
||||
|
||||
# Konfiguration
|
||||
print("Konfiguriere Dokumentlayout und Styles...")
|
||||
create_ihk_styles(doc)
|
||||
setup_document_layout(doc)
|
||||
|
||||
# Titelseite
|
||||
print("Erstelle erweiterte Titelseite...")
|
||||
add_enhanced_title_page(doc)
|
||||
|
||||
# Kopf- und Fußzeilen
|
||||
print("Füge Kopf- und Fußzeilen hinzu...")
|
||||
add_header(doc)
|
||||
add_page_numbers(doc)
|
||||
|
||||
# Inhaltsverzeichnis
|
||||
print("Füge Inhaltsverzeichnis-Platzhalter hinzu...")
|
||||
doc.add_heading('Inhaltsverzeichnis', level=1)
|
||||
p = doc.add_paragraph()
|
||||
p.add_run('Bitte generieren Sie das Inhaltsverzeichnis über:\n')
|
||||
p.add_run('Verweise → Inhaltsverzeichnis → Automatisches Verzeichnis 1\n\n')
|
||||
p.add_run('Stellen Sie sicher, dass alle Überschriften korrekt als Überschrift 1-3 formatiert sind.')
|
||||
p.italic = True
|
||||
doc.add_page_break()
|
||||
|
||||
# Hauptinhalt
|
||||
print("Verarbeite und füge Hauptinhalt hinzu...")
|
||||
processed_content = process_enhanced_content(content)
|
||||
add_enhanced_content(doc, processed_content)
|
||||
|
||||
# Anhänge
|
||||
print("Füge Anhang-Platzhalter hinzu...")
|
||||
add_appendix_placeholder(doc)
|
||||
|
||||
# Speichern
|
||||
print(f"Speichere Dokument als {output_file}...")
|
||||
doc.save(output_file)
|
||||
|
||||
print("\nKonvertierung erfolgreich abgeschlossen!")
|
||||
print("\nWichtige Nachbearbeitungsschritte:")
|
||||
print("1. Generieren Sie das Inhaltsverzeichnis (Verweise → Inhaltsverzeichnis)")
|
||||
print("2. Überprüfen Sie alle Seitenumbrüche")
|
||||
print("3. Fügen Sie fehlende Abbildungen und Diagramme ein")
|
||||
print("4. Prüfen Sie die Seitennummerierung")
|
||||
print("5. Ergänzen Sie die Anlagen mit den tatsächlichen Dokumenten")
|
||||
print("6. Führen Sie eine finale Rechtschreibprüfung durch")
|
||||
print("\nDie Datei entspricht nun den IHK-Formatvorgaben!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -128,3 +128,4 @@
|
||||
2025-06-03 22:00:22 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||
2025-06-03 22:15:15 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||
2025-06-03 22:15:51 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||
2025-06-03 23:03:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
|
||||
|
@ -937,3 +937,4 @@
|
||||
2025-06-03 20:42:22 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1
|
||||
2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🕒 Automatische Abmeldung: Benutzer admin@mercedes-benz.com war 85.0 Minuten inaktiv (Limit: 60min)
|
||||
2025-06-03 22:15:28 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 10.0.2.2
|
||||
2025-06-03 23:04:06 - [auth] auth - [WARNING] WARNING - ⚠️ IP-Adresse geändert für Benutzer admin@mercedes-benz.com: 10.0.2.2 → 127.0.0.1
|
||||
|
@ -133,3 +133,4 @@
|
||||
2025-06-03 22:00:22 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||
2025-06-03 22:15:15 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||
2025-06-03 22:15:51 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||
2025-06-03 23:03:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
|
||||
|
@ -514,3 +514,7 @@
|
||||
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit eventlet initialisiert
|
||||
2025-06-03 22:15:51 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: eventlet)
|
||||
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
|
||||
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
|
||||
2025-06-03 23:04:00 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
|
||||
|
@ -129,3 +129,4 @@
|
||||
2025-06-03 22:00:22 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||
2025-06-03 22:15:15 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||
2025-06-03 22:15:51 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||
2025-06-03 23:03:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
|
||||
|
@ -49,3 +49,6 @@
|
||||
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
|
||||
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
|
||||
2025-06-03 22:15:51 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
|
||||
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
|
||||
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
|
||||
2025-06-03 23:04:01 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
|
||||
|
@ -125,3 +125,4 @@
|
||||
2025-06-03 22:00:23 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||
2025-06-03 22:15:16 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||
2025-06-03 22:15:51 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||
2025-06-03 23:04:00 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
|
||||
|
@ -46,3 +46,7 @@
|
||||
2025-06-03 22:15:51 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
|
||||
2025-06-03 22:15:51 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked
|
||||
2025-06-03 22:15:51 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database
|
||||
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert
|
||||
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet
|
||||
2025-06-03 23:04:01 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked
|
||||
2025-06-03 23:04:01 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database
|
||||
|
@ -256,3 +256,5 @@
|
||||
2025-06-03 22:15:16 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
2025-06-03 22:15:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
2025-06-03 22:15:51 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
2025-06-03 23:04:00 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
|
||||
|
@ -254,3 +254,5 @@
|
||||
2025-06-03 22:15:16 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
2025-06-03 22:15:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
2025-06-03 22:15:51 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
2025-06-03 23:04:00 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
|
||||
|
@ -127,3 +127,4 @@
|
||||
2025-06-03 22:00:23 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||
2025-06-03 22:15:16 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||
2025-06-03 22:15:51 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||
2025-06-03 23:04:00 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
|
||||
|
@ -3449,3 +3449,13 @@
|
||||
2025-06-03 22:16:14 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
|
||||
2025-06-03 22:16:14 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden
|
||||
2025-06-03 22:16:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
|
||||
2025-06-03 23:03:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
|
||||
2025-06-03 23:03:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
|
||||
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
|
||||
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
|
||||
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
|
||||
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
|
||||
2025-06-03 23:04:01 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden
|
||||
2025-06-03 23:04:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
|
||||
2025-06-03 23:04:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
|
||||
2025-06-03 23:04:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
|
||||
|
@ -32264,3 +32264,34 @@
|
||||
2025-06-03 22:16:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fba8c4e5710>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 22:16:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten
|
||||
2025-06-03 22:16:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2
|
||||
2025-06-03 23:03:59 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
|
||||
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
|
||||
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
|
||||
2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test
|
||||
2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DADBB60>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten
|
||||
2025-06-03 23:04:03 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test
|
||||
2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA2A350>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten
|
||||
2025-06-03 23:04:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test
|
||||
2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA2AE90>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten
|
||||
2025-06-03 23:04:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test
|
||||
2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA7D810>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten
|
||||
2025-06-03 23:04:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test
|
||||
2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DA7FE10>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten
|
||||
2025-06-03 23:04:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test
|
||||
2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22DAE28D0>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten
|
||||
2025-06-03 23:04:14 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test
|
||||
2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02C5A0>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten
|
||||
2025-06-03 23:04:16 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test
|
||||
2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02CF30>, 'Connection to 192.168.0.103 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten
|
||||
2025-06-03 23:04:18 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi
|
||||
2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001F22F02D260>, 'Connection to 192.168.0.104 timed out. (connect timeout=2)'))
|
||||
2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten
|
||||
2025-06-03 23:04:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi
|
||||
|
@ -127,3 +127,4 @@
|
||||
2025-06-03 22:00:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||
2025-06-03 22:15:16 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||
2025-06-03 22:15:51 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||
2025-06-03 23:04:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
|
||||
|
@ -221,3 +221,4 @@
|
||||
2025-06-03 22:00:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||
2025-06-03 22:15:16 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||
2025-06-03 22:15:51 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||
2025-06-03 23:04:00 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
|
||||
|
@ -1143,3 +1143,12 @@
|
||||
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: /mnt
|
||||
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T22:15:51.607422
|
||||
2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ==================================================
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ==================================================
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:04:00.907327
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
|
||||
2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ==================================================
|
||||
|
@ -10,3 +10,4 @@
|
||||
2025-06-03 22:00:23 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
|
||||
2025-06-03 22:15:16 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
|
||||
2025-06-03 22:15:51 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
|
||||
2025-06-03 23:04:01 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert
|
||||
|
@ -527,3 +527,7 @@
|
||||
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||
2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
|
||||
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
|
||||
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
|
||||
2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
|
||||
|
Loading…
x
Reference in New Issue
Block a user