o
    h                     @   s   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mZmZmZ d dlmZmZ dZdZG dd deZG dd de	Z eG dd deZ!dS )    )BytesIO)copyfileobj)SpooledTemporaryFile)ImproperlyConfigured)File)Storage)	safe_join)deconstructible)Dropbox)ApiError)
CommitInfoFolderMetadataUploadSessionCursor	WriteMode)get_available_overwrite_namesettingd   addc                   @   s   e Zd ZdS )DropBoxStorageExceptionN)__name__
__module____qualname__ r   r   a/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/storages/backends/dropbox.pyr       s    r   c                   @   s.   e Zd Zdd Zdd Zdd ZeeeZdS )DropBoxFilec                 C   s   || _ || _d | _d S N)name_storage_file)selfr   Zstorager   r   r   __init__%   s   
zDropBoxFile.__init__c                 C   s   | j d u rDt | _ | jj| j\}}|jdkr4t|j}t	|| j  W d    n1 s.w   Y  n
t
d|j| j| j d | j S )N   z7Dropbox server returned a {} response when accessing {}r   )r   r   r   clientZfiles_downloadr   status_coder   contentr   r   formatseek)r   Zfile_metadataresponseZfile_contentr   r   r   	_get_file*   s   

zDropBoxFile._get_filec                 C   s
   || _ d S r   )r   )r   valuer   r   r   	_set_file=   s   
zDropBoxFile._set_fileN)r   r   r   r    r(   r*   propertyfiler   r   r   r   r   $   s
    r   c                       s   e Zd ZdZeddZedZedeZede	Z
dZeeee
fdd	Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd$ddZdd Zdd  Zd% fd"d#	Z  ZS )&DropBoxStoragez:DropBox Storage class for Django pluggable storage system.ZDROPBOX_ROOT_PATH/ZDROPBOX_OAUTH2_TOKENZDROPBOX_TIMEOUTZDROPBOX_WRITE_MODEi  @ c                 C   s>   |d u rt d|dvrt d|| _|| _t||d| _d S )NzCYou must configure an auth token at'settings.DROPBOX_OAUTH2_TOKEN'.)r   	overwriteupdatezHDROPBOX_WRITE_MODE must be set to either: 'add', 'overwrite' or 'update')timeout)r   	root_path
write_moder
   r"   )r   oauth2_access_tokenr2   r1   r3   r   r   r   r    M   s   zDropBoxStorage.__init__c                 C   s    |dkrd}t | j|ddS )Nr.    \)r   r2   replacer   r   r   r   r   
_full_pathX   s   zDropBoxStorage._full_pathc                 C   s   | j | | d S r   )r"   Zfiles_deleter9   r8   r   r   r   delete]   s   zDropBoxStorage.deletec                 C   s.   zt | j| |W S  ty   Y dS w )NF)boolr"   files_get_metadatar9   r   r8   r   r   r   exists`   s
   zDropBoxStorage.existsc                 C   sd   g g }}|  |}|dkrd}| j|}|jD ]}t|tr'||j q||j q||fS )Nr.   r5   )r9   r"   Zfiles_list_folderentries
isinstancer   appendr   )r   pathdirectoriesfiles	full_pathmetadataentryr   r   r   listdirf   s   



zDropBoxStorage.listdirc                 C      | j | |}|jS r   )r"   r<   r9   sizer   r   rE   r   r   r   rI   u      zDropBoxStorage.sizec                 C   rH   r   )r"   r<   r9   Zserver_modifiedrJ   r   r   r   modified_timey   rK   zDropBoxStorage.modified_timec                 C   rH   r   )r"   r<   r9   Zclient_modifiedrJ   r   r   r   accessed_time}   rK   zDropBoxStorage.accessed_timec                 C   rH   r   )r"   Zfiles_get_temporary_linkr9   link)r   r   Zmediar   r   r   url   rK   zDropBoxStorage.urlrbc                 C   s   t | || }|S r   )r   r9   )r   r   modeZremote_filer   r   r   _open   s   zDropBoxStorage._openc                 C   sV   |   |j| jkr| jj| | |t| jd n	| 	|| | |
  |S )N)rQ   )openrI   
CHUNK_SIZEr"   Zfiles_uploadreadr9   r   r3   _chunked_uploadclose)r   r   r$   r   r   r   _save   s   $zDropBoxStorage._savec                 C   s   | j || j}t|j| d}t|t| j	d}| |j
k rS|j
|  | jkr:| j || j|| n| j || j| | |_| |j
k s#d S d S )N)
session_idoffset)rA   rQ   )r"   Zfiles_upload_session_startrU   rT   r   rY   tellr   r   r3   rI   Zfiles_upload_session_finishZfiles_upload_session_append_v2rZ   )r   r$   	dest_pathZupload_sessioncursorcommitr   r   r   rV      s$   

zDropBoxStorage._chunked_uploadNc                    s,   |  |}| jdkrt||S t ||S )z+Overwrite existing file with the same name.r/   )r9   r3   r   superget_available_name)r   r   
max_length	__class__r   r   r`      s   


z!DropBoxStorage.get_available_name)rP   r   )r   r   r   __doc__r   locationr4   _DEFAULT_TIMEOUTr1   _DEFAULT_MODEr3   rT   r    r9   r:   r=   rG   rI   rL   rM   rO   rR   rX   rV   r`   __classcell__r   r   rb   r   r-   C   s,    




	r-   N)"ior   shutilr   tempfiler   Zdjango.core.exceptionsr   Zdjango.core.files.baser   Zdjango.core.files.storager   Zdjango.utils._osr   Zdjango.utils.deconstructr	   Zdropboxr
   Zdropbox.exceptionsr   Zdropbox.filesr   r   r   r   Zstorages.utilsr   r   rf   rg   	Exceptionr   r   r-   r   r   r   r   <module>   s$   
