o
    wvXjò2  ã                   @   sf  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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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( zddlm)Z) W n e*y�   ddl+m)Z) Y nw dZ,dZ-ee.ƒZ/e/j0e/j1e/j2Z0Z1Z2G dd„ deƒZ3G dd„ de
ƒZ4dS )zBeat Scheduler Implementation.é    N)ÚFinalize)Úcurrent_app)Ú	schedules)Ú	SchedulerÚScheduleEntry)Úsafe_strÚ	safe_repr)Ú
get_logger)Úmaybe_make_aware)ÚdumpsÚloads)Úsettings)ÚtransactionÚclose_old_connections)ÚDatabaseErrorÚInterfaceError)ÚObjectDoesNotExisté   )ÚPeriodicTaskÚPeriodicTasksÚCrontabScheduleÚIntervalScheduleÚSolarScheduleÚClockedSchedule)Úclocked)Úis_naiveé   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   sD  |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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ÚpriorityÚexpires_ÚexpiresÚheaders)r   Ú_get_current_objectÚappÚnameÚtaskÚscheduleÚDoesNotExistÚloggerÚerrorÚ_disabler   ÚargsÚkwargsÚ
ValueErrorÚ	exceptionÚoptionsÚgetattrr*   r"   Úmodelr!   Ú_default_now)Úselfr:   r,   ÚexcÚoptionÚvalue© r@   úZ/var/www/html/myproject/venv/lib/python3.10/site-packages/django_celery_beat/schedulers.pyÚ__init__9   sJ   þûþ€û

zModelEntry.__init__c                 C   s   d|_ d|_| ¡  d S )NTF)r#   ÚenabledÚsave)r<   r:   r@   r@   rA   r3   d   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d ¡S | jj}t| jƒ |¡}| j |¡S )NFg      @ÚDJANGO_CELERY_BEAT_TZ_AWARETr   )r:   rC   r   Ú
schedstateÚ
start_timer;   r9   r   r
   ÚmathÚceilÚtotal_secondsÚone_offr"   r#   rD   r,   Útimezoner!   Ú
astimezoner/   Úis_due)r<   ÚnowÚdelayÚtzÚlast_run_at_in_tzr@   r@   rA   rN   i   s*   ÿ
zModelEntry.is_duec                 C   s<   t tddƒr| j ¡ }|j |jd d�¡}|S tj ¡ }|S )NrE   T)Útzinfo)	r9   r   r,   rO   rS   ÚlocalizeÚreplaceÚdatetimeÚutcnow)r<   rO   r@   r@   rA   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__©r<   r@   r@   rA   Ú__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Úsetattrr9   rD   )r<   ÚobjÚfieldr@   r@   rA   rD   Ÿ   s   
zModelEntry.savec                 C   sR   | j D ]\}}}t |¡}t||ƒr!| |¡}| ¡  ||f  S qtd |¡ƒ‚)Nz+Cannot convert schedule type {0!r} to model)Úmodel_schedulesr   Úmaybe_scheduleÚ
isinstanceÚfrom_schedulerD   r6   Úformat)Úclsr/   Úschedule_typeÚ
model_typeÚmodel_fieldÚmodel_scheduler@   r@   rA   Úto_model_schedule¨   s   


ýÿzModelEntry.to_model_schedulec                 K   s$   | t jj|| jdi |¤Žd�|d�S )N)r-   Údefaults©r,   r@   )r   r]   Úupdate_or_createÚ_unpack_fields)rh   r-   r,   Úentryr@   r@   rA   Ú
from_entry³   s
   ÿþzModelEntry.from_entryc           	      K   sN   |   |¡\}}|j||ift|pg ƒt|pi ƒdœ| jdi |p i ¤Ž¤Ž |S )N)r4   r5   r@   )rm   Úupdater   Ú_unpack_options)	rh   r/   r4   r5   Úrelativer8   rr   rl   rk   r@   r@   rA   rq   ¹   s   ÿ

