a
    CgH!                     @   s  d dl mZ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mZmZmZ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# e	rd	dl$m%Z% dZ&dZ'dZ(dZ)d Z*h dZ+G dd deZ,edZ-edZ.eddG dd dee.e-f Z/eee.e-f e/e.e-f dddZ0ee*e'e&dde1e2e2ee3 eee.e-f ge/e.e-f f dddZ0d$e*e'e&ddeee.e-f  e1e2e2ee3 ee/e.e-f eee.e-f ge/e.e-f f f d d!dZ0eddG d"d# d#ee- Z4dS )%    )	dataclassfieldreplace)datetime	timedelta)iscoroutinefunction)TYPE_CHECKINGAnyCallableDictGenericOptionalTypeTypeVarUnioncastoverload)async_to_syncsync_to_async)TextChoices)gettext_lazy)	ParamSpecSelf   )ResultDoesNotExist)get_module_pathjson_normalize)BaseTaskBackenddefaultid   >   
_traceback_return_valuestatusfinished_atenqueued_at
started_at_exception_classc                   @   s<   e Zd ZdedfZdedfZdedfZdedfZd	S )
ResultStatusNEWZNewRUNNINGZRunningFAILEDZFailed	SUCCEEDEDZ	SucceededN)__name__
__module____qualname___r(   r)   r*   r+    r0   r0   P/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_tasks/task.pyr'   1   s   r'   TPT)frozenc                   @   sL  e Zd ZU eed< eeef ed< eed< e	Z
eed< dZee ed< dZee ed< ddd	d
ZeedddZdddddee ee eeeef  ee edddZejejddddZejejddddZeddddZeddddZejejedddZejejedddZd dd!d"Zeedd#d$Z dS )%Taskpriorityfuncbackend
queue_nameN	run_afterenqueue_on_commitreturnc                 C   s   |   |  d S N)get_backendZvalidate_taskselfr0   r0   r1   __post_init__S   s    zTask.__post_init__c                 C   s   | j jS )z,
        An identifier for the task
        )r7   r,   r@   r0   r0   r1   nameV   s    z	Task.name)r6   r9   r:   r8   )r6   r9   r:   r8   r=   c                C   sT   i }|dur||d< |dur$||d< |dur4||d< |durD||d< t | fi |S )z:
        Create a new task with modified defaults
        Nr6   r9   r:   r8   )r   )rA   r6   r9   r:   r8   changesr0   r0   r1   using]   s    z
Task.usingzTaskResult[T])argskwargsr=   c                 O   s   |   | t|t|S )z2
        Queue up the task to be executed
        )r?   enqueuer   rA   rF   rG   r0   r0   r1   rH   v   s    zTask.enqueuec                    s    |   | t|t|I dH S )zH
        Queue up a task function (or coroutine) to be executed
        N)r?   aenqueuer   rI   r0   r0   r1   rJ   ~   s    zTask.aenqueue)	result_idr=   c                 C   s$   |   |}|jj| jkr t|S )
        Retrieve the result for a task of this type by its id (if one exists).
        If one doesn't, or is the wrong type, raises ResultDoesNotExist.
        )r?   
