
    ]j/                     J   d dl Z d dlmZmZmZmZm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 d dlmZ d	d
lmZ d	dlmZ d Zd-dZ G d de      Zd.dZ	 	 d/dededej<                  fdZ	 	 	 	 	 	 	 	 d0dedee    dee   dee   deej<                     deeeee   f      deeeee   f      dededefdZ!d Z"d Z#d  Z$d! Z%d"edefd#Z&d1d$Z'd2defd%Z(	 	 d d&l)m*Z*  G d' d(e*      Z+	 	 	 	 d3ded)ee   d*e deej<                     de+f
d+Z,y# e-$ r d, Z,Y yw xY w)4    N)AnyCallableOptionalTypeUnion)Sentinel)Job)Queue)import_attribute)settingsImproperlyConfigured   )thread_queue)get_job_classc                  H    t        t        di       } | j                  dd      S )aX  
    Disabling AUTOCOMMIT causes enqueued jobs to be stored in a temporary queue.
    Jobs in this queue are only enqueued after the request is completed and are
    discarded if the request causes an exception (similar to db transactions).

    To disable autocommit, put this in settings.py:
    RQ = {
        'AUTOCOMMIT': False,
    }
    RQ
AUTOCOMMITT)getattrr   get)r   s    :/root/env/lib/python3.12/site-packages/django_rq/queues.pyget_commit_moder      s#     
4	$B66,%%    c                     t        t        di       }|*|j                  dt              }| r| j                  d|      }t	        |t
              rt        |      }|S )aC  
    Return queue class from config or from RQ settings, otherwise return DjangoRQ.
    If ``queue_class`` is provided, it takes priority.

    The full priority list for queue class sources:
    1. ``queue_class`` argument
    2. ``QUEUE_CLASS`` in ``config`` argument
    3. ``QUEUE_CLASS`` in base settings (``RQ``)
    r   QUEUE_CLASS)r   r   r   DjangoRQ
isinstancestrr   )configqueue_classr   s      r   get_queue_classr!       sU     
4	$Bff]H5 **]K@K+s#&{3r   c                   2     e Zd ZdZ fdZ fdZd Z xZS )r   z
    A subclass of RQ's QUEUE that allows jobs to be stored temporarily to be
    enqueued later at the end of Django's request/response cycle.
    c                 v    |j                  dd       }|
t               n|| _        t        t        |   |i | y )N
autocommit)popr   _autocommitsuperr   __init__)selfargskwargsr$   	__class__s       r   r(   zDjangoRQ.__init__;   s9    ZZd3
0:0B?,
h&77r   c                     ddl m} |j                  d      xs | j                  }|j                  dt	        |            |d<   t        t        |   |i |S )Nr   QUEUES
queue_name
result_ttl)r   r/   r   nameget_result_ttlr'   r   enqueue_callr)   r*   r+   r/   r0   r,   s        r   original_enqueue_callzDjangoRQ.original_enqueue_callA   sN    $ZZ-:
%zz,z8RS|Xt14B6BBr   c                 n    | j                   r | j                  |i |S t        j                  | ||       y N)r&   r6   r   add)r)   r*   r+   s      r   r4   zDjangoRQ.enqueue_callI   s5    -4--t>v>>T40r   )__name__
__module____qualname____doc__r(   r6   r4   __classcell__r,   s   @r   r   r   5   s    
8C1r   r   c                    |rt         j                  nt         j                  }d| v r| j                  d      s | j                  d      j	                  d      r6|j                  | d   | j                  d      | j                  dd            S |j                  | d   | j                  d            S d	| j                         v r	 d
dlm}  || d	         S d| v r || d   | d         S d| v r| j                  d      | j                  d      | j                  d      | j                  d      d}|j                  | j                  di              | j                  di       }t!        | d   fd|i|}|j#                  | d   |      S  |d| d   | d   | j                  dd
      | j                  dd      | j                  d      | j                  dd      | j                  dd      d| j                  di       S # t        $ r Y nw xY wd
