
    h\                        d Z 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mZmZmZ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 ddl m!Z! ddl"m#Z$ dZ%dZ&dZ' edd      Z(ddZ) G d de*      Z+ G d d      Z,y)z/Sending/Receiving Messages (Kombu integration).    N)
namedtuple)Mapping)	timedelta)WeakValueDictionary)
ConnectionConsumerExchangeProducerQueuepools)	Broadcast)
maybe_list)cached_property)signals)anon_nodename)saferepr)indent)maybe_make_aware   )routes)AMQPQueuestask_messagei   zS
.> {0.name:<16} exchange={0.exchange.name}({0.exchange.type}) key={0.routing_key}
r   headers
propertiesbody
sent_eventc                     | j                         D ci c])  \  }}t        |t              r|j                  |      n||+ c}}S c c}}w N)items
isinstancebytesdecode)dencodingkvs       K/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/app/amqp.pyutf8dictr*   $   sE    	#1 #-Q"6AHHXAq@ # # #s   .Ac                        e Zd ZdZdZ	 	 	 d fd	Z fdZ fdZd Zd Z	d Z
d	 Zd
 ZddZd Zd Zd Zd Zed        Z xZS )r   u  Queue name⇒ declaration mapping.

    Arguments:
        queues (Iterable): Initial list/tuple or dict of queues.
        create_missing (bool): By default any unknown queues will be
            added automatically, but if this flag is disabled the occurrence
            of unknown queues in `wanted` will raise :exc:`KeyError`.
        max_priority (int): Default x-max-priority for queues with none set.
    Nc                    t         	|           t               | _        || _        || _        || _        |t        n|| _        || _	        |*t        |t              s|D ci c]  }|j                  | }}|xs i }|j                         D ]9  \  }}t        |t              r| j                  |      n | j                   |fi | ; y c c}w r    )super__init__r   aliasesdefault_exchangedefault_routing_keycreate_missingr	   autoexchangemax_priorityr"   r   namer!   r   add
add_compat)
selfqueuesr0   r2   r3   r4   r1   qr5   	__class__s
            r)   r.   zQueues.__init__8   s     	*, 0#6 ,(4(<H,(j&A)/0Aaffai0F02||~GD!%a/DHHQK_T__T5OQ5O & 1s    C	c                 `    	 | j                   |   S # t        $ r t        |   |      cY S w xY wr    )r/   KeyErrorr-   __getitem__)r8   r5   r;   s     r)   r>   zQueues.__getitem__H   s6    	-<<%% 	-7&t,,	-s    --c                     | j                   r|j                  s| j                   |_        t        |   ||       |j                  r|| j
                  |j                  <   y y r    )r0   exchanger-   __setitem__aliasr/   )r8   r5   queuer;   s      r)   rA   zQueues.__setitem__N   sL      !22END%(;;(-DLL%     c                 p    | j                   r | j                  | j                  |            S t        |      r    )r2   r6   new_missingr=   r8   r5   s     r)   __missing__zQueues.__missing__U   s/    88D,,T233tnrD   c                 j    t        |t              s | j                  |fi |S | j                  |      S )a  Add new queue.

        The first argument can either be a :class:`kombu.Queue` instance,
        or the name of a queue.  If the former the rest of the keyword
        arguments are ignored, and options are simply taken from the queue
        instance.

        Arguments:
            queue (kombu.Queue, str): Queue to add.
            exchange (kombu.Exchange, str):
                if queue is str, specifies exchange name.
            routing_key (str): if queue is str, specifies binding key.
            exchange_type (str): if queue is str, specifies type of exchange.
            **options (Any): Additional declaration options used when
                queue is a str.
        )r"   r   r7   _add)r8   rC   kwargss      r)   r6   z
