bluenevus commited on
Commit
e7acccb
·
1 Parent(s): 7ff0849

Update app.py via AI Editor

Browse files
Files changed (1) hide show
  1. app.py +33 -38
app.py CHANGED
@@ -47,12 +47,12 @@ def get_or_create_session_data(session_id):
47
  SESSION_DATA[session_id] = {
48
  'log_messages': [],
49
  'generated_pptx': None,
50
- 'uploaded_files': [], # List of dicts: {'name':..., 'content':..., 'type':...}
51
  'lock': threading.Lock(),
52
  'slide_markdowns': [],
53
  'slide_markdown_names': [],
54
  'current_slide_md': "",
55
- 'files_box': [], # List of {'name':..., 'content':..., 'type':...}
56
  }
57
  return SESSION_DATA[session_id]
58
 
@@ -113,7 +113,17 @@ app.layout = html.Div([
113
  dbc.CardBody(id="files-box", className="mb-2"),
114
  ], className="mb-3 shadow-sm"),
115
  dbc.Button("Generate Slides", id='generate-button', color="primary", className="w-100 mt-2", size="lg"),
116
- html.Div(id="slide-generation-list-container", className="mt-3"),
 
 
 
 
 
 
 
 
 
 
117
  html.Div([
118
  html.Div("Status / Log:", className="fw-bold mb-1"),
119
  html.Div(id='log-output', style={'whiteSpace': 'pre-line', 'height': '150px', 'overflowY': 'scroll', 'border': '1px solid #ddd', 'padding': '10px'})
@@ -280,7 +290,8 @@ def store_session_id(n_intervals):
280
  Output('files-box', 'children'),
281
  Output('slides-content', 'value'),
282
  Output('log-output', 'children'),
283
- Output('slide-generation-list-container', 'children'),
 
284
  Output('current-slide-index', 'data'),
285
  Output("download-dynamic", "data"),
286
  Input('upload-file', 'contents'),
@@ -312,11 +323,9 @@ def unified_callback(
312
  log_str = ""
313
  slide_list = session.get('slide_markdown_names', [])
314
  slide_md_list = session.get('slide_markdowns', [])
315
- slide_dropdown = None
316
  slide_idx = current_slide_idx if current_slide_idx is not None else None
317
  download_data = None
318
 
319
- # Ensure files_box is initialized
320
  with session['lock']:
321
  if 'files_box' not in session:
322
  session['files_box'] = []
@@ -350,22 +359,11 @@ def unified_callback(
350
  {'label': slide_name, 'value': idx}
351
  for idx, slide_name in enumerate(slide_list)
352
  ]
353
- slide_dropdown = html.Div([
354
- dbc.Label("Generated Slide Sets", className="fw-bold"),
355
- dcc.Dropdown(
356
- id='slide-generation-list',
357
- options=dropdown_options,
358
- value=slide_idx if (slide_idx is not None and slide_idx < len(slide_list)) else (len(slide_list) - 1 if slide_list else None),
359
- placeholder="No slides generated yet",
360
- clearable=False,
361
- style={'marginBottom': '10px'}
362
- )
363
- ]) if slide_list else html.Div("No slides generated yet.", className="text-muted")
364
 
365
  with session['lock']:
366
  log_str = '\n'.join(session['log_messages'][:100])
367
 
368
- # Handle file upload
369
  if button_id == 'upload-file':
370
  if upload_contents and upload_filename:
371
  try:
@@ -379,12 +377,10 @@ def unified_callback(
379
  with session['lock']:
380
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Error uploading file: {str(e)}")
381
  log_str = '\n'.join(session['log_messages'][:100])
382
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, None
383
 
384
- # Handle slide generation
385
  elif button_id == 'generate-button':
386
  decoded_file_text = None
387
- # Use first uploaded file for text extraction if present
388
  uploaded_files = [f for f in session['files_box'] if f['type'] == 'uploaded']
389
  if uploaded_files:
390
  try:
@@ -396,7 +392,7 @@ def unified_callback(
396
  with session['lock']:
397
  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.")
398
  log_str = '\n'.join(session['log_messages'][:100])
399
- return rebuild_files_box(session), "Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.", log_str, slide_dropdown, slide_idx, None
400
  combined_text = ""
401
  if decoded_file_text and document_text:
402
  combined_text = decoded_file_text.strip() + "\n\n" + document_text.strip()
@@ -408,7 +404,7 @@ def unified_callback(
408
  with session['lock']:
409
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Please upload a file or enter text.")
410
  log_str = '\n'.join(session['log_messages'][:100])
411
- return rebuild_files_box(session), "Please upload a file or enter text.", log_str, slide_dropdown, slide_idx, None
412
  try:
413
  add_log("Starting slide generation...", session_id)
414
  slides_markdown = process_document(combined_text, session_id)
@@ -421,14 +417,18 @@ def unified_callback(
421
  session['current_slide_md'] = slides_markdown
422
  slide_idx = len(session['slide_markdowns']) - 1
423
  log_str = '\n'.join(session['log_messages'][:100])
 
 
 
 
 
424
  except Exception as e:
425
  add_log(f"An error occurred during slide generation: {str(e)}", session_id)
426
  with session['lock']:
427
  log_str = '\n'.join(session['log_messages'][:100])
428
- return rebuild_files_box(session), f"An error occurred: {str(e)}", log_str, slide_dropdown, slide_idx, None
429
- return rebuild_files_box(session), slides_md, log_str, slide_dropdown, slide_idx, None
430
 
431
- # Handle PowerPoint generation
432
  elif button_id == 'generate-ppt-button':
433
  if not slides_content or not session_id:
434
  raise PreventUpdate
@@ -436,9 +436,7 @@ def unified_callback(
436
  add_log("Starting PowerPoint generation...", session_id)
437
  pptx_bytes = markdown_to_pptx(slides_content, session_id)
438
  with session['lock']:
439
- # Remove previous generated pptx files for this session
440
  session['files_box'] = [f for f in session['files_box'] if f['type'] != 'generated_pptx']
441
- # Add new pptx file
442
  session['files_box'].append({'name': 'presentation.pptx', 'content': pptx_bytes, 'type': 'generated_pptx'})
443
  add_log("PowerPoint generation completed.", session_id)
444
  log_str = '\n'.join(session['log_messages'][:100])
@@ -446,27 +444,25 @@ def unified_callback(
446
  add_log(f"An error occurred during PowerPoint generation: {str(e)}", session_id)
447
  with session['lock']:
448
  log_str = '\n'.join(session['log_messages'][:100])
449
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, None
450
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, None
451
 
452
- # Handle slide set dropdown selection
453
  elif button_id == 'slide-generation-list':
454
  try:
455
  if selected_slide_idx is not None and 0 <= selected_slide_idx < len(slide_md_list):
456
  slides_md = slide_md_list[selected_slide_idx]
457
  slide_idx = selected_slide_idx
 
458
  else:
459
  slides_md = ""
460
  except Exception as e:
461
  add_log(f"An error occurred while loading slide set: {str(e)}", session_id)
462
  with session['lock']:
463
  log_str = '\n'.join(session['log_messages'][:100])
464
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, None
465
- return rebuild_files_box(session), slides_md, log_str, slide_dropdown, slide_idx, None
466
 
467
- # Handle file download and delete
468
  elif button_id.startswith("{"):
469
- # Determine which pattern (download or delete) triggered
470
  triggered_id = eval(button_id)
471
  if triggered_id['type'] == 'file-download':
472
  idx = triggered_id['index']
@@ -474,8 +470,7 @@ def unified_callback(
474
  if 0 <= idx < len(session['files_box']):
475
  file_bytes = session['files_box'][idx]['content']
476
  file_name = session['files_box'][idx]['name']
477
- # No other output changes, just return download
478
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, dcc.send_bytes(file_bytes, file_name)
479
  elif triggered_id['type'] == 'file-delete':
480
  idx = triggered_id['index']
481
  with session['lock']:
@@ -484,7 +479,7 @@ def unified_callback(
484
  del session['files_box'][idx]
485
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{deleted_name}' deleted.")
486
  log_str = '\n'.join(session['log_messages'][:100])
487
- return rebuild_files_box(session), slides_content, log_str, slide_dropdown, slide_idx, None
488
  else:
489
  raise PreventUpdate
490
 
 
47
  SESSION_DATA[session_id] = {
48
  'log_messages': [],
49
  'generated_pptx': None,
50
+ 'uploaded_files': [],
51
  'lock': threading.Lock(),
52
  'slide_markdowns': [],
53
  'slide_markdown_names': [],
54
  'current_slide_md': "",
55
+ 'files_box': [],
56
  }
57
  return SESSION_DATA[session_id]
58
 
 
113
  dbc.CardBody(id="files-box", className="mb-2"),
114
  ], className="mb-3 shadow-sm"),
115
  dbc.Button("Generate Slides", id='generate-button', color="primary", className="w-100 mt-2", size="lg"),
116
+ html.Div([
117
+ dbc.Label("Generated Slide Sets", className="fw-bold"),
118
+ dcc.Dropdown(
119
+ id='slide-generation-list',
120
+ options=[],
121
+ value=None,
122
+ placeholder="No slides generated yet",
123
+ clearable=False,
124
+ style={'marginBottom': '10px'}
125
+ )
126
+ ], className="mt-3"),
127
  html.Div([
128
  html.Div("Status / Log:", className="fw-bold mb-1"),
129
  html.Div(id='log-output', style={'whiteSpace': 'pre-line', 'height': '150px', 'overflowY': 'scroll', 'border': '1px solid #ddd', 'padding': '10px'})
 
290
  Output('files-box', 'children'),
291
  Output('slides-content', 'value'),
292
  Output('log-output', 'children'),
293
+ Output('slide-generation-list', 'options'),
294
+ Output('slide-generation-list', 'value'),
295
  Output('current-slide-index', 'data'),
296
  Output("download-dynamic", "data"),
297
  Input('upload-file', 'contents'),
 
323
  log_str = ""
324
  slide_list = session.get('slide_markdown_names', [])
325
  slide_md_list = session.get('slide_markdowns', [])
 
326
  slide_idx = current_slide_idx if current_slide_idx is not None else None
327
  download_data = None
328
 
 
329
  with session['lock']:
330
  if 'files_box' not in session:
331
  session['files_box'] = []
 
359
  {'label': slide_name, 'value': idx}
360
  for idx, slide_name in enumerate(slide_list)
361
  ]
362
+ dropdown_value = slide_idx if (slide_idx is not None and slide_idx < len(slide_list)) else (len(slide_list) - 1 if slide_list else None)
 
 
 
 
 
 
 
 
 
 
363
 
364
  with session['lock']:
365
  log_str = '\n'.join(session['log_messages'][:100])
366
 
 
367
  if button_id == 'upload-file':
368
  if upload_contents and upload_filename:
369
  try:
 
377
  with session['lock']:
378
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Error uploading file: {str(e)}")
379
  log_str = '\n'.join(session['log_messages'][:100])
380
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, None
381
 
 
382
  elif button_id == 'generate-button':
383
  decoded_file_text = None
 
384
  uploaded_files = [f for f in session['files_box'] if f['type'] == 'uploaded']
385
  if uploaded_files:
386
  try:
 
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
+ return rebuild_files_box(session), "Could not decode uploaded file as text. Please upload a UTF-8 or Latin-1 encoded text file.", log_str, dropdown_options, dropdown_value, slide_idx, None
396
  combined_text = ""
397
  if decoded_file_text and document_text:
398
  combined_text = decoded_file_text.strip() + "\n\n" + document_text.strip()
 
404
  with session['lock']:
405
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - Please upload a file or enter text.")
406
  log_str = '\n'.join(session['log_messages'][:100])
407
+ return rebuild_files_box(session), "Please upload a file or enter text.", log_str, dropdown_options, dropdown_value, slide_idx, None
408
  try:
409
  add_log("Starting slide generation...", session_id)
410
  slides_markdown = process_document(combined_text, session_id)
 
417
  session['current_slide_md'] = slides_markdown
418
  slide_idx = len(session['slide_markdowns']) - 1
419
  log_str = '\n'.join(session['log_messages'][:100])
420
+ dropdown_options = [
421
+ {'label': name, 'value': idx}
422
+ for idx, name in enumerate(session['slide_markdown_names'])
423
+ ]
424
+ dropdown_value = slide_idx
425
  except Exception as e:
426
  add_log(f"An error occurred during slide generation: {str(e)}", session_id)
427
  with session['lock']:
428
  log_str = '\n'.join(session['log_messages'][:100])
429
+ return rebuild_files_box(session), f"An error occurred: {str(e)}", log_str, dropdown_options, dropdown_value, slide_idx, None
430
+ return rebuild_files_box(session), slides_md, log_str, dropdown_options, dropdown_value, slide_idx, None
431
 
 
432
  elif button_id == 'generate-ppt-button':
433
  if not slides_content or not session_id:
434
  raise PreventUpdate
 
436
  add_log("Starting PowerPoint generation...", session_id)
437
  pptx_bytes = markdown_to_pptx(slides_content, session_id)
438
  with session['lock']:
 
439
  session['files_box'] = [f for f in session['files_box'] if f['type'] != 'generated_pptx']
 
440
  session['files_box'].append({'name': 'presentation.pptx', 'content': pptx_bytes, 'type': 'generated_pptx'})
441
  add_log("PowerPoint generation completed.", session_id)
442
  log_str = '\n'.join(session['log_messages'][:100])
 
444
  add_log(f"An error occurred during PowerPoint generation: {str(e)}", session_id)
445
  with session['lock']:
446
  log_str = '\n'.join(session['log_messages'][:100])
447
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, None
448
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, None
449
 
 
450
  elif button_id == 'slide-generation-list':
451
  try:
452
  if selected_slide_idx is not None and 0 <= selected_slide_idx < len(slide_md_list):
453
  slides_md = slide_md_list[selected_slide_idx]
454
  slide_idx = selected_slide_idx
455
+ dropdown_value = slide_idx
456
  else:
457
  slides_md = ""
458
  except Exception as e:
459
  add_log(f"An error occurred while loading slide set: {str(e)}", session_id)
460
  with session['lock']:
461
  log_str = '\n'.join(session['log_messages'][:100])
462
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, None
463
+ return rebuild_files_box(session), slides_md, log_str, dropdown_options, dropdown_value, slide_idx, None
464
 
 
465
  elif button_id.startswith("{"):
 
466
  triggered_id = eval(button_id)
467
  if triggered_id['type'] == 'file-download':
468
  idx = triggered_id['index']
 
470
  if 0 <= idx < len(session['files_box']):
471
  file_bytes = session['files_box'][idx]['content']
472
  file_name = session['files_box'][idx]['name']
473
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, dcc.send_bytes(file_bytes, file_name)
 
474
  elif triggered_id['type'] == 'file-delete':
475
  idx = triggered_id['index']
476
  with session['lock']:
 
479
  del session['files_box'][idx]
480
  session['log_messages'].insert(0, f"{time.strftime('%H:%M:%S')} - File '{deleted_name}' deleted.")
481
  log_str = '\n'.join(session['log_messages'][:100])
482
+ return rebuild_files_box(session), slides_content, log_str, dropdown_options, dropdown_value, slide_idx, None
483
  else:
484
  raise PreventUpdate
485