Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
|
@@ -652,25 +652,6 @@ def master_callback(
|
|
| 652 |
del SESSION_LOCKS[sid]
|
| 653 |
return html.Div("Session ended. All data cleared.", style={"wordWrap": "break-word"}), None, [], None, None, [], None, "expanded"
|
| 654 |
|
| 655 |
-
# ACTION BUTTONS: If not shrunk, just shrink and clear preview output, do NOT process action
|
| 656 |
-
if triggered_id in [
|
| 657 |
-
'shred-action-btn', 'proposal-action-btn', 'compliance-action-btn',
|
| 658 |
-
'recover-action-btn', 'board-action-btn', 'loe-action-btn', 'cancel-action-btn'
|
| 659 |
-
] and preview_window_state != "shrunk":
|
| 660 |
-
# Don't alter session, don't clear docs, don't process action
|
| 661 |
-
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
| 662 |
-
doc_value = selected_doc if selected_doc in session_dict['uploaded_documents'] else (next(iter(session_dict['uploaded_documents']), None) if session_dict['uploaded_documents'] else None)
|
| 663 |
-
proposal_options = [{'label': fn, 'value': fn} for fn in session_dict['proposals'].keys()]
|
| 664 |
-
proposal_value = selected_proposal if selected_proposal in session_dict['proposals'] else (next(iter(session_dict['proposals']), None) if session_dict['proposals'] else None)
|
| 665 |
-
documents_list = get_documents_list(session_dict['uploaded_documents'], session_dict['shredded_documents'])
|
| 666 |
-
proposals_list = get_proposals_list(session_dict['proposals'])
|
| 667 |
-
return (
|
| 668 |
-
html.Div("", style={"wordWrap": "break-word"}),
|
| 669 |
-
documents_list, doc_options, doc_value,
|
| 670 |
-
proposals_list, proposal_options, proposal_value,
|
| 671 |
-
"shrunk"
|
| 672 |
-
)
|
| 673 |
-
|
| 674 |
# Cancel should just clear the preview and expand window, not clear session/docs
|
| 675 |
if triggered_id == 'cancel-action-btn':
|
| 676 |
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
|
@@ -686,6 +667,7 @@ def master_callback(
|
|
| 686 |
"expanded"
|
| 687 |
)
|
| 688 |
|
|
|
|
| 689 |
if triggered_id == 'upload-document' and rfp_content is not None and rfp_filename:
|
| 690 |
content_type, content_string = rfp_content.split(',')
|
| 691 |
decoded = base64.b64decode(content_string)
|
|
@@ -718,6 +700,7 @@ def master_callback(
|
|
| 718 |
else:
|
| 719 |
logging.error(f"Failed to decode uploaded proposal: {proposal_filename}")
|
| 720 |
|
|
|
|
| 721 |
if triggered_id and isinstance(doc_delete_clicks, list):
|
| 722 |
for i, n_click in enumerate(doc_delete_clicks):
|
| 723 |
if n_click:
|
|
@@ -768,7 +751,9 @@ def master_callback(
|
|
| 768 |
|
| 769 |
output_data_upload = html.Div("No action taken yet.", style={"wordWrap": "break-word"})
|
| 770 |
|
| 771 |
-
|
|
|
|
|
|
|
| 772 |
got_lock = lock.acquire(blocking=False)
|
| 773 |
if not got_lock:
|
| 774 |
output_data_upload = html.Div("Another Gemini operation is in progress. Please wait or cancel.", style={"wordWrap": "break-word"})
|
|
@@ -795,33 +780,7 @@ def master_callback(
|
|
| 795 |
session_dict, action_name, doc_value, chat_input, uploaded_rfp_decoded_bytes, proposal_value
|
| 796 |
)
|
| 797 |
output_data_upload = dcc.Markdown(result, style={"whiteSpace": "pre-wrap", "wordWrap": "break-word"})
|
| 798 |
-
|
| 799 |
-
lock.release()
|
| 800 |
-
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
| 801 |
-
doc_value = doc_value if doc_value in session_dict['uploaded_documents'] else (next(iter(session_dict['uploaded_documents']), None) if session_dict['uploaded_documents'] else None)
|
| 802 |
-
proposal_options = [{'label': fn, 'value': fn} for fn in session_dict['proposals'].keys()]
|
| 803 |
-
proposal_value = proposal_value if proposal_value in session_dict['proposals'] else (next(iter(session_dict['proposals']), None) if session_dict['proposals'] else None)
|
| 804 |
-
documents_list = get_documents_list(session_dict['uploaded_documents'], session_dict['shredded_documents'])
|
| 805 |
-
proposals_list = get_proposals_list(session_dict['proposals'])
|
| 806 |
-
return (
|
| 807 |
-
output_data_upload,
|
| 808 |
-
documents_list, doc_options, doc_value,
|
| 809 |
-
proposals_list, proposal_options, proposal_value,
|
| 810 |
-
"expanded"
|
| 811 |
-
)
|
| 812 |
-
|
| 813 |
-
if triggered_id in ['proposal-action-btn', 'recover-action-btn', 'loe-action-btn']:
|
| 814 |
-
got_lock = lock.acquire(blocking=False)
|
| 815 |
-
if not got_lock:
|
| 816 |
-
output_data_upload = html.Div("Another Gemini operation is in progress. Please wait or cancel.", style={"wordWrap": "break-word"})
|
| 817 |
-
return (
|
| 818 |
-
output_data_upload,
|
| 819 |
-
documents_list, doc_options, doc_value,
|
| 820 |
-
proposals_list, proposal_options, proposal_value,
|
| 821 |
-
"expanded"
|
| 822 |
-
)
|
| 823 |
-
try:
|
| 824 |
-
if triggered_id == "proposal-action-btn":
|
| 825 |
action_name = "proposal"
|
| 826 |
selected_bytes = session_dict['uploaded_documents_bytes'].get(doc_value, None)
|
| 827 |
result, _, _, generated_filename, generated_docx_bytes = process_document(
|
|
@@ -842,6 +801,7 @@ def master_callback(
|
|
| 842 |
output_data_upload = dcc.Markdown(result, style={"whiteSpace": "pre-wrap", "wordWrap": "break-word"})
|
| 843 |
finally:
|
| 844 |
lock.release()
|
|
|
|
| 845 |
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
| 846 |
doc_value = doc_value if doc_value in session_dict['uploaded_documents'] else (next(iter(session_dict['uploaded_documents']), None) if session_dict['uploaded_documents'] else None)
|
| 847 |
proposal_options = [{'label': fn, 'value': fn} for fn in session_dict['proposals'].keys()]
|
|
|
|
| 652 |
del SESSION_LOCKS[sid]
|
| 653 |
return html.Div("Session ended. All data cleared.", style={"wordWrap": "break-word"}), None, [], None, None, [], None, "expanded"
|
| 654 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 655 |
# Cancel should just clear the preview and expand window, not clear session/docs
|
| 656 |
if triggered_id == 'cancel-action-btn':
|
| 657 |
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
|
|
|
| 667 |
"expanded"
|
| 668 |
)
|
| 669 |
|
| 670 |
+
# File uploads
|
| 671 |
if triggered_id == 'upload-document' and rfp_content is not None and rfp_filename:
|
| 672 |
content_type, content_string = rfp_content.split(',')
|
| 673 |
decoded = base64.b64decode(content_string)
|
|
|
|
| 700 |
else:
|
| 701 |
logging.error(f"Failed to decode uploaded proposal: {proposal_filename}")
|
| 702 |
|
| 703 |
+
# Deletion handling
|
| 704 |
if triggered_id and isinstance(doc_delete_clicks, list):
|
| 705 |
for i, n_click in enumerate(doc_delete_clicks):
|
| 706 |
if n_click:
|
|
|
|
| 751 |
|
| 752 |
output_data_upload = html.Div("No action taken yet.", style={"wordWrap": "break-word"})
|
| 753 |
|
| 754 |
+
# Action buttons: always process immediately
|
| 755 |
+
if triggered_id in ['shred-action-btn', 'compliance-action-btn', 'board-action-btn',
|
| 756 |
+
'proposal-action-btn', 'recover-action-btn', 'loe-action-btn']:
|
| 757 |
got_lock = lock.acquire(blocking=False)
|
| 758 |
if not got_lock:
|
| 759 |
output_data_upload = html.Div("Another Gemini operation is in progress. Please wait or cancel.", style={"wordWrap": "break-word"})
|
|
|
|
| 780 |
session_dict, action_name, doc_value, chat_input, uploaded_rfp_decoded_bytes, proposal_value
|
| 781 |
)
|
| 782 |
output_data_upload = dcc.Markdown(result, style={"whiteSpace": "pre-wrap", "wordWrap": "break-word"})
|
| 783 |
+
elif triggered_id == "proposal-action-btn":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 784 |
action_name = "proposal"
|
| 785 |
selected_bytes = session_dict['uploaded_documents_bytes'].get(doc_value, None)
|
| 786 |
result, _, _, generated_filename, generated_docx_bytes = process_document(
|
|
|
|
| 801 |
output_data_upload = dcc.Markdown(result, style={"whiteSpace": "pre-wrap", "wordWrap": "break-word"})
|
| 802 |
finally:
|
| 803 |
lock.release()
|
| 804 |
+
# Update dropdowns and lists after action (in case doc/proposal was auto-created)
|
| 805 |
doc_options = [{'label': fn, 'value': fn} for fn in session_dict['uploaded_documents'].keys()]
|
| 806 |
doc_value = doc_value if doc_value in session_dict['uploaded_documents'] else (next(iter(session_dict['uploaded_documents']), None) if session_dict['uploaded_documents'] else None)
|
| 807 |
proposal_options = [{'label': fn, 'value': fn} for fn in session_dict['proposals'].keys()]
|