o
    Dfl                     @   s   d Z ddlmZ ddlmZ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 zddlZddlmZ ddlmZ ddlmZ W n ey]   dZY nw dZG dd deZdS )z5Google Cloud Storage result store backend for Celery.    )ThreadPoolExecutor)datetime	timedelta)getpid)RLock)bytes_to_str)
dictfilter)url_to_parts)ImproperlyConfigured   )KeyValueStoreBackendN)storage)Client)DEFAULT_RETRY)
GCSBackendc                       sp   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Ze	dd Z
e	dd Zdd Zdd Zdd Z  ZS )r   z)Google Cloud Storage task result backend.c                    s  t  jdi | t | _t | _t| _d | _t	st
d| jj}| jr2|  }|jdi t| |d| _| js?t
d|d| _| jsLt
d|ddd| _t|d	d
| _t|dpfd| _| jdk rwt
d| j d| jr|  st
d| j d S d S )Nz8You must install google-cloud-storage to use gcs backend
gcs_bucketz:Missing bucket name: specify gcs_bucket to use gcs backendgcs_projectz6Missing project:specify gcs_project to use gcs backendgcs_base_path /gcs_threadpool_maxsize
   gcs_ttlr   zInvalid ttl: z# must be greater than or equal to 0z>Missing lifecycle rule to use gcs backend with ttl on bucket:  )super__init__r   _lockr   _pidr   _retry_policy_clientr   r
   appconfurl_params_from_urlupdater   getbucket_nameprojectstrip	base_pathint_threadpool_maxsizefloatttl _is_bucket_lifecycle_rule_exists)selfkwargsr!   
url_params	__class__r   L/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/backends/gcs.pyr      sN   
zGCSBackend.__init__c                 C   s<   t |}| |}z|j| jdW S  tjjy   Y d S w Nretry)r   	_get_blobdownload_as_bytesr   r   blobNotFoundr/   keyr:   r   r   r4   r%   E   s   
zGCSBackend.getc                 C   sB   t |}| |}| jrt t| jd |_|j|| jd d S )N)secondsr6   )	r   r8   r-   r   utcnowr   custom_timeupload_from_stringr   )r/   r=   valuer:   r   r   r4   setM   s
   
zGCSBackend.setc                 C   s0   t |}| |}| r|j| jd d S d S r5   )r   r8   existsdeleter   r<   r   r   r4   rE   T   s
   
zGCSBackend.deletec                 C   s<   t  }t|| j|W  d    S 1 sw   Y  d S N)r   listmapr%   )r/   keyspoolr   r   r4   mgetZ   s   $zGCSBackend.mgetc                 C   s   | j F | jr| jt kr| jW  d   S t| jd| _t | _tjj| j	| j	dd}| jj
}|d| |jjd| | jW  d   S 1 sLw   Y  dS )zReturns a storage client.N)r'      )pool_connectionspool_maxsizemax_retrieszhttps://)r   r   r   r   r   r'   requestsadaptersHTTPAdapterr+   _httpmount_auth_requestsession)r/   adapterclient_httpr   r   r4   client^   s    $zGCSBackend.clientc                 C   s   | j | jS rF   )rY   bucketr&   )r/   r   r   r4   rZ   v   s   zGCSBackend.bucketc                 C   s&   | j r| j  d| n|}| j|S )Nr   )r)   rZ   r:   )r/   r=   key_bucket_pathr   r   r4   r8   z   s   zGCSBackend._get_blobc                 C   s4   | j }|  |jD ]}|d d dkr dS q
dS )NactiontypeDeleteTF)rZ   reloadlifecycle_rules)r/   rZ   ruler   r   r4   r.   ~   s   
z+GCSBackend._is_bucket_lifecycle_rule_existsc                 C   s   t | j}|j|jd|jS )N)r   r   )r	   r"   hostnamepathquery)r/   	url_partsr   r   r4   r#      s   
zGCSBackend._params_from_url)__name__
__module____qualname____doc__r   r%   rC   rE   rK   propertyrY   rZ   r8   r.   r#   __classcell__r   r   r2   r4   r      s    (

r   )ri   concurrent.futuresr   r   r   osr   	threadingr   kombu.utils.encodingr   kombu.utils.functionalr   kombu.utils.urlr	   celery.exceptionsr
   baser   rP   google.cloudr   google.cloud.storager   google.cloud.storage.retryr   ImportError__all__r   r   r   r   r4   <module>   s(    