
    jg4                        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.j`                  e.jb                  cZ/Z0Z1 G d de
      Z2 G d de      Z3y)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                       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Zd	 Zd
 Zd Zd ZeZd Zed        Zedd       Ze	 dd       Ze	 	 dd       Zd Zy)
ModelEntryz(Scheduler entry taken from database row.crontabintervalsolarr   )last_run_attotal_run_count
no_changesNc                 r   |xs t        j                         | _        |j                  | _        |j                  | _        	 |j
                  | _        	 t        |j                  xs d      | _        t        |j                  xs d      | _        i | _        dD ]   }t!        ||      }||| j                  |<   " t!        |dd      rt!        |d      | j                  d<   t        |j"                  xs d      | j                  d	<   |j                  | j                  d
<   |j$                  | _        || _        |j(                  sS| j+                         |_        | j&                  j,                  r(|j(                  t/        j0                  d      z
  |_        |j(                  | _        y# |j                  $ r5 t        j                  d| j                         | j                  |       Y w xY w# t        $ r=}t        j                  d| j                  |       | j                  |       Y d}~d}~ww xY w)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?   r1   excoptionvalues         X/var/www/html/Stanley/venv/lib/python3.12/site-packages/django_celery_beat/schedulers.py__init__zModelEntry.__init__/   s   ;+99;JJ	JJ		!!NNDM	!ejj0D1DI 45DK FFE6*E}#(DLL 	 G 5*d+&-eZ&@DLL#"'(=">Y-2ZZ)*$44
   $ 1 1 3E
 zz$$$)$5$5((h7%8! !,,U !! 	!LLF		 MM% 	!  	!L		3 MM%  	!s+   F) <G0 )A G-,G-0	H692H11H6c                 @    d|_         d|_        |j                          y )NTF)r%   enabledsave)rD   r?   s     rH   r8   zModelEntry._disableb   s    

    c                    | j                   j                  st        j                  dd      S | j                   j                  | j                         }t        t        dd      rt        | j                               }|| j                   j                  k  rPt        j                  | j                   j                  |z
  j                               }t        j                  d|      S | j                   j                  r| j                   j                  r| j                   j                  dkD  rgd| j                   _        d| j                   _        d| j                   _        | j                   j                          t        j                  dt               S | j"                  j$                  }t        | j&                        j)                  |      }| j*                  j-                  |      S )NFg      @DJANGO_CELERY_BEAT_TZ_AWARETr   )r?   rK   r   
schedstaterA   r@   r>   r
   r	   mathceiltotal_secondsone_offr$   r%   rL   r   r1   timezoner#   
astimezoner4   is_due)rD   nowdelaytzlast_run_at_in_tzs        rH   rW   zModelEntry.is_dueg   sj   zz!!''s33 ::  ,##%Cx!>E&t'8'8':;TZZ*** 		ZZ**S0??A !++E599 ::$**"4"4JJ..2!&DJJ)*DJJ&$)DJJ!JJOO''/BCC XX,T-=-=>II"M}}##$566rM   c                     t        t        dd      r5t        j                  j                  | j                  j
                        }|S t        j                  j                         }|S )NrO   T)r>   r
   rB   rX   r1   rU   utcnow)rD   rX   s     rH   r@   zModelEntry._default_now   sQ    8:DA##''(9(9:C
 
 ##**,C
rM   c                     | j                         | j                  _        | j                  xj                  dz  c_        d| j                  _        | j                  | j                        S )Nr   T)r@   r?   r#   r$   r%   	__class__rD   s    rH   __next__zModelEntry.__next__   sK    !%!2!2!4



""a'" $

~~djj))rM   c           	         t        | j                        j                  j                  | j                  j                        }| j
                  D ]#  }t        ||t        | j                  |             % |j                          y )N)pk)	typer?   _default_managergetrc   save_fieldssetattrr>   rL   )rD   objfields      rH   rL   zModelEntry.save   s`     4:://33tzz}}3E%%EC