ýüzModelEntry._unpack_fieldsc                 K   s   ||||t |pi ƒ|dœS )N)r$   r%   r&   r'   r*   Úexpire_seconds)r   )rh   r$   r%   r&   r'   r*   rw   r5   r@   r@   rA   ru   Æ   s   
úzModelEntry._unpack_optionsc                 C   s(   d  t| jƒ| jt| jƒt| jƒ| j¡S )Nz&<ModelEntry: {0} {1}(*{2}, **{3}) {4}>)rg   r   r-   r.   r   r4   r5   r/   rY   r@   r@   rA   Ú__repr__Ó   s   þzModelEntry.__repr__©N)NNNN)NNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r/   r   r    r   r   r   rc   r_   rB   r3   rN   r;   rZ   ÚnextrD   Úclassmethodrm   rs   rq   ru   rx   r@   r@   r@   rA   r   .   s6    


ü
+"	

ÿÿ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   rB   r   ÚsyncÚ	_finalizer^   r,   ÚconfÚbeat_max_loop_intervalÚDEFAULT_MAX_INTERVALr‚   ©r<   r4   r5   r@   r@   rA   rB   æ   s   
ÿýzDatabaseScheduler.__init__c                 C   s    |   | j¡ |  | jjj¡ d S ry   )Úinstall_default_entriesr/   Úupdate_from_dictr,   r‡   Úbeat_schedulerY   r@   r@   rA   Ú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 schedulero   )ÚdebugÚModelÚobjectsrC   ÚEntryr,   r-   r6   )r<   Úsr:   r@   r@   rA   Ú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   r1   r7   r   Úwarning)r<   ÚlastÚtsr=   r@   r@   rA   Úschedule_changedþ   s:   ÿ€ÿû
ýüÿz"DatabaseScheduler.schedule_changedc                 C   s   t |ƒ}| j |j¡ |S ry   )r~   r„   Úaddr-   )r<   rr   Ú	new_entryr@   r@   rA   Úreserve  s   zDatabaseScheduler.reservec              
   C   s
  t dƒ tƒ }tƒ }zrz/tƒ  | jr9| j ¡ }z| j|  ¡  | |¡ W n tt	fy5   | |¡ Y nw | jsW n$ t
yR } zt d|¡ W Y d }~nd }~w ty^   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...)Úinforƒ   r   r„   Úpopr/   rD   rž   ÚKeyErrorr   r   r1   r7   r   rš   )r<   Ú_triedÚ_failedr-   r=   r@   r@   rA   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:   rC   Ú	Exceptionr1   r7   ÚADD_ENTRY_ERRORr/   rt   )r<   Úmappingr“   r-   Úentry_fieldsrr   r=   r@   r@   rA   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Ú*rw   iÀ¨  )r.   r/   r8   )r,   r‡   Úresult_expiresÚ
setdefaultr   r   rŒ   )r<   ÚdataÚentriesr@   r@   rA   r‹   K  s   
ýÿz)DatabaseScheduler.install_default_entriesc                    s&   | j rd| _ dS tt| ƒj|i |¤ŽS )NF)Ú_heap_invalidatedÚsuperr€   Úschedules_equalrŠ   ©rX   r@   rA   r´   W  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 ry   )Úrepr)Ú.0rr   r@   r@   rA   Ú	<genexpr>p  s   € 
ÿz-DatabaseScheduler.schedule.<locals>.<genexpr>)Ú_initial_readr�   r�   r¡   r…   r”   Ú	_scheduleÚ_heapr²   r1   ÚisEnabledForÚloggingÚDEBUGÚjoinÚvalues)r<   Úinitialrt   r@   r@   rA   r/   ]  s&   

ÿzDatabaseScheduler.schedule)rz   r{   r|   r}   r   r’   r   r�   r   r˜   r»   r—   rº   r²   rB   rŽ   r”   r�   r    r…   rŒ   r‹   r´   Úpropertyr/   Ú__classcell__r@   r@   rµ   rA   r€   Ú   s(    

r€   )5r}   rV   r¾   rH   Úmultiprocessing.utilr   Úceleryr   r   Úcelery.beatr   r   Úcelery.utils.encodingr   r   Úcelery.utils.logr	   Úcelery.utils.timer
   Úkombu.utils.jsonr   r   Údjango.confr   Ú	django.dbr   r   Údjango.db.utilsr   r   Údjango.core.exceptionsr   Úmodelsr   r   r   r   r   r   Úclockedscheduler   r   ÚImportErrorÚcelery.utils.timeutilsr‰   r¨   rz   r1   r�   r¡   rš   r   r€   r@   r@   r@   rA   Ú<module>   s<     ÿ -