lusid-sdk 2.1.201__py3-none-any.whl → 2.1.208__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lusid-sdk might be problematic. Click here for more details.

lusid/__init__.py CHANGED
@@ -1035,6 +1035,7 @@ from lusid.models.upsert_legal_entity_access_metadata_request import UpsertLegal
1035
1035
  from lusid.models.upsert_legal_entity_request import UpsertLegalEntityRequest
1036
1036
  from lusid.models.upsert_person_access_metadata_request import UpsertPersonAccessMetadataRequest
1037
1037
  from lusid.models.upsert_person_request import UpsertPersonRequest
1038
+ from lusid.models.upsert_persons_response import UpsertPersonsResponse
1038
1039
  from lusid.models.upsert_portfolio_access_metadata_request import UpsertPortfolioAccessMetadataRequest
1039
1040
  from lusid.models.upsert_portfolio_group_access_metadata_request import UpsertPortfolioGroupAccessMetadataRequest
1040
1041
  from lusid.models.upsert_portfolio_transactions_response import UpsertPortfolioTransactionsResponse
@@ -2107,6 +2108,7 @@ __all__ = [
2107
2108
  "UpsertLegalEntityRequest",
2108
2109
  "UpsertPersonAccessMetadataRequest",
2109
2110
  "UpsertPersonRequest",
2111
+ "UpsertPersonsResponse",
2110
2112
  "UpsertPortfolioAccessMetadataRequest",
2111
2113
  "UpsertPortfolioGroupAccessMetadataRequest",
2112
2114
  "UpsertPortfolioTransactionsResponse",
lusid/api/persons_api.py CHANGED
@@ -40,6 +40,7 @@ from lusid.models.set_person_identifiers_request import SetPersonIdentifiersRequ
40
40
  from lusid.models.set_person_properties_request import SetPersonPropertiesRequest
41
41
  from lusid.models.upsert_person_access_metadata_request import UpsertPersonAccessMetadataRequest
42
42
  from lusid.models.upsert_person_request import UpsertPersonRequest
43
+ from lusid.models.upsert_persons_response import UpsertPersonsResponse
43
44
 
44
45
  from lusid.api_client import ApiClient
45
46
  from lusid.api_response import ApiResponse
@@ -3345,3 +3346,169 @@ class PersonsApi:
3345
3346
  _request_timeout=_params.get('_request_timeout'),
3346
3347
  collection_formats=_collection_formats,
3347
3348
  _request_auth=_params.get('_request_auth'))
