U
    cc2                     @   s:  d Z ddlZddlZddlZddlm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 ddlmZ dd	lmZ dd
lmZmZ ddlmZm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%m&Z&m'Z'm(Z( ddl)m*Z* dZ+dZ,ee-Z.e.j/e.j0e.j1  Z/Z0Z1G dd de
Z2G dd deZ3dS )zBeat Scheduler Implementation.    N)Finalize)current_app	schedules)ScheduleEntry	Scheduler)
get_logger)maybe_make_aware)settings)ObjectDoesNotExist)close_old_connectionstransaction)DatabaseErrorInterfaceError)	safe_reprsafe_str)dumpsloads   )clocked)ClockedScheduleCrontabScheduleIntervalSchedulePeriodicTaskPeriodicTasksSolarSchedule)NEVER_CHECK_TIMEOUT   z;Cannot add entry %r to database schedule: %r. Contents: %r
c                   @   s   e Zd ZdZejedfejedfej	e
dfeedffZdddgZd d
dZdd Zdd Zdd Zdd ZeZdd Zedd Zed!ddZed"ddZed#ddZdd Zd	S )$
ModelEntryz(Scheduler entry taken from database row.crontabintervalsolarr   last_run_attotal_run_count
no_changesNc              
   C   sV  |p
t  | _|j| _|j| _z|j| _W n. |jk
rX   td| j | 	| Y nX z$t
|jpfd| _t
|jpvd| _W n< tk
r } ztd| j| | 	| W 5 d}~X Y nX i | _dD ]"}t||}|dkrq|| j|< qt|ddrt|d| jd< t
|jpd| jd	< |j| jd
< |j| _|| _|jsJ|  |_|j| _dS )zInitialize the model entry.z4Disabling schedule %s that was removed from databasez[]z{}z:Removing schedule %s for argument deseralization error: %rN)queueexchangerouting_keypriorityZexpires_expiresheadersZperiodic_task_name)r   Z_get_current_objectappnametaskscheduleZDoesNotExistloggererror_disabler   argskwargs
ValueError	exceptionoptionsgetattrr)   r"   modelr!   _default_now)selfr7   r*   excoptionvalue r=   W/var/www/html/project/venv/lib/python3.8/site-packages/django_celery_beat/schedulers.py__init__/   sH     

