FAQ | This is a LIVE service | Changelog

Lookup API response doesn't match OpenAPI spec causing PersonIsMemberOfGroup200ResponseResult to raise pydantic exception

The Lookup API returns a string "true"/"false" while the generated PersonIsMemberOfGroup200ResponseResult expects a bool as per the Lookup OpenAPI spec. When pydantic validates the return response, the client throws an error and exits.

Relevant part of the Lookup OpenAPI spec: https://gitlab.developers.cam.ac.uk/uis/devops/iam/identity-lib/-/blob/main/specs/lookup.yaml?ref_type=heads#L2216

Example exception:

webapp-1      |   File "/usr/src/app/rewards/identity_services.py", line 55, in get_person_groups
webapp-1      |     response = person_api_client.person_is_member_of_group(
webapp-1      |         scheme="crsid", identifier="av603", groupid="108131"
webapp-1      |     )
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py", line 39, in wrapper_function
webapp-1      |     return wrapper(*args, **kwargs)
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py", line 136, in __call__
webapp-1      |     res = self.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args, kwargs))
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api/person_api.py", line 2710, in person_is_member_of_group
webapp-1      |     return self.api_client.response_deserialize(
webapp-1      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
webapp-1      |         response_data=response_data,
webapp-1      |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1      |         response_types_map=_response_types_map,
webapp-1      |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1      |     ).data
webapp-1      |     ^
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 320, in response_deserialize
webapp-1      |     return_data = self.deserialize(response_text, response_type)
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 404, in deserialize
webapp-1      |     return self.__deserialize(data, response_type)
webapp-1      |            ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 449, in __deserialize
webapp-1      |     return self.__deserialize_model(data, klass)
webapp-1      |            ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 770, in __deserialize_model
webapp-1      |     return klass.from_dict(data)
webapp-1      |            ~~~~~~~~~~~~~~~^^^^^^
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/models/person_is_member_of_group200_response.py", line 87, in from_dict
webapp-1      |     "result": PersonIsMemberOfGroup200ResponseResult.from_dict(obj["result"]) if obj.get("result") is not None else None
webapp-1      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/models/person_is_member_of_group200_response_result.py", line 82, in from_dict
webapp-1      |     _obj = cls.model_validate({
webapp-1      |         "value": obj.get("value")
webapp-1      |     })
webapp-1      |   File "/usr/local/lib/python3.13/site-packages/pydantic/main.py", line 703, in model_validate
webapp-1      |     return cls.__pydantic_validator__.validate_python(
webapp-1      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
webapp-1      |         obj, strict=strict, from_attributes=from_attributes, context=context, by_alias=by_alias, by_name=by_name
webapp-1      |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1      |     )
webapp-1      |     ^
webapp-1      | pydantic_core._pydantic_core.ValidationError: 1 validation error for PersonIsMemberOfGroup200ResponseResult
webapp-1      | value
webapp-1      |   Input should be a valid boolean [type=bool_type, input_value='true', input_type=str]
webapp-1      |     For further information visit https://errors.pydantic.dev/2.11/v/bool_type
Edited by Andrew Vella