3349
+
3350
+ @overload
3351
+ async def upsert_persons(self, success_mode : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial")], request_body : Annotated[Dict[str, UpsertPersonRequest], Field(..., description="A collection of requests to create or update Person(s).")], **kwargs) -> UpsertPersonsResponse: # noqa: E501
3352
+ ...
3353
+
3354
+ @overload
3355
+ def upsert_persons(self, success_mode : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial")], request_body : Annotated[Dict[str, UpsertPersonRequest], Field(..., description="A collection of requests to create or update Person(s).")], async_req: Optional[bool]=True, **kwargs) -> UpsertPersonsResponse: # noqa: E501
3356
+ ...
3357
+
3358
+ @validate_arguments
3359
+ def upsert_persons(self, success_mode : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial")], request_body : Annotated[Dict[str, UpsertPersonRequest], Field(..., description="A collection of requests to create or update Person(s).")], async_req: Optional[bool]=None, **kwargs) -> Union[UpsertPersonsResponse, Awaitable[UpsertPersonsResponse]]: # noqa: E501
3360
+ """[EARLY ACCESS] UpsertPersons: Pluralised Upsert of Persons # noqa: E501
3361
+
3362
+ Create or updates a collection of person(s). # noqa: E501
3363
+ This method makes a synchronous HTTP request by default. To make an
3364
+ asynchronous HTTP request, please pass async_req=True
3365
+
3366
+ >>> thread = api.upsert_persons(success_mode, request_body, async_req=True)
3367
+ >>> result = thread.get()
3368
+
3369
+ :param success_mode: Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial (required)
3370
+ :type success_mode: str
3371
+ :param request_body: A collection of requests to create or update Person(s). (required)
3372
+ :type request_body: Dict[str, UpsertPersonRequest]
3373
+ :param async_req: Whether to execute the request asynchronously.
3374
+ :type async_req: bool, optional
3375
+ :param _request_timeout: timeout setting for this request.
3376
+ If one number provided, it will be total request
3377
+ timeout. It can also be a pair (tuple) of
3378
+ (connection, read) timeouts.
3379
+ :return: Returns the result object.
3380
+ If the method is called asynchronously,
3381
+ returns the request thread.
3382
+ :rtype: UpsertPersonsResponse
3383
+ """
3384
+ kwargs['_return_http_data_only'] = True
3385
+ if '_preload_content' in kwargs:
3386
+ message = "Error! Please call the upsert_persons_with_http_info method with `_preload_content` instead and obtain raw data from ApiResponse.raw_data" # noqa: E501
3387
+ raise ValueError(message)
3388
+ if async_req is not None:
3389
+ kwargs['async_req'] = async_req
3390
+ return self.upsert_persons_with_http_info(success_mode, request_body, **kwargs) # noqa: E501
3391
+
3392
+ @validate_arguments
3393
+ def upsert_persons_with_http_info(self, success_mode : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial")], request_body : Annotated[Dict[str, UpsertPersonRequest], Field(..., description="A collection of requests to create or update Person(s).")], **kwargs) -> ApiResponse: # noqa: E501
3394
+ """[EARLY ACCESS] UpsertPersons: Pluralised Upsert of Persons # noqa: E501
3395
+
3396
+ Create or updates a collection of person(s). # noqa: E501
3397
+ This method makes a synchronous HTTP request by default. To make an
3398
+ asynchronous HTTP request, please pass async_req=True
3399
+
3400
+ >>> thread = api.upsert_persons_with_http_info(success_mode, request_body, async_req=True)
3401
+ >>> result = thread.get()
3402
+
3403
+ :param success_mode: Whether the batch request should fail Atomically or in a Partial fashion - Allowed Values: Atomic, Partial (required)
3404
+ :type success_mode: str
3405
+ :param request_body: A collection of requests to create or update Person(s). (required)
3406
+ :type request_body: Dict[str, UpsertPersonRequest]
3407
+ :param async_req: Whether to execute the request asynchronously.
3408
+ :type async_req: bool, optional
3409
+ :param _preload_content: if False, the ApiResponse.data will
3410
+ be set to none and raw_data will store the
3411
+ HTTP response body without reading/decoding.
3412
+ Default is True.
3413
+ :type _preload_content: bool, optional
3414
+ :param _return_http_data_only: response data instead of ApiResponse
3415
+ object with status code, headers, etc
3416
+ :type _return_http_data_only: bool, optional
3417
+ :param _request_timeout: timeout setting for this request. If one
3418
+ number provided, it will be total request
3419
+ timeout. It can also be a pair (tuple) of
3420
+ (connection, read) timeouts.
3421
+ :param _request_auth: set to override the auth_settings for an a single
3422
+ request; this effectively ignores the authentication
3423
+ in the spec for a single request.
3424
+ :type _request_auth: dict, optional
3425
+ :type _content_type: string, optional: force content-type for the request
3426
+ :return: Returns the result object.
3427
+ If the method is called asynchronously,
3428
+ returns the request thread.
3429
+ :rtype: tuple(UpsertPersonsResponse, status_code(int), headers(HTTPHeaderDict))
3430
+ """
3431
+
3432
+ _params = locals()
3433
+
3434
+ _all_params = [
3435
+ 'success_mode',
3436
+ 'request_body'
3437
+ ]
3438
+ _all_params.extend(
3439
+ [
3440
+ 'async_req',
3441
+ '_return_http_data_only',
3442
+ '_preload_content',
3443
+ '_request_timeout',
3444
+ '_request_auth',
3445
+ '_content_type',
3446
+ '_headers'
3447
+ ]
3448
+ )
3449
+
3450
+ # validate the arguments
3451
+ for _key, _val in _params['kwargs'].items():
3452
+ if _key not in _all_params:
3453
+ raise ApiTypeError(
3454
+ "Got an unexpected keyword argument '%s'"
3455
+ " to method upsert_persons" % _key
3456
+ )
3457
+ _params[_key] = _val
3458
+ del _params['kwargs']
3459
+
3460
+ _collection_formats = {}
3461
+
3462
+ # process the path parameters
3463
+ _path_params = {}
3464
+
3465
+ # process the query parameters
3466
+ _query_params = []
3467
+ if _params.get('success_mode') is not None: # noqa: E501
3468
+ _query_params.append(('successMode', _params['success_mode']))
3469
+
3470
+ # process the header parameters
3471
+ _header_params = dict(_params.get('_headers', {}))
3472
+ # process the form parameters
3473
+ _form_params = []
3474
+ _files = {}
3475
+ # process the body parameter
3476
+ _body_params = None
3477
+ if _params['request_body'] is not None:
3478
+ _body_params = _params['request_body']
3479
+
3480
+ # set the HTTP header `Accept`
3481
+ _header_params['Accept'] = self.api_client.select_header_accept(
3482
+ ['text/plain', 'application/json', 'text/json']) # noqa: E501
3483
+
3484
+ # set the HTTP header `Content-Type`
3485
+ _content_types_list = _params.get('_content_type',
3486
+ self.api_client.select_header_content_type(
3487
+ ['application/json-patch+json', 'application/json', 'text/json', 'application/*+json']))
3488
+ if _content_types_list:
3489
+ _header_params['Content-Type'] = _content_types_list
3490
+
3491
+ # authentication setting
3492
+ _auth_settings = ['oauth2'] # noqa: E501
3493
+
3494
+ _response_types_map = {
3495
+ '201': "UpsertPersonsResponse",
3496
+ '400': "LusidValidationProblemDetails",
3497
+ }
3498
+
3499
+ return self.api_client.call_api(
3500
+ '/api/persons/$batchUpsert', 'POST',
3501
+ _path_params,
3502
+ _query_params,
3503
+ _header_params,
3504
+ body=_body_params,
3505
+ post_params=_form_params,
3506
+ files=_files,
3507
+ response_types_map=_response_types_map,
3508
+ auth_settings=_auth_settings,
3509
+ async_req=_params.get('async_req'),
3510
+ _return_http_data_only=_params.get('_return_http_data_only'), # noqa: E501
3511
+ _preload_content=_params.get('_preload_content', True),
3512
+ _request_timeout=_params.get('_request_timeout'),
3513
+ collection_formats=_collection_formats,
3514
+ _request_auth=_params.get('_request_auth'))
@@ -4616,7 +4616,7 @@ class PortfoliosApi:
4616
4616
  def patch_portfolio(self, scope : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="The scope of the portfolio.")], code : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="The code of the portfolio. Together with the scope this uniquely identifies the portfolio.")], operation : Annotated[conlist(Operation), Field(..., description="The json patch document. For more check: https://datatracker.ietf.org/doc/html/rfc6902.")], async_req: Optional[bool]=None, **kwargs) -> Union[Portfolio, Awaitable[Portfolio]]: # noqa: E501
