o
    f4                     @   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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   sl  |pt  | _|j| _|j| _z|j| _W n |jy+   td| j | 	| Y nw zt
|jp2d| _t
|jp:d| _W n ty] } ztd| j| | 	| W Y d}~nd}~ww i | _dD ]}t||}|du roqc|| j|< qct|ddrt|d| jd< t
|jpd| jd	< |j| jd
< |j| _|| _|js|  |_| jjr|jtjdd |_|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priorityexpires_expiresheadersperiodic_task_namei*  )days)r   _get_current_objectappnametaskscheduleDoesNotExistloggererror_disabler   argskwargs
ValueError	exceptionoptionsgetattrr*   r"   modelr!   _default_now
start_timedatetime	timedelta)selfr<   r.   excoptionvalue rE   P/var/www/html/venv/lib/python3.10/site-packages/django_celery_beat/schedulers.py__init__/   sT   


zModelEntry.__init__c                 C   s   d|_ d|_|  d S )NTF)r#   enabledsave)rA   r<   rE   rE   rF   r5   b   s   zModelEntry._disablec                 C   s   | j js
tddS | j jd ur7|  }ttddr t|  }|| j jk r7t	
| j j|  }td|S | j jr\| j jr\| j jdkr\d| j _d| j _d| j _| j   tdtS | jj}t| j|}| j|S )NFg      @DJANGO_CELERY_BEAT_TZ_AWARETr   )r<   rH   r   
schedstater>   r=   r;   r	   r   mathceiltotal_secondsone_offr"   r#   rI   r   r.   timezoner!   
astimezoner1   is_due)rA   nowdelaytzlast_run_at_in_tzrE   rE   rF   rR   g   s*   
zModelEntry.is_duec                 C   s.   t tddrtj| jj}|S tj }|S )NrJ   T)r;   r	   r?   rS   r.   rP   utcnow)rA   rS   rE   rE   rF   r=      s
   
zModelEntry._default_nowc                 C   s0   |   | j_| j jd7  _d| j_| | jS )Nr   T)r=   r<   r!   r"   r#   	__class__rA   rE   rE   rF   __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)	typer<   _default_managergetr[   save_fieldssetattrr;   rI   )rA   objfieldrE   rE   rF   rI      s   
zModelEntry.savec                 C   sT   | j D ]\}}}t|}t||r!||}|  ||f  S qtd|d)NzCannot convert schedule type z	 to model)model_schedulesr   maybe_schedule
isinstancefrom_schedulerI   r8   )clsr1   schedule_type
model_typemodel_fieldmodel_schedulerE   rE   rF   to_model_schedule   s   



zModelEntry.to_model_schedulec                 K   s,   t jj|| jdi |d\}}| ||dS )N)r/   defaultsr.   rE   )r   r]   update_or_create_unpack_fields)rg   r/   r.   entryra   createdrE   rE   rF   
from_entry   s   
zModelEntry.from_entryc           
      K   sb   dd | j D }| |\}}	|||	< |j|ft|pg t|p i d| jdi |p*i  |S )Nc                 S   s   i | ]\}}}|d qS NrE   ).0_rj   rE   rE   rF   
<dictcomp>   s    z-ModelEntry._unpack_fields.<locals>.<dictcomp>)r6   r7   rE   )rc   rl   updater   _unpack_options)
rg   r1   r6   r7   relativer:   rq   entry_schedulesrk   rj   rE   rE   rF   rp      s   

zModelEntry._unpack_fieldsc                 K   s   ||||t |pi |dS )N)r$   r%   r&   r'   r*   expire_seconds)r   )rg   r$   r%   r&   r'   r*   r|   r7   rE   rE   rF   ry      s   
zModelEntry._unpack_optionsc                 C   s(   d t| j| jt| jt| j| jS )Nz!<ModelEntry: {} {}(*{}, **{}) {}>)formatr   r/   r0   r   r6   r7   r1   rY   rE   rE   rF   __repr__   s   zModelEntry.__repr__rt   )NNNN)NNNNNN)__name__
__module____qualname____doc__r   r   r   r1   r   r    r   r   r   rc   r_   rG   r5   rR   r=   rZ   nextrI   classmethodrl   rs   rp   ry   r~   rE   rE   rE   rF   r   $   s6    



