GuglielmoTor commited on
Commit
33a01ad
·
verified ·
1 Parent(s): 181745e

Update services/report_data_handler.py

Browse files
Files changed (1) hide show
  1. services/report_data_handler.py +65 -24
services/report_data_handler.py CHANGED
@@ -73,13 +73,18 @@ def save_report_results(
73
  logger.info(f"Attempting to save agentic analysis to Bubble for org_urn: {org_urn}")
74
  response = bulk_upload_to_bubble([payload], BUBBLE_REPORT_TABLE_NAME)
75
 
76
- # Assuming bulk_upload_to_bubble returns a list of IDs on success and None or False on failure
77
- if response:
 
 
 
 
78
  record_id = response["id"]
79
  logger.info(f"Successfully saved agentic analysis to Bubble. Record ID: {record_id}")
80
  return record_id
81
  else:
82
- logger.error(f"Failed to save agentic analysis to Bubble. Response: {response}")
 
83
  return None
84
 
85
  except Exception as e:
@@ -110,24 +115,33 @@ def save_objectives(
110
  "timeline": obj.get("objective_timeline"),
111
  "owner": obj.get("objective_owner"),
112
  "report": report_id,
113
- # "organization_urn": org_urn # Assuming 'report' links to the org
114
  }
115
  for obj in objectives_data
116
  ]
117
 
118
- logger.info(f"objectives data {objectives_data}")
 
119
 
120
- logger.info(f"payload {payloads}")
 
 
 
121
 
122
- logger.info(f"Attempting to save {len(payloads)} objectives for report_id: {report_id}")
123
- objective_ids = bulk_upload_to_bubble(payloads, BUBBLE_OKR_TABLE_NAME) # Corrected table name
 
 
 
 
124
 
125
- if objective_ids is None:
126
- logger.error(f"Failed to save objectives to Bubble for report_id: {report_id}. The upload function returned None.")
 
 
127
  return None
128
 
129
- logger.info(f"Successfully saved {len(objective_ids)} objectives.")
130
- return objective_ids
131
 
132
  except Exception as e:
133
  logger.exception(f"An unexpected error occurred in save_objectives for report_id {report_id}: {e}")
