
    `f,                     *   d Z ddlmZmZ ddlm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Zn# e$ r d
ZY nw xY wer 	 ddlmZ n# e$ r	 ddlmZ Y nw xY wddlmZ nd
Z G d de          ZdZ eddg          Z G d de          Zd
S )zMongoDB result store backend.    )datetime	timedelta)EncodeError)cached_property)maybe_sanitize_urlurlparse)states)ImproperlyConfigured   )BaseBackendN)Binary)InvalidDocumentc                       e Zd ZdS )r   N)__name__
__module____qualname__     I/var/www/html/env/lib/python3.11/site-packages/celery/backends/mongodb.pyr   r      s        r   r   )MongoBackendpicklemsgpackc                   *    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZd	ZdZd fd
	Zed             Zd Zd Z fdZ fdZ	 d dZd Zd Zd Zd Zd Zd Zd! fd	Zd Ze d             Z!e d             Z"e d             Z#e d             Z$d"dZ% xZ&S )#r   zMongoDB result backend.

    Raises:
        celery.exceptions.ImproperlyConfigured:
            if module :pypi:`pymongo` is not available.
    N	localhostii  celerycelery_taskmetacelery_groupmeta
   Fc                    i | _          t                      j        |fi | t          st	          d          |                                                                 D ] \  }}| j                             ||           !| j        r| 	                    | j                  | _        t          j
                            | j                  }d |d         D             }|d         | _        |d         | _        || _        |d         r|d         | _        | j                             |d                    | j        j                            d          }|t)          |t*                    st	          d	          t+          |          }d
|v sd|v rd | _        |                    d
| j                  | _        |                    d| j                  | _        |                    d| j                  | _        |                    d| j                  | _        |                    d| j                  | _        |                    d| j                  | _        |                    d| j                  | _        |                    d| j                  | _        | j                             |                    di                      | j                             |           d S d S )NzCYou need to install the pymongo library to use the MongoDB backend.c                 4    g | ]}|d           d|d          S )r   :r   r   ).0xs     r   
<listcomp>z)MongoBackend.__init__.<locals>.<listcomp>N   s;       %&1Q4  !A$    r   nodelistusernamepassworddatabaseoptionsmongodb_backend_settingsz4MongoDB backend settings should be grouped in a dicthostport
mongo_hostusertaskmeta_collectiongroupmeta_collection)r)   super__init__pymongor
   _prepare_client_optionsitems
setdefaulturl_ensure_mongodb_uri_compliance
uri_parser	parse_urir.   r'   r-   database_nameupdateappconfget
isinstancedictpopr+   r,   r/   r0   )	selfr=   kwargskeyvalueuri_data	hostslistconfig	__class__s	           r   r2   zMongoBackend.__init__:   s   ''''' 	$&#$ $ $
 6688>>@@ 	0 	0JCL##C//// 8 	5::48DDDH)33DH==H *2:*>  I !,DI$Z0DM'DO
# :%-j%9"L 3444 ""#=>>fd++ L*JL L L&\\F6V#3#3"&

64955DI

64955DI$jjtGGDO

64955DI"JJz4=AADM!'J8J!K!KD'-zz%t'?( (D$ )/

&(A) )D% L

9b 9 9:::L'''''1 r   c                 x    t          |           }|j                            d          sd|  } | dk    r| dz  } | S )Nmongodbzmongodb+
mongodb://r   )r   scheme
startswith)r7   
parsed_urls     r   r8   z+MongoBackend._ensure_mongodb_uri_compliancev   sM    c]]
 ++I66 	#"S""C,;C
r   c                 H    t           j        dk    r	d| j        iS | j        ddS )N)   maxPoolSizeF)max_pool_sizeauto_start_request)r3   version_tuplerT   rC   s    r   r4   z$MongoBackend._prepare_client_options   s6     D((!4#566%)%7*/1 1 1r   c                 H   | j         ddlm} | j        }|s>| j        }t          |t                    r"|                    d          sd| d| j         }t          | j
                  }||d<   | j        r
| j        |d<   | j        r
| j        |d<    |d	i || _         | j         S )
zConnect to the MongoDB server.Nr   )MongoClientrM   r!   r+   r&   r'   r   )_connectionr3   rY   r-   r+   r@   strrO   r,   rA   r)   r.   r'   )rC   rY   r+   r>   s       r   _get_connectionzMongoBackend._get_connection   s    #++++++?D 
; ydC(( ;??<88;:::ty::D%%DDLy -#'9Z } 1#'=Z *{22T22Dr   c                     | j         dk    r|S t                                          |          }| j         t          v rt	          |          }|S Nbson)
serializerr1   encodeBINARY_CODECSr   )rC   datapayloadrJ   s      r   ra   zMongoBackend.encode   sI    ?f$$K''..&& ?m++WooGr   c                 `    | j         dk    r|S t                                          |          S r^   )r`   r1   decode)rC   rc   rJ   s     r   rf   zMongoBackend.decode   s+    ?f$$Kww~~d###r   c                     |                      |                     |          |||d          }||d<   	 | j                            d|i|d           n!# t          $ r}t          |          d}~ww xY w|S )z1Store return value and state of an executed task.F)resultstate	tracebackrequestformat_date_idTupsertN)_get_result_metara   
collectionreplace_oner   r   )	rC   task_idrh   ri   rj   rk   rD   metaexcs	            r   _store_resultzMongoBackend._store_result   s     $$DKK,?,?u/8'16 % 8 8 U	#O''(8$t'LLLL 	# 	# 	#c"""	# s   A 
A2A--A2c                 <   | j                             d|i          }|r| j        j                            dd          r}|                     |d         |d         |d         |d         |d         |d         |d	         |d
         |d         |d         |d         |                     |d                   d          S |                     |d         |d         |                     |d                   |d         |d         |d         d          S t          j        ddS )z$Get task meta-data for a task by id.rm   extendedrh   nameargsqueuerD   statusworkerretrieschildren	date_donerj   )ry   rz   rs   r{   rD   r|   r}   r~   r   r   rj   rh   )rs   r|   rh   r   rj   r   N)r|   rh   )	rq   find_oner=   r>   find_value_for_keymeta_from_decodedrf   r	   PENDING)rC   rs   objs      r   _get_task_meta_forzMongoBackend._get_task_meta_for   s2   o&&w'788 	x}//
HEE --KK"5z \!(m!(m!(m"9~ #J!$[!1!$[!1"kk#h-88/ /    ))u:h-++c(m44 - -
O+ +    !.D999r   c                     ||                      d |D                       t          j                    d}| j                            d|i|d           |S )zSave the group result.c                     g | ]	}|j         
S r   )id)r"   is     r   r$   z,MongoBackend._save_group.<locals>.<listcomp>   s    "8"8"8A14"8"8"8r   )rm   rh   r   rm   Trn   )ra   r   utcnowgroup_collectionrr   )rC   group_idrh   rt   s       r   _save_groupzMongoBackend._save_group   sf     kk"8"8"8"8"899!**
 

 	))5(*;T$)OOOr   c                       j                             d|i          }|r7|d         |d          fd                     |d                   D             dS dS )z!Get the result for a group by id.rm   r   c                 D    g | ]}j                             |          S r   )r=   AsyncResult)r"   taskrC   s     r   r$   z/MongoBackend._restore_group.<locals>.<listcomp>   s9        H((..  r   rh   )rs   r   rh   N)r   r   rf   )rC   r   r   s   `  r   _restore_groupzMongoBackend._restore_group   s    #,,eX->?? 	u: -    $CM : :    	 	r   c                 >    | j                             d|i           dS )zDelete a group by id.rm   N)r   
