Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -199,8 +199,8 @@ def get_left_col_content():
|
|
199 |
'overflowY': 'auto'
|
200 |
},
|
201 |
rows=5,
|
202 |
-
wrap='soft'
|
203 |
-
autoFocus
|
204 |
),
|
205 |
dbc.Row([
|
206 |
dbc.Col(
|
@@ -452,40 +452,11 @@ def update_right_col(selected_type, shred_doc, pink_doc, pink_review_doc, red_do
|
|
452 |
Output('store-shred', 'data'),
|
453 |
Output('document-preview', 'children'),
|
454 |
Output('loading-output', 'children'),
|
|
|
455 |
Input('upload-document', 'contents'),
|
456 |
State('upload-document', 'filename'),
|
457 |
State('file-list', 'children'),
|
458 |
State('store-shred', 'data'),
|
459 |
-
prevent_initial_call=True
|
460 |
-
)
|
461 |
-
def handle_shred_upload(upload_contents, upload_filenames, existing_files, current_shred):
|
462 |
-
files_display = existing_files if existing_files else []
|
463 |
-
new_shred = current_shred
|
464 |
-
if upload_contents and upload_filenames:
|
465 |
-
for content, name in zip(upload_contents, upload_filenames):
|
466 |
-
file_content = process_document(content, name)
|
467 |
-
uploaded_files[name] = file_content
|
468 |
-
new_shred = file_content
|
469 |
-
files_display.append(
|
470 |
-
dbc.Row([
|
471 |
-
dbc.Col(
|
472 |
-
html.Button('×', id={'type': 'remove-file', 'index': name}, style={'marginRight': '5px', 'fontSize': '10px'}),
|
473 |
-
width=1
|
474 |
-
),
|
475 |
-
dbc.Col(
|
476 |
-
html.Span(name, style={'wordBreak': 'break-all'}),
|
477 |
-
width=11
|
478 |
-
)
|
479 |
-
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
480 |
-
)
|
481 |
-
logging.info("Shred document uploaded and stored.")
|
482 |
-
return files_display, new_shred, markdown_table_preview(new_shred), ""
|
483 |
-
return files_display, new_shred, markdown_table_preview(new_shred) if new_shred else html.Div("No Shred document loaded."), ""
|
484 |
-
|
485 |
-
@app.callback(
|
486 |
-
Output('document-preview', 'children'),
|
487 |
-
Output('store-generated-doc', 'data'),
|
488 |
-
Output('loading-output', 'children'),
|
489 |
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
490 |
State('selected-doc-type', 'data'),
|
491 |
State('store-shred', 'data'),
|
@@ -499,54 +470,88 @@ def handle_shred_upload(upload_contents, upload_filenames, existing_files, curre
|
|
499 |
State('store-virtual-board', 'data'),
|
500 |
prevent_initial_call=True
|
501 |
)
|
502 |
-
def
|
|
|
|
|
|
|
503 |
ctx = callback_context
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
|
539 |
-
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
550 |
|
551 |
@app.callback(
|
552 |
Output("download-document", "data"),
|
|
|
199 |
'overflowY': 'auto'
|
200 |
},
|
201 |
rows=5,
|
202 |
+
wrap='soft'
|
203 |
+
# autoFocus removed for Dash compatibility
|
204 |
),
|
205 |
dbc.Row([
|
206 |
dbc.Col(
|
|
|
452 |
Output('store-shred', 'data'),
|
453 |
Output('document-preview', 'children'),
|
454 |
Output('loading-output', 'children'),
|
455 |
+
Output('store-generated-doc', 'data'),
|
456 |
Input('upload-document', 'contents'),
|
457 |
State('upload-document', 'filename'),
|
458 |
State('file-list', 'children'),
|
459 |
State('store-shred', 'data'),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
460 |
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
461 |
State('selected-doc-type', 'data'),
|
462 |
State('store-shred', 'data'),
|
|
|
470 |
State('store-virtual-board', 'data'),
|
471 |
prevent_initial_call=True
|
472 |
)
|
473 |
+
def combined_callback(
|
474 |
+
upload_contents, upload_filenames, existing_files, current_shred,
|
475 |
+
n_clicks, selected_type, shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board
|
476 |
+
):
|
477 |
ctx = callback_context
|
478 |
+
trigger = ctx.triggered[0]['prop_id'].split('.')[0] if ctx.triggered else ""
|
479 |
+
# Default outputs
|
480 |
+
files_display = existing_files if existing_files else []
|
481 |
+
new_shred = current_shred
|
482 |
+
preview = dash.no_update
|
483 |
+
loading_msg = ""
|
484 |
+
generated_doc = dash.no_update
|
485 |
+
|
486 |
+
if trigger == "upload-document":
|
487 |
+
if upload_contents and upload_filenames:
|
488 |
+
for content, name in zip(upload_contents, upload_filenames):
|
489 |
+
file_content = process_document(content, name)
|
490 |
+
uploaded_files[name] = file_content
|
491 |
+
new_shred = file_content
|
492 |
+
files_display.append(
|
493 |
+
dbc.Row([
|
494 |
+
dbc.Col(
|
495 |
+
html.Button('×', id={'type': 'remove-file', 'index': name}, style={'marginRight': '5px', 'fontSize': '10px'}),
|
496 |
+
width=1
|
497 |
+
),
|
498 |
+
dbc.Col(
|
499 |
+
html.Span(name, style={'wordBreak': 'break-all'}),
|
500 |
+
width=11
|
501 |
+
)
|
502 |
+
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
503 |
+
)
|
504 |
+
logging.info("Shred document uploaded and stored.")
|
505 |
+
preview = markdown_table_preview(new_shred)
|
506 |
+
generated_doc = dash.no_update
|
507 |
+
else:
|
508 |
+
preview = markdown_table_preview(new_shred) if new_shred else html.Div("No Shred document loaded.")
|
509 |
+
generated_doc = dash.no_update
|
510 |
+
return files_display, new_shred, preview, loading_msg, generated_doc
|
511 |
+
|
512 |
+
if any(n_clicks):
|
513 |
+
logging.info(f"Generating document for type: {selected_type}")
|
514 |
+
inputs = {
|
515 |
+
"shred": shred,
|
516 |
+
"pink": pink,
|
517 |
+
"pink_review": pink_review,
|
518 |
+
"red": red,
|
519 |
+
"red_review": red_review,
|
520 |
+
"gold": gold,
|
521 |
+
"gold_review": gold_review,
|
522 |
+
"loe": loe,
|
523 |
+
"virtual_board": virtual_board
|
524 |
+
}
|
525 |
+
prompt = document_types.get(selected_type, "")
|
526 |
+
context = ""
|
527 |
+
if selected_type in doc_dependencies:
|
528 |
+
for dep in doc_dependencies[selected_type]["source"]:
|
529 |
+
context += f"\n\n{dep.upper()}:\n{inputs.get(dep, '')}"
|
530 |
+
else:
|
531 |
+
context += f"\n\n{inputs.get('shred','')}"
|
532 |
+
full_prompt = f"{prompt}\n\n{context}"
|
533 |
+
result_holder = {}
|
534 |
+
def gemini_thread():
|
535 |
+
try:
|
536 |
+
model = genai.GenerativeModel(GEMINI_MODEL)
|
537 |
+
response = model.generate_content(full_prompt, stream=False)
|
538 |
+
result_holder['result'] = response.text if hasattr(response, 'text') else str(response)
|
539 |
+
logging.info("Gemini document generated successfully.")
|
540 |
+
except Exception as e:
|
541 |
+
logging.error(f"Error with Gemini API: {str(e)}")
|
542 |
+
result_holder['result'] = f"Error generating document: {str(e)}"
|
543 |
+
t = threading.Thread(target=gemini_thread)
|
544 |
+
t.start()
|
545 |
+
t.join(timeout=60)
|
546 |
+
generated_doc = result_holder.get('result', 'Error: No document generated.')
|
547 |
+
if selected_type in spreadsheet_types:
|
548 |
+
preview = markdown_table_preview(generated_doc)
|
549 |
+
else:
|
550 |
+
preview = markdown_narrative_preview(generated_doc)
|
551 |
+
logging.info("Document preview updated.")
|
552 |
+
return dash.no_update, dash.no_update, preview, "", generated_doc
|
553 |
+
|
554 |
+
return files_display, new_shred, markdown_table_preview(new_shred) if new_shred else html.Div("No Shred document loaded."), loading_msg, generated_doc
|
555 |
|
556 |
@app.callback(
|
557 |
Output("download-document", "data"),
|