o
    q~9S­  ã                   @   sâ   d dl 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 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aejdk Zdd„ ZG dd„ deƒZdd„ Zdd„ ZdS )é    )Úabsolute_importN)Údatetime)Úwarn)Úsignals)ÚDictAttribute)Ú
BaseLoader)Údb)Úsettings)Úcache©Úmail_adminsé   )ÚDATABASE_ERRORSÚnowF)r   é   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   úB/var/www/html/env/lib/python3.10/site-packages/djcelery/loaders.pyÚ_maybe_close_fd   s
   þr   c                       s¦   e Zd ZdZdZdddœZ‡ fdd„Zdd	„ Zd%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‡ fdd„Zdd „ Zd!d"„ Zd%d#d$„Z‡  ZS )&ÚDjangoLoaderzThe Django loader.r   z*djcelery.backends.database.DatabaseBackendz$djcelery.backends.cache.CacheBackend)Údatabaser
   c                    s"   t t| ƒj|i |¤Ž |  ¡  d S r   )Úsuperr   Ú__init__Ú_install_signal_handlers)ÚselfÚargsÚkwargs©Ú	__class__r   r   r   +   s   zDjangoLoader.__init__c                 C   s    t j | j¡ t j | j¡ d S r   )r   Úbeat_embedded_initÚconnectÚclose_databaseÚworker_readyÚwarn_if_debug©r!   r   r   r   r    /   s   z%DjangoLoader._install_signal_handlersFc                 C   s   |rt  ¡ S tƒ S r   )r   Úutcnowr   )r!   Úutcr   r   r   r   5   s   zDjangoLoader.nowc                 C   sN   d| _ ttddƒpttddƒ}|sdt_tr#ttddƒr tdƒ dt_ttƒS )	z(Load configuration from Django settings.TÚCELERY_RESULT_BACKENDNÚCELERY_BACKENDr   ÚCELERY_ENABLE_UTCz&CELERY_ENABLE_UTC requires Django 1.4+F)Ú
configuredÚgetattrr	   r.   ÚNO_TZr   r0   r   )r!   Úbackendr   r   r   Úread_configuration8   s   
ÿzDjangoLoader.read_configurationc                 C   sš   z
dd„ t jD ƒ}W n ty!   tt dƒrt jg}nt jg}Y nw |D ]&}z|ƒ  W q$ tyJ } zt|ƒ}d|vr@d|vr@‚ W Y d }~q$d }~ww d S )Nc                 S   s   g | ]}|j ‘qS r   )r   )Ú.0Úconnr   r   r   Ú
<listcomp>I   s    z0DjangoLoader._close_database.<locals>.<listcomp>Úclose_old_connectionsÚclosedznot connected)r   Úconnectionsr   Úhasattrr9   Úclose_connectionr   Ústr)r!   Úfunsr   ÚexcÚstr_excr   r   r   Ú_close_databaseG   s$   

€ü
€ýýzDjangoLoader._close_databasec                 K   sH   | j  dd ¡}|s|  ¡ S | j|d krd| _|  ¡  |  jd7  _d S )NÚCELERY_DB_REUSE_MAXé   r   r   )ÚconfÚgetrB   Ú	_db_reuse)r!   r#   Údb_reuse_maxr   r   r   r(   X   s   zDjangoLoader.close_databasec              	   C   s*   zt j  ¡  W d S  ttfy   Y d S w r   )r
   r   r   r   r+   r   r   r   Úclose_cachea   s
   ÿzDjangoLoader.close_cachec                 C   s   |   ¡  |  ¡  dS )zmDoes everything necessary for Django to work in a long-living,
        multiprocessing environment.

        N)r(   rI   r+   r   r   r   Úon_process_cleanupg   s   zDjangoLoader.on_process_cleanupc                 C   s8   z|j j}W n ty   d}Y nw |s|  ¡  dS dS )zCalled before every task.FN)ÚrequestÚis_eagerr   r(   )r!   Útask_idÚtaskrL   r   r   r   Úon_task_initq   s   ÿÿzDjangoLoader.on_task_initc                 C   s   |   ¡  |  ¡  |  ¡  dS )zšCalled when the worker starts.

        Automatically discovers any ``tasks.py`` files in the applications
        listed in ``INSTALLED_APPS``.

        N)Úimport_default_modulesr(   rI   r+   r   r   r   Úon_worker_initz   s   zDjangoLoader.on_worker_initc                 K   s   t jr	tdƒ d S d S )Nz_Using settings.DEBUG leads to a memory leak, never use this setting in production environments!)r	   ÚDEBUGr   )r!   r#   r   r   r   r*   †   s   ÿzDjangoLoader.warn_if_debugc                    s   t t| ƒ ¡  |  ¡  d S r   )r   r   rP   Úautodiscoverr+   r$   r   r   rP   ‹   s   z#DjangoLoader.import_default_modulesc                 C   s    | j  dd„ tƒ p
dD ƒ¡ d S )Nc                 s   s   � | ]}|j V  qd S r   )Ú__name__)r6   Úmodr   r   r   Ú	<genexpr>�   s   € z,DjangoLoader.autodiscover.<locals>.<genexpr>r   )Útask_modulesÚupdaterS   r+   r   r   r   rS   �   s    zDjangoLoader.autodiscoverc                 C   sj   zt j ¡ D ]}|r|jrt|jƒ qW n ty*   t jr(t jjr(tt jjƒ Y nw |  ¡  |  ¡  d S r   )r   r;   ÚallÚ
connectionr   r   rB   rI   )r!   Úcr   r   r   Úon_worker_process_init’   s   

€þ€þz#DjangoLoader.on_worker_process_initc                 K   s   t |||d�S )N)Úfail_silentlyr   )r!   ÚsubjectÚbodyr]   r#   r   r   r   r   ¦   s   zDjangoLoader.mail_admins)F)rT   Ú
__module__Ú__qualname__Ú__doc__rG   Úoverride_backendsr   r    r   r5   rB   r(   rI   rJ   rO   rQ   r*   rP   rS   r\   r   Ú__classcell__r   r   r$   r   r   "   s*    þ
	
	r   c                   C   s0   t rdS da ztddd„ tjD ƒƒW da S da w )z9Include tasks for all applications in ``INSTALLED_APPS``.NTc                 S   s   g | ]}t |d ƒ‘qS )Útasks)Úfind_related_module)r6   Úappr   r   r   r8   ²   s    ÿz autodiscover.<locals>.<listcomp>F)Ú_RACE_PROTECTIONÚfilterr	   ÚINSTALLED_APPSr   r   r   r   rS   ª   s   
ÿrS   c              
   C   s”   zt  | ¡j}W n% ty$ } ztd| ||f ƒ W Y d}~dS d}~w ty-   Y dS w zt ||¡ W n
 ty@   Y dS w t  d | |¡¡S )z^Given an application name and a module name, tries to find that
    module in the application.z'Autodiscover: Error importing %s.%s: %rNz{0}.{1})	Ú	importlibÚimport_moduleÚ__path__ÚImportErrorr   r   ÚimpÚfind_moduleÚformat)rg   Úrelated_nameÚapp_pathr@   r   r   r   rf   ¸   s"   ÿ€ÿÿrf   ) Ú
__future__r   r   ro   rk   r   Úwarningsr   Úceleryr   Úcelery.datastructuresr   Úcelery.loaders.baser   Údjangor   Údjango.confr	   Údjango.corer
   Údjango.core.mailr   Úutilsr   r   rh   ÚVERSIONr3   r   r   rS   rf   r   r   r   r   Ú<module>   s,    
 	