delete_one)rC   r   s     r   _delete_groupzMongoBackend._delete_group   s$    ((%):;;;;;r   c                 >    | j                             d|i           dS )zRemove result from MongoDB.

        Raises:
            pymongo.exceptions.OperationsError:
                if the task_id could not be removed.
        rm   N)rq   r   )rC   rs   s     r   _forgetzMongoBackend._forget   s%     	""E7#344444r   c                    | j         sdS | j                            dd| j                                        | j        z
  ii           | j                            dd| j                                        | j        z
  ii           dS )zDelete expired meta-data.Nr   z$lt)expiresrq   delete_manyr=   nowexpires_deltar   rW   s    r   cleanupzMongoBackend.cleanup	  s    | 	F##5$(,,..43E"EFG	
 	
 	
 	))5$(,,..43E"EFG	
 	
 	
 	
 	
r   r   c                     |si n|}t                                          |t          || j        | j                            S )N)r   r7   )r1   
__reduce__rA   r   r7   )rC   rz   rD   rJ   s      r   r   zMongoBackend.__reduce__  sH    !-vww!!$vt|BBBD D 	Dr   c                 D    |                                  }|| j                 S N)r\   r;   )rC   conns     r   _get_databasezMongoBackend._get_database  s!    ##%%D&''r   c                 *    |                                  S )z]Get database from MongoDB connection.

        performs authentication if necessary.
        )r   rW   s    r   r(   zMongoBackend.database  s     !!###r   c                 X    | j         | j                 }|                    dd           |S z"Get the meta-data task collection.r   T)
background)r(   r/   create_indexrC   rq   s     r   rq   zMongoBackend.collection&  s4     ]4#;<
 	===r   c                 X    | j         | j                 }|                    dd           |S r   )r(   r0   r   r   s     r   r   zMongoBackend.group_collection0  s4     ]4#<=
 	===r   c                 ,    t          | j                  S )N)seconds)r   r   rW   s    r   r   zMongoBackend.expires_delta:  s    ....r   c                     | j         sdS |r| j         S d| j         vrt          | j                   S | j                             dd          \  }}d                    t          |          |g          S )z~Return the backend as an URI.

        Arguments:
            include_password (bool): Password censored if disabled.
        rM   ,r   )r7   r   splitjoin)rC   include_passworduri1	remainders       r   as_urizMongoBackend.as_uri>  sx     x 	 < 	8Odh%dh///(..a00ixx+D119=>>>r   r   )NN)r   N)F)'r   r   r   __doc__r-   r+   r,   r.   r'   r;   r/   r0   rT   r)   supports_autoexpirerZ   r2   staticmethodr8   r4   r\   ra   rf   rv   r   r   r   r   r   r   r   r   r   r(   rq   r   r   r   __classcell__)rJ   s   @r   r   r   #   s         JDDDHM+-MGK:( :( :( :( :( :(x   \1 1 1     :	 	 	 	 	$ $ $ $ $ /3    : : ::    < < <
5 
5 
5

 

 

D D D D D D
( ( ( $ $ _$   _   _ / / _/? ? ? ? ? ? ? ?r   r   )r   r   r   kombu.exceptionsr   kombu.utils.objectsr   kombu.utils.urlr   r   r   r	   celery.exceptionsr
   baser   r3   ImportErrorbson.binaryr   pymongo.binarypymongo.errorsr   	Exception__all__	frozensetrb   r   r   r   r   <module>r      s   # # ( ( ( ( ( ( ( ( ( ( ( ( ( ( / / / / / / 8 8 8 8 8 8 8 8       2 2 2 2 2 2      NNNN   GGG  
*&&&&&&& * * *))))))))*.......F    )    	8Y/00j? j? j? j? j?; j? j? j? j? j?s!   7 A AA AA