o
    &zh.                     @   s,  d dl Z d dlmZ d dlmZmZ d dlmZ ddlm	Z	 ddl
mZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< dd l=m>Z> dd!l?m@Z@ dd"lAmBZB dd#lCmDZD dd$lEmFZF dd%lGmHZH dd&lImJZJ dd'lKmLZL dd(lMmNZN dd)lOmPZPmQZQ dd*lRmSZSmTZTmUZUmVZVmWZWmXZXmYZY d d+lZm[Z[ G d,d- d-e\Z]dS ).    N)dumps)AnyDict)MultipartEncoder   )ERRORS)VALID_FILE_OPTIONSVALID_UPLOAD_OPTIONS)URL)BadRequestException)ConflictException)NotFoundException)UnknownException)CopyFileRequestOptions)CopyFolderRequestOptions)(CreateCustomMetadataFieldsRequestOptions)CreateFolderRequestOptions)DeleteFolderRequestOptions)ListAndSearchFileRequestOptions)MoveFileRequestOptions)MoveFolderRequestOptions)RenameFileRequestOptions)(UpdateCustomMetadataFieldsRequestOptions)UpdateFileRequestOptions)UploadFileRequestOptions)BulkDeleteFileResult)CustomMetadataFieldsResult).CustomMetadataFieldsResultWithResponseMetadata)
FileResult)FileResultWithResponseMetadata)FolderResult)GetBulkJobStatusResult)GetMetadataResult)ListCustomMetadataFieldsResult)ListFileResult)PurgeCacheResult)PurgeCacheStatusResult)RenameFileResult)ResponseMetadataResult)
TagsResult)UploadFileResult)request_formattersnake_to_lower_camel)general_api_throw_exceptionget_response_jsonpopulate_response_metadataconvert_to_response_objectconvert_to_list_response_objectthrow_other_exception*convert_to_response_metadata_result_object)BufferedReaderc                   @   sr  e Zd Zdd Z	dMdedefddZdMdedefdd	Z	dMd
e
defddZdMd
e
defddZ	dNd
e
de
defddZ	dMd
e
dedefddZdefddZdefddZdMd
e
defddZdefddZdMde	defddZ	dMdedefdd Z	dMdedefd!d"ZdMdedefd#d$Zdefd%d&Z 	dMde!defd'd(Z"	dMde#defd)d*Z$dMde%de&fd+d,Z'dMde(de&fd-d.Z)de*fd/d0Z+dMd1e
de,fd2d3Z-	dMd4e
de.fd5d6Z/dMd
e
de0fd7d8Z1d9e
de0fd:d;Z2	dMde3de4fd<d=Z5	>dOd?e6de7fd@dAZ8	dMde9de4fdBdCZ:dDe
defdEdFZ;de<e
e=f de6fdGdHZ>e?dIdJ Z@e?dKdL ZAdS )PFilec                 C   s
   || _ d S N)request)selfrequest_obj r:   J/var/www/html/kangema/venv/lib/python3.10/site-packages/imagekitio/file.py__init__E   s   
zFile.__init__Noptionsreturnc                 C   s.  |st tjj|st tjjdtjdf }| j }||d}|s't	 }n| 
|j}|du r5tdt|trE|d||dfi nt|tsOt|trX|dd|fi d|v re|d |d	< |d= i ||}t|d
d}|d|ji | jjd|| |d}	|	jdkrt|	t}
|
S t|	 dS )zUpload file to server using local image or url
        :param file: either local file path or network file path
        :param file_name: intended file name
        :param options: intended options
        :return: UploadFileResult
        z%s%sz/api/v1/files/upload)filefileNameFzInvalid upload optionsr?   NoverwriteAiTagsoverwriteAITagsz%--randomBoundary---------------------)fieldsboundaryContent-TypePost)urldataheaders   )	TypeErrorr   MISSING_UPLOAD_FILE_PARAMETERvalue!MISSING_UPLOAD_FILENAME_PARAMETERr
   UPLOAD_BASE_URLr7   create_headersdictvalidate_upload__dict__
