o
    Df                     @   s@  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
rpd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$de	ddfddZ%d%ddZ&d&ddde'ded f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)ConnectionHandler)Celery)Taskc                   @   s   e Zd ZU eed< dS )DjangoDBModuleconnectionsN)__name__
__module____qualname__r   __annotations__ r   r   M/home/ubuntu/webapp/venv/lib/python3.10/site-packages/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   s0   z
t |   W d S  tttfy   Y d S w N)osclosefilenoAttributeErrorOSError	TypeError)r!   r   r   r   _maybe_close_fd$   s
   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_MODULEappr   envr   c                 C   sf   t j|}|r1d| j vr1zddl}W n ty&   tt	t
 Y dS w 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)r1   r2   SETTINGS_MODULEr+   r   r   r   r    1   s   r    c                   @   s   e Zd ZdZdddZdddZedd
dZejdddZde	ddfddZ
de	ddfddZd dedefddZdee fddZedefddZdS )!r   z"Fixup installed when using Django.r1   r   c                 C   s$   || _ tjd u r| j   d | _d S r#   )r1   r   default_appset_default_worker_fixupselfr1   r   r   r   __init__B   s   


zDjangoFixup.__init__r"   c                 C   sX   t jdt  td| _| j| jj	_| jj
sd| j_tj| j tj| j | S )Nr   django.conf:settingsz%celery.contrib.django.task:DjangoTask)syspathinsertr$   getcwdr   	_settingsnowr1   loader_custom_task_cls_usedtask_clsr   import_modulesconnecton_import_modulesworker_initon_worker_initrA   r   r   r   r;   H   s   
zDjangoFixup.installDjangoWorkerFixupc                 C   s   | j d u rt| j| _ | j S r#   )r?   rS   r1   rR   r   r   r   worker_fixupX   s   
zDjangoFixup.worker_fixupvalueNc                 C   s
   || _ d S r#   )r?   )rA   rU   r   r   r   rT   ^   s   
kwargsc                 K      | j   d S r#   )rT   validate_modelsrA   rV   r   r   r   rO   b   s   zDjangoFixup.on_import_modulesc                 K   rW   r#   )rT   r;   rY   r   r   r   rQ   f   s   zDjangoFixup.on_worker_initFutcc                 C   s   |rt tjS |  S r#   )r   rI   r   rZ   _now)rA   rZ   r   r   r   rI   i   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>n   s    z2DjangoFixup.autodiscover_tasks.<locals>.<listcomp>)django.appsr\   get_app_configs)rA   r\   r   r   r   autodiscover_tasksl   s   zDjangoFixup.autodiscover_tasksc                 C   s   t dS )Nzdjango.utils.timezone:nowr   rR   r   r   r   r[   p   s   zDjangoFixup._now)r1   r   )r"   r   r"   rS   )rU   rS   r"   NF)r   r   r   __doc__rB   r;   propertyrT   setterr   rO   rQ   boolr   rI   r   strrc   r   r[   r   r   r   r   r   ?   s    

c                   @   s   e Zd ZdZd"ddZd#dd	Zd#d
dZd$ddZdeddfddZ	de
ddfddZdddeddfddZdddeddfddZdeddfddZd%deddfddZd#d d!ZdS )&rS   r   r1   r   r"   Nc                 C   sV   || _ | j jdd | _tdtd| _td| _td| _	tdf| _
td| _d S )NCELERY_DB_REUSE_MAXr   z	django.dbzdjango.core.cacherC   zdjango.db.utils.InterfaceErrorzdjango.db:DatabaseError)r1   confr4   db_reuse_maxr
   r   _db_cacher   rH   interface_errorsDatabaseErrorr@   r   r   r   rB   x   s   

zDjangoWorkerFixup.__init__c                 C   s   dd l }|  d S )Nr   )r+   setup)rA   r+   r   r   r   django_setup   s   zDjangoWorkerFixup.django_setupc                 C   s.   ddl m} |   tjds|  d S d S )Nr   )
run_checksCELERY_SKIP_CHECKS)django.core.checksrt   rs   r$   r3   r4   )rA   rt   r   r   r   rX      s
   
z!DjangoWorkerFixup.validate_modelsc                 C   sL   t j| j t j| j t j| j t j| j	 |   | 
  | S r#   )r   beat_embedded_initrN   close_databasetask_prerunon_task_preruntask_postrunon_task_postrunworker_process_initon_worker_process_initclose_cacherR   r   r   r   r;      s   zDjangoWorkerFixup.installrV   c                 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$   r3   r4   rX   rn   r   all
connection_maybe_close_db_fd_close_databaser   )rA   rV   cr   r   r   r~      s   

z(DjangoWorkerFixup.on_worker_process_initfdc                 C   s&   zt | W d S  | jy   Y d S w r#   )r*   rp   )rA   r   r   r   r   r      s
   z$DjangoWorkerFixup._maybe_close_db_fdsenderr   c                 K   s   t |jdds|   dS dS )zCalled before every task.is_eagerFN)getattrrequestrx   rA   r   rV   r   r   r   rz      s   z DjangoWorkerFixup.on_task_prerunc                 K   s&   t |jdds|   |   d S d S )Nr   F)r   r   rx   r   r   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,   )rm   r   _db_recyclesrY   r   r   r   rx      s   z DjangoWorkerFixup.close_databaseFr   c                 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)rn   r   r   r%   close_if_unusable_or_obsoleterp   rq   rj   )rA   r   connexcstr_excr   r   r   r      s   
z!DjangoWorkerFixup._close_databasec              	   C   s*   z| j   W d S  ttfy   Y d S w r#   )ro   close_cachesr)   r'   rR   r   r   r   r      s
   zDjangoWorkerFixup.close_cache)r1   r   r"   N)r"   Nrd   re   )r   r   r   r   rB   rs   rX   r;   r   r~   r   r   rz   r|   rx   ri   r   r   r   r   r   r   rS   u   s    



	rS   )r+   r   r"   N)r0   )+rf   r$   rD   r8   r   r   	importlibr   typingr   r   r   r   r	   r
   kombu.utils.importsr   kombu.utils.objectsr   celeryr   r   celery.exceptionsr   r   typesr   r   django.db.utilsr   celery.app.baser   celery.app.taskr   r   __all__r:   r*   r/   rj   r    r   rS   r   r   r   r   <module>   s2     
6