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

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +31 -31
src/streamlit_app.py CHANGED
@@ -426,39 +426,40 @@ def show_login_page():
426
 
427
  def upload_and_poll_files(api_key: str, uploaded_files: list):
428
  """
429
- Helper function to upload and poll multiple PDF files.
430
-
431
- Handles uploading via upload_pdf(), polling for processing status,
432
- and displaying appropriate UI messages.
433
  """
434
  if not api_key:
435
  st.error("Missing API key. Please login first.")
436
  return
437
-
438
- progress_bar = st.progress(0)
 
439
  status_text = st.empty()
440
 
 
 
 
441
  for i, file in enumerate(uploaded_files):
442
  status_text.text(f"Uploading {file.name}...")
443
-
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))
449
  continue
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 loop for processing status
457
  poll_text = st.empty()
458
- poll_progress = st.progress(0)
 
459
  max_poll_seconds = 600
460
  poll_interval = 2
461
- elapsed = 0
462
  while elapsed < max_poll_seconds:
463
  try:
464
  resp = requests.get(
@@ -466,16 +467,15 @@ def upload_and_poll_files(api_key: str, uploaded_files: list):
466
  headers=get_headers(api_key),
467
  timeout=10
468
  )
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
-
475
  if final_status not in ["processing"]:
476
  if final_status in ["success", "completed"]:
477
  res = job.get("result", {})
478
  st.success(f"βœ… {file.name} processed for {display_name}: {res.get('filename', file.name)}")
 
479
  else:
480
  error_msg = job.get('error', 'unknown error')
481
  st.error(f"❌ {file.name} failed for {display_name}: {error_msg}")
@@ -484,30 +484,30 @@ def upload_and_poll_files(api_key: str, uploaded_files: list):
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
-
488
  except Exception as e:
489
  poll_text.text(f"Waiting... ({str(e)})")
490
-
491
  time.sleep(poll_interval)
492
  elapsed += poll_interval
493
  poll_progress.progress(min(1.0, elapsed / max_poll_seconds))
494
-
495
- if elapsed >= max_poll_seconds:
496
- st.error(f"❌ {file.name}: Processing timed out after {max_poll_seconds}s")
497
-
498
  elif status in ["success", "completed"]:
499
  st.success(f"βœ… {file.name} uploaded and processed successfully")
500
-
501
- else:
502
- # Unknown or missing status: assume success if data is present (backend stored it)
503
- if data and (job_id or status):
504
- st.success(f"βœ… {file.name} uploaded successfully")
505
- else:
506
- st.info(f"ℹ️ {file.name}: Upload response unclear - assuming success")
507
-
508
  progress_bar.progress((i + 1) / len(uploaded_files))
509
-
510
- status_text.text("βœ… Upload complete!")
 
 
 
 
 
 
 
 
511
 
512
  # ============================================
513
  # MAIN APPLICATION UI
 
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))
449
  continue
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:
465
  resp = requests.get(
 
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}")
 
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