o
    _J@h'                  
   @   s   d dl Z d dlmZm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yG Z zededZ[ww G d	d
 d
e	ZdS )    N)datetimetimezone)NodeExistsErrorNoNodeError)Job)BaseJobStoreConflictingIdErrorJobLookupError)datetime_to_utc_timestamp	maybe_refutc_timestamp_to_datetime)KazooClientz*ZooKeeperJobStore requires Kazoo installedc                       s   e Zd ZdZdddejf fdd	Zdd Z 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 )#ZooKeeperJobStorea  
    Stores jobs in a ZooKeeper tree. Any leftover keyword arguments are directly passed to
    kazoo's `KazooClient
    <http://kazoo.readthedocs.io/en/latest/api/client.html>`_.

    Plugin alias: ``zookeeper``

    :param str path: path to store jobs in
    :param client: a :class:`~kazoo.client.KazooClient` 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                    sR   t    || _|| _|std|| _|rt|| _ntdi || _d| _	d S )Nz&The "path" parameter must not be emptyF )
super__init__pickle_protocolclose_connection_on_exit
ValueErrorpathr   clientr   _ensured_path)selfr   r   r   r   Zconnect_args	__class__r   R/var/www/html/venv/lib/python3.10/site-packages/apscheduler/jobstores/zookeeper.pyr   #   s   

zZooKeeperJobStore.__init__c                 C   s   | j s
| j| j d| _ d S )NT)r   r   Zensure_pathr   r   r   r   r   _ensure_paths:   s   
zZooKeeperJobStore._ensure_pathsc                    s(   t  || | jjs| j  d S d S N)r   startr   	connected)r   Z	scheduleraliasr   r   r   r   ?   s   zZooKeeperJobStore.startc                 C   s^   |    | jd t| }z| j|\}}t|}| |d }|W S  ty.   Y d S w )N/	job_state)	r   r   strr   getpickleloads_reconstitute_jobBaseException)r   job_id	node_pathcontent_docjobr   r   r   
lookup_jobD   s   
zZooKeeperJobStore.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_def	timestampr   r   
<listcomp>Q   s    z2ZooKeeperJobStore.get_due_jobs.<locals>.<listcomp>)r
   	_get_jobs)r   nowjobsr   r5   r   get_due_jobsO   s
   
zZooKeeperJobStore.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 )r1   Nr   r2   r   r   r   r7   Z   s
    z7ZooKeeperJobStore.get_next_run_time.<locals>.<listcomp>r   )r8   lenr   min)r   Z	next_runsr   r   r   get_next_run_timeY   s   z#ZooKeeperJobStore.get_next_run_timec                 C   s    dd |   D }| | |S )Nc                 S   s   g | ]}|d  qS )r/   r   r2   r   r   r   r7   b   s    z2ZooKeeperJobStore.get_all_jobs.<locals>.<listcomp>)r8   Z_fix_paused_jobs_sorting)r   r:   r   r   r   get_all_jobsa   s   
zZooKeeperJobStore.get_all_jobsc                 C   n   |    | jd t|j }t|j| d}t|| j	}z| j
j||d W d S  ty6   t|jw Nr"   )r1   r#   )value)r   r   r$   idr
   r1   __getstate__r&   dumpsr   r   creater   r   )r   r/   r+   rB   datar   r   r   add_jobf      
zZooKeeperJobStore.add_jobc                 C   r@   rA   )r   r   r$   rC   r
   r1   rD   r&   rE   r   r   setr   r	   )r   r/   r+   changesrG   r   r   r   
update_jobs   rI   zZooKeeperJobStore.update_jobc                 C   sD   |    | jd t| }z	| j| W d S  ty!   t|w )Nr"   )r   r   r$   r   deleter   r	   )r   r*   r+   r   r   r   
remove_job   s   zZooKeeperJobStore.remove_jobc                 C   s4   z| j j| jdd W n	 ty   Y nw d| _d S )NT)	recursiveF)r   rM   r   r   r   r   r   r   r   remove_all_jobs   s   
z!ZooKeeperJobStore.remove_all_jobsc                 C   s"   | j r| j  | j  d S d S r   )r   r   stopcloser   r   r   r   shutdown   s   
zZooKeeperJobStore.shutdownc                 C   s,   |}t t }|| | j|_| j|_|S r   )r   __new____setstate__Z
_scheduler_aliasZ_jobstore_alias)r   r#   r/   r   r   r   r(      s   

z#ZooKeeperJobStore._reconstitute_jobc              	      s   |    g }g }| j| j}|D ]J}z3| jd | }| j|\}}t|}||d r1|d nd |d | |d |jd}	|	|	 W q t
y[   | jd| |	| Y qw |rh|D ]}
| |
 q`tdddtjd	 t| fd
ddS )Nr"   r1   r#   )r*   r1   r#   r/   creation_timez)Unable to restore job "%s" -- removing iti'        )tzinfoc                    s   | d j p | d fS )Nr/   rW   )r1   )r4   Zpaused_sort_keyr   r   <lambda>   s   z-ZooKeeperJobStore._get_jobs.<locals>.<lambda>)key)r   r   Zget_childrenr   r%   r&   r'   r(   ctimeappendr)   _logger	exceptionrN   r   r   utcsorted)r   r:   Zfailed_job_idsZall_idsZ	node_namer+   r,   r-   r.   r4   Z	failed_idr   r[   r   r8      s@   

	
zZooKeeperJobStore._get_jobsc                 C   s.   | j d| jj| j d| jj d| j dS )Nz<%s (client=%s)><z	 (client=z)>)r`   ra   r   __name__r   r   r   r   r   __repr__   s   zZooKeeperJobStore.__repr__)re   
__module____qualname____doc__r&   HIGHEST_PROTOCOLr   r   r   r0   r;   r>   r?   rH   rL   rN   rP   rS   r(   r8   rf   __classcell__r   r   r   r   r      s*    
'r   )r&   r   r   Zkazoo.exceptionsr   r   Zapscheduler.jobr   Zapscheduler.jobstores.baser   r   r	   Zapscheduler.utilr
   r   r   Zkazoo.clientr   ImportErrorexcr   r   r   r   r   <module>   s    
