bluenevus commited on
Commit
21c6284
·
1 Parent(s): 4699f5b

Update app.py via AI Editor

Browse files
Files changed (1) hide show
  1. app.py +84 -79
app.py CHANGED
@@ -199,8 +199,8 @@ def get_left_col_content():
199
  'overflowY': 'auto'
200
  },
201
  rows=5,
202
- wrap='soft',
203
- autoFocus=True
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 generate_document(n_clicks, selected_type, shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board):
 
 
 
503
  ctx = callback_context
504
- if not ctx.triggered or not any(n_clicks):
505
- raise dash.exceptions.PreventUpdate
506
- logging.info(f"Generating document for type: {selected_type}")
507
- # Gather necessary documents
508
- inputs = {
509
- "shred": shred,
510
- "pink": pink,
511
- "pink_review": pink_review,
512
- "red": red,
513
- "red_review": red_review,
514
- "gold": gold,
515
- "gold_review": gold_review,
516
- "loe": loe,
517
- "virtual_board": virtual_board
518
- }
519
- prompt = document_types.get(selected_type, "")
520
- # Compose context for Gemini
521
- context = ""
522
- if selected_type in doc_dependencies:
523
- for dep in doc_dependencies[selected_type]["source"]:
524
- context += f"\n\n{dep.upper()}:\n{inputs.get(dep, '')}"
525
- else:
526
- context += f"\n\n{inputs.get('shred','')}"
527
- full_prompt = f"{prompt}\n\n{context}"
528
- # Gemini API call (threaded for responsiveness)
529
- result_holder = {}
530
- def gemini_thread():
531
- try:
532
- model = genai.GenerativeModel(GEMINI_MODEL)
533
- response = model.generate_content(full_prompt, stream=False)
534
- result_holder['result'] = response.text if hasattr(response, 'text') else str(response)
535
- logging.info("Gemini document generated successfully.")
536
- except Exception as e:
537
- logging.error(f"Error with Gemini API: {str(e)}")
538
- result_holder['result'] = f"Error generating document: {str(e)}"
539
- t = threading.Thread(target=gemini_thread)
540
- t.start()
541
- t.join(timeout=60)
542
- generated_doc = result_holder.get('result', 'Error: No document generated.')
543
- # Store and preview
544
- if selected_type in spreadsheet_types:
545
- preview = markdown_table_preview(generated_doc)
546
- else:
547
- preview = markdown_narrative_preview(generated_doc)
548
- logging.info("Document preview updated.")
549
- return preview, generated_doc, ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"),