U
    ŽHšdã  ã                   @   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 z(d d	lmZ d d
lmZ d dl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)Ú
clean_name)Ú
get_driver)ÚObjectDoesNotExistError)ÚProviderzCould not load libcloudc                   @   sn   e Zd ZdZd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-1m3lyvgh/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   s2   z| j  | jt|ƒ¡W S  tk
r,   Y dS X dS )z7Get object by its name. Return None if object not foundN)r   Z
get_objectr   r   r
   )r   Únamer%   r%   r&   Ú_get_objectA   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)r+   r   Zdelete_objectr   ©r   r*   Úobjr%   r%   r&   ÚdeleteH   s    
zLibCloudStorage.deletec                 C   s   |   |¡}t|ƒS ©N)r+   Úboolr,   r%   r%   r&   ÚexistsP   s    
zLibCloudStorage.existsú/c           	      C   s  |   ¡ }| j |¡}t|ƒ}| d¡s.d| }g }g }|D ]Ø}|dkrž|j d¡dkrd| |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.
        r2   z%s/r   r   Nz	_$folder$i÷ÿÿÿ)r)   r   Zlist_container_objectsr   Úendswithr*   ÚcountÚappendÚindexÚ
startswithÚlen)	r   ÚpathÚ	containerZobjectsÚfilesÚdirsÚoZdir_namer*   r%   r%   r&   ÚlistdirT   s0    
zLibCloudStorage.listdirc                 C   s   |   |¡}|r|jS dS )Néÿÿÿÿ)r+   Úsizer,   r%   r%   r&   r@   v   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   Úlowerr+   r   Zget_object_cdn_urlÚNotImplementedErrorÚformatr   r*   Ú
connectionÚhostr   )r   r*   r!   r-   Úurlr$   Zobject_pathÚbase_urlr%   r%   r&   rF   z   s,    
ÿzLibCloudStorage.urlÚrbc                 C   s   t || |d}|S )N)Úmode)ÚLibCloudFile)r   r*   rI   Zremote_filer%   r%   r&   Ú_open’   s    zLibCloudStorage._openc                 C   s   |   |¡}t| j ||j¡ƒS r/   )r+   Únextr   Zdownload_object_as_streamr@   r,   r%   r%   r&   Ú_read–   s    
zLibCloudStorage._readc                 C   s   | j  t|ƒ|  ¡ |¡ |S r/   )r   Zupload_object_via_streamÚiterr)   )r   r*   Úfiler%   r%   r&   Ú_save›   s    zLibCloudStorage._save)NN)r2   )rH   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r)   r+   r.   r1   r>   r@   rF   rK   rM   rP   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 )rJ   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storagerI   r%   r%   r&   r'   ¢   s
    zLibCloudFile.__init__c                 C   s*   | j d kr$| j | j¡}t |¡| _ | j S r/   )rX   rU   rM   r*   ÚioÚBytesIO)r   Údatar%   r%   r&   Ú	_get_file©   s    
zLibCloudFile._get_filec                 C   s
   || _ d S r/   )rX   )r   Úvaluer%   r%   r&   Ú	_set_file¯   s    zLibCloudFile._set_filec                 C   s    t | dƒs| j | j¡| _| jS )NÚ_size)ÚhasattrrU   r@   r*   r_   r(   r%   r%   r&   r@   ´   s    
zLibCloudFile.sizeNc                 C   s   | j  |¡S r/   )rO   Úread)r   Ú	num_bytesr%   r%   r&   ra   º   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)rV   ÚAttributeErrorrY   rZ   rO   rW   )r   Úcontentr%   r%   r&   Úwrite½   s    
zLibCloudFile.writec                 C   s&   | j r| j | j| j¡ | j ¡  d S r/   )rW   rU   rP   r*   rO   Úcloser(   r%   r%   r&   rg   Ã   s    zLibCloudFile.close)N)rQ   rR   rS   rT   r'   r\   r^   ÚpropertyrO   r@   ra   rf   rg   r%   r%   r%   r&   rJ       s   


rJ   )rY   Úurllib.parser   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.files.baser   Zdjango.core.files.storager   Zdjango.utils.deconstructr   Zstorages.utilsr   Zlibcloud.storage.providersr	   Zlibcloud.storage.typesr
   r   ÚImportErrorr   rJ   r%   r%   r%   r&   Ú<module>   s"    	