Update app.py via AI Editor
Browse files
app.py
CHANGED
|
@@ -352,15 +352,15 @@ def store_session_id(session_id):
|
|
| 352 |
Input('upload-file', 'contents'),
|
| 353 |
Input('generate-content-button', 'n_clicks'),
|
| 354 |
Input('generate-ppt-button', 'n_clicks'),
|
| 355 |
-
Input({'type': 'file-download', '
|
| 356 |
-
Input({'type': 'file-delete', '
|
| 357 |
Input('slides-content', 'value'),
|
| 358 |
-
Input('session-id', 'data'),
|
| 359 |
State('upload-file', 'filename'),
|
| 360 |
State('document-text', 'value'),
|
| 361 |
State('current-slide-index', 'data'),
|
| 362 |
-
State({'type': 'file-download', '
|
| 363 |
-
State({'type': 'file-delete', '
|
| 364 |
State('slides-content-store', 'data'),
|
| 365 |
prevent_initial_call=False
|
| 366 |
)
|
|
@@ -369,7 +369,6 @@ def unified_callback(
|
|
| 369 |
upload_filename, document_text, current_slide_idx, download_ids, delete_ids, slides_content_store_data
|
| 370 |
):
|
| 371 |
ctx = callback_context
|
| 372 |
-
# On initial app load or refresh, handle state restoration
|
| 373 |
if not ctx.triggered or not session_id:
|
| 374 |
session = get_or_create_session_data(session_id)
|
| 375 |
session['files_box'] = list_session_files(session_id)
|
|
@@ -401,14 +400,14 @@ def unified_callback(
|
|
| 401 |
|
| 402 |
def build_files_box(session):
|
| 403 |
files_box = []
|
| 404 |
-
for
|
| 405 |
files_box.append(
|
| 406 |
html.Div([
|
| 407 |
html.Div(
|
| 408 |
html.A(
|
| 409 |
f['name'],
|
| 410 |
href="#",
|
| 411 |
-
id={'type': 'file-download', '
|
| 412 |
n_clicks=0,
|
| 413 |
style={
|
| 414 |
'color': '#116F70',
|
|
@@ -430,12 +429,12 @@ def unified_callback(
|
|
| 430 |
),
|
| 431 |
dbc.Button(
|
| 432 |
"Delete",
|
| 433 |
-
id={'type': 'file-delete', '
|
| 434 |
size="sm",
|
| 435 |
color="secondary",
|
| 436 |
style={'marginLeft': '8px', 'marginBottom': '2px', 'flex': 'none'}
|
| 437 |
)
|
| 438 |
-
], style={'display': 'flex', 'alignItems': 'center', 'marginBottom': '8px', 'width': '100%', 'gap': '0.2em'}, id={'type': 'file-row', '
|
| 439 |
)
|
| 440 |
if not files_box:
|
| 441 |
return html.Div("No files uploaded or generated yet.", className="text-muted")
|
|
@@ -527,37 +526,34 @@ def unified_callback(
|
|
| 527 |
elif button_id.startswith("{"):
|
| 528 |
triggered_id = eval(button_id)
|
| 529 |
if triggered_id['type'] == 'file-download':
|
| 530 |
-
|
| 531 |
-
|
| 532 |
-
|
| 533 |
-
|
| 534 |
-
|
| 535 |
-
|
| 536 |
-
|
| 537 |
-
|
| 538 |
-
|
| 539 |
-
|
| 540 |
elif triggered_id['type'] == 'file-delete':
|
| 541 |
-
|
| 542 |
-
|
| 543 |
-
|
| 544 |
-
|
| 545 |
-
|
| 546 |
-
|
| 547 |
-
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
|
| 551 |
-
|
| 552 |
-
|
| 553 |
-
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{deleted['name']}' deleted.")
|
| 554 |
-
log_str = '\n'.join(session['log_messages'][:100])
|
| 555 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 556 |
else:
|
| 557 |
raise PreventUpdate
|
| 558 |
|
| 559 |
else:
|
| 560 |
-
# If unknown trigger, restore state (should not happen)
|
| 561 |
session['files_box'] = list_session_files(session_id)
|
| 562 |
session['current_slide_md'] = load_current_slide_md_from_disk(session_id)
|
| 563 |
slides_content = session.get('current_slide_md', "")
|
|
|
|
| 352 |
Input('upload-file', 'contents'),
|
| 353 |
Input('generate-content-button', 'n_clicks'),
|
| 354 |
Input('generate-ppt-button', 'n_clicks'),
|
| 355 |
+
Input({'type': 'file-download', 'filename': dash.ALL}, 'n_clicks'),
|
| 356 |
+
Input({'type': 'file-delete', 'filename': dash.ALL}, 'n_clicks'),
|
| 357 |
Input('slides-content', 'value'),
|
| 358 |
+
Input('session-id', 'data'),
|
| 359 |
State('upload-file', 'filename'),
|
| 360 |
State('document-text', 'value'),
|
| 361 |
State('current-slide-index', 'data'),
|
| 362 |
+
State({'type': 'file-download', 'filename': dash.ALL}, 'id'),
|
| 363 |
+
State({'type': 'file-delete', 'filename': dash.ALL}, 'id'),
|
| 364 |
State('slides-content-store', 'data'),
|
| 365 |
prevent_initial_call=False
|
| 366 |
)
|
|
|
|
| 369 |
upload_filename, document_text, current_slide_idx, download_ids, delete_ids, slides_content_store_data
|
| 370 |
):
|
| 371 |
ctx = callback_context
|
|
|
|
| 372 |
if not ctx.triggered or not session_id:
|
| 373 |
session = get_or_create_session_data(session_id)
|
| 374 |
session['files_box'] = list_session_files(session_id)
|
|
|
|
| 400 |
|
| 401 |
def build_files_box(session):
|
| 402 |
files_box = []
|
| 403 |
+
for f in session['files_box']:
|
| 404 |
files_box.append(
|
| 405 |
html.Div([
|
| 406 |
html.Div(
|
| 407 |
html.A(
|
| 408 |
f['name'],
|
| 409 |
href="#",
|
| 410 |
+
id={'type': 'file-download', 'filename': f['name']},
|
| 411 |
n_clicks=0,
|
| 412 |
style={
|
| 413 |
'color': '#116F70',
|
|
|
|
| 429 |
),
|
| 430 |
dbc.Button(
|
| 431 |
"Delete",
|
| 432 |
+
id={'type': 'file-delete', 'filename': f['name']},
|
| 433 |
size="sm",
|
| 434 |
color="secondary",
|
| 435 |
style={'marginLeft': '8px', 'marginBottom': '2px', 'flex': 'none'}
|
| 436 |
)
|
| 437 |
+
], style={'display': 'flex', 'alignItems': 'center', 'marginBottom': '8px', 'width': '100%', 'gap': '0.2em'}, id={'type': 'file-row', 'filename': f['name']})
|
| 438 |
)
|
| 439 |
if not files_box:
|
| 440 |
return html.Div("No files uploaded or generated yet.", className="text-muted")
|
|
|
|
| 526 |
elif button_id.startswith("{"):
|
| 527 |
triggered_id = eval(button_id)
|
| 528 |
if triggered_id['type'] == 'file-download':
|
| 529 |
+
filename = triggered_id['filename']
|
| 530 |
+
file_entry = next((f for f in session['files_box'] if f['name'] == filename), None)
|
| 531 |
+
if file_entry:
|
| 532 |
+
file_path = file_entry['path']
|
| 533 |
+
file_name = file_entry['name']
|
| 534 |
+
file_bytes = read_session_temp_file(file_path)
|
| 535 |
+
add_log(f"Download link generated for file '{file_name}' at '{file_path}'", session_id)
|
| 536 |
+
logger.info(f"Download triggered for file '{file_name}' at '{file_path}' session '{session_id}'")
|
| 537 |
+
log_str = '\n'.join(session['log_messages'][:100])
|
| 538 |
+
return build_files_box(session), slides_content, log_str, slide_idx, dcc.send_bytes(file_bytes, file_name), slides_content
|
| 539 |
elif triggered_id['type'] == 'file-delete':
|
| 540 |
+
filename = triggered_id['filename']
|
| 541 |
+
file_entry = next((f for f in session['files_box'] if f['name'] == filename), None)
|
| 542 |
+
if file_entry:
|
| 543 |
+
try:
|
| 544 |
+
os.remove(file_entry['path'])
|
| 545 |
+
add_log(f"Deleted file '{file_entry['name']}' from '{file_entry['path']}'", session_id)
|
| 546 |
+
logger.info(f"Deleted file '{file_entry['name']}' at '{file_entry['path']}' for session '{session_id}'")
|
| 547 |
+
except Exception as ex:
|
| 548 |
+
add_log(f"Failed to delete file '{file_entry['name']}' from '{file_entry['path']}': {str(ex)}", session_id)
|
| 549 |
+
session['files_box'] = list_session_files(session_id)
|
| 550 |
+
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{file_entry['name']}' deleted.")
|
| 551 |
+
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
|
|
|
| 552 |
return build_files_box(session), slides_content, log_str, slide_idx, None, slides_content
|
| 553 |
else:
|
| 554 |
raise PreventUpdate
|
| 555 |
|
| 556 |
else:
|
|
|
|
| 557 |
session['files_box'] = list_session_files(session_id)
|
| 558 |
session['current_slide_md'] = load_current_slide_md_from_disk(session_id)
|
| 559 |
slides_content = session.get('current_slide_md', "")
|