a
    Cg                     @   s   d dl mZ d dlmZmZmZm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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rddlmZ edZ edZ!eddG dd dee  ZG dd deZ"dS )    )	dataclass)TYPE_CHECKINGAnyIterableTypeVarN)apps)messages)ValidationError)connectionsroutertransaction)	ParamSpec)BaseTaskBackend)ResultDoesNotExist)task_enqueued)Task)
TaskResult   DBTaskResultTPT)frozenc                   @   s   e Zd ZU ded< dS )r   r   	db_resultN)__name__
__module____qualname____annotations__ r   r   e/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_tasks/backends/database/backend.pyr      s   
r   c                       s   e Zd ZdZdZdZeeef ej	ej
ddddZeeef ej	ej
ee dddZeedd	d
ZeedddZeeej d fddZ  ZS )DatabaseBackendTr   )taskargskwargsreturnc                 C   s0   ddl m} |||d|j|j|j|j| jdS )Nr   r   )r"   r#   )Zargs_kwargspriorityZ	task_path
queue_name	run_afterbackend_name)modelsr   r%   module_pathr&   r'   alias)selfr!   r"   r#   r   r   r   r   _task_to_db_task"   s    z DatabaseBackend._task_to_db_taskc                    sN    | ||| d d fdd}|rBt| n|   jS )N)r$   c                      s        tjt jd d S )N)task_result)saver   sendtyper.   r   r   r,   r   r   save_result7   s    z,DatabaseBackend.enqueue.<locals>.save_result)Zvalidate_taskr-   Z_get_enqueue_on_commit_for_taskr   Z	on_commitr.   )r,   r!   r"   r#   r3   r   r2   r   enqueue0   s    

zDatabaseBackend.enqueue)	result_idr$   c              
   C   sX   ddl m} z|jj|djW S  |jtfyR } zt||W Y d }~n
d }~0 0 d S Nr   r   )id)r)   r   objectsgetr.   DoesNotExistr	   r   r,   r5   r   er   r   r   
get_resultB   s
    zDatabaseBackend.get_resultc              
      s^   ddl m} z|jj|dI d H jW S  |jtfyX } zt||W Y d }~n
d }~0 0 d S r6   )r)   r   r8   Zagetr.   r:   r	   r   r;   r   r   r   aget_resultJ   s
    zDatabaseBackend.aget_result)r#   r$   c                 +   s   ddl m} ddlm} t jf i |E d H  | jj}t	dsZt
t
j| ddV  tt| }|  tjdkr||rt
t
j| dd	|jd
V  d S )Nr   r   )0connection_requires_manual_exclusive_transactionzdjango_tasks.backends.databasezC configured as django_tasks backend, but database app not installedz9Insert 'django_tasks.backends.database' in INSTALLED_APPS)   r   z+ is using SQLite non-exclusive transactionszSet settings.DATABASES[z/]['OPTIONS']['transaction_mode'] to 'EXCLUSIVE')r)   r   utilsr?   supercheck	__class__r   r   is_installedr   CheckMessageERRORr
   r   Zdb_for_readZget_connection_paramsdjangoVERSIONr+   )r,   r#   r   r?   r(   Zdb_connectionrD   r   r   rC   R   s*    
zDatabaseBackend.check)r   r   r   Zsupports_async_taskZsupports_get_resultZsupports_deferr   r   r   r"   r#   r-   r   r4   strr=   r>   r   r   r   rF   rC   __classcell__r   r   rJ   r   r       s   r    )#Zdataclassesr   typingr   r   r   r   rH   Zdjango.appsr   Zdjango.core.checksr   Zdjango.core.exceptionsr	   Z	django.dbr
   r   r   Ztyping_extensionsr   Zdjango_tasks.backends.baser   Zdjango_tasks.exceptionsr   Zdjango_tasks.signalsr   Zdjango_tasks.taskr   r   ZBaseTaskResultr)   r   r   r   r    r   r   r   r   <module>   s&   