E :; & 	
rM   c                     | j                   D ]N  \  }}}t        j                  |      }t        ||      s)|j	                  |      }|j                          ||fc S  t        d|d      )NzCannot convert schedule type z	 to model)model_schedulesr   maybe_schedule
isinstancefrom_schedulerL   r;   )clsr4   schedule_type
model_typemodel_fieldmodel_schedules         rH   to_model_schedulezModelEntry.to_model_schedule   sx    696I6I2M:{ //9H(M2!+!9!9(!C##%%{22 7J +H<yAC 	CrM   c                 ~    t         j                  j                  | | j                  di |      \  }} | ||      S )N)r2   defaultsr1    )r   re   update_or_create_unpack_fields)rp   r2   r1   entryri   createds         rH   
from_entryzModelEntry.from_entry   sG    #44EE 2 2 2 ;U ; F 
W 3C  rM   c           
         | j                   D ci c]	  \  }}}|d  }	}}| j                  |      \  }
}|
|	|<    |j                  |	ft        |xs g       t        |xs i       d | j                  di |xs i  |S c c}}w )N)r9   r:   ry   )rl   ru   updater   _unpack_options)rp   r4   r9   r:   relativer=   r|   _rs   entry_schedulesrt   s              rH   r{   zModelEntry._unpack_fields   s    
 8;7J7J
7J"3!QK7J 	 
 '*&;&;H&E#'5$	
tzr"2&	
 "c!!2GMr2		
 
s   B c                 .    ||||t        |xs i       |dS )N)r'   r(   r)   r*   r-   expire_seconds)r   )rp   r'   r(   r)   r*   r-   r   r:   s           rH   r   zModelEntry._unpack_options   s)    
  & W]+,
 	
rM   c                     dj                  t        | j                        | j                  t	        | j
                        t	        | j                        | j                        S )Nz!<ModelEntry: {} {}(*{}, **{}) {}>)formatr   r2   r3   r   r9   r:   r4   r`   s    rH   __repr__zModelEntry.__repr__   sD    299TYYIdii,@dkk"DMM
 	
rM   N)NNNN)NNNNNN)__name__
__module____qualname____doc__r   r    r   r4   r   r"   r   r   r   rl   rg   rI   r8   rW   r@   ra   nextrL   classmethodru   r~   r{   r   r   ry   rM   rH   r   r   $   s    2 
		OY7			-z:	-1	/9-	O CK1-f
!7F*
 D C C ! ! FJ   DHDH

 


rM   r   c                   ~     e Zd ZdZeZeZeZ	dZ
dZdZdZd Zd Zd Zd Zd	 Zd
 Zd Zd Z fdZed        Z xZS )DatabaseSchedulerzDatabase-backed Beat Scheduler.NTFc                    t               | _        t        j                  | g|i | t	        | | j
                  d      | _        |j                  d      xs( | j                  j                  j                  xs t        | _        y)z"Initialize the database scheduler.r   )exitprioritymax_intervalN)set_dirtyr   rI   r   sync	_finalizerf   r1   confbeat_max_loop_intervalDEFAULT_MAX_INTERVALr   )rD   r9   r:   s      rH   rI   zDatabaseScheduler.__init__   si    e41$1&1!$		BJJ~& $xx}}33$# 	rM   c                     | j                  | j                         | j                  | j                  j                  j
                         y r   )install_default_entriesr4   update_from_dictr1   r   beat_scheduler`   s    rH   setup_schedulez DatabaseScheduler.setup_schedule   s0    $$T]]3dhhmm99:rM   c                     t        d       i }| j                  j                  j                         D ]-  }	 | j	                  || j
                        ||j                  <   / |S # t        $ r Y =w xY w)Nz-DatabaseScheduler: Fetching database schedulerx   )debugModelobjectsrK   Entryr1   r2   r;   )rD   sr?   s      rH   all_as_schedulez!DatabaseScheduler.all_as_schedule   sk    =>ZZ''//1E $

5dhh
 ?%** 2
   s   *A$$	A0/A0c                    	 t                	 t        j                          | j                  | j
                  j                         }}	 |r||r|n|kD  r		 || _        y|| _        y# t        j                  $ r Y Xw xY w# t        $ r }t        j                  d|       Y d }~yd }~wt        $ r t        d       Y yw xY w# || _        w xY 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   r6   r<   r   warning)rD   lasttsrE   s       rH   schedule_changedz"DatabaseScheduler.schedule_changed   s    	!#""$ ++T\\-E-E-G"D	&bDDb1#%D 2D ' 99   	6< 	3 	 $&D sK   
