"Refactor job scheduling in backend using Conventional Commits (feat)"
This commit is contained in:
@@ -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'])
|
||||
|
Reference in New Issue
Block a user