U
    Hd                     @   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 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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-1m3lyvgh/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_file0   s    

 zDropBoxFile._get_filec                 C   s
   || _ d S r   )r   )r   valuer   r   r   	_set_fileC   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ZedZedZ	ede
Zed	eZd
Zeee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_APP_KEYZDROPBOX_APP_SECRETZDROPBOX_OAUTH2_REFRESH_TOKENZDROPBOX_TIMEOUTZDROPBOX_WRITE_MODEi  @ c                 C   sB   |d krt |||gstd|| _|| _t|||||d| _d S )NzYou must configure an auth token at'settings.DROPBOX_OAUTH2_TOKEN' or 'setting.DROPBOX_APP_KEY', 'setting.DROPBOX_APP_SECRET' and 'setting.DROPBOX_OAUTH2_REFRESH_TOKEN'.)app_key
app_secretoauth2_refresh_tokentimeout)allr   	root_path
write_moder
   r"   )r   oauth2_access_tokenr4   r2   r5   r/   r0   r1   r   r   r   r    V   s    

zDropBoxStorage.__init__c                 C   s    |dkrd}t | j|ddS )Nr.    \)r   r4   replacer   r   r   r   r   
_full_patht   s    zDropBoxStorage._full_pathc                 C   s   | j | | d S r   )r"   Zfiles_deleter;   r:   r   r   r   deletey   s    zDropBoxStorage.deletec                 C   s4   zt | j| |W S  tk
r.   Y dS X d S )NF)boolr"   files_get_metadatar;   r   r:   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.   r7   )r;   r"   Zfiles_list_folderentries
isinstancer   appendr   )r   pathdirectoriesfiles	full_pathmetadataentryr   r   r   listdir   s    



zDropBoxStorage.listdirc                 C   s   | j | |}|jS r   )r"   r>   r;   sizer   r   rG   r   r   r   rJ      s    zDropBoxStorage.sizec                 C   s   | j | |}|jS r   )r"   r>   r;   Zserver_modifiedrK   r   r   r   modified_time   s    zDropBoxStorage.modified_timec                 C   s   | j | |}|jS r   )r"   r>   r;   Zclient_modifiedrK   r   r   r   accessed_time   s    zDropBoxStorage.accessed_timec                 C   s6   z| j | |}|jW S  tk
r0   Y d S X d S r   )r"   Zfiles_get_temporary_linkr;   linkr   )r   r   Zmediar   r   r   url   s
    zDropBoxStorage.urlrbc                 C   s   t | || }|S r   )r   r;   )r   r   modeZremote_filer   r   r   _open   s    zDropBoxStorage._openc                 C   s^   |   |j| jkr8| jj| | |t| jd n| 	|| | |
  || jS )N)rQ   )openrJ   
CHUNK_SIZEr"   Zfiles_uploadreadr;   r   r5   _chunked_uploadcloselstripr4   )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)rC   rQ   )r"   Zfiles_upload_session_startrU   rT   r   rZ   tellr   r   r5   rJ   Zfiles_upload_session_finishZfiles_upload_session_append_v2r[   )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.	overwrite)r;   r5   r   superget_available_name)r   r   
max_length	__class__r   r   rb      s    


z!DropBoxStorage.get_available_name)rP   )N)r   r   r   __doc__r   locationr6   r/   r0   r1   _DEFAULT_TIMEOUTr2   _DEFAULT_MODEr5   rT   r    r;   r<   r?   rI   rJ   rL   rM   rO   rR   rY   rV   rb   __classcell__r   r   rd   r   r-   I   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   rh   ri   	Exceptionr   r   r-   r   r   r   r   <module>   s*   