Update app.py via AI Editor
Browse files
app.py
CHANGED
|
@@ -80,6 +80,7 @@ app.layout = html.Div([
|
|
| 80 |
})();
|
| 81 |
'''),
|
| 82 |
html.A(id='uploaded-file-download-link', href="", style={'display': 'none'}),
|
|
|
|
| 83 |
dcc.Dropdown(id='slide-generation-list', style={'display': 'none'}),
|
| 84 |
dcc.Download(id="download-dynamic"),
|
| 85 |
dbc.Container([
|
|
@@ -272,17 +273,6 @@ def markdown_to_pptx(md_text, session_id):
|
|
| 272 |
prs.save(output)
|
| 273 |
return output.getvalue()
|
| 274 |
|
| 275 |
-
def get_pptx_download_button(session):
|
| 276 |
-
if session.get('generated_pptx'):
|
| 277 |
-
return dbc.Button(
|
| 278 |
-
"Download PowerPoint",
|
| 279 |
-
id='pptx-download-link',
|
| 280 |
-
color="primary",
|
| 281 |
-
className="w-100",
|
| 282 |
-
n_clicks=0
|
| 283 |
-
)
|
| 284 |
-
return ""
|
| 285 |
-
|
| 286 |
@app.callback(
|
| 287 |
Output('session-id', 'data'),
|
| 288 |
Input('session-id', 'data')
|
|
@@ -334,7 +324,7 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 334 |
id='uploaded-file-download-link-visible',
|
| 335 |
href="#",
|
| 336 |
n_clicks=0,
|
| 337 |
-
style={'display': 'block'}
|
| 338 |
)
|
| 339 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 340 |
|
|
@@ -354,7 +344,15 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 354 |
)
|
| 355 |
]) if slide_list else html.Div("No slides generated yet.", className="text-muted")
|
| 356 |
|
| 357 |
-
pptx_file_link =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 358 |
|
| 359 |
if button_id == 'upload-file':
|
| 360 |
if upload_contents and upload_filename:
|
|
@@ -371,14 +369,13 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 371 |
id='uploaded-file-download-link-visible',
|
| 372 |
href="#",
|
| 373 |
n_clicks=0,
|
| 374 |
-
style={'display': 'block'}
|
| 375 |
)
|
| 376 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 377 |
except Exception as e:
|
| 378 |
with session['lock']:
|
| 379 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Error uploading file: {str(e)}")
|
| 380 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 381 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 382 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 383 |
elif button_id == 'generate-button':
|
| 384 |
decoded_file_text = None
|
|
@@ -392,7 +389,6 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 392 |
with session['lock']:
|
| 393 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.")
|
| 394 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 395 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 396 |
return upload_file_link, pptx_file_link, "Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.", log_str, slide_dropdown, slide_idx
|
| 397 |
combined_text = ""
|
| 398 |
if decoded_file_text and document_text:
|
|
@@ -405,7 +401,6 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 405 |
with session['lock']:
|
| 406 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Please upload a file or enter text.")
|
| 407 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 408 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 409 |
return upload_file_link, pptx_file_link, "Please upload a file or enter text.", log_str, slide_dropdown, slide_idx
|
| 410 |
try:
|
| 411 |
add_log("Starting slide generation...", session_id)
|
|
@@ -434,13 +429,11 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 434 |
style={'marginBottom': '10px'}
|
| 435 |
)
|
| 436 |
])
|
| 437 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 438 |
return upload_file_link, pptx_file_link, slides_md, log_str, slide_dropdown, slide_idx
|
| 439 |
except Exception as e:
|
| 440 |
add_log(f"An error occurred during slide generation: {str(e)}", session_id)
|
| 441 |
with session['lock']:
|
| 442 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 443 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 444 |
return upload_file_link, pptx_file_link, f"An error occurred: {str(e)}", log_str, slide_dropdown, slide_idx
|
| 445 |
elif button_id == 'generate-ppt-button':
|
| 446 |
if not slides_content or not session_id:
|
|
@@ -450,7 +443,13 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 450 |
pptx_bytes = markdown_to_pptx(slides_content, session_id)
|
| 451 |
with session['lock']:
|
| 452 |
session['generated_pptx'] = pptx_bytes
|
| 453 |
-
pptx_file_link =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 454 |
add_log("PowerPoint generation completed.", session_id)
|
| 455 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 456 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
|
@@ -458,7 +457,6 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 458 |
add_log(f"An error occurred during PowerPoint generation: {str(e)}", session_id)
|
| 459 |
with session['lock']:
|
| 460 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 461 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 462 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 463 |
elif button_id == 'slide-generation-list':
|
| 464 |
try:
|
|
@@ -467,21 +465,19 @@ def unified_callback(upload_contents, gen_btn, gen_ppt_btn, selected_slide_idx,
|
|
| 467 |
slide_idx = selected_slide_idx
|
| 468 |
else:
|
| 469 |
slides_md = ""
|
| 470 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 471 |
return upload_file_link, pptx_file_link, slides_md, log_str, slide_dropdown, slide_idx
|
| 472 |
except Exception as e:
|
| 473 |
add_log(f"An error occurred while loading slide set: {str(e)}", session_id)
|
| 474 |
with session['lock']:
|
| 475 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 476 |
-
pptx_file_link = get_pptx_download_button(session)
|
| 477 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 478 |
else:
|
| 479 |
raise PreventUpdate
|
| 480 |
|
| 481 |
@app.callback(
|
| 482 |
Output("download-dynamic", "data"),
|
| 483 |
-
Input('uploaded-file-download-link', 'n_clicks'),
|
| 484 |
-
Input('pptx-download-link', 'n_clicks'),
|
| 485 |
State('session-id', 'data'),
|
| 486 |
prevent_initial_call=True
|
| 487 |
)
|
|
@@ -492,9 +488,9 @@ def download_dynamic(uploaded_file_nclicks, pptx_nclicks, session_id):
|
|
| 492 |
button_id = ctx.triggered[0]['prop_id'].split('.')[0]
|
| 493 |
session = get_or_create_session_data(session_id)
|
| 494 |
with session['lock']:
|
| 495 |
-
if button_id == 'uploaded-file-download-link' and session.get('uploaded_file') and session.get('uploaded_filename'):
|
| 496 |
return dcc.send_bytes(session['uploaded_file'], session['uploaded_filename'])
|
| 497 |
-
if button_id == 'pptx-download-link' and session.get('generated_pptx'):
|
| 498 |
return dcc.send_bytes(session['generated_pptx'], "presentation.pptx")
|
| 499 |
raise PreventUpdate
|
| 500 |
|
|
|
|
| 80 |
})();
|
| 81 |
'''),
|
| 82 |
html.A(id='uploaded-file-download-link', href="", style={'display': 'none'}),
|
| 83 |
+
html.A(id='pptx-file-download-link', href="", style={'display': 'none'}),
|
| 84 |
dcc.Dropdown(id='slide-generation-list', style={'display': 'none'}),
|
| 85 |
dcc.Download(id="download-dynamic"),
|
| 86 |
dbc.Container([
|
|
|
|
| 273 |
prs.save(output)
|
| 274 |
return output.getvalue()
|
| 275 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
@app.callback(
|
| 277 |
Output('session-id', 'data'),
|
| 278 |
Input('session-id', 'data')
|
|
|
|
| 324 |
id='uploaded-file-download-link-visible',
|
| 325 |
href="#",
|
| 326 |
n_clicks=0,
|
| 327 |
+
style={'display': 'block', 'cursor': 'pointer', 'color': '#116F70', 'textDecoration': 'underline'}
|
| 328 |
)
|
| 329 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 330 |
|
|
|
|
| 344 |
)
|
| 345 |
]) if slide_list else html.Div("No slides generated yet.", className="text-muted")
|
| 346 |
|
| 347 |
+
pptx_file_link = ""
|
| 348 |
+
if session.get('generated_pptx'):
|
| 349 |
+
pptx_file_link = html.A(
|
| 350 |
+
"presentation.pptx",
|
| 351 |
+
id='pptx-file-download-link-visible',
|
| 352 |
+
href="#",
|
| 353 |
+
n_clicks=0,
|
| 354 |
+
style={'display': 'block', 'cursor': 'pointer', 'color': '#116F70', 'textDecoration': 'underline'}
|
| 355 |
+
)
|
| 356 |
|
| 357 |
if button_id == 'upload-file':
|
| 358 |
if upload_contents and upload_filename:
|
|
|
|
| 369 |
id='uploaded-file-download-link-visible',
|
| 370 |
href="#",
|
| 371 |
n_clicks=0,
|
| 372 |
+
style={'display': 'block', 'cursor': 'pointer', 'color': '#116F70', 'textDecoration': 'underline'}
|
| 373 |
)
|
| 374 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 375 |
except Exception as e:
|
| 376 |
with session['lock']:
|
| 377 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Error uploading file: {str(e)}")
|
| 378 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 379 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 380 |
elif button_id == 'generate-button':
|
| 381 |
decoded_file_text = None
|
|
|
|
| 389 |
with session['lock']:
|
| 390 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.")
|
| 391 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 392 |
return upload_file_link, pptx_file_link, "Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.", log_str, slide_dropdown, slide_idx
|
| 393 |
combined_text = ""
|
| 394 |
if decoded_file_text and document_text:
|
|
|
|
| 401 |
with session['lock']:
|
| 402 |
session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Please upload a file or enter text.")
|
| 403 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 404 |
return upload_file_link, pptx_file_link, "Please upload a file or enter text.", log_str, slide_dropdown, slide_idx
|
| 405 |
try:
|
| 406 |
add_log("Starting slide generation...", session_id)
|
|
|
|
| 429 |
style={'marginBottom': '10px'}
|
| 430 |
)
|
| 431 |
])
|
|
|
|
| 432 |
return upload_file_link, pptx_file_link, slides_md, log_str, slide_dropdown, slide_idx
|
| 433 |
except Exception as e:
|
| 434 |
add_log(f"An error occurred during slide generation: {str(e)}", session_id)
|
| 435 |
with session['lock']:
|
| 436 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 437 |
return upload_file_link, pptx_file_link, f"An error occurred: {str(e)}", log_str, slide_dropdown, slide_idx
|
| 438 |
elif button_id == 'generate-ppt-button':
|
| 439 |
if not slides_content or not session_id:
|
|
|
|
| 443 |
pptx_bytes = markdown_to_pptx(slides_content, session_id)
|
| 444 |
with session['lock']:
|
| 445 |
session['generated_pptx'] = pptx_bytes
|
| 446 |
+
pptx_file_link = html.A(
|
| 447 |
+
"presentation.pptx",
|
| 448 |
+
id='pptx-file-download-link-visible',
|
| 449 |
+
href="#",
|
| 450 |
+
n_clicks=0,
|
| 451 |
+
style={'display': 'block', 'cursor': 'pointer', 'color': '#116F70', 'textDecoration': 'underline'}
|
| 452 |
+
)
|
| 453 |
add_log("PowerPoint generation completed.", session_id)
|
| 454 |
log_str = '\n'.join(session['log_messages'][:100])
|
| 455 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
|
|
|
| 457 |
add_log(f"An error occurred during PowerPoint generation: {str(e)}", session_id)
|
| 458 |
with session['lock']:
|
| 459 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 460 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 461 |
elif button_id == 'slide-generation-list':
|
| 462 |
try:
|
|
|
|
| 465 |
slide_idx = selected_slide_idx
|
| 466 |
else:
|
| 467 |
slides_md = ""
|
|
|
|
| 468 |
return upload_file_link, pptx_file_link, slides_md, log_str, slide_dropdown, slide_idx
|
| 469 |
except Exception as e:
|
| 470 |
add_log(f"An error occurred while loading slide set: {str(e)}", session_id)
|
| 471 |
with session['lock']:
|
| 472 |
log_str = '\n'.join(session['log_messages'][:100])
|
|
|
|
| 473 |
return upload_file_link, pptx_file_link, slides_content, log_str, slide_dropdown, slide_idx
|
| 474 |
else:
|
| 475 |
raise PreventUpdate
|
| 476 |
|
| 477 |
@app.callback(
|
| 478 |
Output("download-dynamic", "data"),
|
| 479 |
+
Input('uploaded-file-download-link-visible', 'n_clicks'),
|
| 480 |
+
Input('pptx-file-download-link-visible', 'n_clicks'),
|
| 481 |
State('session-id', 'data'),
|
| 482 |
prevent_initial_call=True
|
| 483 |
)
|
|
|
|
| 488 |
button_id = ctx.triggered[0]['prop_id'].split('.')[0]
|
| 489 |
session = get_or_create_session_data(session_id)
|
| 490 |
with session['lock']:
|
| 491 |
+
if button_id == 'uploaded-file-download-link-visible' and session.get('uploaded_file') and session.get('uploaded_filename'):
|
| 492 |
return dcc.send_bytes(session['uploaded_file'], session['uploaded_filename'])
|
| 493 |
+
if button_id == 'pptx-file-download-link-visible' and session.get('generated_pptx'):
|
| 494 |
return dcc.send_bytes(session['generated_pptx'], "presentation.pptx")
|
| 495 |
raise PreventUpdate
|
| 496 |
|