
    {kf,                     .   d Z ddlmZ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timezone)EncodeError)cached_property)maybe_sanitize_urlurlparse)states)ImproperlyConfigured   )BaseBackendN)Binary)InvalidDocumentc                       e Zd ZdS )r   N)__name__
__module____qualname__     W/var/www/html/nettyfy-visnx/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-   r0   r1   )	selfr>   kwargskeyvalueuri_data	hostslistconfig	__class__s	           r   r3   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)r8   
parsed_urls     r   r9   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)r4   version_tuplerU   rD   s    r   r5   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   )MongoClientrN   r"   r,   r'   r(   r   )_connectionr4   rZ   r.   r,   rA   strrP   r-   rB   r*   r/   r(   )rD   rZ   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)
serializerr2   encodeBINARY_CODECSr   )rD   datapayloadrK   s      r   rb   zMongoBackend.encode   sI    ?f$$K''..&& ?m++WooGr   c                 `    | j         dk    r|S t                                          |          S r_   )ra   r2   decode)rD   rd   rK   s     r   rg   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_metarb   
collectionreplace_oner   r   )	rD   task_idri   rj   rk   rl   rE   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.rn   extendedri   nameargsqueuerE   statusworkerretrieschildren	date_donerk   )rz   r{   rt   r|   rE   r}   r~   r   r   r   rk   ri   )rt   r}   ri   r   rk   r   N)r}   ri   )	rr   find_oner>   r?   find_value_for_keymeta_from_decodedrg   r
   PENDING)rD   rt   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        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   )rn   ri   r   rn   Tro   )rb   r   nowr   utcgroup_collectionrs   )rD   group_idri   ru   s       r   _save_groupzMongoBackend._save_group   sj     kk"8"8"8"8"899!hl33
 

 	))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.rn   r   c                 D    g | ]}j                             |          S r   )r>   AsyncResult)r#   taskrD   s     r   r%   z/MongoBackend._restore_group.<locals>.<listcomp>   s9        H((..  r   ri   )rt   r   ri   N)r   r   rg   )rD   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.rn   N)r   
delete_one)rD   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.
        rn   N)rr   r   )rD   rt   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)expiresrr   delete_manyr>   r   expires_deltar   rX   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   r8   )r2   
__reduce__rB   r   r8   )rD   r{   rE   rK   s      r   r   zMongoBackend.__reduce__  sH    !-vww!!$vt|BBBD D 	Dr   c                 D    |                                  }|| j                 S N)r]   r<   )rD   conns     r   _get_databasezMongoBackend._get_database  s!    ##%%D&''r   c                 *    |                                  S )z]Get database from MongoDB connection.

        performs authentication if necessary.
        )r   rX   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)   r0   create_indexrD   rr   s     r   rr   zMongoBackend.collection&  s4     ]4#;<
 	===r   c                 X    | j         | j                 }|                    dd           |S r   )r)   r1   r   r   s     r   r   zMongoBackend.group_collection0  s4     ]4#<=
 	===r   c                 ,    t          | j                  S )N)seconds)r   r   rX   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.
        rN   ,r   )r8   r   splitjoin)rD   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<   r0   r1   rU   r*   supports_autoexpirer[   r3   staticmethodr9   r5   r]   rb   rg   rw   r   r   r   r   r   r   r   r   r   r)   rr   r   r   r   __classcell__)rK   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   r   kombu.exceptionsr   kombu.utils.objectsr   kombu.utils.urlr   r	   r   r
   celery.exceptionsr   baser   r4   ImportErrorbson.binaryr   pymongo.binarypymongo.errorsr   	Exception__all__	frozensetrc   r   r   r   r   <module>r      s   # # 2 2 2 2 2 2 2 2 2 2 ( ( ( ( ( ( / / / / / / 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!   9 AA	A AA