U
    bh                     @   sL  d Z ddlZddlZddl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dlmZ ddlmZmZ dd	lmZmZ e
rd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# G dd deZ$dZ%dZ&e	ddddZ'dddddZ(d$de)ed ddd Z*G d!d dZ+G d"d# d#Z,dS )%zDjango-specific customization.    N)datetimetimezone)import_module)IOTYPE_CHECKINGAnyListOptionalcastsymbol_by_name)cached_property)_statesignals)FixupWarningImproperlyConfigured)
ModuleType)Protocol)BaseDatabaseWrapper)ConnectionHandler)Celery)Taskc                   @   s   e Zd ZU eed< dS )DjangoDBModuleconnectionsN)__name__
__module____qualname__r   __annotations__ r   r   8/tmp/pip-unpacked-wheel-kcem4wq5/celery/fixups/django.pyr      s   
r   )DjangoFixupfixupzpEnvironment variable DJANGO_SETTINGS_MODULE is defined
but Django isn't installed.  Won't apply Django fix-ups!
)fhreturnc              
   C   s2   zt |   W n tttfk
r,   Y nX d S N)osclosefilenoAttributeErrorOSError	TypeError)r"   r   r   r   _maybe_close_fd%   s    r+   r   )djangor#   c                 C   s   | j dk rtdd S )N)      z)Celery 5.x requires Django 1.11 or later.)VERSIONr   )r,   r   r   r   _verify_django_version-   s    
r0   DJANGO_SETTINGS_MODULEr   r    )appenvr#   c                 C   sf   t j|}|rbd| j krbzddl}W n" tk
rL   tt	t
 Y nX t| t|  S dS )z;Install Django fixup if settings module environment is set.r,   r   N)r%   environget
loader_clslowerr,   ImportErrorwarningswarnr   ERR_NOT_INSTALLEDr0   r    install)r2   r3   ZSETTINGS_MODULEr,   r   r   r   r!   2   s    r!   c                   @   s   e Zd ZdZddddZd dddZed	dd
dZejd	ddddZe	ddddZ
e	ddddZdeedddZee dddZeedddZdS )r    z"Fixup installed when using Django.r   )r2   c                 C   s$   || _ tjd kr| j   d | _d S r$   )r2   r   Zdefault_appset_default_worker_fixupselfr2   r   r   r   __init__C   s    

zDjangoFixup.__init__r#   c                 C   sX   t jdt  td| _| j| jj	_| jj
s8d| j_tj| j tj| j | S )Nr   django.conf:settingsz%celery.contrib.django.task:DjangoTask)syspathinsertr%   getcwdr   	_settingsnowr2   loaderZ_custom_task_cls_usedZtask_clsr   Zimport_modulesconnecton_import_modulesZworker_initon_worker_initr@   r   r   r   r<   I   s    
zDjangoFixup.installDjangoWorkerFixupc                 C   s   | j d krt| j| _ | j S r$   )r>   rO   r2   rN   r   r   r   worker_fixupY   s    
zDjangoFixup.worker_fixupN)valuer#   c                 C   s
   || _ d S r$   )r>   )r@   rQ   r   r   r   rP   _   s    kwargsr#   c                 K   s   | j   d S r$   )rP   validate_modelsr@   rS   r   r   r   rL   c   s    zDjangoFixup.on_import_modulesc                 K   s   | j   d S r$   )rP   r<   rU   r   r   r   rM   g   s    zDjangoFixup.on_worker_initF)utcr#   c                 C   s   |rt tjS |  S r$   )r   rI   r   rV   _now)r@   rV   r   r   r   rI   j   s    zDjangoFixup.nowc                 C   s   ddl m} dd | D S )Nr   )appsc                 S   s   g | ]
}|j qS r   )name).0configr   r   r   
<listcomp>o   s     z2DjangoFixup.autodiscover_tasks.<locals>.<listcomp>)Zdjango.appsrX   Zget_app_configs)r@   rX   r   r   r   autodiscover_tasksm   s    zDjangoFixup.autodiscover_tasksc                 C   s   t dS )Nzdjango.utils.timezone:nowr   rN   r   r   r   rW   q   s    zDjangoFixup._now)F)r   r   r   __doc__rA   r<   propertyrP   setterr   rL   rM   boolr   rI   r   strr]   r   rW   r   r   r   r   r    @   s   c                   @   s   e Zd ZdZdddddZdddd	Zddd
dZd dddZeddddZ	dddddZ
deddddZdeddddZeddddZd#edddd Zddd!d"ZdS )$rO   r   r   N)r2   r#   c                 C   sV   || _ | j jdd | _tdtd| _td| _td| _	tdf| _
td| _d S )NZCELERY_DB_REUSE_MAXr   z	django.dbzdjango.core.cacherC   zdjango.db.utils.InterfaceErrorzdjango.db:DatabaseError)r2   confr5   db_reuse_maxr
   r   _db_cacher   rH   interface_errorsDatabaseErrorr?   r   r   r   rA   y   s    