dl
m} || d	      }	 |j                  S # t        $ r |j                         cY S w xY w) z=
    Returns a redis connection from a connection config
    URLSSLz	rediss://DBSSL_CERT_REQSrequired)dbssl_cert_reqs)rF   USE_REDIS_CACHEr   )get_redis_connection)cachesUNIX_SOCKET_PATH)unix_socket_pathrF   	SENTINELSPASSWORDUSERNAMESOCKET_TIMEOUT)rF   passwordusernamesocket_timeoutCONNECTION_KWARGSSENTINEL_KWARGSsentinel_kwargsMASTER_NAME)service_nameredis_classHOSTPORTNF)hostportrF   rR   rQ   sslrG   REDIS_CLIENT_KWARGS )redisStrictRedisRedisr   
startswithfrom_urlkeysdjango_redisrI   ImportErrordjango.core.cacherJ   _clientAttributeErrorget_master_clientupdater   
master_for)	r   use_strict_redis	redis_cls	get_redisrJ   cacheconnection_kwargsrV   sentinels	            r   rI   rI   P   sn    &6!!5;;I::e

5 1 < <[ I%%u::d#$jj*E &   %%u::d# &  
 FKKM)	FV$5677 V#&1C*DPTVVf**T"

:.

:.$jj)9:	
 	  ,?!DE **%6;F;/ffTef"".! # 
 	

  	F^F^::dAJ-J'JJue$jj*=	 ***B
/	 	?  		 	-v/01	-==  	-**,,	-s$   H 	HHH+ +IIr2   ro   returnc                 ,    ddl m} t        ||    |      S )zU
    Returns a Redis connection to use based on parameters in settings.RQ_QUEUES
    r   r.   )r   r/   rI   )r2   ro   r/   s      r   get_connectionrw      s     !t.>??r   default_timeoutis_asyncr$   
connectionr    	job_class
serializerr+   c           
      b   ddl m}	 |j                  d      |d   }t        j                  dt
               ||	|    j                  dd      }t        |      }||	|    j                  d      }|t        |       }||	|    j                  d      }t        |	|    |      } || f||||||d	|S )
zG
    Returns an rq Queue using parameters defined in ``RQ_QUEUES``
    r   r.   asyncz9The `async` keyword is deprecated. Use `is_async` insteadASYNCTDEFAULT_TIMEOUT
SERIALIZER)rx   rz   ry   r{   r$   r|   )	r   r/   r   warningswarnDeprecationWarningr   rw   r!   )
r2   rx   ry   r$   rz   r    r{   r|   r+   r/   s
             r   	get_queuer      s     !zz'&'?QSef $<##GT2i(I ,**+<=#D)
D\%%l3
!&,<K	'	 	 	r   c                     ddl m} |t        |          } t        |      |d   t	        |d         |j                  dd      |d   j                  d            S )	zI
    Returns an rq Queue using parameters defined in ``QUEUES_LIST``
    r   QUEUES_LISTr2   connection_configr   Tr   )rz   ry   r|   )r   r   intr!   rI   r   indexr   r   s      r   get_queue_by_indexr      s`     &U$F"?6"v'/B(CDGT*-.22<@	 r   c                 F    ddl m} |t        |          }t        |d         S )zW
    Returns an rq-scheduler Scheduler using parameters defined in ``QUEUES_LIST``
    r   r   r2   )r   r   r   get_schedulerr   s      r   get_scheduler_by_indexr      s$     &U$F((r   c                 L    dt        fd| j                         D              S )zN
    Filters the queue params to keep only the connection related params.
    )rA   rC   rH   rK   rZ   r[   rN   rM   rW   rP   rB   rT   c              3   6   K   | ]  \  }}|v s||f  y wr8   r`   ).0pvCONNECTION_PARAMSs      r   	<genexpr>z+filter_connection_params.<locals>.<genexpr>   s!     T6AqQBS=SATs   	)dictitems)queue_paramsr   s    @r   filter_connection_paramsr      s'    " T\%7%7%9TTTr   c                     ddl m} t        |       dk  rt        | i |gS t	        |j                  dd            |d<   || d      }t        |      }t        | d   fi |g}| dd D ]  }t        |fi |}t        |      t        |d         urt        dj                  || d               |t        ||         k7  rt        dj                  || d               |j                  |        |S )zr
    Return queue instances from specified queue names.
    All instances must use the same Redis connection.
    r   r.   r{   Nr   zFQueues must have the same class."{0}" and "{1}" have different classeszUQueues must have the same redis connection."{0}" and "{1}" have different connections)r   r/   lenr   r   r%   r   type