Queues.addZ   s3    " %'"4??53F33yyrD   c                     |j                  d|j                  d             |d   ||d<   | j                  t        j                  |fi |      S )Nrouting_keybinding_key)
setdefaultgetrJ   r   	from_dict)r8   r5   optionss      r)   r7   zQueues.add_compato   sM    ='++m*DE=!)%)GM"yy99::rD   c                 >   |j                   |j                   j                  dk(  r| j                  |_         |j                  s| j                  |_        | j
                  .|j                  i |_        | j                  |j                         || |j                  <   |S )N )r@   r5   r0   rM   r1   r4   queue_arguments_set_max_priority)r8   rC   s     r)   rJ   zQueues._addv   s    >>!U^^%8%8B%>!22EN   $ 8 8E($$,(*%""5#8#89 UZZrD   c                 `    d|vr*| j                   |j                  d| j                   i      S y y )Nzx-max-priority)r4   update)r8   argss     r)   rV   zQueues._set_max_priority   s9    4'D,=,=,I;; 0$2C2CDEE -J'rD   c                 L   | j                   }|syt        |j                               D cg c](  \  }}t        j	                         j                  |      * }}}|rt        dj                  |      |      S |d   dz   t        dj                  |dd       |      z   S c c}}w )z/Format routing table into string for log dumps.rT   
r   r   N)consume_fromsortedr!   QUEUE_FORMATstripformat
textindentjoin)r8   r   indent_firstactive_r:   infos          r)   r`   zQueues.format   s    """6<<>24Aq ""$++A. 4 4diiov66Aw~
499T!"X+> GGG	4s   -B c                 v     | j                   |fi |}| j                  || j                  |j                  <   |S )zAdd new task queue that'll be consumed from.

        The queue will be active even when a subset has been selected
        using the :option:`celery worker -Q` option.
        )r6   _consume_fromr5   )r8   rC   rK   r:   s       r)   
select_addzQueues.select_add   s>     DHHU%f%))*Dqvv&rD   c                 X    |r#t        |      D ci c]  }|| |   
 c}| _        yyc c}w )zSelect a subset of currently defined queues to consume from.

        Arguments:
            include (Sequence[str], str): Names of queues to consume from.
        N)r   rh   )r8   includer5   s      r)   selectzQueues.select   s7     -7-@"%)d4j "D "s   'c                     rUt              | j                  | j                  fd| D              S D ]  }| j                  j                  |d         yy)zDeselect queues so that they won't be consumed from.

        Arguments:
            exclude (Sequence[str], str): Names of queues to avoid
                consuming from.
        Nc              3   ,   K   | ]  }|vs|  y wr     ).0r'   excludes     r)   	<genexpr>z"Queues.deselect.<locals>.<genexpr>   s     "Gaw6F1"Gs   	)r   rh   rl   pop)r8   rq   rC   s    ` r)   deselectzQueues.deselect   sX      )G!!){{"Gd"GGG ""&&ud3 ! rD   c                 :    t        || j                  |      |      S r    )r   r3   rG   s     r)   rF   zQueues.new_missing   s    T4,,T2D99rD   c                 6    | j                   | j                   S | S r    )rh   r8   s    r)   r\   zQueues.consume_from   s    )%%%rD   )NNTNNN)r   T)__name__
