diff --git a/abogen/web/routes/main.py b/abogen/web/routes/main.py index 990595f..05ea916 100644 --- a/abogen/web/routes/main.py +++ b/abogen/web/routes/main.py @@ -87,7 +87,39 @@ def wizard_step(step: str): @main_bp.route("/wizard/upload", methods=["POST"]) def wizard_upload(): - file = request.files.get("file") + pending_id = request.form.get("pending_id") + pending = get_service().get_pending_job(pending_id) if pending_id else None + + file = request.files.get("file") or request.files.get("source_file") + + settings = load_settings() + profiles = serialize_profiles() + + # Case 1: Updating existing job without new file + if pending and (not file or not file.filename): + try: + apply_book_step_form(pending, request.form, settings=settings, profiles=profiles) + get_service().store_pending_job(pending) + + if wants_wizard_json(): + return wizard_json_response(pending, "chapters") + return redirect(url_for("main.wizard_step", step="chapters", pending_id=pending.id)) + except Exception as e: + logger.exception("Error updating job settings") + error_msg = f"Failed to update settings: {str(e)}" + if wants_wizard_json(): + return wizard_json_response(pending, "book", error=error_msg, status=500) + return render_template( + "index.html", + options=template_options(), + settings=settings, + jobs_panel=render_jobs_panel(), + wizard_mode=True, + wizard_step="book", + wizard_partial=render_wizard_partial(pending, "book", error=error_msg), + ) + + # Case 2: New file upload (or replacing file on existing job) if not file or not file.filename: if wants_wizard_json(): return wizard_json_response(None, "book", error="No file selected", status=400) @@ -99,9 +131,6 @@ def wizard_upload(): file_path = temp_dir / f"{uuid.uuid4().hex}_{filename}" file.save(file_path) - settings = load_settings() - profiles = serialize_profiles() - try: extraction = extract_from_path(file_path) @@ -114,6 +143,10 @@ def wizard_upload(): profiles=profiles, ) + # If we had a pending job, we might want to preserve its ID or other properties, + # but for a new file it's safer to start fresh with the new extraction. + # The frontend will handle the ID change via the redirect. + get_service().store_pending_job(result.pending) if wants_wizard_json():