
     hC=                        d dl mZ d dlmZ d dl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 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 d dlmZ d dlmZ  ej        e          Z G d dej                   Z! G d dej"                  Z#e G d dej$                              Z% G d dej                   Z&e G d dej$                              Z'dS )    )	timedelta)sha1N)StringIO)GenericForeignKey)ContentType)models)Q)timezone)python_2_unicode_compatible)InvalidTaskError)app_settings)task_failed)task_rescheduledc                       e Zd Zd ZdS )TaskQuerySetc                 x    t           j                            |          }|                     ||j                  S )z>
        :return: A Task queryset filtered by creator
        creator_content_typecreator_object_idr   objectsget_for_modelfilteridselfcreatorcontent_types      R/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/background_task/models.py
created_byzTaskQuerySet.created_by   =     #*88AA{{!-%j  
 
 	
    N)__name__
__module____qualname__r     r"   r   r   r      s#        
 
 
 
 
r"   r   c                   T    e Zd Zd Zd ZddZd Zd Zd Z	 	 	 	 dd
Z	ddZ
ddZdS )TaskManagerc                 8    t          | j        | j                  S )N)using)r   model_dbr   s    r   get_querysetzTaskManager.get_queryset)   s    DJdh7777r"   c                 P    |                                                      |          S N)r.   r    )r   r   s     r   r    zTaskManager.created_by,   s"      ""--g666r"   Nc                 >   t          j                    }|                     |          }|r|                    |          }|                    |d           }d                    t
          j                  }|                    |d          }t
          j        r| 	                                
                                }|                     |          
                                }t
          j        ||z
  z
  }|dk    r|d |         }n|                                 }|S )N)queue)run_at__lte	failed_atz
{}priorityrun_atr   )r
   nowunlockedr   formatr   !BACKGROUND_TASK_PRIORITY_ORDERINGorder_byBACKGROUND_TASK_RUN_ASYNCfailedcountlockedBACKGROUND_TASK_ASYNC_THREADSnone)	r   r2   r6   qsready_priority_orderingcurrently_failedcurrently_lockedr=   s	            r   find_availablezTaskManager.find_available/   s    lnn]]3 	(''B		cT	::)001_``18<<1 	$#{{}}2244#{{3//5577 >%58H%HJEqyyfuf		r"   c                     t           j        }|                                 }|t          |          z
  }t	          d           t	          |          z  }|                    |          S )Nseconds)	locked_by)locked_at__ltr   BACKGROUND_TASK_MAX_RUN_TIMEr.   r   r	   r   )r   r6   max_run_timerA   
expires_atr7   s         r   r7   zTaskManager.unlockedC   sb    #@  9\::::
t$$$qz'B'B'BByy"""r"   c                     t           j        }|                                 }|t          |          z
  }t	          d          t	          |          z  }|                    |          S )NrH   F)locked_by__isnull)locked_at__gtrL   )r   r6   rN   rA   rO   r>   s         r   r>   zTaskManager.lockedJ   sb    #@  9\::::
