Невозможно десериализовать объект: тип, KeyError: 'key: int; значение: str ' - PullRequest
0 голосов
/ 19 июня 2019

Я пишу скрипт на python для создания пользователя в azure devops, используя клиентскую библиотеку python для azure-devops-rest-api.

Я использую функцию add_user_entitlement () для MemberEntitlementManagementClient .

Ссылка на код этого клиента:

https://github.com/microsoft/azure-devops-python-api/blob/dev/azure-devops/azure/devops/v5_0/member_entitlement_management/member_entitlement_management_client.py

Соответствующая документация REST API:

https://docs.microsoft.com/en-us/rest/api/azure/devops/memberentitlementmanagement/user%20entitlements/add?view=azure-devops-rest-4.1

Я написал код:

from azure.devops.connection import Connection
from azure.devops.v5_0.member_entitlement_management.models import *
import pprint

personal_access_token = <my token>

credentials = BasicAuthentication('', personal_access_token)
connection = Connection(base_url=organization_url, creds=credentials)

member_ent_mngmnt_client = connection.clients_v5_0.get_member_entitlement_management_client()

# List member entitlements
resp = member_ent_mngmnt_client.get_user_entitlements()
print(resp)

# ------ Add user entitlement -----------------

access_level = AccessLevel("express", None, None, None, None, None, None)
print(access_level)

graph_user = GraphUser(None, None, None, None, None, None, None, "user", None, None, "anaya.john@dynactionize.onmicrosoft.com", None, None, None)
 print(graph_user)

user_entitlement = UserEntitlement(None, None, None, None, None, None, graph_user)
print(user_entitlement)

# This is to check what is sent as the request body of REST API POST request
content = member_ent_mngmnt_client._serialize.body(user_entitlement, 'UserEntitlement')
print("\n Content : \n")
print(content)    

# Add user entitlement
resp = member_ent_mngmnt_client.add_user_entitlement(user_entitlement)  

print("\n Result: \n")  
print(resp)  

Но я получил вывод с ошибкой msrest.exceptions.DeserializationError: :

{'additional_properties': {}, 'account_license_type': 'express', 'assignment_source': None, 'license_display_name': None, 'licensing_source': None, 'msdn_license_type': None, 'status': None, 'status_message': None}

{'additional_properties': {}, '_links': None, 'descriptor': None, 'display_name': None, 'url': None, 'legacy_descriptor': None, 'origin': None, 'origin_id': None, 'subject_kind': 'user', 'domain': None, 'mail_address': None, 'principal_name': 'anaya.john@mydomain.com', 'is_deleted_in_origin': None, 'metadata_update_date': None, 'meta_type': None}

{'additional_properties': {}, 'access_level': None, 'extensions': None, 'group_assignments': None, 'id': None, 'last_accessed_date': None, 'project_entitlements': None, 'user': <azure.devops.v5_0.member_entitlement_management.models.GraphUser object at 0x000002147F444FD0>}

Content :

{'user': {'subjectKind': 'user', 'principalName': 'anaya.john@dynactionize.onmicrosoft.com'}}

Traceback (most recent call last):
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1294, in _deserialize
    value = self.deserialize_data(raw_value, attr_desc['type'])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1447, in deserialize_data
    return self.deserialize_type[iter_type](data, data_type[1:-1])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1478, in deserialize_iter
    return [self.deserialize_data(a, iter_type) for a in attr]
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1478, in <listcomp>
    return [self.deserialize_data(a, iter_type) for a in attr]
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1447, in deserialize_data
    return self.deserialize_type[iter_type](data, data_type[1:-1])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1494, in deserialize_dict
    return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()}
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1494, in <dictcomp>
    return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()}
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1449, in deserialize_data
    obj_type = self.dependencies[data_type]
KeyError: ' key: int; value: str '

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Users/Anjana/Desktop/scripts_O365/az_devops_clientAPI_PAT.py", line 152, in <module>
    resp = member_ent_mngmnt_client.add_user_entitlement(user_entitlement)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\azure\devops\v5_0\member_entitlement_management\member_entitlement_management_client.py", line 184, in add_user_entitlement
    return self._deserialize('UserEntitlementsPostResponse', response)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1228, in __call__
    return self._deserialize(target_obj, data)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1294, in _deserialize
    value = self.deserialize_data(raw_value, attr_desc['type'])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1460, in deserialize_data
    return self._deserialize(obj_type, data)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1298, in _deserialize
    raise_with_traceback(DeserializationError, msg, err)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\exceptions.py", line 51, in raise_with_traceback
    raise error.with_traceback(exc_traceback)
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1294, in _deserialize
    value = self.deserialize_data(raw_value, attr_desc['type'])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1447, in deserialize_data
    return self.deserialize_type[iter_type](data, data_type[1:-1])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1478, in deserialize_iter
    return [self.deserialize_data(a, iter_type) for a in attr]
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1478, in <listcomp>
    return [self.deserialize_data(a, iter_type) for a in attr]
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1447, in deserialize_data
    return self.deserialize_type[iter_type](data, data_type[1:-1])
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1494, in deserialize_dict
    return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()}
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1494, in <dictcomp>
    return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()}
  File "C:\Users\Anjana\AppData\Local\Programs\Python\Python37\lib\site-packages\msrest\serialization.py", line 1449, in deserialize_data
    obj_type = self.dependencies[data_type]
msrest.exceptions.DeserializationError: Unable to deserialize to object: type, KeyError: ' key: int; value: str '

Может кто-нибудь помочь мне решить эту ошибку?

1 Ответ

0 голосов
/ 24 июня 2019

Ошибка десериализации говорит о том, что python не может десериализовать ответ, полученный на объект типа UserEntitlementsPostResponse.Это происходит, когда ответ не является ожидаемым.

Я отредактировал функцию add_user_entitlement() класса MemberEntitlementManagementClient клиента python, добавив строку для печати ответа на запрос POST.Ответ был:

{'operationResult': {'isSuccess': False, 'errors': [{'key': 5032, 'value': 'Access Denied: This user needs the following permission(s) on the resource Users to perform this action: Add Users'}], 'userId': '261d25ad091b', 'result': None}, 'isSuccess': False, 'userEntitlement': None}

Очевидно, это не был ожидаемый результат.И это не может быть преобразовано в объект типа UserEntitlementsPostResponse.Следовательно, произошла ошибка.

Как следует из ошибки, после добавления пользователя (который запускает сценарий) в группу «администраторы коллекции проектов» в нашей организации Azure Devops сценарий работал правильно.

Этот шаг был важен, поскольку в документации Microsoft для REST API Azure Devops (https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/add-organization-users?view=azure-devops#prerequisites) говорится:

Для доступа к пользователям и управления ими у вас должен быть администратор или организация коллекции проектов Azure DevOps.разрешения владельца.

...