rairo commited on
Commit
e67421c
·
verified ·
1 Parent(s): 27839ea

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +18 -7
main.py CHANGED
@@ -358,13 +358,12 @@ def delete_sozo_project(project_id):
358
 
359
  @app.route('/api/sozo/projects/<string:project_id>/generate-report', methods=['POST'])
360
  def generate_sozo_report(project_id):
361
- logger.info(f"POST /api/sozo/projects/{project_id}/generate-report - Generating report")
362
 
363
  try:
364
  token = request.headers.get('Authorization', '').split(' ')[1]
365
  uid = verify_token(token)
366
  if not uid:
367
- logger.warning(f"Unauthorized access attempt to generate report for project {project_id}")
368
  return jsonify({'error': 'Unauthorized'}), 401
369
 
370
  project_ref = db.reference(f'sozo_projects/{project_id}')
@@ -373,11 +372,20 @@ def generate_sozo_report(project_id):
373
  if not project_data or project_data.get('uid') != uid:
374
  return jsonify({'error': 'Project not found or unauthorized'}), 404
375
 
 
 
 
 
 
 
 
 
 
 
376
  blob_path = f"sozo_projects/{uid}/{project_id}/data{Path(project_data['originalFilename']).suffix}"
377
  blob = bucket.blob(blob_path)
378
  file_bytes = blob.download_as_bytes()
379
 
380
- # This function now returns data_context, which we need to capture
381
  draft_data = generate_report_draft(
382
  io.BytesIO(file_bytes),
383
  project_data['originalFilename'],
@@ -387,12 +395,11 @@ def generate_sozo_report(project_id):
387
  bucket
388
  )
389
 
390
- # **CORRECTION HERE: Save the data_context to Firebase**
391
  update_data = {
392
- 'status': 'draft',
393
  'rawMarkdown': draft_data.get('raw_md'),
394
  'chartUrls': draft_data.get('chartUrls'),
395
- 'dataContext': draft_data.get('data_context') # Save the context for the video generator
396
  }
397
 
398
  project_ref.update(update_data)
@@ -406,7 +413,11 @@ def generate_sozo_report(project_id):
406
 
407
  except Exception as e:
408
  logger.error(f"CRITICAL error generating report for project {project_id}: {traceback.format_exc()}")
409
- db.reference(f'sozo_projects/{project_id}').update({'status': 'failed', 'error': str(e)})
 
 
 
 
410
  return jsonify({'error': str(e)}), 500
411
 
412
 
 
358
 
359
  @app.route('/api/sozo/projects/<string:project_id>/generate-report', methods=['POST'])
360
  def generate_sozo_report(project_id):
361
+ logger.info(f"POST /api/sozo/projects/{project_id}/generate-report - Received request")
362
 
363
  try:
364
  token = request.headers.get('Authorization', '').split(' ')[1]
365
  uid = verify_token(token)
366
  if not uid:
 
367
  return jsonify({'error': 'Unauthorized'}), 401
368
 
369
  project_ref = db.reference(f'sozo_projects/{project_id}')
 
372
  if not project_data or project_data.get('uid') != uid:
373
  return jsonify({'error': 'Project not found or unauthorized'}), 404
374
 
375
+ # --- THE AUTHORITATIVE LOCK ---
376
+ current_status = project_data.get('status')
377
+ if current_status in ['generating_report', 'generating_video']:
378
+ logger.warning(f"User {uid} attempted to generate a report for project {project_id} which is already in progress (status: {current_status}).")
379
+ return jsonify({'error': 'Report generation is already in progress for this project.'}), 409 # 409 Conflict
380
+
381
+ # Set the lock BEFORE starting the heavy work
382
+ project_ref.update({'status': 'generating_report'})
383
+ logger.info(f"Project {project_id} status locked to 'generating_report'.")
384
+
385
  blob_path = f"sozo_projects/{uid}/{project_id}/data{Path(project_data['originalFilename']).suffix}"
386
  blob = bucket.blob(blob_path)
387
  file_bytes = blob.download_as_bytes()
388
 
 
389
  draft_data = generate_report_draft(
390
  io.BytesIO(file_bytes),
391
  project_data['originalFilename'],
 
395
  bucket
396
  )
397
 
 
398
  update_data = {
399
+ 'status': 'draft', # Unlock by setting the new status
400
  'rawMarkdown': draft_data.get('raw_md'),
401
  'chartUrls': draft_data.get('chartUrls'),
402
+ 'dataContext': draft_data.get('data_context')
403
  }
404
 
405
  project_ref.update(update_data)
 
413
 
414
  except Exception as e:
415
  logger.error(f"CRITICAL error generating report for project {project_id}: {traceback.format_exc()}")
416
+ # Make sure to unlock the project on failure
417
+ db.reference(f'sozo_projects/{project_id}').update({
418
+ 'status': 'failed',
419
+ 'error': str(e)
420
+ })
421
  return jsonify({'error': str(e)}), 500
422
 
423