U+++aj.I.I.IIyy   r"   c                 V    |                                  }|                    d          S )z
        `currently_locked - currently_failed` in `find_available` assues that
        tasks marked as failed are also in processing by the running PID.
        Ffailed_at__isnull)r.   r   )r   rA   s     r   r<   zTaskManager.failedQ   s)    
   yy5y111r"   r   Fc                    |pd}|pi }|t          j                    }t          j        ||fd          }||}t	          |                    d                                                    }|r3t          j        	                    |d          
                                 t          |||||||||	pt          j        |

  
        S )z
        If `remove_existing_tasks` is True, all unlocked tasks with the identical task hash will be removed.
        The attributes `repeat` and `repeat_until` are not supported at the moment.
        r&   NT	sort_keysutf-8)	task_hashlocked_at__isnull)
	task_nametask_paramsrZ   priorityr5   r2   verbose_namer   repeatrepeat_until)r
   r6   jsondumpsr   encode	hexdigestTaskr   r   deleteNEVER)r   r\   argskwargsr5   r^   r2   r_   r   r`   ra   remove_existing_tasksr]   srZ   s                  r   new_taskzTaskManager.new_taskY   s     zr2>\^^Fj$4@@@i-'**++5577	  	VL)tLLSSUUUi +'%!!-#!/TZ!-
 
 
 
	r"   c                 
   |pd}|pi }t          j        ||fd          }||}t          |                    d                                                    }|                                 }|                    |          S )Nr&   TrW   rY   )rZ   )rb   rc   r   rd   re   r.   r   )r   r\   ri   rj   r]   rl   rZ   rA   s           r   get_taskzTaskManager.get_taskv   s    zr2j$4@@@i-'**++5577	  yy9y---r"   c                 T    |                      |||                                          S r0   )ro   rg   )r   r\   ri   rj   s       r   	drop_taskzTaskManager.drop_task   s$    }}Yf55<<>>>r"   r0   )
NNNr   NNNNNF)NN)r#   r$   r%   r.   r    rF   r7   r>   r<   rm   ro   rq   r&   r"   r   r(   r(   '   s        8 8 87 7 7   (# # #! ! !2 2 2 59CG9=',   :. . . .? ? ? ? ? ?r"   r(   c                   t    e Zd Z ej        dd          Z ej                    Z ej        dd          Z ej        ddd          Z	 ej
        dd          Z ej        d	          Zd
Zdez  Zdez  Zdez  Zdez  ZdZedfedfedfedfedfedffZ ej        ee          Z ej        dd          Z ej        dddd          Z ej
        dd          Z ej        ddd          Z ej        d          Z ej        dddd          Z ej        ddd          Z ej        edddej                   Z! ej"        dd          Z# e$dd          Z% e&            Z'd Z(de(_)        d  Z*de*_)        d! Z+d" Z,d# Z-d$ Z.d% Z/d& Z0d' Z1d( Z2d) Z3 fd*Z4d+ Z5 G d, d-          Z6 xZ7S ).rf      T
max_lengthdb_index(      ru   nullblankr   defaultrv   rv   i              hourlydailyweeklyzevery 2 weekszevery 4 weeksneverchoicesr}   rz   r{   ru   rv   rz   r{   rv   rz   r{   r{   @   background_taskrz   r{   related_name	on_deleter   r   c                 x    | j         r2	 t          j        t          | j                   d           dS #  Y dS xY wdS zB
        Check if the locked_by process is still running.
        r   TFNrJ   oskillintr-   s    r   locked_by_pid_runningzTask.locked_by_pid_running   I     > 	DN++Q///tuu4   '2 7c                 *    t          | j                  S z9
        Check if the last_error field is empty.
        bool
last_errorr-   s    r   	has_errorzTask.has_error        DO$$$r"   c                     t          j        | j                  \  }}t          d |                                D                       }||fS )Nc              3   >   K   | ]\  }}t          |          |fV  d S r0   )str).0kvs      r   	<genexpr>zTask.params.<locals>.<genexpr>   s0      ==das1vvqk======r"   )rb   loadsr]   dictitems)r   ri   rj   s      r   paramszTask.params   sF    z$"233f==fllnn=====V|r"   c                    t          j                    }t          j                            |                              | j                  }|                    ||          }|r%t          j                            | j                  S d S )N)pk)rJ   	locked_at)	r
   r6   rf   r   r7   r   r   updateget)r   rJ   r6   r7   updateds        r   lockz	Task.lock   sr    lnn<((--444@@//I/EE 	0<##tw#///tr"   c                 v    t                      }t          j        |||d |           |                                S r0   )r   	tracebackprint_exceptiongetvalue)r   typeerrtbfiles        r   _extract_errorzTask._extract_error   s2    zz!$Rt<<<}}r"   c                 N    | xj         dz  c_         |                                  d S )N   )attemptssaver-   s    r   increment_attemptszTask.increment_attempts   s#    		r"   c                 0    t           j        }| j        |k    S r0   )r   BACKGROUND_TASK_MAX_ATTEMPTSr   )r   max_attemptss     r   has_reached_max_attemptszTask.has_reached_max_attempts   s    #@},,r"   c                 "    | j         | j        k    S r0   )r`   rh   r-   s    r   is_repeating_taskzTask.is_repeating_task   s    {TZ''r"   c                    |                      |||          | _        |                                  |                                 st	          |t
                    r~t          j                    | _        t          
                    d|            |                                 }t          j        | j        | j        |           |                                  dS t#          | j        dz  dz             }t          j                    |z   | _        t          
                    d| || j                   t)          j        | j        |            d| _        d| _        |                                  dS )	z
        Set a new time to run the task in future, or create a CompletedTask and delete the Task
        if it has reached the maximum of allowed attempts
        zMarking task %s as failed)sendertask_idcompleted_taskr      rH   z'Rescheduling task %s for %s later at %s)r   taskN)r   r   r   r   
