U
    b                     @   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   =/tmp/pip-unpacked-wheel-_urp_i0d/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   sz   | j d krtt | _ | jj| j\}}|jdkrTt|j}t	|| j  W 5 Q R X 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 krt d|dk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   s4   zt | j| |W S  tk
r.   Y dS X d S )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rN||j q2||j q2||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   s   | j | |}|jS r   )r"   r<   r9   sizer   r   rE   r   r   r   rH   u   s    zDropBoxStorage.sizec                 C   s   | j | |}|jS r   )r"   r<   r9   Zserver_modifiedrI   r   r   r   modified_timey   s    zDropBoxStorage.modified_timec                 C   s   | j | |}|jS r   )r"   r<   r9   Zclient_modifiedrI   r   r   r   accessed_time}   s    zDropBoxStorage.accessed_timec                 C   s   | j | |}|jS r   )r"   Zfiles_get_temporary_linkr9   link)r   r   Zmediar   r   r   url   s    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r8| jj| | |t| jd n| 	|| | |
  |S )N)rO   )openrH   
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 r|j
|  | jkrt| j || j|| q8| j || j| | |_q8d S )N)
session_idoffset)rA   rO   )r"   Zfiles_upload_session_startrS   rR   r   rW   tellr   r   r3   rH   Zfiles_upload_session_finishZfiles_upload_session_append_v2rX   )r   r$   	dest_pathZupload_sessioncursorcommitr   r   r   rT      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)rN   )N)r   r   r   __doc__r   locationr4   _DEFAULT_TIMEOUTr1   _DEFAULT_MODEr3   rR   r    r9   r:   r=   rG   rH   rJ   rK   rM   rP   rV   rT   r^   __classcell__r   r   r`   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   rd   re   	Exceptionr   r   r-   r   r   r   r   <module>   s"   