o
    /i                     @   s   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 dZdS )    )Iterable)Optional)uuid4)Redis)Pipeline   )Queue)NoSuchGroupError)Job)EnqueueDataas_textc                   @   s  e Zd ZdZdZdZd(dedee fddZ	d	d
 Z
dee defddZdd Zd(deded ded fddZdefddZd(deded fddZed(dedee fddZededefdd Zedd!ded  fd"d#Zededefd$d%Zed)d&d'ZdS )*GroupzKA Group is a container for tracking multiple jobs with a single identifier.z	rq:group:z	rq:groupsN
connectionnamec                 C   s2   |r|nt t j| _|| _| j | j | _d S N)strr   hexr   r   REDIS_GROUP_NAME_PREFIXkey)selfr   r    r   H/var/www/html/flask_server/venv/lib/python3.10/site-packages/rq/group.py__init__   s   zGroup.__init__c                 C   s   d| j  dS )Nz	Group(id=))r   )r   r   r   r   __repr__   s   zGroup.__repr__jobspipelinec                 C   s:   |j | jgdd |D R   | | j| j |  dS )zAdd jobs to the groupc                 S   s   g | ]}|j qS r   )id.0jobr   r   r   
<listcomp>    s    z#Group._add_jobs.<locals>.<listcomp>N)saddr   REDIS_GROUP_KEYr   execute)r   r   r   r   r   r   	_add_jobs   s   zGroup._add_jobsc                 C   s   | j  _}dd t| j | jD }|s	 W d   dS g }|D ]
}|t| q#| }t	|D ]\}}|sC|
||  q6|r\|j| jg|R   |  W d   dS W d   dS 1 sgw   Y  dS )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 methodc                 S      g | ]}t |qS r   r   r   r   r   r   r"   (       z!Group.cleanup.<locals>.<listcomp>N)r   r   listsmembersr   existsr
   key_forr%   	enumerateappendsrem)r   pipejob_idsexpired_job_idsr!   resultsi
key_existsr   r   r   cleanup$   s&   
"zGroup.cleanupqueue	job_datasr   r   c                 C   sF   |r|n| j  }|j|| j|d}| j||d |d u r!|  |S )N)group_idr   )r   )r   r   enqueue_manyr   r&   r%   )r   r7   r8   r   r0   r   r   r   r   r:   7   s   zGroup.enqueue_manyreturnc                 C   s8   |    dd | j| jD }dd t|| jD S )z4Retrieve list of job IDs from the group key in Redisc                 S   r'   r   r   r   r   r   r   r"   F   r(   z"Group.get_jobs.<locals>.<listcomp>c                 S   s   g | ]}|d ur|qS r   r   r   r   r   r   r"   G   s    )r6   r   r*   r   r
   
fetch_many)r   r1   r   r   r   get_jobsC   s   zGroup.get_jobsjob_idc                 C   s8   |r|n| j  }|| j| |d u r|  d S d S r   )r   r   r/   r   r%   )r   r>   r   r0   r   r   r   
delete_jobI   s
   zGroup.delete_jobc                 C   s   | ||dS )Nr   r   r   )clsr   r   r   r   r   createO   s   zGroup.createc                 C   s&   | ||d}| t|jst|S )z"Fetch an existing group from Redisr@   )r+   r   get_keyr   r	   )rA   r   r   groupr   r   r   fetchS   s   zGroup.fetchr   c              	   C   s`   dd | | jD }g }|D ]}z|| j||d W q ty-   || j| Y qw |S )z"Returns an iterable of all Groups.c                 S   r'   r   r   )r    r   r   r   r   r"   ^   r(   zGroup.all.<locals>.<listcomp>r   )r*   r$   r.   rE   r	   r/   )rA   r   
group_keysgroupsr   r   r   r   all[   s   z	Group.allc                 C   s
   | j | S )z9Return the Redis key of the set containing a group's jobs)r   )rA   r   r   r   r   rC   g   s   
zGroup.get_keyc           	      C   s   t j|d}| J}|D ]}|  q|  |D ]}||j q| }g }t|D ]\}}|s;||| j	 q-|rH|j
| jg|R   |  W d   dS 1 sWw   Y  dS )zLoop through groups and delete those that have been deleted.
        If group still has jobs in its registry, delete those that have expiredrF   N)r   rI   r   r6   r%   r+   r   r-   r.   r   r/   r$   )	rA   r   rH   prD   r3   expired_group_idsr4   r5   r   r   r   clean_registriesl   s"   


"zGroup.clean_registriesr   )r   r   )__name__
__module____qualname____doc__r   r$   r   r   r   r   r   r   r
   r   r&   r6   r   r:   r)   r=   r?   classmethodrB   rE   rI   rC   rL   r   r   r   r   r      s*     r   N)collections.abcr   typingr   uuidr   redisr   redis.clientr    r   
exceptionsr	   r!   r
   r7   r   utilsr   r   r   r   r   r   <module>   s   