1010from .exception import AppwriteException
1111from .encoders .value_class_encoder import ValueClassEncoder
1212
13+
1314class Client :
1415 def __init__ (self ):
15- self ._chunk_size = 5 * 1024 * 1024
16+ self ._chunk_size = 5 * 1024 * 1024
1617 self ._self_signed = False
1718 self ._endpoint = 'https://cloud.appwrite.io/v1'
1819 self ._global_headers = {
1920 'content-type' : '' ,
20- 'user-agent' : f'AppwritePythonSDK/0.5 .0 ({ platform .uname ().system } ; { platform .uname ().version } ; { platform .uname ().machine } )' ,
21+ 'user-agent' : f'AppwritePythonSDK/0.6 .0 ({ platform .uname ().system } ; { platform .uname ().version } ; { platform .uname ().machine } )' ,
2122 'x-sdk-name' : 'Console Python' ,
2223 'x-sdk-platform' : 'console' ,
2324 'x-sdk-language' : 'python' ,
24- 'x-sdk-version' : '0.5 .0' ,
25- 'X-Appwrite-Response-Format' : '1.9.6' ,
25+ 'x-sdk-version' : '0.6 .0' ,
26+ 'X-Appwrite-Response-Format' : '1.9.6' ,
2627 }
2728 self ._config = {}
2829
@@ -179,7 +180,7 @@ def call(self, method, path='', headers=None, params=None, response_type='json')
179180 files = files ,
180181 headers = headers ,
181182 verify = (not self ._self_signed ),
182- allow_redirects = False if response_type == 'location' else True
183+ allow_redirects = False if response_type == 'location' else True ,
183184 )
184185
185186 response .raise_for_status ()
@@ -202,7 +203,9 @@ def call(self, method, path='', headers=None, params=None, response_type='json')
202203 if response != None :
203204 content_type = response .headers ['Content-Type' ]
204205 if content_type .startswith ('application/json' ):
205- raise AppwriteException (response .json ()['message' ], response .status_code , response .json ().get ('type' ), response .text )
206+ raise AppwriteException (
207+ response .json ()['message' ], response .status_code , response .json ().get ('type' ), response .text
208+ )
206209 else :
207210 raise AppwriteException (response .text , response .status_code , None , response .text )
208211 else :
@@ -211,11 +214,11 @@ def call(self, method, path='', headers=None, params=None, response_type='json')
211214 def chunked_upload (
212215 self ,
213216 path ,
214- headers = None ,
215- params = None ,
216- param_name = '' ,
217- on_progress = None ,
218- upload_id = ''
217+ headers = None ,
218+ params = None ,
219+ param_name = '' ,
220+ on_progress = None ,
221+ upload_id = '' ,
219222 ):
220223 input_file = params [param_name ]
221224
@@ -232,21 +235,17 @@ def chunked_upload(
232235 input_file .data = input .read ()
233236
234237 params [param_name ] = input_file
235- return self .call (
236- 'post' ,
237- path ,
238- headers ,
239- params
240- )
238+ return self .call ('post' , path , headers , params )
241239
242240 offset = 0
243241 counter = 0
244242
245- try :
246- result = self .call ('get' , path + '/' + upload_id , headers )
247- counter = result ['chunksUploaded' ]
248- except :
249- pass
243+ if upload_id :
244+ try :
245+ result = self .call ('get' , path + '/' + upload_id , headers )
246+ counter = result ['chunksUploaded' ]
247+ except :
248+ pass
250249
251250 if counter > 0 :
252251 offset = counter * self ._chunk_size
@@ -255,11 +254,13 @@ def chunked_upload(
255254 chunks = []
256255 while offset < size :
257256 end = min (offset + self ._chunk_size , size )
258- chunks .append ({
259- 'index' : counter ,
260- 'start' : offset ,
261- 'end' : end ,
262- })
257+ chunks .append (
258+ {
259+ 'index' : counter ,
260+ 'start' : offset ,
261+ 'end' : end ,
262+ }
263+ )
263264 offset = end
264265 counter = counter + 1
265266
@@ -291,7 +292,7 @@ def upload_chunk(chunk, current_upload_id):
291292 chunk_input = InputFile .from_bytes (
292293 read_chunk (chunk ['start' ], chunk ['end' ]),
293294 input_file .filename ,
294- getattr (input_file , 'mime_type' , None )
295+ getattr (input_file , 'mime_type' , None ),
295296 )
296297 chunk_params = {** params , param_name : chunk_input }
297298 chunk_headers = {** headers }
@@ -315,13 +316,15 @@ def upload_chunk(chunk, current_upload_id):
315316 uploaded_size = chunks [0 ]['end' ]
316317
317318 if on_progress is not None :
318- on_progress ({
319- "$id" : result .get ("$id" ),
320- "progress" : uploaded_size / size * 100 ,
321- "sizeUploaded" : uploaded_size ,
322- "chunksTotal" : total_chunks ,
323- "chunksUploaded" : completed_count ,
324- })
319+ on_progress (
320+ {
321+ "$id" : result .get ("$id" ),
322+ "progress" : uploaded_size / size * 100 ,
323+ "sizeUploaded" : uploaded_size ,
324+ "chunksTotal" : total_chunks ,
325+ "chunksUploaded" : completed_count ,
326+ }
327+ )
325328
326329 def upload_remaining_chunk (chunk ):
327330 nonlocal completed_count , uploaded_size , last_result , final_result
@@ -333,13 +336,15 @@ def upload_remaining_chunk(chunk):
333336 if is_upload_complete (chunk_result ):
334337 final_result = chunk_result
335338 if on_progress is not None :
336- on_progress ({
337- "$id" : upload_id_header ,
338- "progress" : uploaded_size / size * 100 ,
339- "sizeUploaded" : uploaded_size ,
340- "chunksTotal" : total_chunks ,
341- "chunksUploaded" : completed_count ,
342- })
339+ on_progress (
340+ {
341+ "$id" : upload_id_header ,
342+ "progress" : uploaded_size / size * 100 ,
343+ "sizeUploaded" : uploaded_size ,
344+ "chunksTotal" : total_chunks ,
345+ "chunksUploaded" : completed_count ,
346+ }
347+ )
343348
344349 with ThreadPoolExecutor (max_workers = 8 ) as executor :
345350 futures = [executor .submit (upload_remaining_chunk , chunk ) for chunk in chunks [1 :]]
@@ -354,8 +359,8 @@ def flatten(self, data, prefix='', stringify=False):
354359
355360 for key in data :
356361 value = data [key ] if isinstance (data , dict ) else key
357- finalKey = prefix + '[' + key + ']' if prefix else key
358- finalKey = prefix + '[' + str (i ) + ']' if isinstance (data , list ) else finalKey
362+ finalKey = prefix + '[' + key + ']' if prefix else key
363+ finalKey = prefix + '[' + str (i ) + ']' if isinstance (data , list ) else finalKey
359364 i += 1
360365
361366 if isinstance (value , list ) or isinstance (value , dict ):
0 commit comments