__module____qualname____doc__rh   r.   r>   rA   rH   r6   r7   rJ   rV   r`   ri   rl   rt   rF   propertyr\   __classcell__)r;   s   @r)   r   r   )   sp     M59378<P -.
 *;
F	H		4 :  rD   r   c                      e Zd ZdZeZeZeZeZeZ	dZ
dZdZdZdZd Zed        Zed        Z	 	 ddZddZd	 Zdd
Z	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 ddZd Zd Zed        Zed        Zej8                  d        Zed        Zed        Zej8                  d        Zed        Z e Z!ed        Z"ed        Z#ed        Z$d Z%y)r   zApp AMQP API: app.amqp.Ni   c                     || _         | j                  | j                  d| _        | j                   j                  j                  | j                         y )N)r      )app
as_task_v1
as_task_v2task_protocols_confbind_to_handle_conf_update)r8   r   s     r)   r.   zAMQP.__init__   s?    
 	t778rD   c                 \    | j                   | j                  j                  j                     S r    )r   r   conftask_protocolrw   s    r)   create_task_messagezAMQP.create_task_message   s!    ""488==#>#>??rD   c                 "    | j                         S r    )_create_task_senderrw   s    r)   send_task_messagezAMQP.send_task_message   s    ''))rD   c                 l   | j                   j                  }|j                  }||j                  }||j                  }|sE|j
                  r9d }|j                  dk(  rddi}t        |j
                  | j                  ||      f}|| j                  n|}| j                  || j                  ||||      S )Nquorumzx-queue-type)r@   rM   rU   )r   r   task_default_routing_keytask_create_missing_queuestask_queue_max_prioritytask_default_queuetask_default_queue_typer   r0   r3   
queues_cls)r8   r9   r2   r3   r4   r   r1   rU   s           r)   r   zAMQP.Queues   s     xx}}";;!!<<N77L$11"O++x7#18"<D33%)%:%:(;,;= ?F .:-A))) 	D))>,(;
 	
rD   c                     t        j                  | j                  |xs | j                  | j                  j                  d|      | j                        S )zReturn the current task router.r   )r   )_routesRouterr   r9   r   either)r8   r9   r2   s      r)   r   zAMQP.Router
  sC    ~~dkk6+@T[["hhoo.J.<>CG88M 	MrD   c                 t    t        j                  | j                  j                  j                        | _        y r    )r   preparer   r   task_routes_rtablerw   s    r)   flush_routeszAMQP.flush_routes  s     txx}}'@'@ArD   c                     | | j                   j                  j                  } | j                  |f||xs- t	        | j
                  j                  j                               d|S )N)acceptr9   )r   r   accept_contentr   listr9   r\   values)r8   channelr9   r   kws        r)   TaskConsumerzAMQP.TaskConsumer  sb    >XX]]11Ft}}
"DT$++":":"A"A"CD
 
 	
rD   c                 |   |xs d}|xs i }t        |t        t        f      st        d      t        |t              st        d      |rd| j                  |d       |xs | j                  j                         }|xs | j                  j                  }t        |t        |      z   |      }t        |	t        j                        rd| j                  |	d       |xs | j                  j                         }|xs | j                  j                  }t        |t        |	      z   |      }	t        |t              s|xr |j                         }t        |	t              s|	xr |	j                         }	|t        || j                         }|t        || j"                        }|s|}|xs g D ci c]  }|||   
 } }i dd	d
|d|d|d|d|	d|d|d|
d||gd|d|d|d|d|xs
 t%               d|d||| d}!t'        |!||xs dd||||||df|r|||||||
||	d	      S d       S c c}w )Nro   !task args must be a list or tuple(task keyword arguments must be a mapping	countdownseconds)tzexpireslangpytaskidshadowetagroupgroup_indexretries	timelimitroot_id	parent_idargsrepr
kwargsreproriginignore_resultreplaced_task_nesting)stamped_headersstampsrT   correlation_idreply_to)	callbackserrbackschainchord)	uuidr   r   r5   rY   rK   r   r   r   r   )r"   r   tuple	TypeErrorr   _verify_secondsr   nowtimezoner   r   numbersRealstr	isoformatr   argsrepr_maxsizekwargsrepr_maxsizer   r   )"r8   task_idr5   rY   rK   r   r   group_idr   r   r   r   r   r   r   
time_limitsoft_time_limitcreate_sent_eventr   r   r   r   r   r   r   r   r   r   r   r   rR   headerr   r   s"                                     r)   r   zAMQP.as_task_v2  s    zr2$u.?@@&'*FGG  K8'C4488#4#4H"i	22xC gw||,  )4'C4488#4#4H&i00XG #s#)#--/C'3'5'"3"3"5Gd&;&;<H!&$*A*ABJG8G8M2Nf&'&/)NN
D
D
 '
 f	

 3
 w
 X
 ;
 w
 *o6
 w
 
 
 *
 f/
  ]!
" $%:#
$  /'
, ")$N
 f!* (""	$ #  "& $""

 	
0 )-1
 	
/ Os   1H9c                    |xs d}|xs i }| j                   }t        |t        t        f      st	        d      t        |t
              st	        d      |r?| j                  |d       |xs | j                  j                         }|t        |      z   }t        |	t        j                        r?| j                  |	d       |xs | j                  j                         }|t        |	      z   }	|xr |j                         }|	xr |	j                         }	t        i ||xs dd|||||||
||	|||||f||d	|r!||t        |      t        |      |
||	d
      S d       S )Nro   r   r   r   r   r   rT   r   )r   r   rY   rK   r   r   r   r   r   utcr   r   r   tasksetr   )r   r5   rY   rK   r   r   r   r   )r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   )r8   r   r5   rY   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   compat_kwargsr   s                            r)   r   zAMQP.as_task_v1z  sz    zr2hh$u.?@@&'*FGG  K8'C	)44Cgw||,  )4'CIg66G%cmmo1g//1")$N
  !*""&$(/:#2 #   "6*""/ 
  	
> )-? 
  	
rD   c                 8    |t         k  rt        | d|      |S )Nz is out of range: )INT_MIN
ValueError)r8   swhats      r)   r   zAMQP._verify_seconds  s%    w;v%7u=>>rD   c                 v  	
 | j                   j                  j                  
| j                   j                  j                  | j                   j                  j                  | j
                  	| j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  | j                  | j                  | j                   j                  j                  | j                   j                  j                   | j                   j                  j"                  	 	 	 	 	 	 	 d	
fd	}|S )Nc                 $   |#n|}|\  }}}}|r|j                  |       |r|j                  |       |}||"}|$t        |t              r|&|   }}n|j                  }|
	 |j                  j
                  }
|
xs }
|	 |j                  j                  }|r|s
|dk(  rd|}}n0|.|j                  j                  xs  }|xs |j                  xs $}||rt        |t              s|g}|#n|}|rt        !fi |n!}r (||||||||        | j                  |f|||	xs %|xs |||
||||d|}r '|||||       *rMt        |t              r )||d   ||d   |d   |d	   |d
          n )||d   ||d   |d   |d	   |d          |rO|xs }|}t        |t              r|j                  }|j                  |||d       |j                  d|| ||       |S # t        $ r Y w xY w# t        $ r d}Y sw xY w)NdirectrT   )senderr   r@   rM   declarer   r   retry_policy)r@   rM   
serializercompressionretryr   delivery_moder   r   timeoutconfirm_timeout)r   r   r   r@   rM   r   r   r   r   r   )r   r   r   rY   rK   r   r   rY   rK   r   )rC   r@   rM   z	task-sent)r   r   )rX   r"   r   r5   r@   r   AttributeErrortyperM   r   dictpublishr   r	   )+producerr5   messager@   rM   rC   event_dispatcherr   r   r   r   r   r   r   exchange_typer   r   rK   headers2r   r   r   qname_rpretevdexnameafter_receiversbefore_receiversdefault_compressordefault_delivery_modedefault_evdr0   default_policydefault_queuedefault_retrydefault_rkeydefault_serializerr9   send_after_publishsend_before_publishsend_task_sentsent_receiverss+                              r)   r   z3AMQP._create_task_sender.<locals>.send_task_message  s    &+]ME5<2Hj$
(!!&)E}!1% eS)#(&-5E!JJE$$)NN$@$@M !. F1F$-$)NN$7$7M
 K]h5N(*E+! >>..B2B)NU->->N,5E91M ' &+]ME;G47,7&   #d%;#X)	 #(""!'%;);'=+=#+W  C "$T8,4+OdE*"#Xd^$!!WT!W$UOXg5F ##T$Zd!&\$x. Ki
 &5+!fh/#[[F!!" &#.# 
 K$E  NJQ &  & -$,M-s$   &G0 H  0	G=<G= HH)NNNNNNNNNNNNNN)r   r   task_publish_retrytask_publish_retry_policytask_default_delivery_moder  r9   r   before_task_publishsend	receiversafter_task_publish	task_sent_event_dispatcherr0   r   task_serializertask_compression)r8   r   r   r   r  r  r  r0   r  r  r  r  r  r9   r	  r
  r  r  s     @@@@@@@@@@@@@@@@r)   r   zAMQP._create_task_sender  sA   88@@ $ H H**%99>>"66@@$77<<!44>> **// **44,,00xx}}==!XX]]::!XX]];; FJ/37;=A8<:><@c	 c	 c	H ! rD   c                 \    | j                   | j                  j                  j                     S r    )r9   r   r   r   rw   s    r)   r  zAMQP.default_queue6  s    {{488==;;<<rD   c                 `    | j                  | j                  j                  j                        S )u"   Queue name⇒ declaration mapping.)r   r   r   task_queuesrw   s    r)   r9   zAMQP.queues:  s!     {{488==4455rD   c                 $    | j                  |      S r    )r   )r8   r9   s     r)   r9   zAMQP.queues?  s    {{6""rD   c                 R    | j                   | j                          | j                   S r    )r   r   rw   s    r)   r   zAMQP.routesC  s"    <<||rD   c                 "    | j                         S r    )r   rw   s    r)   routerzAMQP.routerI  s    {{}rD   c                     |S r    ro   )r8   values     r)   r  zAMQP.routerM  s    rD   c                     | j                   _t        j                  | j                  j	                            | _         | j                  j
                  j                  | j                   _        | j                   S r    )_producer_poolr   	producersr   connection_for_writepoollimitrw   s    r)   producer_poolzAMQP.producer_poolQ  sW    &"'//--/#1D(,(;(;D%"""rD   c                     t        | j                  j                  j                  | j                  j                  j                        S r    )r	   r   r   task_default_exchangetask_default_exchange_typerw   s    r)   r0   zAMQP.default_exchangeZ  s2    ;;@@B 	BrD   c                 B    | j                   j                  j                  S r    )r   r   
