a
    xd2                     @   sB  d Z ddlZddlZddl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 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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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)	SchedulerScheduleEntry)
get_logger)maybe_make_aware)safe_str	safe_repr)dumpsloads)settings)transactionclose_old_connections)DatabaseErrorInterfaceError)ObjectDoesNotExist   )PeriodicTaskPeriodicTasksCrontabScheduleIntervalScheduleSolarScheduleClockedSchedule)clocked)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g d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   sJ  |p
t  | _|j| _|j| _z|j| _W n, |jyV   td| j | 	| Y n0 z$t
|jpdd| _t
|jptd| _W n> ty } z&td| j| | 	| W Y d}~n
d}~0 0 i | _dD ]"}t||}|du rq|| j|< qt|ddrt|d| jd< t
|jpd| jd	< |j| _|| _|js>|  |_|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headers)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=   U/var/www/html/Ranjet/env/lib/python3.9/site-packages/django_celery_beat/schedulers.py__init__6   sD     

zModelEntry.__init__c                 C   s   d|_ d|_|  d S )NTF)r#   enabledsave)r9   r7   r=   r=   r>   r0   a   s    zModelEntry._disablec                 C   s   | j jstddS | j jd u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   f   s,    

zModelEntry.is_duec                 C   s:   t tddr,| j }|j|jd d}n
tj }|S )NrB   T)tzinfo)	r6   r   r*   rJ   rM   Zlocalizereplacedatetime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getrT   save_fieldssetattrr6   rA   )r9   objfieldr=   r=   r>   rA      s    
zModelEntry.savec                 C   sV   | j D ]<\}}}t|}t||r||}|  ||f  S qtd|d S )Nz+Cannot convert schedule type {0!r} to model)model_schedulesr   Zmaybe_schedule
isinstanceZfrom_schedulerA   r3   format)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 i |d|dS )N)r+   defaultsr*   )r   rV   Zupdate_or_create_unpack_fields)r_   r+   r*   entryr=   r=   r>   
from_entry   s
    zModelEntry.from_entryc           	      K   sN   |  |\}}|j||ift|p"g t|p,i d| jf i |p@i  |S )N)r1   r2   )rb   updater   _unpack_options)	r_   r-   r1   r2   relativer5   rf   ra   r`   r=   r=   r>   re      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)   rk   r2   r=   r=   r>   ri      s    
zModelEntry._unpack_optionsc                 C   s(   d t| j| jt| jt| j| jS )Nz&<ModelEntry: {0} {1}(*{2}, **{3}) {4}>)r^   r	   r+   r,   r
   r1   r2   r-   rR   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   r\   rX   r?   r0   rI   r8   rS   nextrA   classmethodrb   rg   re   ri   rl   r=   r=   r=   r>   r   +   s4   



+#	

   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   sP   t  | _tj| g|R i | t| | jdd| _|dpH| jj	j
pHt| _dS )z"Initialize the database scheduler.r   )Zexitprioritymax_intervalN)set_dirtyr   r?   r   syncZ	_finalizerW   r*   confZbeat_max_loop_intervalDEFAULT_MAX_INTERVALrt   r9   r1   r2   r=   r=   r>   r?      s    
zDatabaseScheduler.__init__c                 C   s    |  | j | | jjj d S N)install_default_entriesr-   update_from_dictr*   rx   Zbeat_schedulerR   r=   r=   r>   setup_schedule   s    z DatabaseScheduler.setup_schedulec              	   C   sP   t d i }| jj D ]2}z| j|| jd||j< W q tyH   Y q0 q|S )Nz-DatabaseScheduler: Fetching database schedulerd   )debugModelZ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y(   Y n0 | j| j  }}W nL typ } zt	d| W Y d }~dS d }~0  t
y   td Y dS 0 z*|r||r|n|krW || _dS W || _n|| _0 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 r{   )rq   rv   addr+   )r9   rf   Z	new_entryr=   r=   r>   reserve  s    zDatabaseScheduler.reservec              
   C   s   t tjrtd t }t }zzZt  | jrz| j }z| j	| 
  || W q* ttfyv   || Y q*0 q*W nH ty } zt d| W Y d }~n"d }~0  ty   td Y n0 W |  j|O  _n|  j|O  _0 d S )NzWriting entries...zDatabase error while sync: %rzMDatabaseScheduler: InterfaceError in sync(), waiting to retry in next call...)r.   isEnabledForloggingDEBUGr   ru   r   rv   popr-   rA   r   KeyErrorr   r   r4   r   r   )r9   Z_triedZ_failedr+   r:   r=   r=   r>   rw   "  s(    
 zDatabaseScheduler.syncc                 C   s   i }|  D ]l\}}z.| jj|fd| ji|}|jjr@|||< W q tyv } ztt	||| W Y d }~qd }~0 0 q| j
| d S )Nr*   )itemsr   rg   r*   r7   r@   	Exceptionr.   r4   ADD_ENTRY_ERRORr-   rh   )r9   mappingr   r+   Zentry_fieldsrf   r:   r=   r=   r>   r}   <  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*rk   i  )r,   r-   r5   )r*   rx   Zresult_expires
setdefaultr   r   r}   )r9   dataentriesr=   r=   r>   r|   J  s    
z)DatabaseScheduler.install_default_entriesc                    s"   | j rd| _ dS t j|i |S )NF)_heap_invalidatedsuperschedules_equalrz   rQ   r=   r>   r   V  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 r{   )repr).0rf   r=   r=   r>   	<genexpr>o  s   z-DatabaseScheduler.schedule.<locals>.<genexpr>)_initial_readr   r   inforw   r   	_scheduleZ_heapr   r.   r   r   r   joinvalues)r9   initialrh   r=   r=   r>   r-   \  s&    

zDatabaseScheduler.schedule)rm   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r?   r~   r   r   r   rw   r}   r|   r   propertyr-   __classcell__r=   r=   r   r>   rs      s&   

rs   )4rp   rO   r   rD   Zmultiprocessing.utilr   Zceleryr   r   Zcelery.beatr   r   Zcelery.utils.logr   Zcelery.utils.timer   Zkombu.utils.encodingr	   r
   Zkombu.utils.jsonr   r   Zdjango.confr   Z	django.dbr   r   Zdjango.db.utilsr   r   Zdjango.core.exceptionsr   modelsr   r   r   r   r   r   Zclockedscheduler   utilsr   ry   r   rm   r.   r   r   r   r   rs   r=   r=   r=   r>   <module>   s2     .