1+ import pathlib
2+ from typing import cast
3+ from urllib .parse import urljoin
4+
5+ from mpt_api_client .constants import MIMETYPE_EXCEL_XLSX
16from mpt_api_client .http import AsyncService , Service
27from mpt_api_client .http .mixins import (
38 AsyncCollectionMixin ,
49 AsyncManagedResourceMixin ,
510 CollectionMixin ,
611 ManagedResourceMixin ,
712)
13+ from mpt_api_client .http .types import FileContent , FileTypes
814from mpt_api_client .models import Model
915from mpt_api_client .resources .billing .custom_ledger_attachments import (
1016 AsyncCustomLedgerAttachmentsService ,
1420 AsyncCustomLedgerChargesService ,
1521 CustomLedgerChargesService ,
1622)
17- from mpt_api_client .resources .billing .custom_ledger_upload import (
18- AsyncCustomLedgerUploadService ,
19- CustomLedgerUploadService ,
20- )
2123from mpt_api_client .resources .billing .mixins import AcceptableMixin , AsyncAcceptableMixin
2224
2325
@@ -31,6 +33,8 @@ class CustomLedgersServiceConfig:
3133 _endpoint = "/public/v1/billing/custom-ledgers"
3234 _model_class = CustomLedger
3335 _collection_key = "data"
36+ _upload_file_key = "file"
37+ _upload_data_key = "id"
3438
3539
3640class CustomLedgersService (
@@ -42,20 +46,48 @@ class CustomLedgersService(
4246):
4347 """Custom Ledgers service."""
4448
49+ def upload (self , custom_ledger_id : str , file : FileTypes ) -> CustomLedger :
50+ """Upload custom ledger file.
51+
52+ Args:
53+ custom_ledger_id: Custom Ledger ID.
54+ file: Custom Ledger file.
55+
56+ Returns:
57+ CustomLedger: Created resource.
58+ """
59+ files : dict [str , FileTypes ] = {}
60+
61+ filename = pathlib .Path (getattr (file , "name" , "uploaded_file.xlsx" )).name
62+
63+ # Mimetype is set to Excel XLSX to prevent 415 response from the server
64+ files [self ._upload_file_key ] = (
65+ filename ,
66+ cast ("FileContent" , file ),
67+ MIMETYPE_EXCEL_XLSX ,
68+ ) # UNUSED type: ignore[attr-defined]
69+ files [self ._upload_data_key ] = custom_ledger_id # UNUSED type: ignore
70+
71+ path = urljoin (f"{ self .path } /" , f"{ custom_ledger_id } /upload" )
72+
73+ response = self .http_client .request ( # UNUSED type: ignore[attr-defined]
74+ "post" ,
75+ path , # UNUSED type: ignore[attr-defined]
76+ files = files ,
77+ force_multipart = True ,
78+ )
79+
80+ return self ._model_class .from_response (
81+ response
82+ ) # UNUSED type: ignore[attr-defined, no-any-return]
83+
4584 def charges (self , custom_ledger_id : str ) -> CustomLedgerChargesService :
4685 """Return custom ledger charges service."""
4786 return CustomLedgerChargesService (
4887 http_client = self .http_client ,
4988 endpoint_params = {"custom_ledger_id" : custom_ledger_id },
5089 )
5190
52- def upload (self , custom_ledger_id : str ) -> CustomLedgerUploadService :
53- """Get the Custom Ledger Upload service."""
54- return CustomLedgerUploadService (
55- http_client = self .http_client ,
56- endpoint_params = {"custom_ledger_id" : custom_ledger_id },
57- )
58-
5991 def attachments (self , custom_ledger_id : str ) -> CustomLedgerAttachmentsService :
6092 """Return custom ledger attachments service."""
6193 return CustomLedgerAttachmentsService (
@@ -73,20 +105,48 @@ class AsyncCustomLedgersService(
73105):
74106 """Async Custom Ledgers service."""
75107
108+ async def upload (self , custom_ledger_id : str , file : FileTypes ) -> CustomLedger :
109+ """Upload custom ledger file.
110+
111+ Args:
112+ custom_ledger_id: Custom Ledger ID.
113+ file: Custom Ledger file.
114+
115+ Returns:
116+ CustomLedger: Created resource.
117+ """
118+ files : dict [str , FileTypes ] = {}
119+
120+ filename = pathlib .Path (getattr (file , "name" , "uploaded_file.xlsx" )).name
121+
122+ # Mimetype is set to Excel XLSX to prevent 415 response from the server
123+ files [self ._upload_file_key ] = (
124+ filename ,
125+ cast ("FileContent" , file ),
126+ MIMETYPE_EXCEL_XLSX ,
127+ ) # UNUSED type: ignore[attr-defined]
128+ files [self ._upload_data_key ] = custom_ledger_id # UNUSED type: ignore
129+
130+ path = urljoin (f"{ self .path } /" , f"{ custom_ledger_id } /upload" )
131+
132+ response = await self .http_client .request ( # UNUSED type: ignore[attr-defined]
133+ "post" ,
134+ path , # UNUSED type: ignore[attr-defined]
135+ files = files ,
136+ force_multipart = True ,
137+ )
138+
139+ return self ._model_class .from_response (
140+ response
141+ ) # UNUSED type: ignore[attr-defined, no-any-return]
142+
76143 def charges (self , custom_ledger_id : str ) -> AsyncCustomLedgerChargesService :
77144 """Return custom ledger charges service."""
78145 return AsyncCustomLedgerChargesService (
79146 http_client = self .http_client ,
80147 endpoint_params = {"custom_ledger_id" : custom_ledger_id },
81148 )
82149
83- def upload (self , custom_ledger_id : str ) -> AsyncCustomLedgerUploadService :
84- """Get the Async Custom Ledger Upload service."""
85- return AsyncCustomLedgerUploadService (
86- http_client = self .http_client ,
87- endpoint_params = {"custom_ledger_id" : custom_ledger_id },
88- )
89-
90150 def attachments (self , custom_ledger_id : str ) -> AsyncCustomLedgerAttachmentsService :
91151 """Return custom ledger attachments service."""
92152 return AsyncCustomLedgerAttachmentsService (
0 commit comments