get_resulttaskr7   r   rA   rK   resultr0   r0   r1   rM      s    zTask.get_resultc                    s*   |   |I dH }|jj| jkr&t|S )rL   N)r?   aget_resultrN   r7   r   rO   r0   r0   r1   rQ      s    zTask.aget_resultc                 O   s.   t | jrt| j|i |S | j|i |S r>   )r   r7   r   rI   r0   r0   r1   call   s    
z	Task.callc                    s:   t | jr | j|i |I d H S t| j|i |I d H S r>   )r   r7   r   rI   r0   r0   r1   acall   s    
z
Task.acallr   c                 C   s   ddl m} || j S )Nr   tasks) rU   r8   )rA   rU   r0   r0   r1   r?      s    zTask.get_backendc                 C   s
   t | jS r>   )r   r7   r@   r0   r0   r1   module_path   s    zTask.module_path)!r,   r-   r.   int__annotations__r
   r3   r2   strDEFAULT_QUEUE_NAMEr9   r:   r   r   r;   boolrB   propertyrC   r   r   r   rE   rF   rG   rH   rJ   rM   rQ   rR   rS   r?   rW   r0   r0   r0   r1   r5   <   s:   
	r5   )functionr=   c                C   s   d S r>   r0   )r^   r0   r0   r1   rN      s    rN   Nr6   r9   r8   r;   )r6   r9   r8   r;   r=   c                 C   s   d S r>   r0   r_   r0   r0   r1   rN      s    )r^   r6   r9   r8   r;   r=   c                   sH   ddl m tttf tttf d fdd}| rD|| S |S )z,
    A decorator used to create a task.
    r   rT   )fr=   c                    s     j |  dS )N)r6   r7   r9   r8   r;   )Z
task_class)r`   r8   r;   r6   r9   rU   r0   r1   wrapper   s    ztask.<locals>.wrapper)rV   rU   r
   r3   r2   r5   )r^   r6   r9   r8   r;   rb   r0   ra   r1   rN      s
    ,	c                   @   s*  e Zd ZU eed< eed< eed< ee ed< ee ed< ee ed< e	ed< e
eef ed< eed	< ed
ddZeee  ed< ed
ddZee ed< ed
ddZee ed< eee dddZeeee  dddZeee dddZeedddZddddZddddZdS )
TaskResultrN   idr"   r$   r%   r#   rF   rG   r8   FN)initr   r&   r    r!   r<   c                 C   s   | j stdtt| jS )z
        Get the return value of the task.

        If the task didn't succeed, an exception is raised.
        This is to distinguish against the task returning None.
        Task has not finished yet)is_finished
ValueErrorr   r2   r!   r@   r0   r0   r1   return_value  s    zTaskResult.return_valuec                 C   s   | j std| jS )z)The exception raised by the task functionrf   )rg   rh   r&   r@   r0   r0   r1   exception_class  s    zTaskResult.exception_classc                 C   s   | j std| jS )z1The traceback of the exception if the task failedrf   )rg   rh   r    r@   r0   r0   r1   	traceback  s    zTaskResult.tracebackc                 C   s   | j tjtjhv S )zHas the task finished?)r"   r'   r*   r+   r@   r0   r0   r1   rg      s    zTaskResult.is_finishedc                 C   s4   | j  | j}tD ]}t| |t|| qdS zA
        Reload the cached task data from the task store
        N)rN   r?   rM   rd   TASK_REFRESH_ATTRSobject__setattr__getattrrA   Zrefreshed_taskattrr0   r0   r1   refresh%  s    zTaskResult.refreshc                    s:   | j  | jI dH }tD ]}t| |t|| qdS rl   )rN   r?   rQ   rd   rm   rn   ro   rp   rq   r0   r0   r1   arefresh.  s    zTaskResult.arefresh)r,   r-   r.   r5   rY   rZ   r'   r   r   listr   r	   r   r&   r   BaseExceptionr    r!   r2   r]   ri   rj   rk   r\   rg   rs   rt   r0   r0   r0   r1   rc      s,   
	rc   )N)5Zdataclassesr   r   r   r   r   inspectr   typingr   r	   r
   r   r   r   r   r   r   r   r   Zasgiref.syncr   r   Zdjango.db.models.enumsr   Zdjango.utils.translationr   r/   Ztyping_extensionsr   r   
exceptionsr   utilsr   r   Zbackends.baser   ZDEFAULT_TASK_BACKEND_ALIASr[   ZMIN_PRIORITYZMAX_PRIORITYZDEFAULT_PRIORITYrm   r'   r2   r3   r5   rN   rX   rZ   r\   rc   r0   r0   r0   r1   <module>   sh   4w" ,