
    s,gs                         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	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)    )List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d
ed   f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                        | _        || _        dj                  | j                  | j                        | _        y )Nz{0}{1})strr   hexr   r   formatREDIS_GROUP_NAME_PREFIXkey)selfr   r   s      b/var/www/trellinator.diamondhoofcare.com/public_html/venv/lib/python3.12/site-packages/rq/group.py__init__zGroup.__init__   s;     Dc%'++&6	$??4#?#?K    c                 8    dj                  | j                        S )NzGroup(id={}))r   r   )r   s    r   __repr__zGroup.__repr__   s    $$TYY//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-
r   c                    |r|n| j                   j                         }t        | j                   j                  | j                              D cg c]  }t        |       }}g }|D ]&  }|j                  t        j                  |             ( |j                         }t        |      D ]  \  }}|r	|j                  ||           |r |j                  | j                  g|  ||j                          yyc c}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   r   piper%   job_idsexpired_job_idsresultsi
key_existss	            r   cleanupzGroup.cleanup"   s     $x)A)A)C+/0H0H0R+STC73<TT 	*CKKC()	*,,.&w/ 	3MAz&&wqz2	3 DIIdhh11LLN  Us   C=queue	job_datasr   c                     |r|n| j                   j                         }|j                  || j                  |      }| j	                  ||       ||j                          |S )N)group_idr   r   )r   r   enqueue_manyr   r&   r$   )r   r6   r7   r   r/   r   s         r   r;   zGroup.enqueue_many4   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)r5   r   r)   r   r   r   
fetch_many)r   r%   r0   s      r   get_jobszGroup.get_jobs@   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 N)r   r   r.   r   r$   )r   r@   r   r/   s       r   
delete_jobzGroup.delete_jobF   s>    #x)A)A)C		$((F#LLN r   c                      | ||      S )Nr   r    )clsr   r   s      r   createzGroup.createL   s    44r   c                      | ||      }|j                  t        j                  |j                              st        |S )z"Fetch an existing group from RedisrE   )r*   r   get_keyr   r
   )rG   r   r   groups       r   fetchzGroup.fetchP   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 Groupes.r   )r)   r#   r   r-   rL   r
   r.   )rG   r   r   
group_keysgroupss        r   allz	Group.allX   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   )rG   r   s     r   rJ   zGroup.get_keyd   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 expiredrN   r:   N)r   rQ   r   r5   r$   r*   r   r,   r-   r   r.   r#   )	rG   r   rP   prK   r2   expired_group_idsr3   r4   s	            r   clean_registrieszGroup.clean_registriesi   s     j1  " 	a *q)*IIK $#$iikG "!*7!3 =:!%,,VAY^^<= !s**?->?IIK	 	 	s   A1C1AC11C:rB   )r   r   )__name__
__module____qualname____doc__r   r#   r   r   r   r   r   r   r   r   r&   r5   r	   r;   r(   r?   rC   classmethodrH   rL   rQ   rJ   rV   rF   r   r   r   r      sG   U)!OL5 L L
0d3i 8  4 $
% 
D4G 
S[\fSg 
\$ \ 0D  5 5Xc] 5 5  %   	W 	g 	 	 23 23 2 2  r   r   N)typingr   r   uuidr   redisr   redis.clientr    r	   
exceptionsr
   r%   r   r6   r   utilsr   r   rF   r   r   <module>rc      s,    !   !  (   o or   