enable_utcrw   s    r)   r   zAMQP.utc_  s    xx}}'''rD   c                 N    | j                   j                  j                  d      S )NF)enabled)r   events
Dispatcherrw   s    r)   r  zAMQP._event_dispatcherc  s      xx))%)88rD   c                 ^    d|v sd|v r%| j                          | j                         | _        y )Nr   )r   r   r  )r8   rY   rK   s      r)   r   zAMQP._handle_conf_updatei  s-    V#}'<++-DKrD   )NNN)NN)NNNNNNNr   NNNNNNFNNNNNNNFNNNr   )NNNNNNNr   NNNNNNFNNNNN)&rx   ry   rz   r{   r   r   r
   BrokerConnectionr   r   r   r"  r3   r   r   r.   r   r   r   r   r   r   r   r   r   r   r  r9   setterr|   r   r  r'  publisher_poolr0   r   r  r   ro   rD   r)   r   r      s   !JHH "J G N L  9 @ @ * * -1/3
2MB
 ;?HL26;?48DH?Cei)*\
| ;?HL)*GK48DH37:
x
y!v = = 6 6 ]]# #  
   ]]  # # #NB B ( ( 9 9
rD   r   )zutf-8)-r{   r   collectionsr   collections.abcr   datetimer   weakrefr   kombur   r   r	   r
   r   r   kombu.commonr   kombu.utils.functionalr   kombu.utils.objectsr   celeryr   celery.utils.nodenamesr   celery.utils.safereprr   celery.utils.textr   ra   celery.utils.timer   rT   r   r   __all__r   r^   r   r*   r   r   r   ro   rD   r)   <module>rC     s}    5  " #  ' H H " - /  0 * 2 . 
, 
 .IK#
UT Upl lrD   