Hamza4100 commited on
Commit
db5995f
Β·
verified Β·
1 Parent(s): afa40cc

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +48 -38
src/streamlit_app.py CHANGED
@@ -426,23 +426,31 @@ def show_login_page():
426
 
427
  def upload_and_poll_files(api_key: str, uploaded_files: list):
428
  """
429
- Upload PDFs, display status, and clear messages + reset uploader after processing.
 
430
  """
431
  if not api_key:
432
  st.error("Missing API key. Please login first.")
433
  return
434
 
435
- # Create placeholders for overall messages
436
- progress_bar = st.empty()
437
  status_text = st.empty()
438
 
439
- # Track which files were successfully processed
440
- processed_files = []
441
 
442
  for i, file in enumerate(uploaded_files):
443
  status_text.text(f"Uploading {file.name}...")
444
- result = upload_pdf(api_key, file)
 
 
 
 
 
 
 
445
 
 
446
  if not result["success"]:
447
  st.error(f"❌ {file.name}: {result['error']}")
448
  progress_bar.progress((i + 1) / len(uploaded_files))
@@ -450,15 +458,15 @@ def upload_and_poll_files(api_key: str, uploaded_files: list):
450
 
451
  data = result.get("data") or {}
452
  job_id = data.get("document_id") or data.get("job_id")
453
- status = data.get("status")
454
 
455
- if status == "processing" and job_id:
456
- # Polling messages
457
  poll_text = st.empty()
458
- poll_progress = st.empty()
459
- elapsed = 0
460
  max_poll_seconds = 600
461
  poll_interval = 2
 
462
 
463
  while elapsed < max_poll_seconds:
464
  try:
@@ -467,47 +475,49 @@ def upload_and_poll_files(api_key: str, uploaded_files: list):
467
  headers=get_headers(api_key),
468
  timeout=10
469
  )
470
- if resp.status_code == 200:
 
471
  job = resp.json()
472
- final_status = job.get("status")
473
- display_name = job.get("username") or job.get("user_id")
474
- if final_status not in ["processing"]:
475
- if final_status in ["success", "completed"]:
476
- res = job.get("result", {})
477
- st.success(f"βœ… {file.name} processed for {display_name}: {res.get('filename', file.name)}")
478
- processed_files.append(file.name)
479
- else:
480
- error_msg = job.get('error', 'unknown error')
481
- st.error(f"❌ {file.name} failed for {display_name}: {error_msg}")
482
- break
483
  else:
484
- poll_text.text(f"Processing {file.name} for {display_name}... elapsed {elapsed}s")
 
 
485
  else:
486
- poll_text.text(f"Waiting for processing... (status {resp.status_code})")
487
  except Exception as e:
488
  poll_text.text(f"Waiting... ({str(e)})")
 
489
  time.sleep(poll_interval)
490
  elapsed += poll_interval
491
  poll_progress.progress(min(1.0, elapsed / max_poll_seconds))
492
 
493
- # Clear polling messages after processing
494
- poll_text.empty()
495
- poll_progress.empty()
496
  elif status in ["success", "completed"]:
497
  st.success(f"βœ… {file.name} uploaded and processed successfully")
498
- processed_files.append(file.name)
 
 
499
 
500
- progress_bar.progress((i + 1) / len(uploaded_files))
 
 
 
501
 
502
- # Clear overall status
503
- status_text.empty()
504
- progress_bar.empty()
505
 
506
- # βœ… Remove successfully processed files from uploader
507
- if processed_files and "pdf_uploader" in st.session_state:
508
- # Streamlit doesn't allow direct modification, so delete and rerun
509
- del st.session_state["pdf_uploader"]
510
- st.experimental_rerun()
511
 
512
  # ============================================
513
  # MAIN APPLICATION UI
 
426
 
427
  def upload_and_poll_files(api_key: str, uploaded_files: list):
428
  """
429
+ Upload PDFs to backend, poll for processing, and clean up uploader after completion.
430
+ Works for both local and HF Spaces deployments.
431
  """
432
  if not api_key:
433
  st.error("Missing API key. Please login first.")
434
  return
435
 
436
+ progress_bar = st.progress(0)
 
437
  status_text = st.empty()
438
 
439
+ # Make a copy of uploaded_files so we can remove processed ones
440
+ remaining_files = uploaded_files.copy()
441
 
442
  for i, file in enumerate(uploaded_files):
443
  status_text.text(f"Uploading {file.name}...")
444
+
445
+ # Upload
446
+ try:
447
+ result = upload_pdf(api_key, file)
448
+ except Exception as e:
449
+ st.error(f"❌ {file.name} upload failed: {e}")
450
+ progress_bar.progress((i + 1) / len(uploaded_files))
451
+ continue
452
 
453
+ # If upload request itself failed
454
  if not result["success"]:
455
  st.error(f"❌ {file.name}: {result['error']}")
456
  progress_bar.progress((i + 1) / len(uploaded_files))
 
458
 
459
  data = result.get("data") or {}
460
  job_id = data.get("document_id") or data.get("job_id")
461
+ status = data.get("status", "processing")
462
 
463
+ # Poll backend for processing status
464
+ if job_id and status == "processing":
465
  poll_text = st.empty()
466
+ poll_progress = st.progress(0)
 
467
  max_poll_seconds = 600
468
  poll_interval = 2
469
+ elapsed = 0
470
 
471
  while elapsed < max_poll_seconds:
472
  try:
 
475
  headers=get_headers(api_key),
476
  timeout=10
477
  )
478
+ # Always attempt JSON parse, fallback if HF wraps response
479
+ try:
480
  job = resp.json()
481
+ except Exception:
482
+ job = {}
483
+
484
+ final_status = job.get("status", "processing")
485
+ display_name = job.get("username") or job.get("user_id") or "You"
486
+
487
+ if final_status not in ["processing"]:
488
+ if final_status in ["success", "completed"]:
489
+ res = job.get("result", {})
490
+ st.success(f"βœ… {file.name} processed for {display_name}: {res.get('filename', file.name)}")
 
491
  else:
492
+ error_msg = job.get('error', 'unknown error')
493
+ st.error(f"❌ {file.name} failed for {display_name}: {error_msg}")
494
+ break
495
  else:
496
+ poll_text.text(f"Processing {file.name} for {display_name}... elapsed {elapsed}s")
497
  except Exception as e:
498
  poll_text.text(f"Waiting... ({str(e)})")
499
+
500
  time.sleep(poll_interval)
501
  elapsed += poll_interval
502
  poll_progress.progress(min(1.0, elapsed / max_poll_seconds))
503
 
504
+ if elapsed >= max_poll_seconds:
505
+ st.error(f"❌ {file.name}: Processing timed out after {max_poll_seconds}s")
506
+
507
  elif status in ["success", "completed"]:
508
  st.success(f"βœ… {file.name} uploaded and processed successfully")
509
+ else:
510
+ # Unknown status β€” assume processing and continue
511
+ st.info(f"ℹ️ {file.name}: Upload in progress")
512
 
513
+ # Remove the file from remaining_files to clear uploader
514
+ remaining_files.remove(file)
515
+ # Force re-render of file uploader with remaining files
516
+ st.session_state["pdf_uploader"] = remaining_files
517
 
518
+ progress_bar.progress((i + 1) / len(uploaded_files))
 
 
519
 
520
+ status_text.text("βœ… Upload complete!")
 
 
 
 
521
 
522
  # ============================================
523
  # MAIN APPLICATION UI