
     h*                        d dl mZ d dlmZmZ 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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ddZ G d d          Z G d de          Z G d de          Z  G d de          Z!e G d de                      Z" e            Z#d Z$dS )    )unicode_literals)datetime	timedelta)import_module)
ThreadPoolN)OperationalError)timezone)python_2_unicode_compatible)BackgroundTaskError)Task)app_settings)signalsc                 b   t           j                            t                     	 t	          | dd          }t          |t                    r|                                \  }}nft	          | dd          }t	          | dd          }t          j                            |||          }|r|	                    |          }|r|d         }|t          d           ||i | |r|                                 |                                }t           j                            |j        |j        |	           |                                 |                                 t$                              d
|           n# t(          $ r}	t+          j                    \  }
}}|r]t$                              d||
||f           t           j                            |	j        |           |                    |
||           ~Y d}	~	nd}	~	ww xY wt           j                            t                     dS )z
    Executes the function attached to task. Used to enable threads.
    If a Task instance is provided, args and kwargs are ignored and retrieved from the Task itself.
    task_functionNnamequeue)	task_nameargskwargsr   r   z Function is None, can't execute!)sendertask_idcompleted_taskzRan task and deleting %szRescheduling %s)exc_infor   task)r   task_startedsendr   getattr
isinstanceparamsobjectsget_taskfilterr   increment_attemptscreate_completed_tasktask_successful	__class__idcreate_repetitiondeleteloggerinfo	Exceptionsysr   error
task_error
rescheduletask_finished)
proxy_taskr   r   r   funcr   
task_queuetask_qs	completedexte	tracebacks                Q/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/background_task/tasks.py	bg_runnerr>      s%   
 d###z?D99dD!! 		";;==LD&&
FD99I Wd;;Jl++idSY+ZZG ;!..z.:: "qz<%&HIIIdf 	:##%%%2244I#((`i(jjj""$$$KKMMMKK2D999   ,..1i 	-LL*DAq);LLMMM##2<d#CCCOOAq),,,IIIII t$$$$$s   EE= =
HA7HHc                   :    e Zd Zd ZdZed             ZddZeZdS )
PoolRunnerc                 "    || _         || _        d S N)
_bg_runner_num_processes)selfr>   num_processess      r=   __init__zPoolRunner.__init__A   s    #+    Nc                 R    | j         st          | j                  | _         | j         S )N)	processes)_pool_instancer   rD   rE   s    r=   _poolzPoolRunner._poolG   s-    " 	L",t7J"K"K"KD""rH   c                 n    | j                             | j        ||ft          |          z   |           d S )N)r5   r   kwds)rM   apply_asyncrC   tuple)rE   r4   r   r   r   s        r=   runzPoolRunner.runM   s9    
DO:t:LuUY{{:ZaghhhhhrH   rB   )	__name__
__module____qualname__rG   rK   propertyrM   rR   __call__ rH   r=   r@   r@   @   s\        , , , N# # X#
i i i i HHHrH   r@   c                   0    e Zd Zd Z	 	 ddZddZd	dZdS )
Tasksc                     i | _         t                      | _        t          | _        t
          | _        t          t
          t          j	                  | _
        d S rB   )_tasksDBTaskRunner_runner	TaskProxy_task_proxy_classr>   rC   r@   r   BACKGROUND_TASK_ASYNC_THREADS_pool_runnerrL   s    r=   rG   zTasks.__init__T   s>    #~~!*#&y,2\]]rH   NFc                 j     d}rt                    r}d fd}|r ||          S |S )z
        decorator to turn a regular function into
        something that gets run asynchronously in
        the background, at a later time
        Nc                     }|s| j         d| j        }                    || j                  }|j        |<   |S )N.)rT   rS   r`   r^   r\   )fn_nameproxyr   r   remove_existing_tasksschedulerE   s      r=   
_decoratorz$Tasks.background.<locals>._decoratorj   s[    E ?#%==="++>**5"h+@$,P PE!&DKLrH   )callable)rE   r   rj   r   ri   rf   rk   s   `````  r=   
backgroundzTasks.background[   sx      	HTNN 	BD	 	 	 	 	 	 	 	 	  	":b>>!rH   c                     t          |t                    r|}|j        }g }i }nd }| j        |         }t          j        r | j        ||g|R i | d S  | j        ||g|R i | d S rB   )r    r   r   r\   r   BACKGROUND_TASK_RUN_ASYNCrb   rC   )rE   r   r   r   r   r4   s         r=   run_taskzTasks.run_taskw   s    i&& 	DI DFFD[+
1 	?Dj$@@@@@@@@@DOJ>t>>>v>>>>>rH   c                 8    | j                             | |          S rB   )r^   run_next_task)rE   r   s     r=   rr   zTasks.run_next_task   s    |))$666rH   )NNNF)NNrB   )rS   rT   rU   rG   rm   rp   rr   rX   rH   r=   rZ   rZ   S   sj        ^ ^ ^ :>).   8? ? ? ?"7 7 7 7 7 7rH   rZ   c                       e Zd ZdZdZdZddZed             Zd Z	e
d             Ze
d	             Ze
d
             Zd Zd ZdS )TaskScheduler         Nc                 0    || _         || _        || _        d S rB   _run_at	_priority_action)rE   run_atpriorityactions       r=   rG   zTaskSchedule.__init__   s    !rH   c                 2   t          |t                    r|S d }d }d }|rgt          |t          t          t          f          r|}nB|                    dd           }|                    dd           }|                    dd           }t          |||          S )Nr|   r}   r~   r|   r}   r~   )r    rt   intr   r   get)rE   rj   r}   r|   r~   s        r=   createzTaskSchedule.create   s    h-- 	O 	6(S)X$>?? 6!!h55#<<