4617
4617
  """PatchPortfolio: Patch portfolio. # noqa: E501
4618
4618
 
4619
- Create or update certain fields for a particular portfolio. The behaviour is defined by the JSON Patch specification. Currently supported are: CreationDate, InstrumentScopes. # noqa: E501
4619
+ Create or update certain fields for a particular portfolio. The behaviour is defined by the JSON Patch specification. Currently supported are: Created, InstrumentScopes. # noqa: E501
4620
4620
  This method makes a synchronous HTTP request by default. To make an
4621
4621
  asynchronous HTTP request, please pass async_req=True
4622
4622
 
@@ -4652,7 +4652,7 @@ class PortfoliosApi:
4652
4652
  def patch_portfolio_with_http_info(self, scope : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="The scope of the portfolio.")], code : Annotated[constr(strict=True, max_length=64, min_length=1), Field(..., description="The code of the portfolio. Together with the scope this uniquely identifies the portfolio.")], operation : Annotated[conlist(Operation), Field(..., description="The json patch document. For more check: https://datatracker.ietf.org/doc/html/rfc6902.")], **kwargs) -> ApiResponse: # noqa: E501
4653
4653
  """PatchPortfolio: Patch portfolio. # noqa: E501
4654
4654
 
4655
- Create or update certain fields for a particular portfolio. The behaviour is defined by the JSON Patch specification. Currently supported are: CreationDate, InstrumentScopes. # noqa: E501
4655
+ Create or update certain fields for a particular portfolio. The behaviour is defined by the JSON Patch specification. Currently supported are: Created, InstrumentScopes. # noqa: E501
4656
4656
  This method makes a synchronous HTTP request by default. To make an
4657
4657
  asynchronous HTTP request, please pass async_req=True
4658
4658
 
lusid/configuration.py CHANGED
@@ -373,7 +373,7 @@ class Configuration:
373
373
  return "Python SDK Debug Report:\n"\
374
374
  "OS: {env}\n"\
375
375
  "Python Version: {pyversion}\n"\
376
- "Version of the API: 0.11.6635\n"\
376
+ "Version of the API: 0.11.6642\n"\
377
377
  "SDK Package Version: {package_version}".\
378
378
  format(env=sys.platform, pyversion=sys.version, package_version=package_version)
379
379
 
lusid/models/__init__.py CHANGED
@@ -957,6 +957,7 @@ from lusid.models.upsert_legal_entity_access_metadata_request import UpsertLegal
957
957
  from lusid.models.upsert_legal_entity_request import UpsertLegalEntityRequest
958
958
  from lusid.models.upsert_person_access_metadata_request import UpsertPersonAccessMetadataRequest
959
959
  from lusid.models.upsert_person_request import UpsertPersonRequest
960
+ from lusid.models.upsert_persons_response import UpsertPersonsResponse
960
961
  from lusid.models.upsert_portfolio_access_metadata_request import UpsertPortfolioAccessMetadataRequest
961
962
  from lusid.models.upsert_portfolio_group_access_metadata_request import UpsertPortfolioGroupAccessMetadataRequest
962
963
  from lusid.models.upsert_portfolio_transactions_response import UpsertPortfolioTransactionsResponse
@@ -1952,6 +1953,7 @@ __all__ = [
1952
1953
  "UpsertLegalEntityRequest",
1953
1954
  "UpsertPersonAccessMetadataRequest",
1954
1955
  "UpsertPersonRequest",
1956
+ "UpsertPersonsResponse",
1955
1957
  "UpsertPortfolioAccessMetadataRequest",
1956
1958
  "UpsertPortfolioGroupAccessMetadataRequest",
1957
1959
  "UpsertPortfolioTransactionsResponse",
@@ -19,14 +19,14 @@ import json
19
19
 
20
20
 
21
21
  from typing import Any, Dict, Optional, Union
22
- from pydantic.v1 import BaseModel, StrictFloat, StrictInt, StrictStr
22
+ from pydantic.v1 import BaseModel, Field, StrictFloat, StrictInt, StrictStr
23
23
 
24
24
  class CurrencyAndAmount(BaseModel):
25
25
  """
26
26
  An amount of a specific currency, specifying a value and an associated unit # noqa: E501
27
27
  """
28
28
  amount: Optional[Union[StrictFloat, StrictInt]] = None
29
- currency: Optional[StrictStr] = None
29
+ currency: StrictStr = Field(...)
30
30
  __properties = ["amount", "currency"]
31
31
 
32
32
  class Config:
@@ -53,11 +53,6 @@ class CurrencyAndAmount(BaseModel):
53
53
  exclude={
54
54
  },
55
55
  exclude_none=True)
