
    h,                        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er	 ddlmZ 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y
# e$ r d
ZY >w xY w# e$ r	 ddlmZ Y Fw xY w)zMongoDB result store backend.    )datetime	timedeltatimezone)EncodeError)cached_property)maybe_sanitize_urlurlparse)states)ImproperlyConfigured   )BaseBackendN)Binary)InvalidDocumentc                       e Zd Zy)r   N)__name__
__module____qualname__     S/var/www/Befach/backend/env/lib/python3.12/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        	|   |fi | t        st	        d      | j                         j                         D ]!  \  }}| j                   j                  ||       # | j                  r| j                  | j                        | _        t        j                  j                  | j                        }|d   D cg c]  }|d    d|d     }}|d   | _        |d   | _        || _        |d   r
|d   | _        | j                   j!                  |d	          | j"                  j$                  j'                  d
      }|t)        |t*              st	        d      t+        |      }d|v sd|v rd | _        |j-                  d| j.                        | _        |j-                  d| j0                        | _        |j-                  d| j                        | _        |j-                  d| j                        | _        |j-                  d| j                        | _        |j-                  d| j                        | _        |j-                  d| j2                        | _        |j-                  d| j4                        | _        | j                   j!                  |j-                  d	i              | j                   j!                  |       y y c c}w )NzCYou need to install the pymongo library to use the MongoDB backend.nodelistr   :r   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,   r-   )
selfr:   kwargskeyvalueuri_datax	hostslistconfig	__class__s
            r   r/   zMongoBackend.__init__:   sz   ''&#$ $
 668>>@JCLL##C/ A 88::488DDH))33DHH=H +3:*>%&1Q4&!A$ I  !,DI$Z0DM'DO
#%-j%9"LL 34 ""#=>fd+*JL L&\F6V#3"&

64995DI

64995DI$jjtGDO

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

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

9b 9:LL'1 s   Kc                 p    t        |       }|j                  j                  d      sd|  } | dk(  r| dz  } | S )Nmongodbzmongodb+
mongodb://r   )r	   scheme
startswith)r4   
parsed_urls     r   r5   z+MongoBackend._ensure_mongodb_uri_compliancev   sB    c]
  ++I6SE"C,;C
r   c                 b    t         j                  dk\  rd| j                  iS | j                  ddS )N)   maxPoolSizeF)max_pool_sizeauto_start_request)r0   version_tuplerR   r@   s    r   r1   z$MongoBackend._prepare_client_options   s7      D(!4#5#566%)%7%7*/1 1r   c                    | j                   ddlm} | j                  }|s?| j                  }t        |t              r#|j                  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.r   )MongoClientrK   r"   r(   r#   r$   r   )_connectionr0   rW   r*   r(   r=   strrM   r)   r>   r&   r+   r$   )r@   rW   r(   r;   s       r   _get_connectionzMongoBackend._get_connection   s    #+??D yydC(??<8'vQtyyk:D%DDLyy#'99Z }}#'==Z *2T2Dr   c                     | j                   dk(  r|S t        | 	  |      }| j                   t        v rt	        |      }|S Nbson)
serializerr.   encodeBINARY_CODECSr   )r@   datapayloadrH   s      r   r_   zMongoBackend.encode   s>    ??f$K'.& ??m+WoGr   c                 D    | j                   dk(  r|S t        | 	  |      S r\   )r^   r.   decode)r@   ra   rH   s     r   rd   zMongoBackend.decode   s#    ??f$Kw~d##r   c                     | j                  | j                  |      |||d      }||d<   	 | j                  j                  d|i|d       |S # t        $ r}t        |      d}~ww xY w)z1Store return value and state of an executed task.F)resultstate	tracebackrequestformat_date_idTupsertN)_get_result_metar_   
collectionreplace_oner   r   )	r@   task_idrf   rg   rh   ri   rA   metaexcs	            r   _store_resultzMongoBackend._store_result   s     $$DKK,?u/8'16 % 8 U	#OO''(8$t'L   	#c""	#s    A 	A'A""A'c                    | j                   j                  d|i      }|r| j                  j                  j	                  dd      rQ| j                  |d   |d   |d   |d   |d   |d   |d	   |d
   |d   |d   |d   | j                  |d         d      S | j                  |d   |d   | j                  |d         |d   |d   |d   d      S t        j                  ddS )z$Get task meta-data for a task by id.rk   extendedrf   nameargsqueuerA   statusworkerretrieschildren	date_donerh   )rw   rx   rq   ry   rA   rz   r{   r|   r}   r~   rh   rf   )rq   rz   rf   r~   rh   r}   N)rz   rf   )	ro   find_oner:   r;   find_value_for_keymeta_from_decodedrd   r
   PENDING)r@   rq   objs      r   _get_task_meta_forzMongoBackend._get_task_meta_for   s   oo&&w'78xx}}//
