o
    {l~i@                     @   s  d dl 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ZdZG dd deZ e Z!dd Z"G dd de
Z#e#Z$eG dd deZ%e%Z&dS )    N)BytesIO)copyfileobj)SpooledTemporaryFile)ImproperlyConfigured)File)	safe_join)deconstructible)Dropbox)ApiError)
CommitInfo)FolderMetadata)UploadSessionCursor)	WriteMode)BaseStorage)get_available_overwrite_name)settingd   addc                   @   s   e Zd ZdS )DropboxStorageExceptionN)__name__
__module____qualname__ r   r   `/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/storages/backends/dropbox.pyr      s    r   c                 C   s   | | r|t| d  }|S N)
startswithlen)prefixnamer   r   r   removeprefix$   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 r   )r   _storage_file)selfr   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!   clientfiles_downloadr   status_coder   contentr   r   formatseek)r#   file_metadataresponse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%   r0   r2   propertyfiler   r   r   r   r    *   s
    r    c                       s   e Zd ZdZdZd 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dZdd Zdd Zd fdd	Z  ZS )DropboxStoragez:Dropbox Storage class for Django pluggable storage system.i  @ Nc                    s   t  jdd|i| | jd u rt| j| j| jgstdt| j| j| j| j| j	d| _
t| dr>tdt | j| _d S d S )Noauth2_access_tokenzYou 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locationzSetting `root_path` with name `location` is deprecated and will be removed in a future version of django-storages. Please update the name from `location` to `root_path`r   )superr%   r6   allr7   r8   r9   r   r	   r:   r'   hasattrwarningswarnDeprecationWarningr;   	root_path)r#   r6   settings	__class__r   r   r%   R   s*   
	zDropboxStorage.__init__c              	   C   s6   t ddt dt dt dt dt dtt dtd	S )
NDROPBOX_ROOT_PATH/DROPBOX_OAUTH2_TOKENDROPBOX_APP_KEYDROPBOX_APP_SECRETDROPBOX_OAUTH2_REFRESH_TOKENDROPBOX_TIMEOUTDROPBOX_WRITE_MODE)rB   r6   r7   r8   r9   r:   
write_mode)r   _DEFAULT_TIMEOUT_DEFAULT_MODE)r#   r   r   r   get_default_settingsq   s   z#DropboxStorage.get_default_settingsc                 C   s    |dkrd}t | j|ddS )NrG    \)r   rB   replacer#   r   r   r   r   
_full_path|   s   zDropboxStorage._full_pathc                 C   s   | j | | d S r   )r'   files_deleterV   rU   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_metadatarV   r
   rU   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 )NrG   rR   )rV   r'   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'   rZ   rV   size)r#   r   rd   r   r   r   rg      s   zDropboxStorage.sizec                 C   s0   z| j | |}|jW S  ty   Y d S w r   )r'   files_get_temporary_linkrV   linkr
   )r#   r   mediar   r   r   url   s   zDropboxStorage.urlrbc                 C   s   t | || }|S r   )r    rV   )r#   r   moderemote_filer   r   r   _open   s   zDropboxStorage._openc                 C   sd   |   |j| jkr| jj| | |t| jd n	| 	|| | |
  t| j|dS )N)rm   rG   )openrg   
CHUNK_SIZEr'   files_uploadreadrV   r   rN   _chunked_uploadcloser   rB   lstrip)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)r`   rm   )r'   files_upload_session_startrs   rq   r   rx   tellr   r   rN   rg   files_upload_session_finishfiles_upload_session_append_v2ry   )r#   r*   	dest_pathupload_sessioncursorcommitr   r   r   rt      s"   


zDropboxStorage._chunked_uploadc                    s,   |  |}| jdkrt||S t ||S )z+Overwrite existing file with the same name.	overwrite)rV   rN   r   r<   get_available_name)r#   r   
max_lengthrD   r   r   r      s   


z!DropboxStorage.get_available_namer   )rl   )r   r   r   __doc__rq   r%   rQ   rV   rX   r[   rf   rg   rk   ro   rw   rt   r   __classcell__r   r   rD   r   r5   L   s    
r5   )'r?   ior   shutilr   tempfiler   django.core.exceptionsr   django.core.files.baser   django.utils._osr   django.utils.deconstructr   dropboxr	   dropbox.exceptionsr
   dropbox.filesr   r   r   r   storages.baser   storages.utilsr   r   rO   rP   	Exceptionr   DropBoxStorageExceptionr   r    DropBoxFiler5   DropBoxStorager   r   r   r   <module>   s8    