o
    ®äe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ƒrƒt|dƒ| jd< t
|jpˆdƒ| 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   úO/var/www/html/env/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