Spaces:
Sleeping
Sleeping
Update main.py
Browse files
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 -
|
| 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')
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|