isinstancer   r
   r6   r4   loggerwarningcreate_completed_taskr   send	__class__r   rg   r   r   r5   r   rJ   r   r   )r   r   r   r   	completedbackoffs         r   
reschedulezTask.reschedule   s=   
 --dCCC!!!((** 	j>N.O.O 	%\^^DNNN6===2244IDNDGT]^^^^KKMMMMM!);q(@AAAG",..72DKNNDd& & &!dCCCC!DN!DNIIKKKKKr"   c                    t          | j        | j        | j        | j        t          j                    | j        | j        | j	        | j
        | j        | j        | j        | j        | j        | j                  }|                                 |S )zK
        Returns a new CompletedTask instance with the same values
        )r\   r]   rZ   r^   r5   r2   r   r4   r   rJ   r   r_   r   r`   ra   )CompletedTaskr\   r]   rZ   r^   r
   r6   r2   r   r4   r   rJ   r   r_   r   r`   ra   r   )r   r   s     r   r   zTask.create_completed_task
  s     'n(n]<>>*]nnn*L;*
 
 
" 	r"   c                 4   |                                  sdS | j        r| j        t          j                    k    rdS |                                 \  }}| j        t          | j                  z   }|t          j                    k     r/|t          | j                  z  }|t          j                    k     /t                      	                    | j
        |||| j        | j        | j        | j        | j        | j        
  
        }|                                 |S )zp
        :return: A new Task with an offset of self.repeat, or None if the self.repeat_until is reached
        NrH   )
r\   ri   rj   r5   r^   r2   r_   r   r`   ra   )r   ra   r
   r6   r   r5   r   r`   r(   rm   r\   r^   r2   r_   r   r   )r   ri   rj   
new_run_atrm   s        r   create_repetitionzTask.create_repetition"  s    %%'' 	4 	!2hlnn!D!D4{{}}f[9T[#A#A#AA
8<>>)))DK8888J 8<>>)) ==))n]**L;* * 
 
 	r"   c                 `    | j         pd | _          t          t          |           j        |i |S r0   )rJ   superrf   r   )r   argkwr   s      r   r   z	Task.saveA  s3    /4%uT4  %s1b111r"   c                 D    d                     | j        p| j                  S )Nz{})r8   r_   r\   r-   s    r   __str__zTask.__str__F  s    ||D-?@@@r"   c                       e Zd ZdZdS )	Task.Metar   N)r#   r$   r%   db_tabler&   r"   r   Metar   I  s        $r"   r   )8r#   r$   r%   r   	CharFieldr\   	TextFieldr]   rZ   r_   IntegerFieldr^   DateTimeFieldr5   HOURLYDAILYWEEKLYEVERY_2_WEEKSEVERY_4_WEEKSrh   REPEAT_CHOICESBigIntegerFieldr`   ra   r2   r   r4   r   rJ   r   