56
- # set to None if currency (nullable) is None
57
- # and __fields_set__ contains the field
58
- if self.currency is None and "currency" in self.__fields_set__:
59
- _dict['currency'] = None
60
-
61
56
  return _dict
62
57
 
63
58
  @classmethod
@@ -33,7 +33,7 @@ class TransactionConfigurationMovementData(BaseModel):
33
33
  properties: Optional[Dict[str, PerpetualProperty]] = Field(None, description="The properties associated with the underlying Movement")
34
34
  mappings: Optional[conlist(TransactionPropertyMapping)] = Field(None, description="This allows you to map a transaction property to a property on the underlying holding")
35
35
  name: Optional[StrictStr] = Field(None, description="The movement name (optional)")
36
- movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The only option currently available is 'DirectAdjustment'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the unitsof a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
36
+ movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The options currently available are 'DirectAdjustment' and 'IncludesTradedInterest'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the units of a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
37
37
  __properties = ["movementTypes", "side", "direction", "properties", "mappings", "name", "movementOptions"]
38
38
 
39
39
  @validator('movement_types')
@@ -33,7 +33,7 @@ class TransactionConfigurationMovementDataRequest(BaseModel):
33
33
  properties: Optional[Dict[str, PerpetualProperty]] = Field(None, description="The properties associated with the underlying Movement.")
34
34
  mappings: Optional[conlist(TransactionPropertyMappingRequest)] = Field(None, description="This allows you to map a transaction property to a property on the underlying holding.")
35
35
  name: Optional[StrictStr] = Field(None, description="The movement name (optional)")
36
- movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The only option currently available is 'DirectAdjustment'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the unitsof a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
36
+ movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The options currently available are 'DirectAdjustment' and 'IncludesTradedInterest'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the units of a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
37
37
  __properties = ["movementTypes", "side", "direction", "properties", "mappings", "name", "movementOptions"]
38
38
 
39
39
  @validator('movement_types')
@@ -33,7 +33,7 @@ class TransactionTypeMovement(BaseModel):
33
33
  properties: Optional[Dict[str, PerpetualProperty]] = Field(None, description="The properties associated with the underlying Movement")
34
34
  mappings: Optional[conlist(TransactionTypePropertyMapping, max_items=5000)] = Field(None, description="This allows you to map a transaction property to a property on the underlying holding")
35
35
  name: Optional[constr(strict=True, max_length=512, min_length=1)] = Field(None, description="The movement name (optional)")
36
- movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The only option currently available is 'DirectAdjustment'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the unitsof a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
36
+ movement_options: Optional[conlist(StrictStr)] = Field(None, alias="movementOptions", description="Allows extra specifications for the movement. The options currently available are 'DirectAdjustment' and 'IncludesTradedInterest'. A movement type of 'StockMovement' with an option of 'DirectAdjusment' will allow you to adjust the units of a holding without affecting its cost base. You will, therefore, be able to reflect the impact of a stock split by loading a Transaction.")
37
37
  settlement_date_override: Optional[StrictStr] = Field(None, alias="settlementDateOverride", description="Optional property key that must be in the Transaction domain when specified. When the movement is processed and the transaction has this property set to a valid date, then the property value will override the SettlementDate of the transaction.")
38
38
  __properties = ["movementTypes", "side", "direction", "properties", "mappings", "name", "movementOptions", "settlementDateOverride"]
39
39
 
