U
    Z¨+d¼  ã                   @   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 ddl	m
Z
 ddlmZmZ ddlmZmZ d	Zd
Zdd„ Zdd„ Zddd„ZG dd„ dƒZG dd„ dƒZdS )zDjango-specific customization.é    N)Údatetime)Úimport_module©Úsymbol_by_name)Úcached_property)Ú_stateÚsignals)ÚFixupWarningÚImproperlyConfigured)ÚDjangoFixupÚfixupzpEnvironment variable DJANGO_SETTINGS_MODULE is defined
but Django isn't installed.  Won't apply Django fix-ups!
c              
   C   s2   zt  |  ¡ ¡ W n tttfk
r,   Y nX d S ©N)ÚosÚcloseÚfilenoÚAttributeErrorÚOSErrorÚ	TypeError)Úfh© r   ú8/tmp/pip-unpacked-wheel-ucduq0nd/celery/fixups/django.pyÚ_maybe_close_fd   s    r   c                 C   s   | j dk rtdƒ‚d S )N)é   é   z)Celery 5.x requires Django 1.11 or later.)ÚVERSIONr
   )Údjangor   r   r   Ú_verify_django_version   s    
r   ÚDJANGO_SETTINGS_MODULEc                 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)ÚappÚenvZSETTINGS_MODULEr   r   r   r   r   #   s    r   c                   @   sh   e Zd ZdZdd„ Zdd„ Zedd„ ƒZejdd„ ƒZd	d
„ Z	dd„ Z
ddd„Zdd„ Zedd„ ƒZdS )r   z"Fixup installed when using Django.c                 C   s$   || _ tjd kr| j  ¡  d | _d S r   )r'   r   Zdefault_appÚset_defaultÚ_worker_fixup©Úselfr'   r   r   r   Ú__init__3   s    

zDjangoFixup.__init__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Únowr'   Úloaderr   Zimport_modulesÚconnectÚon_import_modulesZworker_initÚon_worker_init©r,   r   r   r   r&   9   s    
zDjangoFixup.installc                 C   s   | j d krt| jƒ| _ | j S r   )r*   ÚDjangoWorkerFixupr'   r9   r   r   r   Úworker_fixupF   s    
zDjangoFixup.worker_fixupc                 C   s
   || _ d S r   )r*   )r,   Úvaluer   r   r   r;   L   s    c                 K   s   | j  ¡  d S r   )r;   Úvalidate_models©r,   Úkwargsr   r   r   r7   P   s    zDjangoFixup.on_import_modulesc                 K   s   | j  ¡  d S r   )r;   r&   r>   r   r   r   r8   T   s    zDjangoFixup.on_worker_initFc                 C   s   |rt  ¡ S |  ¡ S r   )r   ÚutcnowÚ_now)r,   Úutcr   r   r   r4   W   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>\   s     z2DjangoFixup.autodiscover_tasks.<locals>.<listcomp>)Zdjango.appsrC   Zget_app_configs)r,   rC   r   r   r   Úautodiscover_tasksZ   s    zDjangoFixup.autodiscover_tasksc                 C   s   t dƒS )Nzdjango.utils.timezone:nowr   r9   r   r   r   rA   ^   s    zDjangoFixup._nowN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r&   Úpropertyr;   Úsetterr7   r8   r4   rH   r   rA   r   r   r   r   r   0   s   


r   c                   @   sr   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )r:   r   c                 C   sP   || _ | j j dd ¡| _tdƒ| _tdƒ| _tdƒ| _tdƒf| _	tdƒ| _
d S )NZCELERY_DB_REUSE_MAXz	django.dbzdjango.core.cacher.   zdjango.db.utils.InterfaceErrorzdjango.db:DatabaseError)r'   Úconfr   Údb_reuse_maxr   Ú_dbÚ_cacher   r3   Úinterface_errorsÚDatabaseErrorr+   r   r   r   r-   f   s    


ÿzDjangoWorkerFixup.__init__c                 C   s   dd l }| ¡  d S )Nr   )r   Úsetup)r,   r   r   r   r   Údjango_setupr   s    zDjangoWorkerFixup.django_setupc                 C   s   ddl m} |  ¡  |ƒ  d S )Nr   )Ú
run_checks)Zdjango.core.checksrW   rV   )r,   rW   r   r   r   r=   v   s    z!DjangoWorkerFixup.validate_modelsc                 C   sZ   t j | j¡ t j | j¡ t j | j¡ t j | j	¡ t j
 | j¡ |  ¡  |  ¡  | S r   )r   Zbeat_embedded_initr6   Úclose_databaseZworker_readyÚon_worker_readyZtask_prerunÚon_task_prerunZtask_postrunÚon_task_postrunZworker_process_initÚon_worker_process_initÚclose_cacher9   r   r   r   r&   {   s    zDjangoWorkerFixup.installc                 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   r   r   r=   rQ   ÚconnectionsÚallÚ
connectionÚ_maybe_close_db_fdÚ_close_databaser]   )r,   r?   Úcr   r   r   r\   …   s    

z(DjangoWorkerFixup.on_worker_process_initc                 C   s(   zt |ƒ W n | jk
r"   Y nX d S r   )r   rS   )r,   Úfdr   r   r   rb   ›   s    z$DjangoWorkerFixup._maybe_close_db_fdc                 K   s   t |jddƒs|  ¡  dS )zCalled before every task.Úis_eagerFN)ÚgetattrÚrequestrX   ©r,   Zsenderr?   r   r   r   rZ   ¡   s    z DjangoWorkerFixup.on_task_prerunc                 K   s"   t |jddƒs|  ¡  |  ¡  d S )Nrf   F)rg   rh   rX   r]   ri   r   r   r   r[   ¦   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   )rP   rc   Ú_db_recyclesr>   r   r   r   rX   ­   s    z DjangoWorkerFixup.close_databaseFc                 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)rQ   r_   r`   r   Zclose_if_unusable_or_obsoleterS   rT   Ústr)r,   r^   ÚconnÚexcZstr_excr   r   r   rc   µ   s    
z!DjangoWorkerFixup._close_databasec              	   C   s,   z| j  ¡  W n ttfk
r&   Y nX d S r   )rR   Zclose_cachesr   r   r9   r   r   r   r]   Ã   s    zDjangoWorkerFixup.close_cachec                 K   s   | j jrt d¡ d S )NzkUsing settings.DEBUG leads to a memory
            leak, never use this setting in production environments!)r3   ÚDEBUGr#   r$   r>   r   r   r   rY   É   s    z!DjangoWorkerFixup.on_worker_readyN)F)rI   rJ   rK   rk   r-   rV   r=   r&   r\   rb   rZ   r[   rX   rc   r]   rY   r   r   r   r   r:   c   s   

r:   )r   )rL   r   r/   r#   r   Ú	importlibr   Zkombu.utils.importsr   Zkombu.utils.objectsr   Zceleryr   r   Zcelery.exceptionsr	   r
   Ú__all__r%   r   r   r   r   r:   r   r   r   r   Ú<module>   s    
3