Update app.py via AI Editor
Browse files
app.py
CHANGED
|
@@ -383,12 +383,10 @@ def unified_callback(
|
|
| 383 |
slides_content
|
| 384 |
)
|
| 385 |
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
button_id = ctx.triggered[0]['prop_id'].split('.')[0]
|
| 391 |
-
triggered_id_dict = ctx.triggered[0]['id'] if 'id' in ctx.triggered[0] else None
|
| 392 |
|
| 393 |
session = get_or_create_session_data(session_id)
|
| 394 |
slide_idx = current_slide_idx if current_slide_idx is not None else None
|
|
@@ -449,22 +447,69 @@ def unified_callback(
|
|
| 449 |
with session['lock']:
|
| 450 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 451 |
|
| 452 |
-
#
|
| 453 |
-
|
| 454 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 455 |
try:
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
| 460 |
-
|
| 461 |
-
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 465 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 466 |
|
| 467 |
-
elif
|
| 468 |
decoded_file_text = None
|
| 469 |
uploaded_files = [f for f in session['files_box'] if f['type'] == 'uploaded']
|
| 470 |
if uploaded_files:
|
|
@@ -506,7 +551,7 @@ def unified_callback(
|
|
| 506 |
return build_files_box(session), f"An error occurred: {str(e)}", log_str, slide_idx, None, slides_content
|
| 507 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 508 |
|
| 509 |
-
elif
|
| 510 |
if not slides_content or not session_id:
|
| 511 |
raise PreventUpdate
|
| 512 |
pptx_bytes = None
|
|
@@ -530,36 +575,6 @@ def unified_callback(
|
|
| 530 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 531 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 532 |
|
| 533 |
-
# Handle pattern-matching download/delete, robustly extract the dict, never parse as JSON string
|
| 534 |
-
elif triggered_id_dict is not None and isinstance(triggered_id_dict, dict):
|
| 535 |
-
if triggered_id_dict.get('type') == 'file-download':
|
| 536 |
-
filename = triggered_id_dict.get('filename')
|
| 537 |
-
file_entry = next((f for f in session['files_box'] if f['name'] == filename), None)
|
| 538 |
-
if file_entry:
|
| 539 |
-
file_path = file_entry['path']
|
| 540 |
-
file_name = file_entry['name']
|
| 541 |
-
file_bytes = read_session_temp_file(file_path)
|
| 542 |
-
add_log(f"Download link generated for file '{file_name}' at '{file_path}'", session_id)
|
| 543 |
-
logger.info(f"Download triggered for file '{file_name}' at '{file_path}' session '{session_id}'")
|
| 544 |
-
log_str = '\n'.join(session['log_messages'][:100])
|
| 545 |
-
return build_files_box(session), slides_content, log_str, slide_idx, dcc.send_bytes(file_bytes, file_name), slides_content
|
| 546 |
-
elif triggered_id_dict.get('type') == 'file-delete':
|
| 547 |
-
filename = triggered_id_dict.get('filename')
|
| 548 |
-
file_entry = next((f for f in session['files_box'] if f['name'] == filename), None)
|
| 549 |
-
if file_entry:
|
| 550 |
-
try:
|
| 551 |
-
os.remove(file_entry['path'])
|
| 552 |
-
add_log(f"Deleted file '{file_entry['name']}' from '{file_entry['path']}'", session_id)
|
| 553 |
-
logger.info(f"Deleted file '{file_entry['name']}' at '{file_entry['path']}' for session '{session_id}'")
|
| 554 |
-
except Exception as ex:
|
| 555 |
-
add_log(f"Failed to delete file '{file_entry['name']}' from '{file_entry['path']}': {str(ex)}", session_id)
|
| 556 |
-
session['files_box'] = list_session_files(session_id)
|
| 557 |
-
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{file_entry['name']}' deleted.")
|
| 558 |
-
log_str = '\n'.join(session['log_messages'][:100])
|
| 559 |
-
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 560 |
-
else:
|
| 561 |
-
raise PreventUpdate
|
| 562 |
-
|
| 563 |
else:
|
| 564 |
session['files_box'] = list_session_files(session_id)
|
| 565 |
session['current_slide_md'] = load_current_slide_md_from_disk(session_id)
|
|
|
|
| 383 |
slides_content
|
| 384 |
)
|
| 385 |
|
| 386 |
+
# Determine what triggered the callback
|
| 387 |
+
triggered = ctx.triggered[0]
|
| 388 |
+
prop_id = triggered['prop_id']
|
| 389 |
+
triggered_id = triggered.get('id', None)
|
|
|
|
|
|
|
| 390 |
|
| 391 |
session = get_or_create_session_data(session_id)
|
| 392 |
slide_idx = current_slide_idx if current_slide_idx is not None else None
|
|
|
|
| 447 |
with session['lock']:
|
| 448 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 449 |
|
| 450 |
+
# Detect if delete triggered
|
| 451 |
+
delete_triggered = False
|
| 452 |
+
delete_filename = None
|
| 453 |
+
if 'file-delete' in prop_id:
|
| 454 |
+
if isinstance(delete_ids, list):
|
| 455 |
+
for n, n_clicks in enumerate(file_deletes):
|
| 456 |
+
if n_clicks and n_clicks > 0 and isinstance(delete_ids[n], dict):
|
| 457 |
+
delete_triggered = True
|
| 458 |
+
delete_filename = delete_ids[n].get('filename')
|
| 459 |
+
break
|
| 460 |
+
# Detect if download triggered
|
| 461 |
+
download_triggered = False
|
| 462 |
+
download_filename = None
|
| 463 |
+
if 'file-download' in prop_id:
|
| 464 |
+
if isinstance(download_ids, list):
|
| 465 |
+
for n, n_clicks in enumerate(file_downloads):
|
| 466 |
+
if n_clicks and n_clicks > 0 and isinstance(download_ids[n], dict):
|
| 467 |
+
download_triggered = True
|
| 468 |
+
download_filename = download_ids[n].get('filename')
|
| 469 |
+
break
|
| 470 |
+
|
| 471 |
+
# Handle file deletion
|
| 472 |
+
if delete_triggered and delete_filename:
|
| 473 |
+
file_entry = next((f for f in session['files_box'] if f['name'] == delete_filename), None)
|
| 474 |
+
if file_entry:
|
| 475 |
try:
|
| 476 |
+
os.remove(file_entry['path'])
|
| 477 |
+
add_log(f"Deleted file '{file_entry['name']}' from '{file_entry['path']}'", session_id)
|
| 478 |
+
logger.info(f"Deleted file '{file_entry['name']}' at '{file_entry['path']}' for session '{session_id}'")
|
| 479 |
+
except Exception as ex:
|
| 480 |
+
add_log(f"Failed to delete file '{file_entry['name']}' from '{file_entry['path']}': {str(ex)}", session_id)
|
| 481 |
+
session['files_box'] = list_session_files(session_id)
|
| 482 |
+
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{file_entry['name']}' deleted.")
|
| 483 |
+
log_str = '\n'.join(session['log_messages'][:100])
|
| 484 |
+
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 485 |
+
|
| 486 |
+
# Handle file download
|
| 487 |
+
if download_triggered and download_filename:
|
| 488 |
+
file_entry = next((f for f in session['files_box'] if f['name'] == download_filename), None)
|
| 489 |
+
if file_entry:
|
| 490 |
+
file_path = file_entry['path']
|
| 491 |
+
file_name = file_entry['name']
|
| 492 |
+
file_bytes = read_session_temp_file(file_path)
|
| 493 |
+
add_log(f"Download link generated for file '{file_name}' at '{file_path}'", session_id)
|
| 494 |
+
logger.info(f"Download triggered for file '{file_name}' at '{file_path}' session '{session_id}'")
|
| 495 |
+
log_str = '\n'.join(session['log_messages'][:100])
|
| 496 |
+
return build_files_box(session), slides_content, log_str, slide_idx, dcc.send_bytes(file_bytes, file_name), slides_content
|
| 497 |
+
|
| 498 |
+
# Handle upload
|
| 499 |
+
if prop_id.startswith('upload-file') and upload_contents and upload_filename:
|
| 500 |
+
try:
|
| 501 |
+
header, content_string = upload_contents.split(',')
|
| 502 |
+
file_bytes = base64.b64decode(content_string)
|
| 503 |
+
file_path = save_to_session_temp_file(session_id, upload_filename, file_bytes)
|
| 504 |
+
session['files_box'] = list_session_files(session_id)
|
| 505 |
+
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Uploaded file '{upload_filename}' saved to '{file_path}' for session '{session_id}'.")
|
| 506 |
+
logger.info(f"File '{upload_filename}' registered in session file box for '{session_id}', path: {file_path}")
|
| 507 |
+
except Exception as e:
|
| 508 |
+
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Error uploading file: {str(e)}")
|
| 509 |
+
log_str = '\n'.join(session['log_messages'][:100])
|
| 510 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 511 |
|
| 512 |
+
elif prop_id.startswith('generate-content-button'):
|
| 513 |
decoded_file_text = None
|
| 514 |
uploaded_files = [f for f in session['files_box'] if f['type'] == 'uploaded']
|
| 515 |
if uploaded_files:
|
|
|
|
| 551 |
return build_files_box(session), f"An error occurred: {str(e)}", log_str, slide_idx, None, slides_content
|
| 552 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 553 |
|
| 554 |
+
elif prop_id.startswith('generate-ppt-button'):
|
| 555 |
if not slides_content or not session_id:
|
| 556 |
raise PreventUpdate
|
| 557 |
pptx_bytes = None
|
|
|
|
| 575 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 576 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 577 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 578 |
else:
|
| 579 |
session['files_box'] = list_session_files(session_id)
|
| 580 |
session['current_slide_md'] = load_current_slide_md_from_disk(session_id)
|