diff --git a/src/msgraph_core/requests/batch_request_builder.py b/src/msgraph_core/requests/batch_request_builder.py index b9fc77e9..bb0aa5f7 100644 --- a/src/msgraph_core/requests/batch_request_builder.py +++ b/src/msgraph_core/requests/batch_request_builder.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional, List +from typing import Type, TypeVar, Dict, Optional, Any import asyncio import json @@ -8,12 +8,15 @@ from kiota_abstractions.request_information import RequestInformation from kiota_abstractions.method import Method from kiota_abstractions.headers_collection import HeadersCollection +from kiota_abstractions.api_error import APIError from .batch_request_content import BatchRequestContent from .batch_request_content_collection import BatchRequestContentCollection from .batch_response_content import BatchResponseContent from .batch_response_content_collection import BatchResponseContentCollection +T = TypeVar('T', bound='Parsable') + class BatchRequestBuilder: """ @@ -44,20 +47,24 @@ async def post_content( if batch_request_content is None: raise ValueError("batch_request_content cannot be Null.") request_info = await self.to_post_request_information(batch_request_content) - # print(f"Request Info: {request_info}") - print(f"Request Info Content: {request_info.content}") - # print(f"Request Info Headers: {request_info.headers}") - # print(f"Request Info Method: {request_info.http_method}") - # print(f"Request Info URL: {request_info.url}") - # could we use a native response handler here? + request_body = request_info.content.decode("utf-8") + json_body = json.loads(request_body) + request_info.content = json_body + print(f"Request Info Content: {request_body}") + print(f"Request Info Content: {type(request_info.content)}") parsable_factory = BatchResponseContent() error_map: Dict[str, int] = {} - response = await self._request_adapter.send_async(request_info, parsable_factory, error_map) + try: + response = await self._request_adapter.send_async( + request_info, parsable_factory, error_map + ) + except APIError as e: + print(f"API Error: {e}") return response async def to_post_request_information( self, - batch_request_content: 'BatchRequestContent', + batch_request_content: BatchRequestContent, ) -> RequestInformation: """ Creates request information for a batch POST request. @@ -73,11 +80,11 @@ async def to_post_request_information( request_info = RequestInformation() request_info.http_method = Method.POST request_info.url_template = self.url_template - # serialized_content = [ - # item.get_field_deserializers() for item in batch_request_content.requests - # ] - # print(f"Serialized Content: {type(serialized_content)}") - # request_info.content = json.dumps(serialized_content).encode("utf-8") request_info.headers = HeadersCollection() request_info.headers.try_add("Content-Type", "application/json") + request_info.headers.try_add("Accept", "application/json") + request_info.set_content_from_parsable( + self._request_adapter, "application/json", batch_request_content + ) + return request_info diff --git a/src/msgraph_core/requests/batch_request_content.py b/src/msgraph_core/requests/batch_request_content.py index b217d0ad..b86e1cab 100644 --- a/src/msgraph_core/requests/batch_request_content.py +++ b/src/msgraph_core/requests/batch_request_content.py @@ -1,5 +1,5 @@ import uuid -from typing import List, Dict, Union +from typing import List, Dict, Union, Any from kiota_abstractions.request_information import RequestInformation from kiota_abstractions.serialization import Parsable @@ -83,6 +83,10 @@ def finalize(self): self.is_finalized = True return self._requests + @classmethod + def create_from_discriminator_value(cls, data: Dict[str, Any]) -> 'BatchResponseContent': + pass + def get_field_deserializers(self, ) -> Dict: """ The deserialization information for the current model diff --git a/src/msgraph_core/requests/batch_request_item.py b/src/msgraph_core/requests/batch_request_item.py index 0b87d0b0..5615e668 100644 --- a/src/msgraph_core/requests/batch_request_item.py +++ b/src/msgraph_core/requests/batch_request_item.py @@ -153,11 +153,11 @@ def body(self) -> None: return self._body @body.setter - def body(self, body: Optional[StreamInterface]) -> None: + def body(self, body: BytesIO) -> None: """ Sets the body of the request item. Args: - body (Optional[StreamInterface]): The body of the request item. + body : (BytesIO): The body of the request item. """ self._body = body @@ -217,12 +217,13 @@ def serialize(self, writer: SerializationWriter) -> None: writer.write_str_value('url', self.url) writer.write_collection_of_primitive_values('depends_on', self._depends_on) headers = {key: ", ".join(val) for key, val in self._headers.items()} - writer.write_additional_data_value('headers', headers) + writer.write_collection_of_object_values('headers', headers) if self._body: - json_object = json.loads(self._body.read()) + print(f"Body: {self._body}") + json_object = json.loads(self._body) is_json_string = json_object and isinstance(json_object, dict) - self.body.seek(0) - writer.write_additional_data_value( - 'body', json_object - if is_json_string else base64.b64encode(self._body.read()).decode('utf-8') + # self.body.seek(0) + writer.write_collection_of_object_values( + 'body', + json_object if is_json_string else base64.b64encode(self._body).decode('utf-8') )