SMW-Upload/seduttomachineworks_project/quote_submit.py

85 lines
2.9 KiB
Python

import json
import time
from pathlib import Path
from django.http import StreamingHttpResponse, JsonResponse
from django.conf import settings
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.csrf import csrf_exempt
def send_progress_update(step, message, progress):
"""Helper to send a progress update as JSON"""
return json.dumps({"step": step, "message": message, "progress": progress}) + "\n"
@xframe_options_exempt
@csrf_exempt
def submit_quote(request):
"""
Handle quote submission with progress updates.
Steps:
1. Upload files
2. Save files
3. Send email
4. Verify email sent
"""
if request.method != "POST":
return JsonResponse({"error": "Method not allowed"}, status=405)
# Read form data first (files need to be read from request)
email = request.POST.get("email", "").strip()
notes = request.POST.get("notes", "").strip()
files = request.FILES.getlist("files")
def process_quote():
try:
if not settings.DEBUG:
raise Exception("Not implemented")
# Step 1: Upload files
yield send_progress_update(1, "Uploading files...", 25)
# Files are already uploaded at this point, just acknowledge
uploaded_files = []
for file in files:
uploaded_files.append({"name": file.name, "size": file.size})
# Step 2: Save files
yield send_progress_update(2, "Saving files...", 50)
# Save files to disk/storage
saved_paths = []
for file in files:
# Create store directory if it doesn't exist
store_dir = Path(settings.MEDIA_ROOT) / "uploads"
store_dir.mkdir(parents=True, exist_ok=True)
# Save file
file_path = store_dir / file.name
with open(file_path, "wb") as f:
for chunk in file.chunks():
f.write(chunk)
saved_paths.append(str(file_path))
# Step 3: Send emails
yield send_progress_update(3, "Sending emails 1/2...", 70)
time.sleep(0.5)
# TODO: Actually send emails
yield send_progress_update(4, "Sending emails 2/2...", 75)
time.sleep(0.5)
# TODO: Actually send emails
emails_sent = True # Placeholder
# Complete
yield send_progress_update(
5,
"Quote request submitted successfully! Check your email for confirmation.",
100,
)
except Exception as e:
yield send_progress_update("error", f"An error occurred: {str(e)}", 0)
response = StreamingHttpResponse(process_quote(), content_type="text/event-stream")
response["Cache-Control"] = "no-cache"
response["X-Accel-Buffering"] = "no"
return response