o
    _J@hG                  
   @   s   d dl Z d dlmZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZmZ zd dlmZ W n ey? Z zededZ[ww G dd	 d	eZdS )
    N)datetimetimezone)Job)BaseJobStoreConflictingIdErrorJobLookupError)datetime_to_utc_timestamp	maybe_refutc_timestamp_to_datetime)Etcd3Clientz(EtcdJobStore requires etcd3 be installedc                       s   e Zd ZdZdddejf fdd	Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )EtcdJobStorea  
    Stores jobs in a etcd. Any leftover keyword arguments are directly passed to
    etcd3's `etcd3.client
    <https://python-etcd3.readthedocs.io/en/latest/readme.html>`_.

    Plugin alias: ``etcd``

    :param str path: path to store jobs in
    :param client: a :class:`~etcd3.client.etcd3` instance to use instead of
        providing connection arguments
    :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the
        highest available
    z/apschedulerNFc                    sN   t    || _|| _|std|| _|rt|| _d S tdi || _d S )Nz&The "path" parameter must not be empty )	super__init__pickle_protocolclose_connection_on_exit
ValueErrorpathr	   clientr   )selfr   r   r   r   Zconnect_args	__class__r   M/var/www/html/venv/lib/python3.10/site-packages/apscheduler/jobstores/etcd.pyr   !   s   
zEtcdJobStore.__init__c                 C   sV   | j d t| }z| j|\}}t|}| |d }|W S  ty*   Y d S w )N/	job_state)r   strr   getpickleloads_reconstitute_jobBaseException)r   job_id	node_pathcontent_jobr   r   r   
lookup_job7   s   
zEtcdJobStore.lookup_jobc                    s"   t |  fdd|  D }|S )Nc                    s,   g | ]}|d  dur|d   kr|d qS )next_run_timeNr%   r   .0
job_record	timestampr   r   
<listcomp>C   s    z-EtcdJobStore.get_due_jobs.<locals>.<listcomp>)r   	_get_jobs)r   nowjobsr   r+   r   get_due_jobsA   s
   
zEtcdJobStore.get_due_jobsc                 C   s.   dd |   D }t|dkrtt|S d S )Nc                 S   s    g | ]}|d  dur|d  qS )r'   Nr   r(   r   r   r   r-   L   s
    z2EtcdJobStore.get_next_run_time.<locals>.<listcomp>r   )r.   lenr
   min)r   Z	next_runsr   r   r   get_next_run_timeK   s   zEtcdJobStore.get_next_run_timec                 C   s    dd |   D }| | |S )Nc                 S   s   g | ]}|d  qS )r%   r   r(   r   r   r   r-   T   s    z-EtcdJobStore.get_all_jobs.<locals>.<listcomp>)r.   Z_fix_paused_jobs_sorting)r   r0   r   r   r   get_all_jobsS   s   
zEtcdJobStore.get_all_jobsc                 C   sX   | j d t|j }t|j| d}t|| j}| j	j
||d}|s*t|jd S )Nr   r'   r   value)r   r   idr   r'   __getstate__r   dumpsr   r   Zput_if_not_existsr   )r   r%   r"   r8   datastatusr   r   r   add_jobX   s   
zEtcdJobStore.add_jobc                 C   s~   | j d t|j }t|j| d}t|| j}| j	j
| j	j|dkg| j	jj||dgg d\}}|s=t|jd S )Nr   r6   r   r7   comparesuccessZfailure)r   r   r9   r   r'   r:   r   r;   r   r   transactiontransactionsversionputr   )r   r%   r"   changesr<   r=   r$   r   r   r   
update_jobc   s   

zEtcdJobStore.update_jobc                 C   sT   | j d t| }| jj| jj|dkg| jj|gg d\}}|s(t|d S )Nr   r   r?   )r   r   r   rB   rC   rD   deleter   )r   r!   r"   r=   r$   r   r   r   
remove_jobr   s   
zEtcdJobStore.remove_jobc                 C   s   | j | j d S N)r   Zdelete_prefixr   r   r   r   r   remove_all_jobs|   s   zEtcdJobStore.remove_all_jobsc                 C   s   | j   d S rJ   )r   closerK   r   r   r   shutdown   s   zEtcdJobStore.shutdownc                 C   s,   |}t t }|| | j|_| j|_|S rJ   )r   __new____setstate__Z
_scheduler_aliasZ_jobstore_alias)r   r   r%   r   r   r   r      s   

zEtcdJobStore._reconstitute_jobc           	   	      s   g }g }t | j| j}|D ]<\}}zt|}|d | |d d}|| W q tyK   t|}|d d }|| | j	
d| Y qw |rX|D ]}| | qPtdddtjd	 t| fd
ddS )Nr'   r   )r'   r%   r9   z)Unable to restore job "%s" -- removing iti'        )tzinfoc                    s   | d j p S )Nr%   )r'   )r*   Zpaused_sort_keyr   r   <lambda>   s    z(EtcdJobStore._get_jobs.<locals>.<lambda>)key)listr   Z
get_prefixr   r   r   r   appendr    _logger	exceptionrI   r   r   utcsorted)	r   r0   Zfailed_job_idsZall_idsdocr$   r#   r*   Z	failed_idr   rU   r   r.      s4   



zEtcdJobStore._get_jobsc                 C   s.   | j d| jj| j d| jj d| j dS )Nz<%s (client=%s)><z	 (client=z)>)rZ   r[   r   __name__r   rK   r   r   r   __repr__   s   zEtcdJobStore.__repr__)r`   
__module____qualname____doc__r   DEFAULT_PROTOCOLr   r&   r1   r4   r5   r>   rG   rI   rL   rN   r   r.   ra   __classcell__r   r   r   r   r      s&    


r   )r   r   r   Zapscheduler.jobr   Zapscheduler.jobstores.baser   r   r   Zapscheduler.utilr   r	   r
   Zetcd3r   ImportErrorexcr   r   r   r   r   <module>   s    