ValueError
isinstancer4   updatestrbytesr   content_typereadstatus_coder0   r*   r-   )r8   r?   	file_namer=   rG   rI   files
all_fieldsmultipart_datarespresponser:   r:   r;   uploadH   sB   	



zFile.uploadc                 C   s   |dur)d|j v rt|jtrd|j}|r||_t|j }| |s(tdnt }d	t
j}| j }| jjd|||d}|jdkrNt|tt}|S t| dS )	z|Returns list files on ImageKit Server
        :param: options dictionary of options
        :return: ListFileResult
        Ntagsz, zInvalid option for list_filesz{}/v1/filesGETmethodrG   rI   paramsrJ   )rS   rU   rc   listjoinr+   is_valid_list_optionsrT   rQ   formatr
   API_BASE_URLr7   rP   r[   r1   r   r$   r-   )r8   r=   valformatted_optionsrG   rI   r`   ra   r:   r:   r;   rh   v   s&   



z	File.listfile_idc                 C   Z   |st tjjdtj|}| jjd|| j d}|j	dkr't
|t}|S t| dS )zreturns file detailz{}/v1/files/{}/detailsrd   rf   rG   rI   rJ   N)rK   r   FILE_ID_MISSINGrM   rk   r
   rl   r7   rP   r[   r0   r   r-   r8   ro   rG   r`   ra   r:   r:   r;   details   s   

zFile.detailsc           	      C   s   |st tjjdtj|}| jjd|| j d}|j	dkr(t
|tt}|S |j	dkr^t|}t|}t|tkr@t|}t|tkrJ|d nd}t|tkrV|d nd}t|||t| d	S )
zreturns file versionsz{}/v1/files/{}/versionsrd   rq   rJ     message helpN)rK   r   rr   rM   rk   r
   rl   r7   rP   r[   r1   r   r$   r.   r/   typerW   astliteral_evalrQ   r   r-   )	r8   ro   rG   r`   ra   response_jsonresponse_meta_dataerror_messageresponse_helpr:   r:   r;   get_file_versions   s*   


zFile.get_file_versions
version_idc           
      C   s   |st tjj|st tjjdtj||}| jjd|| j	 d}|j
dkr0t|t}|S |j
dkrft|}t|}t|tkrHt|}t|tkrR|d nd}t|tkr^|d nd}	t||	|t| d	S )
zreturns file version detail{}/v1/files/{}/versions/{}rd   rq   rJ   ru   rv   rw   rx   N)rK   r   rr   rM   VERSION_ID_MISSINGrk   r
   rl   r7   rP   r[   r0   r   r.   r/   ry   rW   rz   r{   rQ   r   r-   )
r8   ro   r   rG   r`   ra   r|   r}   r~   r   r:   r:   r;   get_file_version_details   s.   



zFile.get_file_version_detailsc                 C   s   |st tjjdtj|}ddi}|| j	  t
|j}d|v r4d|d i}|d= i ||}n|}|dur>t|nt }| jjd|||d}	|	jd	krWt|	t}
|
S t|	 dS )
zUpdate detail of a file(like tags, coordinates)
        update details identified by file_id and options,
        which is already uploaded
        z{}/v1/files/{}/details/rE   application/jsonremoveAiTagsremoveAITagsNPatchrf   rG   rI   rH   rJ   )rK   r   rr   rM   rk   r
   rl   rV   r7   get_auth_headersr+   rS   r   rQ   r[   r0   r   r-   )r8   ro   r=   rG   rI   rn   remove_ai_tags_dictrequest_datarH   r`   ra   r:   r:   r;   update_file_details   s"   


zFile.update_file_detailsc           	      C   s   |dkr
d tjnd tj}ddi}|| j  t||d}| jjd|||d}|jd	kr9t|t	}|S |jd
ksC|jdkrIt
| dS t| dS )zAdd or Remove tags of files
        :param file_ids: array of file ids
        :param tags: array of tags
        :param action: to identify call either for removeTags or addTags
        
removeTagsz{}/v1/files/removeTagsz{}/v1/files/addTagsrE   r   )fileIdsrc   rF   r   rJ      ru   Nrk   r
   rl   rV   r7   r   r   r[   r0   r)   r2   r-   )	r8   file_idsrc   actionrG   rI   rH   r`   ra   r:   r:   r;   manage_tags   s   