zDjangoWorkerFixup.__init__rB   c                 C   s   dd l }|  d S )Nr   )r,   setup)r@   r,   r   r   r   django_setup   s    zDjangoWorkerFixup.django_setupc                 C   s*   ddl m} |   tjds&|  d S )Nr   )
run_checksZCELERY_SKIP_CHECKS)Zdjango.core.checksrk   rj   r%   r4   r5   )r@   rk   r   r   r   rT      s    z!DjangoWorkerFixup.validate_modelsc                 C   sL   t j| j t j| j t j| j t j| j	 |   | 
  | S r$   )r   Zbeat_embedded_initrK   close_databaseZtask_prerunon_task_prerunZtask_postrunon_task_postrunZworker_process_initon_worker_process_initclose_cacherN   r   r   r   r<      s    zDjangoWorkerFixup.installrR   c                 K   sR   t jdr|   | jj D ]}|r |jr | | q | j	dd | 
  d S )NZFORKED_BY_MULTIPROCESSINGT)force)r%   r4   r5   rT   re   r   all
connection_maybe_close_db_fd_close_databaserp   )r@   rS   cr   r   r   ro      s    

z(DjangoWorkerFixup.on_worker_process_initr   )rv   r#   c              	   C   s<   z |j  t|j W 5 Q R X W n | jk
r6   Y nX d S r$   )Zwrap_database_errorsr+   rs   rg   )r@   rv   r   r   r   rt      s
    z$DjangoWorkerFixup._maybe_close_db_fdr   )senderrS   r#   c                 K   s   t |jdds|   dS )zCalled before every task.is_eagerFN)getattrrequestrl   r@   rw   rS   r   r   r   rm      s    z DjangoWorkerFixup.on_task_prerunc                 K   s"   t |jdds|   |   d S )Nrx   F)ry   rz   rl   rp   r{   r   r   r   rn      s    z!DjangoWorkerFixup.on_task_postrunc                 K   s>   | j s|  S | j| j d kr,d| _|   |  jd7  _d S )N   r   r-   )rd   ru   _db_recyclesrU   r   r   r   rl      s    z DjangoWorkerFixup.close_databaseF)rq   r#   c                 C   s   | j j D ]r}z|r |  n|  W q | jk
r@   Y q | jk
r| } zt|}d|krld|krl W 5 d }~X Y qX qd S )Nclosedznot connected)re   r   rr   r&   Zclose_if_unusable_or_obsoleterg   rh   rb   )r@   rq   connexcZstr_excr   r   r   ru      s    
z!DjangoWorkerFixup._close_databasec              	   C   s,   z| j   W n ttfk
r&   Y nX d S r$   )rf   Zclose_cachesr*   r(   rN   r   r   r   rp      s    zDjangoWorkerFixup.close_cache)F)r   r   r   r}   rA   rj   rT   r<   r   ro   rt   rm   rn   rl   ra   ru   rp   r   r   r   r   rO   v   s   	rO   )r1   )-r^   r%   rD   r9   r   r   	importlibr   typingr   r   r   r   r	   r
   Zkombu.utils.importsr   Zkombu.utils.objectsr   Zceleryr   r   Zcelery.exceptionsr   r   typesr   r   Zdjango.db.backends.base.baser   Zdjango.db.utilsr   Zcelery.app.baser   Zcelery.app.taskr   r   __all__r;   r+   r0   rb   r!   r    rO   r   r   r   r   <module>   s2    6