U
    þ¯bV  ã                   @   s¾   d dl Z 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 z d dlmZ d d	lmZmZ W n ek
r”   ed
ƒ‚Y nX eG dd„ deƒƒZG dd„ de	ƒZdS )é    N)Úurljoin)Úsettings)ÚImproperlyConfigured)ÚFile)ÚStorage)Údeconstructible)Ú
get_driver)ÚObjectDoesNotExistErrorÚProviderzCould not load libcloudc                   @   sv   e Zd ZdZd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dd„Zdd„ Zdd„ ZdS ) ÚLibCloudStoragezXDjango storage derived class using apache libcloud to operate
    on supported providersNc           	   
   C   s  |d krt tddƒ}tj |¡| _| js4td| ƒ‚i }d| jkrP| jd |d< d| jkrh| jd |d< zf| jd }t|tƒr¨| dd¡\}}|d	kržt	d
ƒ‚t t
|ƒ}t|ƒ}|| jd | jd f|Ž| _W n< tk
r
 } ztd| j d¡|f ƒ‚W 5 d }~X Y nX | jd | _d S )NZDEFAULT_LIBCLOUD_PROVIDERÚdefaultz,LIBCLOUD_PROVIDERS %s not defined or invalidZregionÚprojectÚtypeÚ.é   zlibcloud.storage.types.ProviderzInvalid module pathÚuserÚkeyz,Unable to create libcloud driver type %s: %sÚbucket)Úgetattrr   ZLIBCLOUD_PROVIDERSÚgetÚproviderr   Ú
isinstanceÚstrÚrsplitÚ
ValueErrorr
   r   ÚdriverÚ	Exceptionr   )	ÚselfZprovider_nameÚoptionÚextra_kwargsÚprovider_typeÚmodule_pathÚtagZDriverÚe© r$   úE/tmp/pip-unpacked-wheel-_urp_i0d/storages/backends/apache_libcloud.pyÚ__init__   sB    ÿ




þý
ÿÿzLibCloudStorage.__init__c                 C   s   | j  | j¡S )z0Helper to get bucket object (libcloud container))r   Zget_containerr   ©r   r$   r$   r%   Ú_get_bucket;   s    zLibCloudStorage._get_bucketc                 C   s   t j |¡ dd¡S )z Clean name (windows directories)ú\ú/)ÚosÚpathÚnormpathÚreplace)r   Únamer$   r$   r%   Ú_clean_name?   s    zLibCloudStorage._clean_namec                 C   s8   |   |¡}z| j | j|¡W S  tk
r2   Y dS X dS )z7Get object by its name. Return None if object not foundN)r0   r   Z
get_objectr   r	   )r   r/   Z
clean_namer$   r$   r%   Ú_get_objectC   s
    
zLibCloudStorage._get_objectc                 C   s&   |   |¡}|r| j |¡S tdƒ‚dS )zDelete object on remotez Object to delete does not existsN)r1   r   Zdelete_objectr   ©r   r/   Úobjr$   r$   r%   ÚdeleteK   s    
zLibCloudStorage.deletec                 C   s   |   |¡}t|ƒS ©N)r1   Úboolr2   r$   r$   r%   ÚexistsS   s    
zLibCloudStorage.existsr*   c           	      C   s  |   ¡ }| j |¡}|  |¡}| d¡s0d| }g }g }|D ]Ø}|dkr |j d¡dkrf| |j¡ n8|j d¡dkrž|jd|j d¡… }||krž| |¡ q<|j 	|¡r<|j d¡| d¡kr<|j d¡rø|jdd… }|t
|ƒd… }| |¡ q<|jt
|ƒd… }| |¡ q<||fS )zŸLists the contents of the specified path,
        returning a 2-tuple of lists; the first item being
        directories, the second item being files.
        r*   z%s/r   r   Nz	_$folder$i÷ÿÿÿ)r(   r   Zlist_container_objectsr0   Úendswithr/   ÚcountÚappendÚindexÚ
startswithÚlen)	r   r,   Ú	containerZobjectsÚfilesÚdirsÚoZdir_namer/   r$   r$   r%   ÚlistdirW   s0    