A= A$ &A= B> $A:7A= 9A::A= =	B;B!!B;:B;>	Cc                 f    t        |      }| j                  j                  |j                         |S r   )r   r   addr2   )rD   r|   	new_entrys      rH   reservezDatabaseScheduler.reserve  s'    K	 		'rM   c                    t         j                  t        j                        rt	        d       t               }t               }	 t                | j                  rV| j                  j                         }	 | j                  |   j                          |j                  |       | j                  rV| xj                  |z  c_        y # t        t        t        f$ r |j                  |       Y Jw xY w# t        $ r }t         j!                  d|       Y d }~ed }~wt"        $ r t%        d       Y ~w xY w# | xj                  |z  c_        w xY w)NzWriting entries...zDatabase error while sync: %rzMDatabaseScheduler: InterfaceError in sync(), waiting to retry in next call...)r6   isEnabledForloggingDEBUGr   r   r   r   pop	_schedulerL   r   KeyError	TypeErrorr   r   r<   r   r   )rD   _tried_failedr2   rE   s        rH   r   zDatabaseScheduler.sync$  s    w}}-&'%	#!#++{{(&NN4(--/JJt$	 ++  KK7"K !)-?@ &KK%& 	C<cBB 	3	 KK7"KsZ   0C1 5.C #C1 %C.+C1 -C..C1 1	D/:DD2 D/,D2 .D//D2 2E	c                 \   i }|j                         D ]J  \  }}	  | j                  j                  |fd| j                  i|}|j                  j
                  r|||<   L | j                  j                  |       y # t        $ r&}t        j                  t        |||       Y d }~d }~ww xY w)Nr1   )itemsr   r~   r1   r?   rK   	Exceptionr6   r<   ADD_ENTRY_ERRORr4   r   )rD   mappingr   r2   entry_fieldsr|   rE   s          rH   r   z"DatabaseScheduler.update_from_dict>  s    ")--/D,K-

--d >26((>0<> ;;&&#AdG #2 	Q  K  $\JJKs   AA<<	B+B&&B+c           	          i }| j                   j                  j                  r-|j                  ddt	        j
                  ddd      ddid       | j                  |       y )Nzcelery.backend_cleanup04*r   i  )r3   r4   r=   )r1   r   result_expires
setdefaultr   r    r   )rD   dataentriess      rH   r   z)DatabaseScheduler.install_default_entriesL  s[    88==''(4 ) 1 1#sC @ 0)<+ 	g&rM   c                 J    | j                   rd| _         yt        |   |i |S )NF)_heap_invalidatedsuperschedules_equal)rD   r9   r:   r_   s      rH   r   z!DatabaseScheduler.schedules_equalX  s,    !!%*D"w&777rM   c                    dx}}| j                   rt        d       dx}}d| _         n| j                         rt        d       d}|r| j	                          | j                         | _        |sg | _        d| _        t        j                  t        j                        r:t        ddj                  d | j                  j                         D                     | j                  S )NFzDatabaseScheduler: initial readTz$DatabaseScheduler: Schedule changed.zCurrent schedule:
%s
c              3   2   K   | ]  }t        |        y wr   )repr).0r|   s     rH   	<genexpr>z-DatabaseScheduler.schedule.<locals>.<genexpr>q  s      9F-DEDK-Ds   )_initial_readr   r   infor   r   r   _heapr   r6   r   r   r   joinvalues)rD   initialr   s      rH   r4   zDatabaseScheduler.schedule^  s      &34##Gf!&D""$78FIIK!113DN
)-&""7==1-tyy 9F-1^^-B-B-D9F 0F  ~~rM   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   propertyr4   __classcell__)r_   s   @rH   r   r      sk    )EEGIOM%;>#4 
'8  rM   r   )4r   rB   r   rQ   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   r6   r   r   r   r   r   ry   rM   rH   <module>r      s    $    ) ) 0 ' .   5 8 9 4 ) $A A &
   
H	||V[[&.. tWs
 s
lZ	 ZrM   