U
    .e                     @   s<  d 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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  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)import_module)IOTYPE_CHECKINGAnyListOptionalcastsymbol_by_name)cached_property)_statesignals)FixupWarningImproperlyConfigured)
ModuleType)Protocol)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-f4liivr4/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    
r.   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_INSTALLEDr.   r   install)r0   r1   ZSETTINGS_MODULEr*   r   r   r   r   1   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   )r0   c                 C   s$   || _ tjd kr| j   d | _d S r"   )r0   r   Zdefault_appset_default_worker_fixupselfr0   r   r   r   __init__B   s    

zDjangoFixup.__init__r!   c                 C   sH   t jdt  td| _| j| jj	_t
j| j t
j| j | S )Nr   django.conf:settings)syspathinsertr#   getcwdr   	_settingsnowr0   loaderr   Zimport_modulesconnecton_import_modulesZworker_initon_worker_initr>   r   r   r   r:   H   s    
zDjangoFixup.installDjangoWorkerFixupc                 C   s   | j d krt| j| _ | j S r"   )r<   rM   r0   rL   r   r   r   worker_fixupU   s    
zDjangoFixup.worker_fixupN)valuer!   c                 C   s
   || _ d S r"   )r<   )r>   rO   r   r   r   rN   [   s    kwargsr!   c                 K   s   | j   d S r"   )rN   validate_modelsr>   rQ   r   r   r   rJ   _   s    zDjangoFixup.on_import_modulesc                 K   s   | j   d S r"   )rN   r:   rS   r   r   r   rK   c   s    zDjangoFixup.on_worker_initF)utcr!   c                 C   s   |rt  S |  S r"   )r   utcnow_now)r>   rT   r   r   r   rG   f   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>k   s     z2DjangoFixup.autodiscover_tasks.<locals>.<listcomp>)Zdjango.appsrW   Zget_app_configs)r>   rW   r   r   r   autodiscover_tasksi   s    zDjangoFixup.autodiscover_tasksc                 C   s   t dS )Nzdjango.utils.timezone:nowr
   rL   r   r   r   rV   m   s    zDjangoFixup._now)F)r   r   r   __doc__r?   r:   propertyrN   setterr   rJ   rK   boolr   rG   r   strr\   r   rV   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	e
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 )#rM   r   r   N)r0   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.cacherA   zdjango.db.utils.InterfaceErrorzdjango.db:DatabaseError)r0   confr3   db_reuse_maxr	   r   _db_cacher   rF   interface_errorsDatabaseErrorr=   r   r   r   r?   u   s    

zDjangoWorkerFixup.__init__r@   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.checksrj   ri   r#   r2   r3   )r>   rj   r   r   r   rR      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_initrI   close_databaseZtask_prerunon_task_prerunZtask_postrunon_task_postrunZworker_process_initon_worker_process_initclose_cacherL   r   r   r   r:      s    zDjangoWorkerFixup.installrP   c                 K   sT   t jdr|   | jj D ]}|r |jr | |j q | j	dd | 
  d S )NZFORKED_BY_MULTIPROCESSINGT)force)r#   r2   r3   rR   rd   r   all
connection_maybe_close_db_fd_close_databasero   )r>   rQ   cr   r   r   rn      s    

z(DjangoWorkerFixup.on_worker_process_init)fdr!   c                 C   s(   zt | W n | jk
r"   Y nX d S r"   )r)   rf   )r>   rv   r   r   r   rs      s    z$DjangoWorkerFixup._maybe_close_db_fdr   )senderrQ   r!   c                 K   s   t |jdds|   dS )zCalled before every task.is_eagerFN)getattrrequestrk   r>   rw   rQ   r   r   r   rl      s    z DjangoWorkerFixup.on_task_prerunc                 K   s"   t |jdds|   |   d S )Nrx   F)ry   rz   rk   ro   r{   r   r   r   rm      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+   )rc   rt   _db_recyclesrS   r   r   r   rk      s    z DjangoWorkerFixup.close_databaseF)rp   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)rd   r   rq   r$   Zclose_if_unusable_or_obsoleterf   rg   ra   )r>   rp   connexcZstr_excr   r   r   rt      s    
z!DjangoWorkerFixup._close_databasec              	   C   s,   z| j   W n ttfk
r&   Y nX d S r"   )re   Zclose_cachesr(   r&   rL   r   r   r   ro      s    zDjangoWorkerFixup.close_cache)F)r   r   r   r}   r?   ri   rR   r:   r   rn   r   rs   rl   rm   rk   r`   rt   ro   r   r   r   r   rM   r   s   	rM   )r/   )*r]   r#   rB   r7   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.utilsr   Zcelery.app.baser   Zcelery.app.taskr   r   __all__r9   r)   r.   ra   r   r   rM   r   r   r   r   <module>   s0    3