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Úsettingéd   Ú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"   