@@ -0,0 +1,114 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ LUSID API
5
+
6
+ FINBOURNE Technology # noqa: E501
7
+
8
+ Contact: info@finbourne.com
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from datetime import datetime
21
+ from typing import Any, Dict, List, Optional
22
+ from pydantic.v1 import BaseModel, Field, conlist
23
+ from lusid.models.error_detail import ErrorDetail
24
+ from lusid.models.link import Link
25
+ from lusid.models.person import Person
26
+
27
+ class UpsertPersonsResponse(BaseModel):
28
+ """
29
+ UpsertPersonsResponse
30
+ """
31
+ values: Dict[str, Person] = Field(..., description="The Person(s) that have been successfully upserted")
32
+ failed: Dict[str, ErrorDetail] = Field(..., description="The Person(s) that could not be upserted along with a reason for their failure.")
33
+ as_at_date: datetime = Field(..., alias="asAtDate", description="The as-at datetime at which Person(s) were created or updated.")
34
+ links: Optional[conlist(Link)] = None
35
+ __properties = ["values", "failed", "asAtDate", "links"]
36
+
37
+ class Config:
38
+ """Pydantic configuration"""
39
+ allow_population_by_field_name = True
40
+ validate_assignment = True
41
+
42
+ def to_str(self) -> str:
43
+ """Returns the string representation of the model using alias"""
44
+ return pprint.pformat(self.dict(by_alias=True))
45
+
46
+ def to_json(self) -> str:
47
+ """Returns the JSON representation of the model using alias"""
48
+ return json.dumps(self.to_dict())
49
+
50
+ @classmethod
51
+ def from_json(cls, json_str: str) -> UpsertPersonsResponse:
52
+ """Create an instance of UpsertPersonsResponse from a JSON string"""
53
+ return cls.from_dict(json.loads(json_str))
54
+
55
+ def to_dict(self):
56
+ """Returns the dictionary representation of the model using alias"""
57
+ _dict = self.dict(by_alias=True,
58
+ exclude={
59
+ },
60
+ exclude_none=True)
61
+ # override the default output from pydantic by calling `to_dict()` of each value in values (dict)
62
+ _field_dict = {}
63
+ if self.values:
64
+ for _key in self.values:
65
+ if self.values[_key]:
66
+ _field_dict[_key] = self.values[_key].to_dict()
67
+ _dict['values'] = _field_dict
68
+ # override the default output from pydantic by calling `to_dict()` of each value in failed (dict)
69
+ _field_dict = {}
70
+ if self.failed:
71
+ for _key in self.failed:
72
+ if self.failed[_key]:
73
+ _field_dict[_key] = self.failed[_key].to_dict()
74
+ _dict['failed'] = _field_dict
75
+ # override the default output from pydantic by calling `to_dict()` of each item in links (list)
76
+ _items = []
77
+ if self.links:
78
+ for _item in self.links:
79
+ if _item:
80
+ _items.append(_item.to_dict())
81
+ _dict['links'] = _items
82
+ # set to None if links (nullable) is None
83
+ # and __fields_set__ contains the field
84
+ if self.links is None and "links" in self.__fields_set__:
85
+ _dict['links'] = None
86
+
87
+ return _dict
88
+
89
+ @classmethod
90
+ def from_dict(cls, obj: dict) -> UpsertPersonsResponse:
91
+ """Create an instance of UpsertPersonsResponse from a dict"""
92
+ if obj is None:
93
+ return None
94
+
95
+ if not isinstance(obj, dict):
96
+ return UpsertPersonsResponse.parse_obj(obj)
97
+
98
+ _obj = UpsertPersonsResponse.parse_obj({
99
+ "values": dict(
100
+ (_k, Person.from_dict(_v))
101
+ for _k, _v in obj.get("values").items()
102
+ )
103
+ if obj.get("values") is not None
104
+ else None,
105
+ "failed": dict(
106
+ (_k, ErrorDetail.from_dict(_v))
107
+ for _k, _v in obj.get("failed").items()
108
+ )
109
+ if obj.get("failed") is not None
110
+ else None,
111
+ "as_at_date": obj.get("asAtDate"),
112
+ "links": [Link.from_dict(_item) for _item in obj.get("links")] if obj.get("links") is not None else None
113
+ })
114
+ return _obj
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lusid-sdk
3
- Version: 2.1.201
3
+ Version: 2.1.208
4
4
  Summary: LUSID API
5
5
  Home-page: https://github.com/finbourne/lusid-sdk-python
6
6
  License: MIT
@@ -29,8 +29,8 @@ FINBOURNE Technology
29
29
 
30
30
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
31
31
 