D99!h556HVLLLLrH   c                     i }dD ]4}d|z  }t          | |d           }|t          ||d           ||<   /|||<   5t          di |S )Nr   z_%srX   )r   rt   )rE   rj   r!   r   	attr_namevalues         r=   mergezTaskSchedule.merge   sk    4 	% 	%DID)T22E}&xDAAt$t%%f%%%rH   c                    | j         pt          j                    }t          |t                    r$t          j                    t          |          z   }t          |t
                    rt          j                    |z   }|S )N)seconds)ry   r	   nowr    r   r   )rE   r|   s     r=   r|   zTaskSchedule.run_at   si    /fc"" 	@\^^i&?&?&??Ffi(( 	-\^^f,FrH   c                     | j         pdS )Nr   )rz   rL   s    r=   r}   zTaskSchedule.priority   s    ~""rH   c                 (    | j         pt          j        S rB   )r{   rt   SCHEDULErL   s    r=   r~   zTaskSchedule.action   s    |4|44rH   c                 (    d| j         d| j        dS )NzTaskSchedule(run_at=z, priority=))ry   rz   rL   s    r=   __repr__zTaskSchedule.__repr__   s"     9=9=I 	IrH   c                 b    | j         |j         k    o| j        |j        k    o| j        |j        k    S rB   rx   )rE   others     r=   __eq__zTaskSchedule.__eq__   s5    |u}, -~0-|u},	-rH   )NNN)rS   rT   rU   r   RESCHEDULE_EXISTINGCHECK_EXISTINGrG   classmethodr   r   rV   r|   r}   r~   r   r   rX   rH   r=   rt   rt      s        HN   
 M M [M"	& 	& 	&   X # # X# 5 5 X5I I I- - - - -rH   rt   c            	       R    e Zd ZdZd Zddej        ddddddf	dZd
dZd Z	d
d	Z
dS )r]   zt
    Encapsulate the model related logic in here, in case
    we want to support different queues in the future
    c                 P    t          t          j                              | _        d S rB   )strosgetpidworker_namerL   s    r=   rG   zDBTaskRunner.__init__   s    ry{{++rH   Nr   Fc                 ^   t           j                            ||||||||	|
||          }|t          j        k    r|j        }t          j                    }t           j                            |          }|	                    |          }|r|	                    |          }|t          j
        k    r|                    ||          }|rdS n&|t          j        k    r|                                rdS |                                 t          j                            | j        |           |S )z+Simply create a task object in the database)	task_hashr   )r|   r}   Nr   )r   r"   new_taskrt   r   r   r	   r   unlockedr$   r   updater   countsaver   task_createdr   r(   )rE   r   r   r   r|   r}   r~   r   verbose_namecreatorrepeatrepeat_untilri   r   r   r   r   existingupdateds                      r=   rj   zDBTaskRunner.schedule   s%   
 |$$Yffh%*L'6%13HJ J \***I,..C|,,S11H;;H 8#???77999"//(/KK F<666>>## F		!!d!CCCrH   c                    	 fdt           j                            |          D             d d         }|D ]"}|                    | j                  }|r|c S #d S # t
          $ r t                              d           Y d S w xY w)Nc                 0    g | ]}|j         j        v |S rX   )r   r\   ).0r   taskss     r=   