HE--KK"5z \!(m!(m!(m"9~ #J!$[!1!$[!1"kk#h-8/   ))u:h-++c(m4 - -
O+   !..D99r   c                     || j                  |D cg c]  }|j                   c}      t        j                  t        j
                        d}| j                  j                  d|i|d       |S c c}w )zSave the group result.)rk   rf   r~   rk   Trl   )r_   idr   nowr   utcgroup_collectionrp   )r@   group_idrf   irr   s        r   _save_groupzMongoBackend._save_group   se     kk"8A144"89!hll3

 	))5(*;T$)O	 #9s   A1
c                     | j                   j                  d|i      }|rE|d   |d   | j                  |d         D cg c]  }| j                  j	                  |       c}dS yc c}w )z!Get the result for a group by id.rk   r~   rf   )rq   r~   rf   N)r   r   rd   r:   AsyncResult)r@   r   r   tasks       r   _restore_groupzMongoBackend._restore_group   sw    ##,,eX->?u: - !%CM : HH((.  s   "A&c                 >    | j                   j                  d|i       y)zDelete a group by id.rk   N)r   
delete_one)r@   r   s     r   _delete_groupzMongoBackend._delete_group   s    ((%):;r   c                 >    | j                   j                  d|i       y)zRemove result from MongoDB.

        Raises:
            pymongo.exceptions.OperationsError:
                if the task_id could not be removed.
        rk   N)ro   r   )r@   rq   s     r   _forgetzMongoBackend._forget   s     	""E7#34r   c                 .   | j                   sy| j                  j                  dd| j                  j	                         | j
                  z
  ii       | j                  j                  dd| j                  j	                         | j
                  z
  ii       y)zDelete expired meta-data.Nr~   z$lt)expiresro   delete_manyr:   r   expires_deltar   rU   s    r   cleanupzMongoBackend.cleanup	  sx    ||##5$((,,.43E3E"EFG	
 	))5$((,,.43E3E"EFG	
r   c                 p    |si n|}t         |   |t        || j                  | j                              S )N)r   r4   )r.   
__reduce__r>   r   r4   )r@   rx   rA   rH   s      r   r   zMongoBackend.__reduce__  s6    !vw!$vt||BD 	Dr   c                 @    | j                         }|| j                     S N)rZ   r8   )r@   conns     r   _get_databasezMongoBackend._get_database  s!    ##%D&&''r   c                 "    | j                         S )z]Get database from MongoDB connection.

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

        Arguments:
            include_password (bool): Password censored if disabled.
        rK   ,r   )r4   r   splitjoin)r@   include_passworduri1	remainders       r   as_urizMongoBackend.as_uri>  sg     xx88Odhh%dhh//((..a0ixx+D19=>>r   r   )NN)r   N)F)'r   r   r   __doc__r*   r(   r)   r+   r$   r8   r,   r-   rR   r&   supports_autoexpirerX   r/   staticmethodr5   r1   rZ   r_   rd   rt   r   r   r   r   r   r   r   r   r   r%   ro   r   r   r   __classcell__)rH   s   @r   r   r   #   s     JDDDHM+-MGK:(x  1 :	$ /3 ::<
5

D
( $ $     / /?r   r   )r   r   r   r   kombu.exceptionsr   kombu.utils.objectsr   kombu.utils.urlr   r	   r   r
   celery.exceptionsr   baser   r0   ImportErrorbson.binaryr   pymongo.binarypymongo.errorsr   	Exception__all__	frozensetr`   r   r   r   r   <module>r      s    # 2 2 ( / 8  2  *& /F)  8Y/0j?; j?)  G  *)*s"   A- A: -A76A7:BB