Не работал ранее с soap, навскидку подобрал модуль zeep.
В моём видении я могу через get запрос получить объект, модифицировать его и скормить update запросу.
По факту объекты, которые я получею get запросом содержат поля с None элементами и попытка так это передать далее в update запрос приводит к ValidationError. Предполагаю, что я как-то неправильно это использую и накостылил что-то страшное.
Вот «документация» soap https://bolid.ru/files/373/566/IntegrServ.pdf
Вот мой код (частями)
from zeep import Client, xsd
client = Client(soap_addr)
orion_factory = client.type_factory('urn:OrionProIntf')
keys_request = client.service.GetKeys(0, 0, 0, 0, token)
Я получил ключи, отфильтровал нужные мне, теперь надо поменять оставшиеся
for key in filtered_keys:
# Костыль 1: я заменяю все None на xsd.SkipValue
# Костыль в том, как я перебираю ключи объекта
for name, _ in client.type_factory('urn:OrionProIntf').TKeyData.elements:
if key.__getattribute__(name) is None:
key.__setattr__(name, xsd.SkipValue)
# Set key values for block
key.IsBlocked = True
key.Comment = key_block_comment
# Костыль 2: orion_factory.TKeyData(key) не работает
# Вот это первое, что пришло в голову и сработало
key_values = [key.__getattribute__(name) for name, _ in client.type_factory('urn:OrionProIntf').TKeyData.elements]
key_object = orion_factory.TKeyData(*key_values)
result = client.service.UpdateKeyData(key_object, token)
Может тут найдётся кто с этим модулем работал, скажите как сделать правильно.
PS. Проверки успешности запросов вида if keys_request.Success
я опустил.
PPS. Документацию разработчик не особо то и обновляет, параметры методов немного отличаются от описанного, правильные я беру из wsdl документа самого сервиса.