zFile.manage_tagsc                 C   s   d tj}ddi}|| j  t||d}| jjd|||d}|jdkr/t|t	}|S |jdks9|jd	kr?t
| d
S t| d
S )ztRemove AI tags of files
        :param file_ids: array of file ids
        :param ai_tags: array of AI tags
        z{}/v1/files/removeAITagsrE   r   )r   AITagsrF   r   rJ   r   ru   Nr   )r8   r   ai_tagsrG   rI   rH   r`   ra   r:   r:   r;   remove_ai_tags
  s   

zFile.remove_ai_tagsc                 C   sX   |st tjjdtj|}| jjd|| j d}|j	dkr&t
|}|S t| dS )zIDelete file by file_id
        deletes file from imagekit server
        z{}/v1/files/{}Deleterq      N)rK   r   rr   rM   rk   r
   rl   r7   rP   r[   r3   r-   rs   r:   r:   r;   delete  s   
zFile.deletec           
      C   s   d tj||}ddi}|| j  | jjd||d}|jdkr(t|}|S |jdks2|jdkrut|}t	|}t
|tkrEt|}t
|tkrO|d	 nd
}t
|tkr[|d nd
}	|jdkrht||	||jdkrst||	|dS t| dS )z-Delete file version by file_id and version_idr   rE   r   r   rq   r     ru   rv   rw   rx   N)rk   r
   rl   rV   r7   rP   r[   r3   r.   r/   ry   rW   rz   r{   rQ   r   r   r-   
r8   ro   r   rG   rI   r`   ra   r}   r~   r   r:   r:   r;   delete_file_version,  s0   



zFile.delete_file_versionr   c                 C   s   |st dtjd tj }ddi}|| j  td|i}| jjd|||d}|jdkr6t	|t
}|S |jd	ks@|jd
krFt| dS t| dS )z<Delete bulk files
        Delete files by batch ids
        zNeed to pass ids in listz	/v1/filesrE   r   r   POSTr   rJ   r   ru   N)rT   r
   rl   BULK_FILE_DELETErV   r7   rP   r   r[   r0   r   r2   r-   )r8   r   rG   rI   rH   r`   ra   r:   r:   r;   batch_deleteG  s   

zFile.batch_deletec           
      C      d tj}ddi}|| j  |durtt|jnt	 }| jjd|||d}|j
dkr5t|}|S |j
dkrkt|}t|}t|tkrMt|}t|t	krW|d	 nd
}t|t	krc|d nd
}	t||	|t| dS )z[Copy file by provided sourceFilePath, destinationPath and includeFileVersions as an optionsz{}/v1/files/copyrE   r   NrF   r   r   ru   rv   rw   rx   rk   r
   rl   rV   r7   rP   r   r+   rS   rQ   r[   r3   r.   r/   ry   rW   rz   r{   r   r-   
r8   r=   rG   rI   rn   r`   ra   r}   r~   r   r:   r:   r;   	copy_fileZ  ,   


zFile.copy_filec           
      C   r   )zFMove file by provided sourceFilePath and destinationPath as an optionsz{}/v1/files/moverE   r   NrF   r   r   ru   rv   rw   rx   r   r   r:   r:   r;   	move_filew  r   zFile.move_filec           
      C   s  d tj}ddi}|| j  |durtt|jnt	 }| jjd|||d}|j