ForeignKeyr   CASCADEr   PositiveIntegerFieldr   r   r   r(   r   r   booleanr   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   rf   rf      sS        ! C$???I"&"$$K  B>>>I#6#sTJJJL #v"1t<<<H!V!4000F FKEYFJMJME				(	(	N $V#NEJJJF'6'T>>>L Fd"&d4 4 4E #v"1t<<<H$$dTJJJI!!---J ! B&*$8 8 8I$$dTJJJI,6,$d&&.   43TJJJ 68KLLGkmmG   %)!% % %
 I      
  - - -( ( (  .  0  >2 2 2 2 2
A A A% % % % % % % % % % % %r"   rf   c                   $    e Zd Zd ZddZddZdS )CompletedTaskQuerySetc                 x    t           j                            |          }|                     ||j                  S )zG
        :return: A CompletedTask queryset filtered by creator
        r   r   r   s      r   r    z CompletedTaskQuerySet.created_byR  r!   r"   Nc                     |                      d          }|r,t          j                    |z
  }|                     |          }|S )z
        :param within: A timedelta object
        :return: A queryset of CompletedTasks that failed within the given timeframe (e.g. less than 1h ago)
        FrT   )failed_at__gtr   r
   r6   r   withinrA   
time_limits       r   r<   zCompletedTaskQuerySet.failed\  sQ    
 [[#  
 
  	5!&0J44B	r"   c                     |                      d          }|r,t          j                    |z
  }|                     |          }|S )z
        :param within: A timedelta object
        :return: A queryset of CompletedTasks that completed successfully within the given timeframe
        (e.g. less than 1h ago)
        TrT   )
run_at__gtr   r   s       r   	succeededzCompletedTaskQuerySet.succeededi  sQ     [["  
 
  	2!&0Jj11B	r"   r0   )r#   r$   r%   r    r<   r  r&   r"   r   r   r   P  sK        
 
 
        r"   r   c                      e Zd Z ej        dd          Z ej                    Z ej        dd          Z ej        ddd          Z	 ej
        dd          Z ej        d	          Z ej        ej        ej        
          Z ej        dd          Z ej        dddd          Z ej
        dd          Z ej        ddd          Z ej        d          Z ej        dddd          Z ej        ddd          Z ej        edddej                  Z ej        dd          Z e dd          Z!e"#                                Z$d Z%de%_&        d Z'de'_&        d Z(dS )r   rs   Trt   rw   rx   ry   r   r|   r~   r   r   r   r   r   r   completed_background_taskr   r   r   c                 x    | j         r2	 t          j        t          | j                   d           dS #  Y dS xY wdS r   r   r-   s    r   r   z#CompletedTask.locked_by_pid_running  r   r   c                 *    t          | j                  S r   r   r-   s    r   r   zCompletedTask.has_error  r   r"   c                 P    d                     | j        p| j        | j                  S )Nz{} - {})r8   r_   r\   r5   r-   s    r   r   zCompletedTask.__str__  s,      /K
 
 	
r"   N))r#   r$   r%   r   r   r\   r   r]   rZ   r_   r   r^   r   r5   r   rf   r   rh   r`   ra   r2   r   r4   r   rJ   r   r   r   r   r   r   r   r   r   r   
as_managerr   r   r   r   r   r&   r"   r   r   r   x  s        ! C$???I"&"$$K  B>>>I#6#sTJJJL #v"1t<<<H!V!4000F#V#D,?TTTF'6'T>>>L Fd"&d4 4 4E #v"1t<<<H$$dTJJJI!!---J ! B&*$8 8 8I$$dTJJJI,6,$d0FN   43TJJJ 68KLLG#..00G   %)!% % %
 I
 
 
 
 
r"   r   )(datetimer   hashlibr   rb   loggingr   r   compatr   compat.modelsr   "django.contrib.contenttypes.modelsr   	django.dbr   django.db.modelsr	   django.utilsr
   sixr   background_task.exceptionsr   background_task.settingsr   background_task.signalsr   r   	getLoggerr#   r   QuerySetr   Managerr(   Modelrf   r   r   r&   r"   r   <module>r     sG                 				           + + + + + + : : : : : :             ! ! ! ! ! ! + + + + + + 7 7 7 7 7 7 1 1 1 1 1 1 / / / / / / 4 4 4 4 4 4 
	8	$	$

 

 

 

 

6? 

 

 

Y? Y? Y? Y? Y?&. Y? Y? Y?x F% F% F% F% F%6< F% F% F%X% % % % %FO % % %P E
 E
 E
 E
 E
FL E
 E
 E
 E
 E
r"   