32
- - API version: 0.11.6635
33
- - Package version: 2.1.201
32
+ - API version: 0.11.6642
33
+ - Package version: 2.1.208
34
34
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
35
35
  For more information, please visit [https://www.finbourne.com](https://www.finbourne.com)
36
36
 
@@ -521,6 +521,7 @@ Class | Method | HTTP request | Description
521
521
  *PersonsApi* | [**set_person_properties**](docs/PersonsApi.md#set_person_properties) | **POST** /api/persons/{idTypeScope}/{idTypeCode}/{code}/properties | [EARLY ACCESS] SetPersonProperties: Set Person Properties
522
522
  *PersonsApi* | [**upsert_person**](docs/PersonsApi.md#upsert_person) | **POST** /api/persons | [EARLY ACCESS] UpsertPerson: Upsert Person
523
523
  *PersonsApi* | [**upsert_person_access_metadata**](docs/PersonsApi.md#upsert_person_access_metadata) | **PUT** /api/persons/{idTypeScope}/{idTypeCode}/{code}/metadata/{metadataKey} | [EARLY ACCESS] UpsertPersonAccessMetadata: Upsert a Person Access Metadata entry associated with a specific metadataKey. This creates or updates the data in LUSID.
524
+ *PersonsApi* | [**upsert_persons**](docs/PersonsApi.md#upsert_persons) | **POST** /api/persons/$batchUpsert | [EARLY ACCESS] UpsertPersons: Pluralised Upsert of Persons
524
525
  *PlacementsApi* | [**delete_placement**](docs/PlacementsApi.md#delete_placement) | **DELETE** /api/placements/{scope}/{code} | [EARLY ACCESS] DeletePlacement: Delete placement
525
526
  *PlacementsApi* | [**get_placement**](docs/PlacementsApi.md#get_placement) | **GET** /api/placements/{scope}/{code} | [EARLY ACCESS] GetPlacement: Get Placement
526
527
  *PlacementsApi* | [**list_placements**](docs/PlacementsApi.md#list_placements) | **GET** /api/placements | [EARLY ACCESS] ListPlacements: List Placements
@@ -1690,6 +1691,7 @@ Class | Method | HTTP request | Description
1690
1691
  - [UpsertLegalEntityRequest](docs/UpsertLegalEntityRequest.md)
1691
1692
  - [UpsertPersonAccessMetadataRequest](docs/UpsertPersonAccessMetadataRequest.md)
1692
1693
  - [UpsertPersonRequest](docs/UpsertPersonRequest.md)
1694
+ - [UpsertPersonsResponse](docs/UpsertPersonsResponse.md)
1693
1695
  - [UpsertPortfolioAccessMetadataRequest](docs/UpsertPortfolioAccessMetadataRequest.md)
1694
1696
  - [UpsertPortfolioGroupAccessMetadataRequest](docs/UpsertPortfolioGroupAccessMetadataRequest.md)
1695
1697
  - [UpsertPortfolioTransactionsResponse](docs/UpsertPortfolioTransactionsResponse.md)
@@ -1,4 +1,4 @@
1
- lusid/__init__.py,sha256=Fc_eQH5FJ4vyUWkKiCFXKQ2bKVEAvPTEvg28Xt9b7Y8,110353
1
+ lusid/__init__.py,sha256=D7YxBCamtXvcrdy2agoNMy3TQCCQwaAdkAICUu7VWiY,110453
2
2
  lusid/api/__init__.py,sha256=PFpT-ADthWd08-JqKOqQTbVW6cz9wdP_us6bg3aBFfs,5555
3
3
  lusid/api/abor_api.py,sha256=AvgsHuWE7qRSYJhKveBE2htSjHpqqS0VNJrysAfwME0,159655
4
4
  lusid/api/abor_configuration_api.py,sha256=G2bKPtMYOZ2GhUrg-nPJtCa9XIZdZYK7oafcbJWDMP8,64033
@@ -37,10 +37,10 @@ lusid/api/order_management_api.py,sha256=DI7QI_ePN1lEB5uS4FmocJLLsC2aIWW2O05ihDD
37
37
  lusid/api/orders_api.py,sha256=PjkqtLhbS6lQEEfZiXXAiIa5ls0jLokiqizseg7_nx0,43527
38
38
  lusid/api/packages_api.py,sha256=-2mdoL2HSQ2aCXqYUMxt-1rrlezyQhgCNtevVazqM9o,43985
39
39
  lusid/api/participations_api.py,sha256=nlVzeyfE33X9Ue9HC9rqCW3WACEPKBvcrEjFEmT8wlk,45263
40
- lusid/api/persons_api.py,sha256=0ZUZykUD46ow8j6sXjqaxCTylzUkssOyimAxCoDMUb4,247306
40
+ lusid/api/persons_api.py,sha256=wYB_EaDB9LXTXuSIQr8SIR4h-0NrTgisfwd5uShz8JQ,256317
41
41
  lusid/api/placements_api.py,sha256=bsX7VHZlvnxJiZ3ZPtlJ8md_exerU-Qa_BkHGVRphH8,45797
42
42
  lusid/api/portfolio_groups_api.py,sha256=IueIpi-krYvm5w-I0gkvkYAgxHXfiWejRYcW6DW8400,380452
43
- lusid/api/portfolios_api.py,sha256=azolh8b5KzRMWFPAfRSD-DczqnHjq_Kgpjtgt4qomwg,421241
43
+ lusid/api/portfolios_api.py,sha256=pXwxugbm-zQf901tDlh_zbC4odf384sQKclu1rrIWXk,421231
44
44
  lusid/api/property_definitions_api.py,sha256=I3aISrQ3USeB-Vkx8OVyakx345aEhPATghGmEtL6ApU,140367
45
45
  lusid/api/queryable_keys_api.py,sha256=1HafmN22bU1bV5H5nua8EZ5oL0pe0LZ5xkVDQTDSezg,10281
46
46
  lusid/api/quotes_api.py,sha256=QPSJ6rFAI-hsvei1QA-PoCzpHRJlcvF_SiCxyGyG678,115595
@@ -67,7 +67,7 @@ lusid/api/transaction_portfolios_api.py,sha256=7G5m6iTQXTKCc6ASdxnlVJjvFascHxEgD
67
67
  lusid/api/translation_api.py,sha256=xTAaKEW96JTDIZBXCjxSguCa7Gz4oVd5jdObUE2egwo,20092
68
68
  lusid/api_client.py,sha256=dF6l9RAsdxdQjf6Qn4ny6LB-QXlJmsscWiozCvyyBFA,30709
69
69
  lusid/api_response.py,sha256=6-gnhty6lu8MMAERt3_kTVD7UxQgWFfcjgpcq6iN5IU,855
70
- lusid/configuration.py,sha256=kQZT8gEZR48sO2YsxsArTJfCm5WDaon4a_JTBy75zYQ,14404
70
+ lusid/configuration.py,sha256=-yuEVBTpIq8BXOWIL9bboq7EAJ13ERfnjPvgjCt6fYM,14404
71
71
  lusid/exceptions.py,sha256=HIQwgmQrszLlcVCLaqex8dO0laVuejUyOMz7U2ZWJ6s,5326
72
72
  lusid/extensions/__init__.py,sha256=L7EF4zKjcq1g2GodEumg1-C9xKs7YrQ0QHGPi8XbpO4,629
73
73
  lusid/extensions/api_client.py,sha256=Ob06urm4Em3MLzgP_geyeeGsPCkU225msW_1kpIeABM,30567
@@ -81,7 +81,7 @@ lusid/extensions/rest.py,sha256=tjVCu-cRrYcjp-ttB975vebPKtBNyBWaeoAdO3QXG2I,1269
81
81
  lusid/extensions/retry.py,sha256=orBJ1uF1iT1IncjWX1iGHVqsCgTh0SBe9rtiV_sPnwk,11564
82
82
  lusid/extensions/socket_keep_alive.py,sha256=NGlqsv-E25IjJOLGZhXZY6kUdx51nEF8qCQyVdzayRk,1653
83
83
  lusid/extensions/tcp_keep_alive_connector.py,sha256=zaGtUsygRsxB1_4B3x39K3ILwztdhMLDv5bFZV7zmGE,3877
84
- lusid/models/__init__.py,sha256=NaO3YY2YePlhZOMBPjDwDP347uGNyfQcMo0GjUWjukg,103766
84
+ lusid/models/__init__.py,sha256=kh-3eODFYDlfPJLqhPaK0XBx9L7ozJl6AQuQE3TGQEo,103866
85
85
  lusid/models/a2_b_breakdown.py,sha256=Txi12EIQw3mH6NM-25QkOnHSQc3BVAWrP7yl9bZswSY,2947
86
86
  lusid/models/a2_b_category.py,sha256=k6NPAACi0CUjKyhdQac4obQSrPmp2PXD6lkAtCnyEFM,2725
87
87
  lusid/models/a2_b_data_record.py,sha256=zKGS2P4fzNpzdcGJiSIpkY4P3d_jAcawYfyuPCDeQgk,9737
@@ -293,7 +293,7 @@ lusid/models/credit_rating.py,sha256=3EJjCwgdDT04iclq5OTBWughXAbXc9FkOtz-x7i5rks
293
293
  lusid/models/credit_spread_curve_data.py,sha256=N2gish4RNEdHNRwo8AceZbY5dPUtKy8Lt1WTRxrDHNw,7174
294
294
  lusid/models/credit_support_annex.py,sha256=YFEtXS7mDojadeeJOfvfNVCBHjgkgBFbUMV0YA5bNtI,5420
295
295
  lusid/models/criterion_type.py,sha256=Bd9KQZuS8O0ie_vYJZAvfnKMggoJOiCdcMFpik-m-q8,772
296
- lusid/models/currency_and_amount.py,sha256=izd4FdwwuPPB79pNkbk4tuwB3-JiTUE4B-OhHyboJ9k,2277
296
+ lusid/models/currency_and_amount.py,sha256=0fnwWNfI1_gMhmZBx_dCjujbM0EgwV28c_9u5k5kmlY,2069
297
297
  lusid/models/curve_options.py,sha256=QrYx3ty0D8guh0t5mnxs6makVs3zGlJDO2-6ypIHN_c,5131
298
298
  lusid/models/custodian_account.py,sha256=u12g4jvcWG-ueWSpbBBBfpjmp09ehY3wEXcORQI-hx0,5020
299
299
  lusid/models/custodian_account_properties.py,sha256=733uiIZZOx86tQVcX0zfb6-HqF6DXKy5w4hl-9T7uSU,4363
@@ -933,8 +933,8 @@ lusid/models/trade_ticket_type.py,sha256=j7f2bfiA_cxaFtjZpT3Natl4BoaGAaEXF6E0ltE
933
933
  lusid/models/transaction.py,sha256=s_t93axEEHXHIFkmTCqeWWbJ0b2IuaP465yBvQGtK2w,11577
934
934
  lusid/models/transaction_configuration_data.py,sha256=BSHXnMn6TWaubn2zTxPvbRUOsRtGYb0N4sDNUcf1SaY,4318
935
935
  lusid/models/transaction_configuration_data_request.py,sha256=mypVKRfltmkG5NEUGqDDyBYdIir3S1nkYzGL8BwHWgo,4398
936
- lusid/models/transaction_configuration_movement_data.py,sha256=LzoIgeauRPD2KnvYHchjYXv7LiOx2aazLaCcydjGuwU,6984
937
- lusid/models/transaction_configuration_movement_data_request.py,sha256=9-PcxYeRBTC2PfWebPGMt99tjnv8qWp_EMVsryxmZ90,6623
936
+ lusid/models/transaction_configuration_movement_data.py,sha256=_reiT_ZkjGFvAzyuftXxFfJNJ3YIe0lLws9wFBPGmd8,7011
937
+ lusid/models/transaction_configuration_movement_data_request.py,sha256=3o7WmlP4XNSjLfWWmlfcCsZSeRUFCRBdZERr-TnHYRk,6650
938
938
  lusid/models/transaction_configuration_type_alias.py,sha256=YXhlJeoClTMcY0KmAfqGGV6mkYQFP2YF6B4PXOLjQt0,4750
939
939
  lusid/models/transaction_currency_and_amount.py,sha256=us7dfLcpX_55r_K3EjDeTha0k2NTDl0FkkWg9LhX6Lo,2524
940
940
  lusid/models/transaction_field_map.py,sha256=sFREEtmXIwCv2HWoXVFiuU_uLrSSDCAis3CRKXazwtY,4329
@@ -959,7 +959,7 @@ lusid/models/transaction_template_specification.py,sha256=dggD7J8ZSUTznJddC_Sn65
959
959
  lusid/models/transaction_type.py,sha256=zcWUQPVY5JKEOzNWQls7TjTiKOB7QVY8iFh1zgJXYUc,5765
960
960
  lusid/models/transaction_type_alias.py,sha256=xL9k8kjgAcEPe5sfK8asHscvz7gLcAa6pC_eGgVvXlY,3532
961
961
  lusid/models/transaction_type_calculation.py,sha256=L44yItrCEO_L1lZ-blbKIkwHplM28a_5kwKlf-BvfGA,2734
962
- lusid/models/transaction_type_movement.py,sha256=RfcTLPKRDVzVFQm7mWgDGVUyvv9psJlSL-Ag5vwp__E,7324
962
+ lusid/models/transaction_type_movement.py,sha256=91L6LTeAGpAB52qmFZOPqiraol4G2JOgdf3ElzYSU2Y,7351
963
963
  lusid/models/transaction_type_property_mapping.py,sha256=2fmP3IJH-44GXE5-jt4Fd55xQscWTrEa76yjQJIUs_4,3249
964
964
  lusid/models/transaction_type_request.py,sha256=tuoF4_cUe0KLjF4FN_un_wGtraNfJAXoNrfudvA0zIc,5121
965
965
  lusid/models/transactions_reconciliations_response.py,sha256=ogcMW8W4vgIDqEdggwJDA0tH-SInrqIFCLved7SZ-VM,3083
@@ -1025,6 +1025,7 @@ lusid/models/upsert_legal_entity_access_metadata_request.py,sha256=YJ1lK6mS8rdBv
1025
1025
  lusid/models/upsert_legal_entity_request.py,sha256=H0JdP5DceJaM7UshA2X3Xtcb-4jTYD7egL2fx6-5TAA,5628
1026
1026
  lusid/models/upsert_person_access_metadata_request.py,sha256=A4dqDvLcSy8vmlFUrNe69E00qQoZyw3crsylz1vkNzM,2795
1027
1027
  lusid/models/upsert_person_request.py,sha256=WniK_xYrtBbHx0sSaZd0ejsZPr3_fge9fu5jBQMBlD8,4278
1028
+ lusid/models/upsert_persons_response.py,sha256=H-R-CZLG4AqmZlJcqO0tMTjPy-GTmIkVyRNIu9FaTOc,4184
1028
1029
  lusid/models/upsert_portfolio_access_metadata_request.py,sha256=DaD6GKXyOKWFt80u7B3PG420Rq2aVPSojjfExttElhM,2587
1029
1030
  lusid/models/upsert_portfolio_group_access_metadata_request.py,sha256=utQ8jcZx4Nnszx-BeWKMydstgs-4dpC9eGerBtRCbvg,2633
1030
1031
  lusid/models/upsert_portfolio_transactions_response.py,sha256=bnpOD9bKiA6dKC7izDN1C5E_S7idHBIj3h68bCa_-bk,4621
@@ -1076,6 +1077,6 @@ lusid/models/weighted_instruments.py,sha256=1y_y_vw4-LPsbkQx4FOzWdZc5fJnzhVkf1D3
1076
1077
  lusid/models/yield_curve_data.py,sha256=SbxvdJ4-GWK9kpMdw4Fnxc7_kvIMwgsRsd_31UJn7nw,6330
1077
1078
  lusid/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1078
1079
  lusid/rest.py,sha256=TNUzQ3yLNT2L053EdR7R0vNzQh2J3TlYD1T56Dye0W0,10138
1079
- lusid_sdk-2.1.201.dist-info/METADATA,sha256=VmljbliDKZIEWoOcHGfdzW9RkU4tz8pSGlAJxkF2SGU,188870
1080
- lusid_sdk-2.1.201.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1081
- lusid_sdk-2.1.201.dist-info/RECORD,,
1080
+ lusid_sdk-2.1.208.dist-info/METADATA,sha256=2qk66nv6vsQ6aBJ9IwZW4toExcFr-7Fkz2vyHzysciI,189097
1081
+ lusid_sdk-2.1.208.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1082
+ lusid_sdk-2.1.208.dist-info/RECORD,,