'AnyType objects using Zeep and Workday's SOAP API

I'm trying to edit a custom object's field on a worker object in Workday via Edit_Worker_Additional_Data operation in the Staffing namespace. I think I'm pretty close, but I keep running into an AttributeError which leads me to believe that my formatting is incorrect compared to how Zeep expects it to be. Any tips or ideas would be great, I've tried about everything under the sun: running get_type, get_element, creating factories with those, etc. Intuitively, I shouldn't need to get any type or element, since Workday is expecting an AnyType object for this piece of the request. Here is my full code and request dictionary.

def update_provisioning_flag(user_info, credentials):
    user = credentials.get("WD_USERNAME")
    password = credentials.get("WD_PASSWORD")
    wsdl = "https://wd2-impl-services1.workday.com/ccx/service/tenant/Staffing/v37.2?wsdl"
    settings = Settings(strict=False, xml_huge_tree=True, raw_response=True)
    client = Client(wsdl, wsse=UsernameToken(user, password), settings=settings)

    request_dict = {
        "Worker_Custom_Object_Data": {
            "Effective_Date": "2022-03-14",
            "Worker_Reference": {
                "ID": {
                    'type': "Employee_ID",  # user_info['system_id_type'],
                    '_value_1': "10183"
                }
            },
            "Business_Object_Additional_Data": {
                "_value_1": [
                    {
                        "usernameAdministration": {
                            "isProvisioned": "Y"
                        }
                    }
                ]
            }
        }
    }

    return client.service.Edit_Worker_Additional_Data(**request_dict)

Below is the full stack trace for the error

Traceback (most recent call last):
  File "lambda_function.py", line 188, in <module>
    response = update_provisioning_flag({}, creds)
  File "lambda_function.py", line 183, in update_provisioning_flag
    return client.service.Edit_Worker_Additional_Data(**request_dict)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/proxy.py", line 46, in __call__
    return self._proxy._binding.send(
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/wsdl/bindings/soap.py", line 123, in send
    envelope, http_headers = self._create(
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/wsdl/bindings/soap.py", line 73, in _create
    serialized = operation_obj.create(*args, **kwargs)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/wsdl/definitions.py", line 222, in create
    return self.input.serialize(*args, **kwargs)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/wsdl/messages/soap.py", line 79, in serialize
    self.body.render(body, body_value)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 232, in render
    self._render_value_item(parent, value, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 256, in _render_value_item
    return self.type.render(node, value, None, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/types/complex.py", line 295, in render
    element.render(node, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/indicators.py", line 251, in render
    element.render(parent, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 232, in render
    self._render_value_item(parent, value, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 256, in _render_value_item
    return self.type.render(node, value, None, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/types/complex.py", line 295, in render
    element.render(node, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/indicators.py", line 251, in render
    element.render(parent, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 232, in render
    self._render_value_item(parent, value, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/element.py", line 256, in _render_value_item
    return self.type.render(node, value, None, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/types/complex.py", line 295, in render
    element.render(node, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/indicators.py", line 251, in render
    element.render(parent, element_value, child_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/any.py", line 143, in render
    self._render_value_item(parent, val, render_path)
  File "/Users/lukas/Library/Python/3.8/lib/python/site-packages/zeep/xsd/elements/any.py", line 161, in _render_value_item
    if isinstance(value.value, list):
AttributeError: 'dict' object has no attribute 'value'


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source