Spaces:
Running
Running
Update services/report_data_handler.py
Browse files- 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 |
-
#
|
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 |
-
|
|
|
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
|
|
|
119 |
|
120 |
-
|
|
|
|
|
|
|
121 |
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
124 |
|
125 |
-
if
|
126 |
-
|
|
|
|
|
127 |
return None
|
128 |
|
129 |
-
logger.info(f"Successfully saved {len(
|
130 |
-
return
|
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 |
-
|
173 |
|
174 |
-
|
175 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
176 |
return None
|
177 |
|
178 |
-
logger.info(f"Successfully saved {len(
|
179 |
-
return list(zip(key_results_to_process,
|
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 |
-
|
224 |
|
225 |
-
|
226 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
227 |
return None
|
228 |
|
229 |
-
logger.info(f"Successfully saved {len(
|
230 |
-
return
|
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 |
|