dkr6t|t}|S |j
dks@|j
d	krFt| dS |j
d
kr|t|}t|}t|tkr^t|}t|t	krh|d nd}t|t	krt|d nd}	t||	|t| dS )zJRename file by provided filePath, newFileName and purgeCache as an optionsz{}/v1/files/renamerE   r   NPutr   rJ   r   ru   i  rv   rw   rx   )rk   r
   rl   rV   r7   rP   r   r+   rS   rQ   r[   r0   r'   r2   r.   r/   ry   rW   rz   r{   r   r-   r   r:   r:   r;   rename_file  s0   



zFile.rename_filec           
      C   s   d tj||}| j }| jjd||d}|jdkr"t|t}|S |jdkrXt|}t	|}t
|tkr:t|}t
|tkrD|d nd}t
|tkrP|d nd}	t||	|t| d	S )
z-Restore file by provided fileId and versionIdz"{}/v1/files/{}/versions/{}/restorer   rq   rJ   ru   rv   rw   rx   N)rk   r
   rl   r7   rP   r[   r0   r   r.   r/   ry   rW   rz   r{   rQ   r   r-   r   r:   r:   r;   restore_file_version  s*   




zFile.restore_file_versionc           
      C   s   d tj}| j }|ddi |durtt|jnt	 }| jjd|||d}|j
dkr5t|}|S t|}t|}t|tkrHt|}t|t	krR|d nd	}t|t	kr^|d
 nd	}	t||	|)zGCreate folder by provided folderName and parentFolderPath as an options{}/v1/folderrE   r   NrF   r      rv   rw   rx   )rk   r
   rl   r7   rP   rV   r   r+   rS   rQ   r[   r3   r.   r/   ry   rW   rz   r{   r   )
r8   r=   rG   rI   formatted_datar`   ra   r}   r~   r   r:   r:   r;   create_folder  s$   


zFile.create_folderc                 C   s   d tj}| j }|ddi |durtt|jnt	 }| jjd|||d}|j
dkr5t|}|S |j
dkrkt|}t|}t|tkrMt|}t|t	krW|d	 nd
}	t|t	krc|d nd
}
t|	|
|t| dS )z2Delete folder by provided folderPath as an optionsr   rE   r   Nr   r   r   ru   rv   rw   rx   )rk   r
   rl   r7   rP   rV   r   r+   rS   rQ   r[   r3   r.   r/   ry   rW   rz   r{   r   r-   r8   r=   rG   rI   r   r`   ra   r|   r}   r~   r   r:   r:   r;   delete_folder  s*   



zFile.delete_folderc                 C      d tj}| j }|ddi |durtt|jnt	 }| jjd|||d}|j
dkr6t|t}|S |j
dkrlt|}t|}t|tkrNt|}t|t	krX|d	 nd
}	t|t	krd|d nd
}
t|	|
|t| dS )z_Copy folder by provided sourceFolderPath, destinationPath and includeFileVersions as an optionsz{}/v1/bulkJobs/copyFolderrE   r   NrF   r   rJ   ru   rv   rw   rx   rk   r
   rl   r7   rP   rV   r   r+   rS   rQ   r[   r0   r    r.   r/   ry   rW   rz   r{   r   r-   r   r:   r:   r;   copy_folder  s.   




zFile.copy_folderc                 C   r   )zJMove folder by provided sourceFolderPath and destinationPath as an optionsz{}/v1/bulkJobs/moveFolderrE   r   NrF   r   rJ   ru   rv   rw   rx   r   r   r:   r:   r;   move_folder  s.   




zFile.move_folderc                 C   sN   d tj|}| j }| jjd||d}|jdkr!t|t}|S t| dS )z*Get bulk job status by provided only jobIdz{}/v1/bulkJobs/{}Getrq   rJ   N)	rk   r
   rl   r7   rP   r[   r0   r!   r-   )r8   job_idrG   rI   r`   ra   r:   r:   r;   get_bulk_job_status=  s   


zFile.get_bulk_job_statusfile_urlc                 C   sv   |st tjjtjd }ddi}|| j  d|i}| jjd||t	|d}|j
dkr5t|t}|S t| dS )	z#Use from child class to purge cachez/v1/files/purgerE   r   rG   rF   )rI   rG   rH   r   N)rK   r   MISSING_FILE_URLrM   r
   rl   rV   r7   r   r   r[   r0   r%   r-   )r8   r   rG   rI   bodyr`   ra   r:   r:   r;   purge_cacheL  s   


