o
    /i                     @   sj   d dl m Z mZmZ d dlmZmZ d dlmZ d dlm	Z	 er,ddl
mZ ddlmZ G dd	 d	Zd
S )    )datetime	timedeltatimezone)TYPE_CHECKINGOptional)Redis)now   )Queue)
BaseWorkerc                   @   s   e Zd ZdedefddZededefddZdedefd	d
Zdede	fddZ
dedee fddZdede	fddZdee fddZdeddfddZdddZdS )IntermediateQueue	queue_key
connectionc                 C   s   || _ | || _|| _d S )N)r   get_intermediate_queue_keykeyr   )selfr   r    r   U/var/www/html/flask_server/venv/lib/python3.10/site-packages/rq/intermediate_queue.py__init__   s   
zIntermediateQueue.__init__returnc                 C   s
   | dS )zReturns the intermediate queue key for a given queue key.

        Args:
            key (str): The queue key

        Returns:
            str: The intermediate queue key
        z:intermediater   )clsr   r   r   r   r      s   

z,IntermediateQueue.get_intermediate_queue_keyjob_idc                 C   s   | j  d| S )zReturns the first seen key for a given job ID.

        Args:
            job_id (str): The job ID

        Returns:
            str: The first seen key
        z:first_seen:)r   r   r   r   r   r   get_first_seen_key   s   	z$IntermediateQueue.get_first_seen_keyc                 C   s$   t | jj| |t  dddS )zSets the first seen timestamp for a job.

        Args:
            job_id (str): The job ID
            timestamp (float): The timestamp
        TiQ )nxex)boolr   setr   r   	timestampr   r   r   r   set_first_seen*   s   $z IntermediateQueue.set_first_seenc                 C   s.   | j | |}|rtjt|tjdS dS )zReturns the first seen timestamp for a job.

        Args:
            job_id (str): The job ID

        Returns:
            Optional[datetime]: The timestamp
        )tzN)r   getr   r   fromtimestampfloatr   utc)r   r   r   r   r   r   get_first_seen4   s   	z IntermediateQueue.get_first_seenc                 C   s&   |  |}|s	dS t | tddkS )a  Returns whether a job should be cleaned up.
        A job in intermediate queue should be cleaned up if it has been there for more than 1 minute.

        Args:
            job_id (str): The job ID

        Returns:
            bool: Whether the job should be cleaned up
        Fr	   )minutes)r%   r   r   )r   r   
first_seenr   r   r   should_be_cleaned_upB   s   
z&IntermediateQueue.should_be_cleaned_upc                 C   s   dd | j | jddD S )zlReturns the job IDs in the intermediate queue.

        Returns:
            List[str]: The job IDs
        c                 S   s   g | ]}|  qS r   )decode).0r   r   r   r   
<listcomp>X   s    z1IntermediateQueue.get_job_ids.<locals>.<listcomp>r   )r   lranger   )r   r   r   r   get_job_idsR   s   zIntermediateQueue.get_job_idsNc                 C   s   | j | jd| dS )zgRemoves a job from the intermediate queue.

        Args:
            job_id (str): The job ID
        r	   N)r   lremr   r   r   r   r   removeZ   s   zIntermediateQueue.removeworkerr   queuer
   c                 C   sj   |   }|D ],}||}||jvr2|s| | q| |r q| |r2|j||dd | | qd S )Nz$Job was stuck in intermediate queue.)
exc_string)r.   	fetch_jobstarted_job_registryr0   r   r(   handle_job_failure)r   r1   r2   job_idsr   jobr   r   r   cleanupb   s   





zIntermediateQueue.cleanup)r1   r   r2   r
   r   N)__name__
__module____qualname__strr   r   classmethodr   r   r   r   r   r   r%   r(   listr.   r0   r9   r   r   r   r   r      s    
r   N)r   r   r   typingr   r   redisr   rq.utilsr   r2   r
   r1   r   r   r   r   r   r   <module>   s    