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

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +86 -63
src/streamlit_app.py CHANGED
@@ -424,6 +424,91 @@ def show_login_page():
424
  else:
425
  st.error(f"❌ {result}")
426
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
427
  # ============================================
428
  # MAIN APPLICATION UI
429
  # ============================================
@@ -486,69 +571,7 @@ def show_main_app():
486
 
487
  if uploaded_files:
488
  if st.button("πŸ“€ Upload All", use_container_width=True, type="secondary"):
489
- progress_bar = st.progress(0)
490
- status_text = st.empty()
491
- for i, file in enumerate(uploaded_files):
492
- status_text.text(f"Uploading {file.name}...")
493
-
494
- result = upload_pdf(st.session_state.api_key, file)
495
-
496
- if not result["success"]:
497
- st.error(f"❌ {file.name}: {result['error']}")
498
- progress_bar.progress((i + 1) / len(uploaded_files))
499
- continue
500
-
501
- data = result.get("data") or {}
502
- job_id = data.get("document_id") or data.get("job_id")
503
- status = data.get("status")
504
-
505
- if status == "processing" and job_id:
506
- poll_text = st.empty()
507
- poll_progress = st.progress(0)
508
- max_poll_seconds = 600
509
- poll_interval = 2
510
- elapsed = 0
511
- while elapsed < max_poll_seconds:
512
- try:
513
- resp = requests.get(
514
- f"{API_BASE_URL}/upload-status/{job_id}",
515
- headers=get_headers(st.session_state.api_key),
516
- timeout=10
517
- )
518
-
519
- if resp.status_code == 200:
520
- job = resp.json()
521
- final_status = job.get("status")
522
- display_name = job.get("username") or job.get("user_id")
523
- if final_status != "processing":
524
- if final_status == "success":
525
- res = job.get("result", {})
526
- st.success(f"βœ… {file.name} processed for {display_name}: {res.get('filename', file.name)}")
527
- else:
528
- st.error(f"❌ {file.name} failed for {display_name}: {job.get('error', 'unknown error')}")
529
- break
530
- else:
531
- poll_text.text(f"Processing {file.name} for {display_name}... elapsed {elapsed}s")
532
- else:
533
- poll_text.text(f"Waiting for processing... (status {resp.status_code})")
534
- except Exception as e:
535
- poll_text.text(f"Waiting... ({str(e)})")
536
-
537
- time.sleep(poll_interval)
538
- elapsed += poll_interval
539
- poll_progress.progress(min(1.0, elapsed / max_poll_seconds))
540
-
541
- if elapsed >= max_poll_seconds:
542
- st.error(f"❌ {file.name}: Processing timed out after {max_poll_seconds}s")
543
-
544
- elif status == "success":
545
- st.success(f"βœ… {file.name} uploaded and processed successfully")
546
- else:
547
- st.info(f"ℹ️ {file.name}: {data}")
548
-
549
- progress_bar.progress((i + 1) / len(uploaded_files))
550
-
551
- status_text.text("βœ… Upload complete!")
552
 
553
  # Chat interface
554
  # Provide a scope selector: General (all docs) or a specific uploaded document
 
424
  else:
425
  st.error(f"❌ {result}")
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(
465
+ f"{API_BASE_URL}/upload-status/{job_id}",
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}")
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
+
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
514
  # ============================================
 
571
 
572
  if uploaded_files:
573
  if st.button("πŸ“€ Upload All", use_container_width=True, type="secondary"):
574
+ upload_and_poll_files(st.session_state.api_key, uploaded_files)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
 
576
  # Chat interface
577
  # Provide a scope selector: General (all docs) or a specific uploaded document