zFile.purge_cachecache_request_idc                 C   s^   |st tjjdtj|}| j }| jjd||d}|j	dkr)t
|t}|S t| dS )z[Get purge cache status by cache_request_id
        :return: PurgeCacheStatusResult
        z{}/v1/files/purge/{}rd   rI   rJ   N)rK   r   CACHE_PURGE_STATUS_ID_MISSINGrM   rk   r
   rl   r7   rP   r[   r0   r&   r-   )r8   r   rG   rI   r`   ra   r:   r:   r;   get_purge_cache_status[  s   


zFile.get_purge_cache_statusc                 C   rp   )zGet metadata by file_idz{}/v1/files/{}/metadatard   r   rJ   N)rK   r   rr   rM   rk   r
   rl   r7   rP   r[   r0   r"   r-   rs   r:   r:   r;   get_metadatam  s   

zFile.get_metadataremote_file_urlc                 C   s^   |st ddtj}d|i}| jjd|| j |d}|jdkr)t|t}|S t	| dS )z/Get remote metadata by provided remote_file_urlzYou must provide remote urlz{}/v1/metadatarG   rd   )rI   rg   rJ   N)
rT   rk   r
   rl   r7   rP   r[   r0   r"   r-   )r8   r   rG   paramr`   ra   r:   r:   r;   get_metadata_from_remote_urlz  s   

z!File.get_metadata_from_remote_urlc                 C   s  d tj}|dur)d|jv rt|jj|j_|j}d|v r$|jj|d< t|}nt }ddi}|| j	
  | j	j	d|||d}|jdkrNt|t}|S t|}t|}	t|tkrat|}t|tkrk|d	 nd
}
t|tkrw|d nd
}|jdkrt|
||	t|
||	)zNcreates custom metadata fields by passing name, label and schema as an options{}/v1/customMetadataFieldsNschemarE   r   rF   r   r   rv   rw   rx   r   )rk   r
   rl   rS   r+   r   r   rQ   rV   r7   rP   r[   r0   r   r.   r/   ry   rW   rz   r{   r   r   )r8   r=   rG   options_dictrn   rI   r`   ra   r|   r}   r~   r   r:   r:   r;   create_custom_metadata_fields  s>   




z"File.create_custom_metadata_fieldsFinclude_deletedc           	      C   s   d tj}dt| i}| jjd|| j |d}|jdkr(t|t	t
}|S t|}t|}t|tkr;t|}t|tkrE|d nd}t|tkrQ|d nd}t|||)	zget custom metadata fieldsr   includeDeletedrd   re   rJ   rv   rw   rx   )rk   r
   rl   rW   lowerr7   rP   r[   r1   r   r#   r.   r/   ry   rz   r{   rQ   r   )	r8   r   rG   r   r`   ra   r}   r~   r   r:   r:   r;   get_custom_metadata_fields  s"   

zFile.get_custom_metadata_fieldsc                 C   s.  |st tjdtj|}d|jv rt|jj|j_|j}d|v r(|jj|d< t	t|}ddi}|
| j  | jjd|||d}|jdkrPt|t}|S t|}	t|}
t|	tkrct|	}	t|	tkrm|	d nd	}t|	tkry|	d
 nd	}|jdkrt|||
