📚 Reorganized documentation files and renamed for clarity

This commit is contained in:
Till Tomczak
2025-06-20 08:56:51 +02:00
parent e0eab2b6b1
commit 98f7878351
38 changed files with 2775 additions and 51 deletions

View File

@@ -705,4 +705,211 @@ def fix_admin_permissions():
'success': False,
'error': 'Fehler beim Korrigieren der Berechtigungen',
'message': str(e)
}), 500
@api_blueprint.route('/stats/charts/job-status', methods=['GET'])
@login_required
def get_job_status_chart():
"""
API-Endpunkt für Job-Status-Chart-Daten.
Liefert Daten für ein Doughnut/Pie-Chart der Job-Status-Verteilung.
"""
try:
db_session = get_db_session()
# Job-Status-Verteilung ermitteln
completed_jobs = db_session.query(Job).filter(Job.status == 'completed').count()
running_jobs = db_session.query(Job).filter(Job.status == 'running').count()
pending_jobs = db_session.query(Job).filter(Job.status == 'pending').count()
failed_jobs = db_session.query(Job).filter(Job.status == 'failed').count()
queued_jobs = db_session.query(Job).filter(Job.status == 'queued').count()
db_session.close()
# Chart.js-Format für Doughnut-Chart
chart_data = {
'labels': ['Abgeschlossen', 'Läuft', 'Wartend', 'Fehlgeschlagen', 'Warteschlange'],
'datasets': [{
'data': [completed_jobs, running_jobs, pending_jobs, failed_jobs, queued_jobs],
'backgroundColor': [
'#10b981', # Grün für abgeschlossen
'#3b82f6', # Blau für läuft
'#f59e0b', # Gelb für wartend
'#ef4444', # Rot für fehlgeschlagen
'#8b5cf6' # Lila für Warteschlange
],
'borderColor': [
'#059669',
'#2563eb',
'#d97706',
'#dc2626',
'#7c3aed'
],
'borderWidth': 2
}]
}
api_logger.info(f"Job-Status-Chart-Daten abgerufen von Benutzer {current_user.username}")
return jsonify(chart_data)
except Exception as e:
api_logger.error(f"Fehler beim Abrufen der Job-Status-Chart-Daten: {str(e)}")
return jsonify({
'error': 'Fehler beim Laden der Job-Status-Chart-Daten',
'message': str(e)
}), 500
@api_blueprint.route('/stats/charts/printer-usage', methods=['GET'])
@login_required
def get_printer_usage_chart():
"""
API-Endpunkt für Drucker-Nutzung-Chart-Daten.
Liefert Daten für ein Bar-Chart der Drucker-Nutzung.
"""
try:
db_session = get_db_session()
# Drucker mit Job-Anzahl abfragen
from sqlalchemy import func
printer_usage = db_session.query(
Printer.name,
func.count(Job.id).label('job_count')
).outerjoin(Job).group_by(Printer.id, Printer.name).all()
db_session.close()
# Sortieren nach Job-Anzahl (höchste zuerst)
printer_usage = sorted(printer_usage, key=lambda x: x.job_count, reverse=True)
# Daten für Chart.js formatieren
chart_data = {
'labels': [printer.name for printer in printer_usage],
'datasets': [{
'label': 'Anzahl Jobs',
'data': [printer.job_count for printer in printer_usage],
'backgroundColor': 'rgba(59, 130, 246, 0.8)',
'borderColor': 'rgba(59, 130, 246, 1)',
'borderWidth': 1
}]
}
api_logger.info(f"Drucker-Nutzung-Chart-Daten abgerufen von Benutzer {current_user.username}")
return jsonify(chart_data)
except Exception as e:
api_logger.error(f"Fehler beim Abrufen der Drucker-Nutzung-Chart-Daten: {str(e)}")
return jsonify({
'error': 'Fehler beim Laden der Drucker-Nutzung-Chart-Daten',
'message': str(e)
}), 500
@api_blueprint.route('/stats/charts/jobs-timeline', methods=['GET'])
@login_required
def get_jobs_timeline_chart():
"""
API-Endpunkt für Jobs-Timeline-Chart-Daten.
Liefert Daten für ein Line-Chart der Jobs über Zeit (letzte 30 Tage).
"""
try:
db_session = get_db_session()
# Letzte 30 Tage
from datetime import date, timedelta
end_date = date.today()
start_date = end_date - timedelta(days=29) # 30 Tage inkl. heute
# Jobs pro Tag ermitteln
from sqlalchemy import func, Date, cast
daily_jobs = db_session.query(
cast(Job.created_at, Date).label('date'),
func.count(Job.id).label('job_count')
).filter(
cast(Job.created_at, Date) >= start_date,
cast(Job.created_at, Date) <= end_date
).group_by(cast(Job.created_at, Date)).all()
db_session.close()
# Dictionary für schnellen Zugriff erstellen
jobs_by_date = {str(day.date): day.job_count for day in daily_jobs}
# Alle Tage füllen (auch die ohne Jobs)
labels = []
data = []
current_date = start_date
while current_date <= end_date:
labels.append(current_date.strftime('%d.%m'))
data.append(jobs_by_date.get(str(current_date), 0))
current_date += timedelta(days=1)
# Chart.js-Format für Line-Chart
chart_data = {
'labels': labels,
'datasets': [{
'label': 'Jobs pro Tag',
'data': data,
'borderColor': 'rgba(16, 185, 129, 1)',
'backgroundColor': 'rgba(16, 185, 129, 0.1)',
'borderWidth': 2,
'fill': True,
'tension': 0.4
}]
}
api_logger.info(f"Jobs-Timeline-Chart-Daten abgerufen von Benutzer {current_user.username}")
return jsonify(chart_data)
except Exception as e:
api_logger.error(f"Fehler beim Abrufen der Jobs-Timeline-Chart-Daten: {str(e)}")
return jsonify({
'error': 'Fehler beim Laden der Jobs-Timeline-Chart-Daten',
'message': str(e)
}), 500
@api_blueprint.route('/stats/charts/user-activity', methods=['GET'])
@login_required
def get_user_activity_chart():
"""
API-Endpunkt für Benutzer-Aktivität-Chart-Daten.
Liefert Daten für ein horizontales Bar-Chart der Benutzeraktivität.
"""
try:
db_session = get_db_session()
# Top 10 aktivste Benutzer (nach Job-Anzahl)
from sqlalchemy import func
user_activity = db_session.query(
User.username,
func.count(Job.id).label('job_count')
).outerjoin(Job).group_by(User.id, User.username).order_by(
func.count(Job.id).desc()
).limit(10).all()
db_session.close()
# Daten für Chart.js formatieren (horizontales Bar-Chart)
chart_data = {
'labels': [user.username for user in user_activity],
'datasets': [{
'label': 'Anzahl Jobs',
'data': [user.job_count for user in user_activity],
'backgroundColor': 'rgba(139, 92, 246, 0.8)',
'borderColor': 'rgba(139, 92, 246, 1)',
'borderWidth': 1
}]
}
api_logger.info(f"Benutzer-Aktivität-Chart-Daten abgerufen von Benutzer {current_user.username}")
return jsonify(chart_data)
except Exception as e:
api_logger.error(f"Fehler beim Abrufen der Benutzer-Aktivität-Chart-Daten: {str(e)}")
return jsonify({
'error': 'Fehler beim Laden der Benutzer-Aktivität-Chart-Daten',
'message': str(e)
}), 500