3#		

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p$| jj	j
p$t| _dS )z"Initialize the database scheduler.r   )exitprioritymax_intervalN)set_dirtyr   rG   r   sync	_finalizer^   r.   confbeat_max_loop_intervalDEFAULT_MAX_INTERVALr   rA   r6   r7   rE   rE   rF   rG      s   
zDatabaseScheduler.__init__c                 C   s    |  | j | | jjj d S rt   )install_default_entriesr1   update_from_dictr.   r   beat_schedulerY   rE   rE   rF   setup_schedule   s   z DatabaseScheduler.setup_schedulec              	   C   sN   t d i }| jj D ]}z| j|| jd||j< W q ty$   Y qw |S )Nz-DatabaseScheduler: Fetching database schedulern   )debugModelobjectsrH   Entryr.   r/   r8   )rA   sr<   rE   rE   rF   all_as_schedule   s   z!DatabaseScheduler.all_as_schedulec              
   C   s   zt   zt  W n
 tjy   Y nw | j| j }}W n& ty8 } zt	d| W Y d }~dS d }~w t
yE   td Y dS w z|rW||rN|n|kr]W || _dS W || _dS W || _dS || _w )NzDatabase gave error: %rFzYDatabaseScheduler: InterfaceError in schedule_changed(), waiting to retry in next call...T)r   r   commitTransactionManagementError_last_timestampChangeslast_changer   r3   r9   r   warning)rA   lasttsrB   rE   rE   rF   schedule_changed   s:   
z"DatabaseScheduler.schedule_changedc                 C   s   t |}| j|j |S rt   )r   r   addr/   )rA   rq   	new_entryrE   rE   rF   reserve  s   zDatabaseScheduler.reservec              
   C   s  t tjr
td t }t }zsz0t  | jr@| j }z| j	| 
  || W n tttfy<   || Y nw | jsW n$ tyY } zt d| W Y d }~nd }~w tye   td Y nw W |  j|O  _d S W |  j|O  _d S W |  j|O  _d S |  j|O  _w )NzWriting entries...zDatabase error while sync: %rzMDatabaseScheduler: InterfaceError in sync(), waiting to retry in next call...)r3   isEnabledForloggingDEBUGr   r   r   r   pop	_schedulerI   r   KeyError	TypeErrorr
   r   r9   r   r   )rA   _tried_failedr/   rB   rE   rE   rF   r   $  s<   
"zDatabaseScheduler.syncc                 C   s   i }|  D ]5\}}z| jj|fd| ji|}|jjr |||< W q ty; } ztt	||| W Y d }~qd }~ww | j
| d S )Nr.   )itemsr   rs   r.   r<   rH   	Exceptionr3   r9   ADD_ENTRY_ERRORr1   rx   )rA   mappingr   r/   entry_fieldsrq   rB   rE   rE   rF   r   >  s    z"DatabaseScheduler.update_from_dictc              	   C   s>   i }| j jjr|ddtdddddid | | d S )Nzcelery.backend_cleanup04*r|   i  )r0   r1   r:   )r.   r   result_expires
setdefaultr   r   r   )rA   dataentriesrE   rE   rF   r   L  s   
z)DatabaseScheduler.install_default_entriesc                    s"   | j rd| _ dS t j|i |S )NF)_heap_invalidatedsuperschedules_equalr   rX   rE   rF   r   X  s   z!DatabaseScheduler.schedules_equalc                 C   s   d }}| j rtd d }}d| _ n
|  rtd d}|rF|   |  | _|s0g | _d| _t	
tjrFt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 rt   )repr)ru   rq   rE   rE   rF   	<genexpr>q  s    
z-DatabaseScheduler.schedule.<locals>.<genexpr>)_initial_readr   r   infor   r   r   _heapr   r3   r   r   r   joinvalues)rA   initialrx   rE   rE   rF   r1   ^  s&   

zDatabaseScheduler.schedule)r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   r   r   r   r   propertyr1   __classcell__rE   rE   r   rF   r      s(    

r   )4r   r?   r   rL   multiprocessing.utilr   celeryr   r   celery.beatr   r   celery.utils.logr   celery.utils.timer   django.confr	   django.core.exceptionsr
   	django.dbr   r   django.db.utilsr   r   kombu.utils.encodingr   r   kombu.utils.jsonr   r   clockedscheduler   modelsr   r   r   r   r   r   utilsr   r   r   r   r3   r   r   r   r   r   rE   rE   rE   rF   <module>   s2      7