|jdkrt|||
t|||
)z^updates custom metadata fields by passing id of custom metadata field and params as an options{}/v1/customMetadataFields/{}r   rE   r   r   r   rJ   rv   rw   rx   r   ru   )rT   r    MISSING_CUSTOM_METADATA_FIELD_IDrk   r
   rl   rS   r+   r   r   rV   r7   rP   r[   r0   r   r.   r/   ry   rW   rz   r{   rQ   r   r   r   )r8   field_idr=   rG   r   rn   rI   r`   ra   r|   r}   r~   r   r:   r:   r;   update_custom_metadata_fields  sF   





z"File.update_custom_metadata_fieldsr   c           	      C   s   d tj|}| jjd|| j d}|jdkrt|}|S t|}t|}t	|t
kr1t|}t	|tkr;|d nd}t	|tkrG|d nd}|jdkrTt|||t|||)	z2Deletes custom metadata fields by passing field_idr   r   r   r   rv   rw   rx   ru   )rk   r
   rl   r7   rP   r[   r3   r.   r/   ry   rW   rz   r{   rQ   r   r   )	r8   r   rG   r`   ra   r|   r}   r~   r   r:   r:   r;   delete_custom_metadata_field  s&   


z!File.delete_custom_metadata_fieldc                 C   s$   |   }|D ]	}||vr dS qdS )zReturns if options are validFT)get_valid_list_values)r8   r=   valid_valueskeyr:   r:   r;   rj     s   zFile.is_valid_list_optionsc                   C   s   t S )z$Returns valid options for list files)r   r:   r:   r:   r;   r     s   zFile.get_valid_list_valuesc                 C   s  g }|   D ]}\}}|tvr dS t|tkst|tkr$t|| |< q|dkr/t|| |< q|dkr\t| | D ]\}}|tvrE  dS |t| q9d	|}|r[d	|| |< qt
|trrd	dd |D }|rq|| |< qt
|tr}t| }|r|| |< qt| S )zi
        Validates upload value, checks if params are valid,
        changes snake to camel case
        F
extensionsresponse_fields,c                 S   s   g | ]}t |qS r:   )rW   ).0ir:   r:   r;   
<listcomp>4  s    z(File.validate_upload.<locals>.<listcomp>)itemsr	   ry   rQ   tupler   	enumerateappendr,   ri   rU   rh   boolrW   r   r+   )r=   response_listr   rm   r   jr:   r:   r;   rR     s<   


zFile.validate_uploadr6   )NN)F)B__name__
__module____qualname__r<   r   r*   rb   r   r$   rh   rW   r   rt   r   r   r   r   r)   r   r   r(   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r    r   r   r   r!   r   r%   r   r&   r   r"   r   r   r   r   r   r   r#   r   r   r   r   r   r   rj   staticmethodr   rR   r:   r:   r:   r;   r5   D   s    
.








*

+
r5   )^rz   jsonr   typingr   r   requests_toolbeltr   constants.errorsr   constants.filesr   r	   constants.urlr
   exceptions.BadRequestExceptionr   exceptions.ConflictExceptionr   exceptions.NotFoundExceptionr   exceptions.UnknownExceptionr   models.CopyFileRequestOptionsr   models.CopyFolderRequestOptionsr   /models.CreateCustomMetadataFieldsRequestOptionsr   !models.CreateFolderRequestOptionsr   !models.DeleteFolderRequestOptionsr   &models.ListAndSearchFileRequestOptionsr   models.MoveFileRequestOptionsr   models.MoveFolderRequestOptionsr   models.RenameFileRequestOptionsr   /models.UpdateCustomMetadataFieldsRequestOptionsr   models.UpdateFileRequestOptionsr   models.UploadFileRequestOptionsr   #models.results.BulkDeleteFileResultr   )models.results.CustomMetadataFieldsResultr   =models.results.CustomMetadataFieldsResultWithResponseMetadatar   models.results.FileResultr   -models.results.FileResultWithResponseMetadatar   models.results.FolderResultr    %models.results.GetBulkJobStatusResultr!    models.results.GetMetadataResultr"   -models.results.ListCustomMetadataFieldsResultr#   models.results.ListFileResultr$   models.results.PurgeCacheResultr%   %models.results.PurgeCacheStatusResultr&   models.results.RenameFileResultr'   %models.results.ResponseMetadataResultr(   models.results.TagsResultr)   models.results.UploadFileResultr*   utils.formatterr+   r,   utils.utilsr-   r.   r/   r0   r1   r2   r3   ior4   objectr5   r:   r:   r:   r;   <module>   sV    $