ValueErrorformatappend)queue_namesr+   r/   r   connection_paramsqueuesr2   queues           r   
get_queuesr      s   
 !
;1 ;1&122 (

;(EFF;+a.)L0>A1&12F AB $)&);d6!9o-$$*F4Q$@ 
  8 FF((.t[^(D 
 	e  Mr   funcc                 >     t               j                  | g|i |S )z
    A convenience function to put a job in the default queue. Usage::

    from django_rq import enqueue
    enqueue(func, *args, **kwargs)
    )r   enqueue)r   r*   r+   s      r   r   r   %  s#     9;t5d5f55r   c                     | ddl m} |} g }| j                         D ]&  \  }}t        |      }||vs|j	                  |       ( |S )z@
    Returns a list of unique Redis connections from config
    r   r.   )r   r/   r   r   r   )r   r/   connection_configskeyvalues        r   get_unique_connection_configsr   /  sY     ~$lln -
U(/**%%e,- r   c                 x    ddl m} t        t         di       }||    j                  d|j                  d            S )zK
    Returns the result ttl from RQ_QUEUES if found, otherwise from RQ
    r   r.   r   DEFAULT_RESULT_TTL)r   r/   r   r   )r2   r/   r   s      r   r3   r3   @  s7     !	4	$B$<0"&&9M2NOOr   )	Schedulerc                   "     e Zd ZdZ fdZ xZS )DjangoSchedulerz
        Use settings ``DEFAULT_RESULT_TTL`` from ``RQ``
        and ``DEFAULT_TIMEOUT`` from ``RQ_QUEUES`` if configured.
        c                 ,   ddl m} |j                  d      6|j                  d      xs | j                  }||   j                  d      |d<   |j                  d      #t	        t         di       j                  d      |d<   t        t        |   |i |S )	Nr   r.   timeoutr0   r   r1   r   r   )r   r/   r   r0   r   r'   r   _create_jobr5   s        r   r   zDjangoScheduler._create_jobX  s    (zz)$,#ZZ5H
$*:$6$:$:;L$My!zz,'/'.xr'B'F'FG['\|$$;TLVLLr   )r:   r;   r<   r=   r   r>   r?   s   @r   r   r   R  s    	

	M 
	Mr   r   r   intervalc                     t        t        di       }|j                  dt              }t	        |t
              rt        |      }|t        |       }|t        | |      } || |||j                  |      S )zd
        Returns an RQ Scheduler instance using parameters defined in
        ``RQ_QUEUES``
        r   SCHEDULER_CLASS)rz   )r0   r   r   r{   rz   )
r   r   r   r   r   r   r   rw   r   r{   )r2   r   r   rz   r   scheduler_classs         r   r   r   d  su     XtR(&&!2ODos+.?O'-J=dz:Eheucm
 	
r   c                      t        d      )Nzrq_scheduler not installedr   )r*   r+   s     r   r   r     s    "#?@@r   )NN)F)defaultF)r   NNNNNNNr8   )r   )r   N<   N).r   typingr   r   r   r   r   ra   redis.sentinelr   rq.jobr	   rq.queuer
   rq.utilsr   django.confr   django.core.exceptionsr    r   jobsr   r   r!   r   rI   r   boolrc   rw   r   r   r   r   r   r   r   r   r3   rq_schedulerr   r   r   rh   r`   r   r   <module>r      s    7 7  #   %   7  &*1u 16AJ "	@
	@	@ [[	@ %)#!%(,8<15*
*c]* tn* 	*
 %* %T(^ 345* c49n-.* * * *Z)U0%P6( 6 6"P P
2A&M) M& $(,0	

!
 
 U[[)	

 

4  AAAs   "4D D"!D"