o
    wvXj  ã                   @   sÂ   d Z ddlmZm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eƒZG dd„ deƒZdS )zDjango-specific customization.é    )Úabsolute_importÚunicode_literalsN)Ú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   s0   z
t  |  ¡ ¡ W d S  tttfy   Y d S w ©N)ÚosÚcloseÚfilenoÚAttributeErrorÚOSErrorÚ	TypeError)Úfh© r   úQ/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/fixups/django.pyÚ_maybe_close_fd   s
   þr   c                 C   s   | j dk r	tdƒ‚d S )N)é   é   z)Celery 4.x requires Django 1.11 or later.)ÚVERSIONr   )Údjangor   r   r   Ú_verify_django_version    s   
ÿr   ÚDJANGO_SETTINGS_MODULEc                 C   sj   t j |¡}|r1d| j ¡ vr3zddl}W n ty&   t t	t
ƒ¡ Y dS w t|ƒ t| ƒ ¡ S d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ÚenvÚ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 u r| j  ¡  d | _d S r   )r)   r	   Údefault_appÚset_defaultÚ_worker_fixup©Úselfr)   r   r   r   Ú__init__5   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
   Úimport_modulesÚconnectÚon_import_modulesÚworker_initÚon_worker_init©r0   r   r   r   r(   ;   s   
zDjangoFixup.installc                 C   s   | j d u rt| jƒ| _ | j S r   )r.   ÚDjangoWorkerFixupr)   r?   r   r   r   Úworker_fixupH   s   
zDjangoFixup.worker_fixupc                 C   s
   || _ d S r   )r.   )r0   Úvaluer   r   r   rA   N   s   
c                 K   ó   | j  ¡  d S r   )rA   Úvalidate_models©r0   Úkwargsr   r   r   r<   R   s   zDjangoFixup.on_import_modulesc                 K   rC   r   )rA   r(   rE   r   r   r   r>   V   s   zDjangoFixup.on_worker_initFc                 C   s   |rt  ¡ S |  ¡ S r   )r   ÚutcnowÚ_now)r0   Úutcr   r   r   r8   Y   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>)Údjango.appsrJ   Úget_app_configs)r0   rJ   r   r   r   Úautodiscover_tasks\   s   zDjangoFixup.autodiscover_tasksc                 C   s   t dƒS )Nzdjango.utils.timezone:nowr   r?   r   r   r   rH   `   s   zDjangoFixup._nowN©F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r(   ÚpropertyrA   Úsetterr<   r>   r8   rQ   r   rH   r   r   r   r   r   2   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 )NÚCELERY_DB_REUSE_MAXz	django.dbzdjango.core.cacher2   zdjango.db.utils.InterfaceErrorzdjango.db:DatabaseError)r)   Úconfr!   Údb_reuse_maxr   Ú_dbÚ_cacher   r7   Úinterface_errorsÚDatabaseErrorr/   r   r   r   r1   h   s   


ÿzDjangoWorkerFixup.__init__c                 C   s   dd l }| ¡  d S )Nr   )r   Úsetup)r0   r   r   r   r   Údjango_setupt   s   zDjangoWorkerFixup.django_setupc                 C   s   ddl m} |  ¡  |ƒ  d S )Nr   )Ú
run_checks)Údjango.core.checksrb   ra   )r0   rb   r   r   r   rD   x   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
   Úbeat_embedded_initr;   Úclose_databaseÚworker_readyÚon_worker_readyÚtask_prerunÚon_task_prerunÚtask_postrunÚon_task_postrunÚworker_process_initÚon_worker_process_initÚclose_cacher?   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 )NÚFORKED_BY_MULTIPROCESSINGT)Úforce)r   r    r!   rD   r\   ÚconnectionsÚallÚ
connectionÚ_maybe_close_db_fdÚ_close_databasern   )r0   rF   Úcr   r   r   rm   ‡   s   

€z(DjangoWorkerFixup.on_worker_process_initc                 C   s&   zt |ƒ W d S  | jy   Y d S w r   )r   r^   )r0   Úfdr   r   r   rt   �   s
   ÿz$DjangoWorkerFixup._maybe_close_db_fdc                 K   s   t |jddƒs|  ¡  dS dS )zCalled before every task.Úis_eagerFN)ÚgetattrÚrequestre   ©r0   ÚsenderrF   r   r   r   ri   £   s   ÿz DjangoWorkerFixup.on_task_prerunc                 K   s&   t |jddƒs|  ¡  |  ¡  d S d S )Nrx   F)ry   rz   re   rn   r{   r   r   r   rk   ¨   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   )r[   ru   Ú_db_recyclesrE   r   r   r   re   ¯   s   z DjangoWorkerFixup.close_databaseFc                 C   s‚   | j j ¡ D ]8}z|r| ¡  n| ¡  W q | jy   Y q | jy> } zt|ƒ}d|vr4d|vr4‚ W Y d }~qd }~ww d S )NÚclosedznot connected)r\   rq   rr   r   Úclose_if_unusable_or_obsoleter^   r_   Ústr)r0   rp   ÚconnÚexcÚstr_excr   r   r   ru   ·   s   
€€ýøz!DjangoWorkerFixup._close_databasec              	   C   s*   z| j  ¡  W d S  ttfy   Y d S w r   )r]   Úclose_cachesr   r   r?   r   r   r   rn   Å   s
   ÿzDjangoWorkerFixup.close_cachec                 K   s   | j jrt d¡ d S d S )NzkUsing settings.DEBUG leads to a memory
            leak, never use this setting in production environments!)r7   ÚDEBUGr%   r&   rE   r   r   r   rg   Ë   s   ÿz!DjangoWorkerFixup.on_worker_readyNrR   )rS   rT   rU   r~   r1   ra   rD   r(   rm   rt   ri   rk   re   ru   rn   rg   r   r   r   r   r@   e   s    

r@   )r   )rV   Ú
__future__r   r   r   r3   r%   r   Ú	importlibr   Úkombu.utils.importsr   Úkombu.utils.objectsr   Úceleryr	   r
   Úcelery.exceptionsr   r   Ú__all__r'   r   r   r   Úobjectr   r@   r   r   r   r   Ú<module>   s$    
3