
    ]j                         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dlmZ  G d d      Zy)    )Iterable)Optional)uuid4)Redis)Pipeline   )Queue)NoSuchGroupError)Job)EnqueueData)as_textc                       e Zd ZdZdZdZddedee   fdZ	d Z
d	ee   d
efdZd Zddeded   d
ed   fdZdefdZdded
ed   fdZeddedee   fd       Zededefd       Zeddded    fd       Zededefd       Zedd       Zy)GroupzKA Group is a container for tracking multiple jobs with a single identifier.z	rq:group:z	rq:groupsN
connectionnamec                     |r|nt        t               j                        | _        || _        | j
                   | j                   | _        y N)strr   hexr   r   REDIS_GROUP_NAME_PREFIXkey)selfr   r   s      2/root/env/lib/python3.12/site-packages/rq/group.py__init__zGroup.__init__   s:     Dc%'++&6	$223DII;?    c                 "    d| j                    dS )Nz	Group(id=))r   )r   s    r   __repr__zGroup.__repr__   s    499+Q''r   jobspipelinec                      |j                   | j                  g|D cg c]  }|j                   c}  |j                  | j                  | j                         |j                          yc c}w )zAdd jobs to the groupN)saddr   idREDIS_GROUP_KEYr   execute)r   r   r    jobs       r   	_add_jobszGroup._add_jobs   sQ    dhh:D!9S#&&!9:d**DII6 ":s   A-
c                 8   | j                   j                         5 }t        | j                   j                  | j                              D cg c]  }t        |       }}|s
	 ddd       yg }|D ]&  }|j                  t        j                  |             ( |j                         }t        |      D ]  \  }}|r	|j                  ||           |r- |j                  | j                  g|  |j                          ddd       yc c}w # 1 sw Y   yxY w)zDelete jobs from the group's job registry that have been deleted or expired from Redis.
        We assume while running this that alive jobs have all been fetched from Redis in fetch_jobs methodN)r   r    listsmembersr   r   existsr   key_forr%   	enumerateappendsrem)r   piper&   job_idsexpired_job_idsresultsi
key_existss           r   cleanupzGroup.cleanup$   s     __%%' 	4/3DOO4L4LTXX4V/WXws|XGX	 	 !O .CKK,-.llnG!*7!3 7:!#**71:67 		$((5_5	 	X	 	s+   1DDD,AD=ADDDqueue	job_datasr   r   c                     |r|n| j                   j                         }|j                  || j                  |      }| j	                  ||       ||j                          |S )N)group_idr    )r    )r   r    enqueue_manyr   r'   r%   )r   r7   r8   r    r0   r   s         r   r;   zGroup.enqueue_many7   sW    #x)A)A)C!!)dii$!Otd+LLNr   returnc                    | j                          | j                  j                  | j                        D cg c]  }t	        |       }}t        j                  || j                        D cg c]  }||	 c}S c c}w c c}w )z4Retrieve list of job IDs from the group key in Redis)r6   r   r*   r   r   r   
fetch_many)r   r&   r1   s      r   get_jobszGroup.get_jobsC   sb    +/??+C+CDHH+MNC73<NN"~~gtG[3?[[ O[s   A=.B6Bjob_idc                     |r|n| j                   j                         }|j                  | j                  |       ||j	                          y y r   )r   r    r/   r   r%   )r   r@   r    r0   s       r   
delete_jobzGroup.delete_jobI   s>    #x)A)A)C		$((F#LLN r   c                      | ||      S )Nr   r    )clsr   r   s      r   createzGroup.createO   s    44r   c                      | ||      }|j                  t        j                  |j                              st        |S )z"Fetch an existing group from RedisrD   )r+   r   get_keyr   r
   )rF   r   r   groups       r   fetchzGroup.fetchS   s6     *5  uzz!:;""r   r   c                     |j                  | j                        D cg c]  }t        |       }}g }|D ]%  }	 |j                  | j	                  ||             ' |S c c}w # t
        $ r |j                  | j                  |       Y Vw xY w)z"Returns an iterable of all Groups.r   )r*   r$   r   r.   rK   r
   r/   )rF   r   r   
group_keysgroupss        r   allz	Group.all[   s     /9.A.A#BUBU.VWsgclW
W 	:C:cii
iCD	:
  X
 $ : 3 3S9:s   A "A%%%BBc                      | j                   |z   S )z9Return the Redis key of the set containing a group's jobs)r   )rF   r   s     r   rI   zGroup.get_keyg   s     **T11r   c                    t         j                  |      }|j                         5 }|D ]  }|j                           |j	                          |D ]  }|j                  |j                          |j	                         }g }t        |      D ]&  \  }}|r	|j                  ||   j                         ( |r |j                  | j                  g|  |j	                          ddd       y# 1 sw Y   yxY w)zLoop through groups and delete those that have been deleted.
        If group still has jobs in its registry, delete those that have expiredrM   N)r   rP   r    r6   r%   r+   r   r-   r.   r   r/   r$   )	rF   r   rO   prJ   r3   expired_group_idsr4   r5   s	            r   clean_registrieszGroup.clean_registriesl   s     j1  " 	a   IIK $#$iikG "!*7!3 =:!%,,VAY^^<= !s**?->?IIK	 	 	s   A/C/AC//C8r   )r   r   )__name__
__module____qualname____doc__r   r$   r   r   r   r   r   r   r   r   r'   r6   r	   r;   r)   r?   rB   classmethodrG   rK   rP   rI   rU   rE   r   r   r   r      s;   U)!O@5 @ @
(hsm x &
% 
H]4K 
W_`jWk 
\$ \ 0D  5 5Xc] 5 5  %   	W 	g 	 	 23 23 2 2  r   r   N)collections.abcr   typingr   uuidr   redisr   redis.clientr    r	   
exceptionsr
   r&   r   r7   r   utilsr   r   rE   r   r   <module>rc      s/    $    !  (   p pr   