Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -472,7 +472,6 @@ def update_selected_doc_type(n_clicks_list, btn_ids):
|
|
472 |
Input('selected-doc-type', 'data'),
|
473 |
)
|
474 |
def update_right_col(selected_type):
|
475 |
-
# Load all doc stores from sqlite
|
476 |
store_data = {}
|
477 |
for store_key in ["shred","pink","pink_review","red","red_review","gold","gold_review","loe","virtual_board"]:
|
478 |
doc_content, _ = get_uploaded_doc(store_key)
|
@@ -530,7 +529,6 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
530 |
if not triggered or not contents_lists:
|
531 |
return [dash.no_update]*19 + [dash.no_update]
|
532 |
|
533 |
-
# Map subtype to store index and doc_name index
|
534 |
subtype_map = {
|
535 |
"shred": (0, 0),
|
536 |
"pink": (1, 1),
|
@@ -543,7 +541,6 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
543 |
"virtual_board": (8, 8)
|
544 |
}
|
545 |
|
546 |
-
# Find which upload triggered
|
547 |
for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
|
548 |
if contents and filenames:
|
549 |
id_dict = callback_context.inputs_list[0][i]['id']
|
@@ -552,7 +549,6 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
552 |
if isinstance(contents, str):
|
553 |
contents = [contents]
|
554 |
filenames = [filenames]
|
555 |
-
# Only take the last uploaded file for that slot
|
556 |
content = contents[-1]
|
557 |
name = filenames[-1]
|
558 |
file_text = process_document(content, name)
|
@@ -560,7 +556,6 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
560 |
stores[idx] = file_text
|
561 |
doc_names[doc_name_idx] = name
|
562 |
if subtype == "shred":
|
563 |
-
# For shred, build file list
|
564 |
file_list = [
|
565 |
dbc.Row([
|
566 |
dbc.Col(
|
@@ -582,10 +577,12 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
582 |
[
|
583 |
Output('document-preview', 'children'),
|
584 |
Output('store-generated-doc', 'data'),
|
|
|
585 |
Output('progress-dot-store', 'data')
|
586 |
],
|
587 |
[
|
588 |
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
|
|
589 |
Input('selected-doc-type', 'data')
|
590 |
],
|
591 |
[
|
@@ -602,14 +599,50 @@ def handle_doc_upload(contents_lists, filenames_lists,
|
|
602 |
],
|
603 |
prevent_initial_call=True
|
604 |
)
|
605 |
-
def
|
606 |
-
|
607 |
ctx = callback_context
|
608 |
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
609 |
-
logging.info(f"
|
610 |
|
611 |
-
#
|
612 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
613 |
logging.info(f"Generating document for type: {selected_type}")
|
614 |
inputs = {
|
615 |
"shred": shred,
|
@@ -650,89 +683,36 @@ def handle_preview_and_generate(n_clicks_list, selected_type,
|
|
650 |
else:
|
651 |
preview = markdown_narrative_preview(generated_doc)
|
652 |
logging.info("Document preview updated.")
|
653 |
-
return preview, generated_doc, "progress"
|
654 |
-
else:
|
655 |
-
# Just preview from store or sqlite
|
656 |
-
doc = get_generated_doc(selected_type)
|
657 |
-
if not doc:
|
658 |
-
# Fallback to uploaded doc for preview
|
659 |
-
if selected_type == "Shred" and shred:
|
660 |
-
return markdown_table_preview(shred), dash.no_update, dash.no_update
|
661 |
-
elif selected_type in spreadsheet_types:
|
662 |
-
doc_store = {
|
663 |
-
"Pink Review": pink_review,
|
664 |
-
"Red Review": red_review,
|
665 |
-
"Gold Review": gold_review,
|
666 |
-
"Virtual Board": virtual_board,
|
667 |
-
"LOE": loe
|
668 |
-
}
|
669 |
-
doc = doc_store.get(selected_type, "")
|
670 |
-
return markdown_table_preview(doc), dash.no_update, dash.no_update
|
671 |
-
elif selected_type in narrative_types:
|
672 |
-
doc_store = {
|
673 |
-
"Pink": pink,
|
674 |
-
"Red": red,
|
675 |
-
"Gold": gold
|
676 |
-
}
|
677 |
-
doc = doc_store.get(selected_type, "")
|
678 |
-
return markdown_narrative_preview(doc), dash.no_update, dash.no_update
|
679 |
-
return html.Div("No document loaded."), dash.no_update, dash.no_update
|
680 |
-
if selected_type in spreadsheet_types:
|
681 |
-
return markdown_table_preview(doc), doc, dash.no_update
|
682 |
-
else:
|
683 |
-
return markdown_narrative_preview(doc), doc, dash.no_update
|
684 |
|
685 |
-
|
686 |
-
|
687 |
-
Output('progress-dot-store', 'data'),
|
688 |
-
Input("btn-download", "n_clicks"),
|
689 |
-
State('selected-doc-type', 'data'),
|
690 |
-
State('store-generated-doc', 'data'),
|
691 |
-
State('store-shred', 'data'),
|
692 |
-
State('store-pink', 'data'),
|
693 |
-
State('store-pink-review', 'data'),
|
694 |
-
State('store-red', 'data'),
|
695 |
-
State('store-red-review', 'data'),
|
696 |
-
State('store-gold', 'data'),
|
697 |
-
State('store-gold-review', 'data'),
|
698 |
-
State('store-loe', 'data'),
|
699 |
-
State('store-virtual-board', 'data'),
|
700 |
-
prevent_initial_call=True
|
701 |
-
)
|
702 |
-
def download_document(n_clicks, selected_type, generated_doc, shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board):
|
703 |
-
doc = generated_doc
|
704 |
-
if not doc:
|
705 |
-
doc = get_generated_doc(selected_type)
|
706 |
-
if not doc:
|
707 |
-
if selected_type == "Shred":
|
708 |
-
doc = shred
|
709 |
-
elif selected_type == "Pink":
|
710 |
-
doc = pink
|
711 |
-
elif selected_type == "Pink Review":
|
712 |
-
doc = pink_review
|
713 |
-
elif selected_type == "Red":
|
714 |
-
doc = red
|
715 |
-
elif selected_type == "Red Review":
|
716 |
-
doc = red_review
|
717 |
-
elif selected_type == "Gold":
|
718 |
-
doc = gold
|
719 |
-
elif selected_type == "Gold Review":
|
720 |
-
doc = gold_review
|
721 |
-
elif selected_type == "LOE":
|
722 |
-
doc = loe
|
723 |
-
elif selected_type == "Virtual Board":
|
724 |
-
doc = virtual_board
|
725 |
if not doc:
|
726 |
-
|
727 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
728 |
if selected_type in spreadsheet_types:
|
729 |
-
|
730 |
-
logging.info("Spreadsheet document prepared for download.")
|
731 |
-
return dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx"), "progress"
|
732 |
else:
|
733 |
-
|
734 |
-
logging.info("Narrative document prepared for download.")
|
735 |
-
return dcc.send_bytes(content, filename=f"{selected_type}_output.md"), "progress"
|
736 |
|
737 |
@app.callback(
|
738 |
Output("main-progress-dot-output", "children"),
|
|
|
472 |
Input('selected-doc-type', 'data'),
|
473 |
)
|
474 |
def update_right_col(selected_type):
|
|
|
475 |
store_data = {}
|
476 |
for store_key in ["shred","pink","pink_review","red","red_review","gold","gold_review","loe","virtual_board"]:
|
477 |
doc_content, _ = get_uploaded_doc(store_key)
|
|
|
529 |
if not triggered or not contents_lists:
|
530 |
return [dash.no_update]*19 + [dash.no_update]
|
531 |
|
|
|
532 |
subtype_map = {
|
533 |
"shred": (0, 0),
|
534 |
"pink": (1, 1),
|
|
|
541 |
"virtual_board": (8, 8)
|
542 |
}
|
543 |
|
|
|
544 |
for i, (contents, filenames) in enumerate(zip(contents_lists, filenames_lists)):
|
545 |
if contents and filenames:
|
546 |
id_dict = callback_context.inputs_list[0][i]['id']
|
|
|
549 |
if isinstance(contents, str):
|
550 |
contents = [contents]
|
551 |
filenames = [filenames]
|
|
|
552 |
content = contents[-1]
|
553 |
name = filenames[-1]
|
554 |
file_text = process_document(content, name)
|
|
|
556 |
stores[idx] = file_text
|
557 |
doc_names[doc_name_idx] = name
|
558 |
if subtype == "shred":
|
|
|
559 |
file_list = [
|
560 |
dbc.Row([
|
561 |
dbc.Col(
|
|
|
577 |
[
|
578 |
Output('document-preview', 'children'),
|
579 |
Output('store-generated-doc', 'data'),
|
580 |
+
Output('download-document', 'data'),
|
581 |
Output('progress-dot-store', 'data')
|
582 |
],
|
583 |
[
|
584 |
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
585 |
+
Input("btn-download", "n_clicks"),
|
586 |
Input('selected-doc-type', 'data')
|
587 |
],
|
588 |
[
|
|
|
599 |
],
|
600 |
prevent_initial_call=True
|
601 |
)
|
602 |
+
def handle_preview_generate_download(n_clicks_generate_list, n_clicks_download, selected_type,
|
603 |
+
shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board, prev_generated):
|
604 |
ctx = callback_context
|
605 |
trigger = ctx.triggered[0]['prop_id'] if ctx.triggered else ""
|
606 |
+
logging.info(f"Unified preview/generate/download trigger: {trigger}")
|
607 |
|
608 |
+
# Download logic
|
609 |
+
if "btn-download" in trigger:
|
610 |
+
doc = prev_generated
|
611 |
+
if not doc:
|
612 |
+
doc = get_generated_doc(selected_type)
|
613 |
+
if not doc:
|
614 |
+
if selected_type == "Shred":
|
615 |
+
doc = shred
|
616 |
+
elif selected_type == "Pink":
|
617 |
+
doc = pink
|
618 |
+
elif selected_type == "Pink Review":
|
619 |
+
doc = pink_review
|
620 |
+
elif selected_type == "Red":
|
621 |
+
doc = red
|
622 |
+
elif selected_type == "Red Review":
|
623 |
+
doc = red_review
|
624 |
+
elif selected_type == "Gold":
|
625 |
+
doc = gold
|
626 |
+
elif selected_type == "Gold Review":
|
627 |
+
doc = gold_review
|
628 |
+
elif selected_type == "LOE":
|
629 |
+
doc = loe
|
630 |
+
elif selected_type == "Virtual Board":
|
631 |
+
doc = virtual_board
|
632 |
+
if not doc:
|
633 |
+
logging.warning("No generated document to download.")
|
634 |
+
return dash.no_update, dash.no_update, dash.no_update, dash.no_update
|
635 |
+
if selected_type in spreadsheet_types:
|
636 |
+
xlsx_io = markdown_tables_to_xlsx(doc)
|
637 |
+
logging.info("Spreadsheet document prepared for download.")
|
638 |
+
return dash.no_update, dash.no_update, dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx"), "progress"
|
639 |
+
else:
|
640 |
+
content = doc.encode('utf-8')
|
641 |
+
logging.info("Narrative document prepared for download.")
|
642 |
+
return dash.no_update, dash.no_update, dcc.send_bytes(content, filename=f"{selected_type}_output.md"), "progress"
|
643 |
+
|
644 |
+
# Generate logic
|
645 |
+
if any(n_clicks_generate_list):
|
646 |
logging.info(f"Generating document for type: {selected_type}")
|
647 |
inputs = {
|
648 |
"shred": shred,
|
|
|
683 |
else:
|
684 |
preview = markdown_narrative_preview(generated_doc)
|
685 |
logging.info("Document preview updated.")
|
686 |
+
return preview, generated_doc, dash.no_update, "progress"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
687 |
|
688 |
+
# Preview logic (selected type changed)
|
689 |
+
doc = get_generated_doc(selected_type)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
690 |
if not doc:
|
691 |
+
if selected_type == "Shred" and shred:
|
692 |
+
return markdown_table_preview(shred), dash.no_update, dash.no_update, dash.no_update
|
693 |
+
elif selected_type in spreadsheet_types:
|
694 |
+
doc_store = {
|
695 |
+
"Pink Review": pink_review,
|
696 |
+
"Red Review": red_review,
|
697 |
+
"Gold Review": gold_review,
|
698 |
+
"Virtual Board": virtual_board,
|
699 |
+
"LOE": loe
|
700 |
+
}
|
701 |
+
doc = doc_store.get(selected_type, "")
|
702 |
+
return markdown_table_preview(doc), dash.no_update, dash.no_update, dash.no_update
|
703 |
+
elif selected_type in narrative_types:
|
704 |
+
doc_store = {
|
705 |
+
"Pink": pink,
|
706 |
+
"Red": red,
|
707 |
+
"Gold": gold
|
708 |
+
}
|
709 |
+
doc = doc_store.get(selected_type, "")
|
710 |
+
return markdown_narrative_preview(doc), dash.no_update, dash.no_update, dash.no_update
|
711 |
+
return html.Div("No document loaded."), dash.no_update, dash.no_update, dash.no_update
|
712 |
if selected_type in spreadsheet_types:
|
713 |
+
return markdown_table_preview(doc), doc, dash.no_update, dash.no_update
|
|
|
|
|
714 |
else:
|
715 |
+
return markdown_narrative_preview(doc), doc, dash.no_update, dash.no_update
|
|
|
|
|
716 |
|
717 |
@app.callback(
|
718 |
Output("main-progress-dot-output", "children"),
|