diff --git a/.last-branch b/.last-branch index 36c68d6..08b1612 100644 --- a/.last-branch +++ b/.last-branch @@ -1 +1 @@ -v20260115-07-autotask-picklist-field-detect +v20260115-08-autotask-entityinfo-fields-shape-fix diff --git a/containers/backupchecks/src/backend/app/integrations/autotask/client.py b/containers/backupchecks/src/backend/app/integrations/autotask/client.py index 0f39cfd..7f86fb6 100644 --- a/containers/backupchecks/src/backend/app/integrations/autotask/client.py +++ b/containers/backupchecks/src/backend/app/integrations/autotask/client.py @@ -167,6 +167,10 @@ class AutotaskClient: if isinstance(items, list): return [x for x in items if isinstance(x, dict)] + fields = payload.get("fields") + if isinstance(fields, list): + return [x for x in fields if isinstance(x, dict)] + # Some endpoints may return a single object. if "id" in payload: return [payload] @@ -270,11 +274,15 @@ class AutotaskClient: if not bool(field.get("isPickList")): raise AutotaskError(f"Tickets.{field.get('name')} is not marked as a picklist in Autotask metadata.") - picklist_path = field.get("picklistValues") - if not isinstance(picklist_path, str) or not picklist_path.strip(): - raise AutotaskError(f"Tickets.{field.get('name')} metadata did not include a picklistValues endpoint.") + picklist_values = field.get("picklistValues") + # Autotask may return picklist values inline (as a list) or as a URL/path. + if isinstance(picklist_values, list): + return [x for x in picklist_values if isinstance(x, dict)] - return self._call_picklist_values(picklist_path) + if not isinstance(picklist_values, str) or not picklist_values.strip(): + raise AutotaskError(f"Tickets.{field.get('name')} metadata did not include picklist values.") + + return self._call_picklist_values(picklist_values) def get_ticket_priorities(self) -> List[Dict[str, Any]]: """Return Ticket Priority picklist values. @@ -314,8 +322,11 @@ class AutotaskClient: if not bool(priority_field.get("isPickList")): raise AutotaskError("Tickets.priority is not marked as a picklist in Autotask metadata.") - picklist_path = priority_field.get("picklistValues") - if not isinstance(picklist_path, str) or not picklist_path.strip(): - raise AutotaskError("Tickets.priority metadata did not include a picklistValues endpoint.") + picklist_values = priority_field.get("picklistValues") + if isinstance(picklist_values, list): + return [x for x in picklist_values if isinstance(x, dict)] - return self._call_picklist_values(picklist_path) + if not isinstance(picklist_values, str) or not picklist_values.strip(): + raise AutotaskError("Tickets.priority metadata did not include picklist values.") + + return self._call_picklist_values(picklist_values) diff --git a/docs/changelog.md b/docs/changelog.md index e8a1911..6955786 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -64,6 +64,16 @@ Changes: - Applied the same robust detection logic to ticket priority picklist retrieval. - Prevented connection test failures caused by missing or differently named metadata fields. +## v20260115-08-autotask-entityinfo-fields-shape-fix + +### Changes: +- Fixed parsing of Autotask entityInformation responses to correctly read field metadata from the `fields` attribute. +- Extended metadata normalization to support different response shapes returned by Autotask. +- Improved picklist value handling to support both inline picklist values and URL-based retrieval. +- Resolved failures in queue, source, and priority picklist detection caused by empty or misparsed field metadata. +- Stabilized Autotask connection testing across sandbox environments with differing metadata formats. + + *** ## v0.1.21