@@ -153,6 +167,11 @@ def save_key_results(
153
 
154
  try:
155
  for objective_data, parent_objective_id in objectives_with_ids:
 
 
 
 
 
156
  for kr in objective_data.get("key_results", []):
157
  key_results_to_process.append(kr)
158
  key_result_payloads.append({
@@ -169,14 +188,26 @@ def save_key_results(
169
  return []
170
 
171
  logger.info(f"Attempting to save {len(key_result_payloads)} key results for org_urn: {org_urn}")
172
- key_result_ids = bulk_upload_to_bubble(key_result_payloads, BUBBLE_KEY_RESULTS_TABLE_NAME)
173
 
174
- if key_result_ids is None:
175
- logger.error(f"Failed to save key results to Bubble for org_urn: {org_urn}.")
 
 
 
 
 
 
 
 
 
 
 
 
176
  return None
177
 
178
- logger.info(f"Successfully saved {len(key_result_ids)} key results.")
179
- return list(zip(key_results_to_process, key_result_ids))
180
 
181
  except Exception as e:
182
  logger.exception(f"An unexpected error occurred in save_key_results for org_urn {org_urn}: {e}")
@@ -220,14 +251,26 @@ def save_tasks(
220
  return []
221
 
222
  logger.info(f"Attempting to save {len(task_payloads)} tasks for org_urn: {org_urn}")
223
- task_ids = bulk_upload_to_bubble(task_payloads, BUBBLE_TASKS_TABLE_NAME)
224
 
225
- if task_ids is None:
226
- logger.error(f"Failed to save tasks to Bubble for org_urn: {org_urn}.")
 
 
 
 
 
 
 
 
 
 
 
 
227
  return None
228
 
229
- logger.info(f"Successfully saved {len(task_ids)} tasks.")
230
- return task_ids
231
 
232
  except Exception as e:
233
  logger.exception(f"An unexpected error occurred in save_tasks for org_urn {org_urn}: {e}")
@@ -260,7 +303,6 @@ def save_actionable_okrs(org_urn: str, actionable_okrs: Dict[str, Any], report_i
260
  return
261
 
262
  # Step 1: Save the top-level objectives
263
- # Corrected the argument order from your original code.
264
  objective_ids = save_objectives(org_urn, report_id, objectives_data)
265
  if objective_ids is None:
266
  logger.error("OKR save process aborted due to failure in saving objectives.")
@@ -279,7 +321,6 @@ def save_actionable_okrs(org_urn: str, actionable_okrs: Dict[str, Any], report_i
279
  task_ids = save_tasks(org_urn, key_results_with_ids)
280
  if task_ids is None:
281
  logger.error("Task saving failed, but objectives and key results were saved.")
282
- # Decide if you want to consider the whole process a failure.
283
  # For now, we just log the error and complete.
284
  return
285
 
 
73
  logger.info(f"Attempting to save agentic analysis to Bubble for org_urn: {org_urn}")
74
  response = bulk_upload_to_bubble([payload], BUBBLE_REPORT_TABLE_NAME)
75
 
76
+ # Handle API response which could be a list of dicts (for bulk) or a single dict.
77
+ if response and isinstance(response, list) and len(response) > 0 and isinstance(response[0], dict) and 'id' in response[0]:
78
+ record_id = response[0]['id'] # Get the ID from the first dictionary in the list
79
+ logger.info(f"Successfully saved agentic analysis to Bubble. Record ID: {record_id}")
80
+ return record_id
81
+ elif response and isinstance(response, dict) and "id" in response: # Handle non-bulk response
82
  record_id = response["id"]
83
  logger.info(f"Successfully saved agentic analysis to Bubble. Record ID: {record_id}")
84
  return record_id
85
  else:
86
+ # Catches None, False, empty lists, or other unexpected formats.
87
+ logger.error(f"Failed to save agentic analysis to Bubble. Unexpected API Response: {response}")
88
  return None
89
 
90
  except Exception as e:
 
115
  "timeline": obj.get("objective_timeline"),
116
  "owner": obj.get("objective_owner"),
117
  "report": report_id,
 
118
  }
119
  for obj in objectives_data
120
  ]
121
 
122
+ logger.info(f"Attempting to save {len(payloads)} objectives for report_id: {report_id}")
123
+ response_data = bulk_upload_to_bubble(payloads, BUBBLE_OKR_TABLE_NAME)
124
 
125
+ # Validate response and extract IDs from the list of dictionaries.
126
+ if not response_data or not isinstance(response_data, list):
127
+ logger.error(f"Failed to save objectives. API response was not a list: {response_data}")
128
+ return None
129
 
130
+ try:
131
+ # Extract the ID from each dictionary in the response list.
132
+ extracted_ids = [item['id'] for item in response_data]
133
+ except (TypeError, KeyError):
134
+ logger.error(f"Failed to parse IDs from API response. Response format invalid: {response_data}", exc_info=True)
135
+ return None
136
 
137
+ # Check if we extracted the expected number of IDs
138
+ if len(extracted_ids) != len(payloads):
139
+ logger.error(f"Failed to save all objectives for report_id: {report_id}. "
140
+ f"Expected {len(payloads)} IDs, but got {len(extracted_ids)} from response: {response_data}")
141
  return None
142
 
143
+ logger.info(f"Successfully saved {len(extracted_ids)} objectives.")
144
+ return extracted_ids
145
 
146
  except Exception as e:
147
  logger.exception(f"An unexpected error occurred in save_objectives for report_id {report_id}: {e}")
 
167
 
168
  try:
169
  for objective_data, parent_objective_id in objectives_with_ids:
170
+ # Defensive check to ensure the parent_objective_id is a valid-looking string.
171
+ if not isinstance(parent_objective_id, str) or not parent_objective_id:
172
+ logger.error(f"Invalid parent_objective_id found: '{parent_objective_id}'. Skipping KRs for this objective.")
173
+ continue # Skip this loop iteration
174
+
175
  for kr in objective_data.get("key_results", []):
176
  key_results_to_process.append(kr)
177
  key_result_payloads.append({
 
188
  return []
189
 
190
  logger.info(f"Attempting to save {len(key_result_payloads)} key results for org_urn: {org_urn}")
191
+ response_data = bulk_upload_to_bubble(key_result_payloads, BUBBLE_KEY_RESULTS_TABLE_NAME)
192
 
193
+ # Validate response and extract IDs.
194
+ if not response_data or not isinstance(response_data, list):
195
+ logger.error(f"Failed to save key results. API response was not a list: {response_data}")
196
+ return None
197
+
198
+ try:
199
+ extracted_ids = [item['id'] for item in response_data]
200
+ except (TypeError, KeyError):
201
+ logger.error(f"Failed to parse IDs from key result API response: {response_data}", exc_info=True)
202
+ return None
203
+
204
+ if len(extracted_ids) != len(key_result_payloads):
205
+ logger.error(f"Failed to save all key results for org_urn: {org_urn}. "
206
+ f"Expected {len(key_result_payloads)} IDs, but got {len(extracted_ids)} from response: {response_data}")
207
  return None
208
 
209
+ logger.info(f"Successfully saved {len(extracted_ids)} key results.")
210
+ return list(zip(key_results_to_process, extracted_ids))
211
 
212
  except Exception as e:
213
  logger.exception(f"An unexpected error occurred in save_key_results for org_urn {org_urn}: {e}")
 
251
  return []
252
 
253
  logger.info(f"Attempting to save {len(task_payloads)} tasks for org_urn: {org_urn}")
254
+ response_data = bulk_upload_to_bubble(task_payloads, BUBBLE_TASKS_TABLE_NAME)
255
 
256
+ # Validate response and extract IDs.
257
+ if not response_data or not isinstance(response_data, list):
258
+ logger.error(f"Failed to save tasks. API response was not a list: {response_data}")
259
+ return None
260
+
261
+ try:
262
+ extracted_ids = [item['id'] for item in response_data]
263
+ except (TypeError, KeyError):
264
+ logger.error(f"Failed to parse IDs from task API response: {response_data}", exc_info=True)
265
+ return None
266
+
267
+ if len(extracted_ids) != len(task_payloads):
268
+ logger.error(f"Failed to save all tasks for org_urn: {org_urn}. "
269
+ f"Expected {len(task_payloads)} IDs, but got {len(extracted_ids)} from response: {response_data}")
270
  return None
271
 
272
+ logger.info(f"Successfully saved {len(extracted_ids)} tasks.")
273
+ return extracted_ids
274
 
275
  except Exception as e:
276
  logger.exception(f"An unexpected error occurred in save_tasks for org_urn {org_urn}: {e}")
 
303
  return
304
 
305
  # Step 1: Save the top-level objectives
 
306
  objective_ids = save_objectives(org_urn, report_id, objectives_data)
307
  if objective_ids is None:
308
  logger.error("OKR save process aborted due to failure in saving objectives.")
 
321
  task_ids = save_tasks(org_urn, key_results_with_ids)
322
  if task_ids is None:
323
  logger.error("Task saving failed, but objectives and key results were saved.")
 
324
  # For now, we just log the error and complete.
325
  return
326