<listcomp>z0DBTaskRunner.get_task_to_run.<locals>.<listcomp>   s4     B B B"&.EL"@"@  $"@"@"@rH      z/Failed to retrieve tasks. Database unreachable.)r   r"   find_availablelockr   r   r,   warning)rE   r   r   available_tasksr   locked_tasks    `    r=   get_task_to_runzDBTaskRunner.get_task_to_run   s    
	NB B B B0K0KE0R0R B B BBD1"FO' ' '"ii(899 '&&&&'4 	N 	N 	NNNLMMMMMM	Ns   AA A $BBc                 f    t                               d|           |                    |           d S )Nz
Running %s)r,   r-   rp   )rE   r   r   s      r=   rp   zDBTaskRunner.run_task   s.    L$'''trH   c                 f    |                      ||          }|r|                     ||           dS dS )NTF)r   rp   )rE   r   r   r   s       r=   rr   zDBTaskRunner.run_next_task  s=    ##E511 	MM%&&&45rH   rB   )rS   rT   rU   __doc__rG   rt   r   rj   r   rp   rr   rX   rH   r=   r]   r]      s         
, , , 8<L$9"D4u   6N N N N       rH   r]   c                        e Zd Zd Zd Zd ZdS )r_   c                     || _         |x| _        | _        || _        t                              |          | _        || _        || _        d S rB   )	r   r   r   runnerrt   r   rj   r   ri   )rE   r   r   rj   r   ri   r   s          r=   rG   zTaskProxy.__init__  sI    	(554%$++H55
%:"""rH   c                 T   |                     dd           }t                              |                              | j                  }|j        }|                     d|j                  }|j        }|                     d| j                  }|                     dd           }|                     dd           }	|                     dd           }
|                     dd           }|                     d| j	                  }| j
                            | j        ||||||||	|
||          S )	Nrj   r}   r   r   r   r   r   ri   )poprt   r   r   rj   r|   r}   r~   r   ri   r   r   )rE   r   r   rj   r|   r}   r~   r   r   r   r   r   ri   s                r=   rW   zTaskProxy.__call__  s   ::j$//&&x0066t}EE::j(*;<<

7DJ//zz.$77**Y--Hd++zz.$77!',CTE_!`!`{##DItVVX$*E<$*L$9; ; 	;rH   c                     d| j         z  S )NzTaskProxy(%s))r   rL   s    r=   __str__zTaskProxy.__str__*  s    **rH   N)rS   rT   rU   rG   rW   r   rX   rH   r=   r_   r_     sA        ; ; ;; ; ;$+ + + + +rH   r_   c                      ddl } ddlm} |j        D ]i}	 t	          |          j        }n# t          t          f$ r Y +w xY w	 |                     d|           n# t          $ r Y Sw xY wt	          d|z             jdS )zG
    Autodiscover tasks.py files in much the same way as admin app
    r   N)settingsr   z%s.tasks)	impdjango.confr   INSTALLED_APPSr   __path__AttributeErrorImportErrorfind_module)r   r   appapp_paths       r=   autodiscoverr   0  s     JJJ$$$$$$& 
( 
(	$S))2HH, 	 	 	H		OOGX.... 	 	 	H	 	j3&''''
( 
(s   *>>A
A&%A&rB   )%
__future__r   r   r   	importlibr   multiprocessing.poolr   loggingr   r/   django.db.utilsr   django.utilsr	   sixr
   background_task.exceptionsr   background_task.modelsr   background_task.settingsr   background_taskr   	getLoggerrS   r,   r>   r@   objectrZ   rt   r]   r_   r   r   rX   rH   r=   <module>r      s!   ' ' ' ' ' ' ( ( ( ( ( ( ( ( # # # # # # + + + + + +  				 



 , , , , , , ! ! ! ! ! ! + + + + + + : : : : : : ' ' ' ' ' ' 1 1 1 1 1 1 # # # # # #		8	$	$&% &% &% &%R       &67 67 67 67 67F 67 67 67r@- @- @- @- @-6 @- @- @-F; ; ; ; ;6 ; ; ;| + + + + + + + +> 	( ( ( ( (rH   