zLibCloudStorage.listdirc                 C   s   |   |¡}|r|jS dS )Néÿÿÿÿ)r1   Úsizer2   r$   r$   r%   rD   y   s    
zLibCloudStorage.sizec              
   C   sØ   | j d  ¡ }|  |¡}|s d S z| j |¡}W n¢ tk
rÒ } z„d | j|j¡}d|krtd| jj	j
 }t||ƒ}nNd|krˆtd|ƒ}n:d|krªd| j d	  }t||ƒ}nd
|kr¾td|ƒ}n|‚W 5 d }~X Y nX |S )Nr   z{}/{}Zs3z
https://%sZgooglezhttps://storage.googleapis.comZazurez https://%s.blob.core.windows.netr   Z	backblazezapi.backblaze.com/b2api/v1/)r   Úlowerr1   r   Zget_object_cdn_urlÚNotImplementedErrorÚformatr   r/   Ú
connectionÚhostr   )r   r/   r    r3   Úurlr#   Zobject_pathÚbase_urlr$   r$   r%   rJ   }   s,    
ÿzLibCloudStorage.urlÚrbc                 C   s   t || |d}|S )N)Úmode)ÚLibCloudFile)r   r/   rM   Zremote_filer$   r$   r%   Ú_open•   s    zLibCloudStorage._openc                 C   s   |   |¡}t| j ||j¡ƒS r5   )r1   Únextr   Zdownload_object_as_streamrD   r2   r$   r$   r%   Ú_read™   s    
zLibCloudStorage._readc                 C   s   | j  t|ƒ|  ¡ |¡ |S r5   )r   Zupload_object_via_streamÚiterr(   )r   r/   Úfiler$   r$   r%   Ú_savež   s    zLibCloudStorage._save)NN)r*   )rL   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r(   r0   r1   r4   r7   rB   rD   rJ   rO   rQ   rT   r$   r$   r$   r%   r      s   
"
"
r   c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ ZeeeƒZedd	„ ƒZ	ddd„Z
dd„ Zdd„ Zd
S )rN   z@File inherited class for libcloud storage objects read and writec                 C   s"   || _ || _|| _d| _d | _d S )NF)r/   Ú_storageÚ_modeÚ	_is_dirtyÚ_file)r   r/   ZstoragerM   r$   r$   r%   r&   ¥   s
    zLibCloudFile.__init__c                 C   s*   | j d kr$| j | j¡}t |¡| _ | j S r5   )r\   rY   rQ   r/   ÚioÚBytesIO)r   Údatar$   r$   r%   Ú	_get_file¬   s    
zLibCloudFile._get_filec                 C   s
   || _ d S r5   )r\   )r   Úvaluer$   r$   r%   Ú	_set_file²   s    zLibCloudFile._set_filec                 C   s    t | dƒs| j | j¡| _| jS )NÚ_size)ÚhasattrrY   rD   r/   rc   r'   r$   r$   r%   rD   ·   s    
zLibCloudFile.sizeNc                 C   s   | j  |¡S r5   )rS   Úread)r   Ú	num_bytesr$   r$   r%   re   ½   s    zLibCloudFile.readc                 C   s(   d| j krtdƒ‚t |¡| _d| _d S )NÚwz%File was opened for read-only access.T)rZ   ÚAttributeErrorr]   r^   rS   r[   )r   Úcontentr$   r$   r%   ÚwriteÀ   s    
zLibCloudFile.writec                 C   s&   | j r| j | j| j¡ | j ¡  d S r5   )r[   rY   rT   r/   rS   Úcloser'   r$   r$   r%   rk   Æ   s    zLibCloudFile.close)N)rU   rV   rW   rX   r&   r`   rb   ÚpropertyrS   rD   re   rj   rk   r$   r$   r$   r%   rN   £   s   


rN   )r]   r+   Úurllib.parser   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.files.baser   Zdjango.core.files.storager   Zdjango.utils.deconstructr   Zlibcloud.storage.providersr   Zlibcloud.storage.typesr	   r
   ÚImportErrorr   rN   r$   r$   r$   r%   Ú<module>   s     