"Refactor job scheduling in backend using Conventional Commits (feat)"

This commit is contained in:
2025-05-29 23:10:52 +02:00
parent 4f4de4a84c
commit f5b4fdd296
2 changed files with 265 additions and 26 deletions

View File

@@ -2034,7 +2034,8 @@ def get_active_jobs():
@measure_execution_time(logger=jobs_logger, task_name="API-Job-Erstellung")
def create_job():
"""
Erstellt einen neuen Job mit dem Status "scheduled".
Erstellt einen neuen Job mit intelligentem Power Management.
Jobs die sofort starten sollen, werden automatisch verarbeitet.
Body: {
"printer_id": int,
@@ -2072,6 +2073,7 @@ def create_job():
# End-Zeit berechnen
end_at = start_at + timedelta(minutes=duration_minutes)
now = datetime.now()
db_session = get_db_session()
@@ -2081,14 +2083,18 @@ def create_job():
db_session.close()
return jsonify({"error": "Drucker nicht gefunden"}), 404
# Prüfen, ob der Drucker online ist
printer_status, printer_active = check_printer_status(printer.plug_ip if printer.plug_ip else "")
# Intelligente Status-Bestimmung
is_immediate_job = start_at <= now # Job soll sofort oder in der Vergangenheit starten
# Status basierend auf Drucker-Verfügbarkeit setzen
if printer_status == "online" and printer_active:
job_status = "scheduled"
else:
if is_immediate_job:
# Sofort-Job: Status auf "waiting_for_printer" setzen für automatische Verarbeitung
job_status = "waiting_for_printer"
jobs_logger.info(f"📦 Erstelle Sofort-Job für Drucker {printer.name} (Start: {start_at})")
else:
# Geplanter Job: Status auf "scheduled" setzen
job_status = "scheduled"
time_until_start = (start_at - now).total_seconds() / 60
jobs_logger.info(f"⏰ Erstelle geplanten Job für Drucker {printer.name} (Start in {time_until_start:.1f} Min)")
# Neuen Job erstellen
new_job = Job(
@@ -2106,15 +2112,56 @@ def create_job():
db_session.add(new_job)
db_session.commit()
# Job-Objekt für die Antwort serialisieren
# Job-ID für weitere Verarbeitung speichern
job_id = new_job.id
job_dict = new_job.to_dict()
db_session.close()
jobs_logger.info(f"Neuer Job {new_job.id} erstellt für Drucker {printer_id}, Start: {start_at}, Dauer: {duration_minutes} Minuten")
return jsonify({"job": job_dict}), 201
jobs_logger.info(f" Job {job_id} erstellt für Drucker {printer_id}, Start: {start_at}, Dauer: {duration_minutes} Minuten, Status: {job_status}")
# Intelligentes Power Management: Sofort-Jobs automatisch verarbeiten
if is_immediate_job:
try:
from utils.job_scheduler import get_job_scheduler
scheduler = get_job_scheduler()
# Versuche den Job sofort zu starten (schaltet Drucker automatisch ein)
if scheduler.handle_immediate_job(job_id):
jobs_logger.info(f"⚡ Sofort-Job {job_id} erfolgreich gestartet - Drucker automatisch eingeschaltet")
# Status in der Antwort aktualisieren
job_dict["status"] = "running"
job_dict["message"] = "Job wurde sofort gestartet - Drucker automatisch eingeschaltet"
else:
jobs_logger.warning(f"⚠️ Sofort-Job {job_id} konnte nicht gestartet werden - bleibt im Status 'waiting_for_printer'")
job_dict["message"] = "Job erstellt - wartet auf Drucker-Verfügbarkeit"
except Exception as e:
jobs_logger.error(f"❌ Fehler beim automatischen Starten von Sofort-Job {job_id}: {str(e)}")
job_dict["message"] = "Job erstellt - automatischer Start fehlgeschlagen"
else:
# Geplanter Job: Power Management für zukünftige Optimierung
try:
from utils.job_scheduler import get_job_scheduler
scheduler = get_job_scheduler()
# Prüfe und manage Power für diesen Drucker (für optimale Vorbereitung)
scheduler.check_and_manage_printer_power(printer_id)
time_until_start = (start_at - now).total_seconds() / 60
job_dict["message"] = f"Job geplant - startet automatisch in {time_until_start:.1f} Minuten"
except Exception as e:
jobs_logger.warning(f"⚠️ Power-Management-Fehler für geplanten Job {job_id}: {str(e)}")
job_dict["message"] = "Job geplant - startet automatisch zur geplanten Zeit"
return jsonify({
"job": job_dict,
"success": True,
"immediate_start": is_immediate_job
}), 201
except Exception as e:
jobs_logger.error(f"Fehler beim Erstellen eines Jobs: {str(e)}")
jobs_logger.error(f"Fehler beim Erstellen eines Jobs: {str(e)}")
return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500
@app.route('/api/jobs/<int:job_id>/extend', methods=['POST'])