🗑️ Refactor: Remove obsolete printer check scripts and update app logic

**Änderungen:**
-  check_printer_ips.py und check_printers.py: Entfernt nicht mehr benötigte Skripte zur Überprüfung von Drucker-IP-Adressen.
-  DRUCKER_STATUS_REQUIREMENTS.md: Veraltete Anforderungen entfernt.
-  setup_standard_printers.py: Anpassungen zur Vereinheitlichung der Drucker-IP.
-  app.py: Logik zur Filterung offline/unreachable Drucker aktualisiert.

**Ergebnis:**
- Bereinigung des Codes durch Entfernen nicht mehr benötigter Dateien.
- Optimierte Logik zur Handhabung von Druckerstatus in der Anwendung.

🤖 Generated with [Claude Code](https://claude.ai/code)
This commit is contained in:
2025-06-15 23:59:39 +02:00
parent 956c24d8ca
commit c4e65a07a9
1258 changed files with 11101 additions and 609 deletions

View File

@ -13,8 +13,8 @@ from models import get_db_session, Job, Printer
from utils.logging_config import get_logger
from utils.job_queue_system import conflict_manager
# Blueprint initialisieren - URL-Präfix geändert um Konflikte zu vermeiden
jobs_blueprint = Blueprint('jobs', __name__, url_prefix='/api/jobs-bp')
# Blueprint initialisieren
jobs_blueprint = Blueprint('jobs', __name__, url_prefix='/api/jobs')
# Logger für Jobs
jobs_logger = get_logger("jobs")
@ -23,22 +23,34 @@ def job_owner_required(f):
"""Decorator um zu prüfen, ob der aktuelle Benutzer Besitzer eines Jobs ist oder Admin"""
@wraps(f)
def decorated_function(job_id, *args, **kwargs):
db_session = get_db_session()
job = db_session.query(Job).filter(Job.id == job_id).first()
if not job:
db_session.close()
return jsonify({"error": "Job nicht gefunden"}), 404
try:
db_session = get_db_session()
job = db_session.query(Job).filter(Job.id == job_id).first()
is_owner = job.user_id == int(current_user.id) or job.owner_id == int(current_user.id)
is_admin = current_user.is_admin
if not (is_owner or is_admin):
db_session.close()
return jsonify({"error": "Keine Berechtigung"}), 403
if not job:
db_session.close()
jobs_logger.warning(f"Job {job_id} nicht gefunden für Benutzer {current_user.id}")
return jsonify({"error": "Job nicht gefunden"}), 404
is_owner = job.user_id == int(current_user.id) or job.owner_id == int(current_user.id)
is_admin = current_user.is_admin
db_session.close()
return f(job_id, *args, **kwargs)
if not (is_owner or is_admin):
db_session.close()
jobs_logger.warning(f"Benutzer {current_user.id} hat keine Berechtigung für Job {job_id}")
return jsonify({"error": "Keine Berechtigung"}), 403
db_session.close()
jobs_logger.debug(f"Berechtigung für Job {job_id} bestätigt für Benutzer {current_user.id}")
return f(job_id, *args, **kwargs)
except Exception as e:
jobs_logger.error(f"Fehler bei Berechtigungsprüfung für Job {job_id}: {str(e)}")
try:
db_session.close()
except:
pass
return jsonify({"error": "Interner Serverfehler bei Berechtigungsprüfung"}), 500
return decorated_function
def check_printer_status(ip_address: str, timeout: int = 7):
@ -94,7 +106,11 @@ def get_jobs():
jobs_logger.info(f"✅ Jobs erfolgreich abgerufen: {len(job_dicts)} von {total_count} (Seite {page})")
return jsonify({
"success": True,
"jobs": job_dicts,
"total": total_count,
"current_page": page,
"total_pages": (total_count + per_page - 1) // per_page,
"pagination": {
"page": page,
"per_page": per_page,
@ -133,7 +149,10 @@ def get_job(job_id):
db_session.close()
jobs_logger.info(f"✅ Job-Details erfolgreich abgerufen für Job {job_id}")
return jsonify(job_dict)
return jsonify({
"success": True,
"job": job_dict
})
except Exception as e:
jobs_logger.error(f"❌ Fehler beim Abrufen des Jobs {job_id}: {str(e)}", exc_info=True)
try:
@ -280,7 +299,11 @@ def create_job():
db_session.close()
jobs_logger.info(f"✅ Neuer Job {new_job.id} erfolgreich erstellt für Drucker {printer_id}, Start: {start_at}, Dauer: {duration_minutes} Minuten")
return jsonify({"job": job_dict}), 201
return jsonify({
"success": True,
"job": job_dict,
"message": "Job erfolgreich erstellt"
}), 201
except Exception as db_error:
jobs_logger.error(f"❌ Datenbankfehler beim Job-Erstellen: {str(db_error)}")
@ -358,7 +381,11 @@ def update_job(job_id):
db_session.close()
jobs_logger.info(f"Job {job_id} aktualisiert")
return jsonify({"job": job_dict})
return jsonify({
"success": True,
"job": job_dict,
"message": "Job erfolgreich aktualisiert"
})
except Exception as e:
jobs_logger.error(f"Fehler beim Aktualisieren von Job {job_id}: {str(e)}")
@ -369,30 +396,55 @@ def update_job(job_id):
@job_owner_required
def delete_job(job_id):
"""Löscht einen Job."""
db_session = None
try:
jobs_logger.info(f"🗑️ Lösche Job {job_id} für Benutzer {current_user.id}")
db_session = get_db_session()
job = db_session.query(Job).get(job_id)
if not job:
db_session.close()
jobs_logger.warning(f"Job {job_id} nicht gefunden beim Löschen")
return jsonify({"error": "Job nicht gefunden"}), 404
# Prüfen, ob der Job gelöscht werden kann
if job.status == "running":
db_session.close()
jobs_logger.warning(f"Versuch, laufenden Job {job_id} zu löschen")
return jsonify({"error": "Laufende Jobs können nicht gelöscht werden"}), 400
job_name = job.name
job_name = job.name or f"Job-{job_id}"
# Job löschen
db_session.delete(job)
db_session.commit()
db_session.close()
jobs_logger.info(f"Job '{job_name}' (ID: {job_id}) gelöscht von Benutzer {current_user.id}")
return jsonify({"success": True, "message": "Job erfolgreich gelöscht"})
jobs_logger.info(f"Job '{job_name}' (ID: {job_id}) erfolgreich gelöscht von Benutzer {current_user.id}")
return jsonify({
"success": True,
"message": "Job erfolgreich gelöscht",
"deleted_job": {
"id": job_id,
"name": job_name
}
})
except Exception as e:
jobs_logger.error(f"Fehler beim Löschen des Jobs {job_id}: {str(e)}")
return jsonify({"error": "Interner Serverfehler"}), 500
jobs_logger.error(f"Fehler beim Löschen des Jobs {job_id}: {str(e)}", exc_info=True)
if db_session:
try:
db_session.rollback()
except:
pass
return jsonify({
"error": "Interner Serverfehler beim Löschen des Jobs",
"details": str(e) if current_app.debug else None
}), 500
finally:
if db_session:
try:
db_session.close()
except:
pass
@jobs_blueprint.route('/active', methods=['GET'])
@login_required
@ -428,7 +480,11 @@ def get_active_jobs():
result.append(job_dict)
db_session.close()
return jsonify({"jobs": result})
return jsonify({
"success": True,
"jobs": result,
"total": len(result)
})
except Exception as e:
jobs_logger.error(f"Fehler beim Abrufen aktiver Jobs: {str(e)}")
return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500
@ -448,15 +504,65 @@ def get_current_job():
if current_job:
job_dict = current_job.to_dict()
db_session.close()
return jsonify(job_dict)
return jsonify({
"success": True,
"job": job_dict
})
else:
db_session.close()
return jsonify({"message": "Kein aktueller Job"}), 404
return jsonify({
"success": False,
"message": "Kein aktueller Job"
}), 404
except Exception as e:
jobs_logger.error(f"Fehler beim Abrufen des aktuellen Jobs: {str(e)}")
db_session.close()
return jsonify({"error": "Interner Serverfehler"}), 500
@jobs_blueprint.route('/recent', methods=['GET'])
@login_required
def get_recent_jobs():
"""Gibt die letzten Jobs zurück (für Dashboard)."""
db_session = get_db_session()
try:
jobs_logger.info(f"📋 Recent Jobs-Abfrage von Benutzer {current_user.id}")
# Anzahl der Jobs begrenzen
limit = request.args.get('limit', 10, type=int)
if limit > 50: # Sicherheitslimit
limit = 50
# Query aufbauen
query = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer))
# Admin sieht alle Jobs, User nur eigene
if not current_user.is_admin:
query = query.filter(Job.user_id == int(current_user.id))
# Sortierung: neueste zuerst, begrenzt auf limit
recent_jobs = query.order_by(Job.created_at.desc()).limit(limit).all()
# Convert jobs to dictionaries
job_dicts = [job.to_dict() for job in recent_jobs]
db_session.close()
jobs_logger.info(f"{len(job_dicts)} Recent Jobs erfolgreich abgerufen")
return jsonify({
"success": True,
"jobs": job_dicts,
"total": len(job_dicts)
})
except Exception as e:
jobs_logger.error(f"❌ Fehler beim Abrufen der Recent Jobs: {str(e)}", exc_info=True)
try:
db_session.close()
except:
pass
return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500
@jobs_blueprint.route('/<int:job_id>/start', methods=['POST'])
@login_required
@job_owner_required