zModelEntry.__init__c                 C   s   d|_ d|_|  d S )NTF)r#   enabledsave)r9   r7   r=   r=   r>   r0   [   s    zModelEntry._disablec                 C   s   | j jstddS | j jd k	rn|  }ttddr@t|  }|| j jk rnt	
| j j|  }td|S | j jr| j jr| j jdkrd| j _d| j _d| j _| j   tdtS | jj}t| j|}| j|S )NFg      @DJANGO_CELERY_BEAT_TZ_AWARETr   )r7   r@   r   Z
schedstate
start_timer8   r6   r	   r   mathceiltotal_secondsZone_offr"   r#   rA   r   r*   timezoner!   
astimezoner-   is_due)r9   nowdelaytzZlast_run_at_in_tzr=   r=   r>   rI   `   s,    

zModelEntry.is_duec                 C   s,   t tddrtj| jj}n
tj }|S )NrB   T)r6   r	   datetimerJ   r*   rG   utcnow)r9   rJ   r=   r=   r>   r8      s    
zModelEntry._default_nowc                 C   s0   |   | j_| j jd7  _d| j_| | jS )Nr   T)r8   r7   r!   r"   r#   	__class__r9   r=   r=   r>   __next__   s    zModelEntry.__next__c                 C   sD   t | jjj| jjd}| jD ]}t||t| j| q|  d S )N)pk)	typer7   _default_managergetrR   save_fieldssetattrr6   rA   )r9   objfieldr=   r=   r>   rA      s    
zModelEntry.savec                 C   sX   | j D ]<\}}}t|}t||r||}|  ||f  S qtd|dd S )NzCannot convert schedule type z	 to model)model_schedulesr   Zmaybe_schedule
isinstanceZfrom_schedulerA   r3   )clsr-   Zschedule_typeZ
model_typemodel_fieldmodel_scheduler=   r=   r>   to_model_schedule   s    



zModelEntry.to_model_schedulec                 K   s(   t jj|| jf |d\}}| ||dS )N)r+   defaultsr*   )r   rT   Zupdate_or_create_unpack_fields)r\   r+   r*   entryrX   createdr=   r=   r>   
from_entry   s
     

zModelEntry.from_entryc           
      K   s^   dd | j D }| |\}}	|||	< |j|ft|p6g t|p@i d| jf |pRi  |S )Nc                 S   s   i | ]\}}}|d qS Nr=   ).0_r]   r=   r=   r>   
<dictcomp>   s     z-ModelEntry._unpack_fields.<locals>.<dictcomp>)r1   r2   )rZ   r_   updater   _unpack_options)
r\   r-   r1   r2   relativer5   rc   Zentry_schedulesr^   r]   r=   r=   r>   rb      s    

zModelEntry._unpack_fieldsc                 K   s   ||||t |pi |dS )N)r$   r%   r&   r'   r)   expire_seconds)r   )r\   r$   r%   r&   r'   r)   rm   r2   r=   r=   r>   rk      s    
zModelEntry._unpack_optionsc                 C   s(   d t| j| jt| jt| j| jS )Nz!<ModelEntry: {} {}(*{}, **{}) {}>)formatr   r+   r,   r   r1   r2   r-   rP   r=   r=   r>   __repr__   s       zModelEntry.__repr__)N)N)NNNN)NNNNNN)__name__
__module____qualname____doc__r   r   r   r-   r   r    r   r   r   rZ   rV   r?   r0   rI   r8   rQ   nextrA   classmethodr_   re   rb   rk   ro   r=   r=   r=   r>   r   $   s>   




,#		

             r   c                       s   e Zd ZdZeZeZeZ	dZ
dZdZ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 fddZedd Z  ZS )DatabaseSchedulerzDatabase-backed Beat Scheduler.NTFc                 O   sJ   t  | _tj| f|| t| | jdd| _|dpB| jj	j
pBt| _dS )z"Initialize the database scheduler.r   )Zexitprioritymax_intervalN)set_dirtyr   r?   r   sync	_finalizerU   r*   confZbeat_max_loop_intervalDEFAULT_MAX_INTERVALrw   r9   r1   r2   r=   r=   r>   r?      s    
zDatabaseScheduler.__init__c                 C   s    |  | j | | jjj d S rf   )install_default_entriesr-   update_from_dictr*   r|   Zbeat_schedulerP   r=   r=   r>   setup_schedule   s    z DatabaseScheduler.setup_schedulec              	   C   sR   t d i }| jj D ]4}z| j|| jd||j< W q tk
rJ   Y qX q|S )Nz-DatabaseScheduler: Fetching database schedulera   )debugModelobjectsr@   Entryr*   r+   r3   )r9   sr7   r=   r=   r>   all_as_schedule   s    z!DatabaseScheduler.all_as_schedulec              
   C   s   z@t   zt  W n tjk
r*   Y nX | j| j  }}W nP tk
rt } zt	d| W Y dS d }~X Y n t
k
r   td Y dS X z |r||r|n|krW dS W 5 || _X dS )NzDatabase gave error: %rFzYDatabaseScheduler: InterfaceError in schedule_changed(), waiting to retry in next call...T)r   r   commitZTransactionManagementError_last_timestampChangesZlast_changer   r.   r4   r   warning)r9   lasttsr:   r=   r=   r>   schedule_changed   s(    z"DatabaseScheduler.schedule_changedc                 C   s   t |}| j|j |S rf   )rt   ry   addr+   )r9   rc   Z	new_entryr=   r=   r>   reserve  s    zDatabaseScheduler.reservec              
   C   s   t tjrtd t }t }zz\t  | jr|| j }z| j	| 
  || W q* ttfk
rx   || Y q*X q*W nH tk
r } zt d| W 5 d }~X Y n tk
r   td Y nX W 5 |  j|O  _X d S )NzWriting entries...zDatabase error while sync: %rzMDatabaseScheduler: InterfaceError in sync(), waiting to retry in next call...)r.   isEnabledForloggingDEBUGr   rx   ry   r   popr-   rA   r   KeyErrorr
   r   r4   r   r   )r9   Z_triedZ_failedr+   r:   r=   r=   r>   rz     s(    
zDatabaseScheduler.syncc                 C   s   i }|  D ]j\}}z.| jj|fd| ji|}|jjr@|||< W q tk
rt } ztt	||| W 5 d }~X Y qX q| j
| d S )Nr*   )itemsr   re   r*   r7   r@   	Exceptionr.   r4   ADD_ENTRY_ERRORr-   rj   )r9   mappingr   r+   Zentry_fieldsrc   r:   r=   r=   r>   r   7  s    $z"DatabaseScheduler.update_from_dictc              	   C   s>   i }| j jjr0|ddtdddddid | | d S )Nzcelery.backend_cleanup04*rm   i  )r,   r-   r5   )r*   r|   Zresult_expires
setdefaultr   r   r   )r9   dataentriesr=   r=   r>   r   E  s    
z)DatabaseScheduler.install_default_entriesc                    s   | j rd| _ dS t j||S )NF)_heap_invalidatedsuperschedules_equalr~   rO   r=   r>   r   Q  s    z!DatabaseScheduler.schedules_equalc                 C   s   d }}| j r&td d }}d| _ n|  r:td d}|r|   |  | _|s`g | _d| _t	
tjrtdddd | j D  | jS )	NFzDatabaseScheduler: initial readTz$DatabaseScheduler: Schedule changed.zCurrent schedule:
%s
c                 s   s   | ]}t |V  qd S rf   )repr)rg   rc   r=   r=   r>   	<genexpr>j  s    z-DatabaseScheduler.schedule.<locals>.<genexpr>)_initial_readr   r   inforz   r   	_scheduleZ_heapr   r.   r   r   r   joinvalues)r9   initialrj   r=   r=   r>   r-   W  s&    

zDatabaseScheduler.schedule)rp   rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r?   r   r   r   r   rz   r   r   r   propertyr-   __classcell__r=   r=   r   r>   rv      s&   

rv   )4rs   rM   r   rD   Zmultiprocessing.utilr   Zceleryr   r   Zcelery.beatr   r   Zcelery.utils.logr   Zcelery.utils.timer   Zdjango.confr	   Zdjango.core.exceptionsr
   Z	django.dbr   r   Zdjango.db.utilsr   r   Zkombu.utils.encodingr   r   Zkombu.utils.jsonr   r   Zclockedscheduler   modelsr   r   r   r   r   r   utilsr   r}   r   rp   r.   r   r   r   r   rv   r=   r=   r=   r>   <module>   s0     0