o
    QDi#                     @   s   d dl 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 dlmZ d dlmZmZmZ g d	Zd
d Zdd ZG dd deZdS )    N)perf_counter)Local)settings)CacheHandlercaches)gettext_lazyngettext)Panel)get_stack_traceget_template_inforender_stacktrace)addgetset
get_or_settouchdeleteclearget_manyset_manydelete_manyhas_keyincrdecrincr_versiondecr_versionc                    s6   t t fdd}t| d S )Nc                     s0   j }|d u r| i |S | | |S N)_djdt_panel_record_call)argskwargspanelaliascachenameoriginal_method S/var/www/Datamplify/venv/lib/python3.10/site-packages/debug_toolbar/panels/cache.pywrapper$   s   z%_monkey_patch_method.<locals>.wrapper)getattr	functoolswrapssetattr)r$   r%   r#   r)   r'   r"   r(   _monkey_patch_method!   s   
r.   c                 C   s0   t | dd stD ]}t| || q|| _d S d S )Nr   )r*   WRAPPED_CACHE_METHODSr.   r   )r$   r#   r!   r%   r'   r'   r(   _monkey_patch_cache/   s
   
r0   c                       s   e Zd ZdZdZdZe Z fddZe	dd Z
e	dd	 Zd
d Zdd ZedZedd Zedd Zdd Zdd Zdd Zdd Zdd Z  ZS )
CachePanelz3
    Panel that displays the cache statistics.
    zdebug_toolbar/panels/cache.htmlTc                    s<   t  j|i | d| _d| _d| _g | _ttd| _	d S )Nr   )
super__init__
total_timehitsmissescallsdictfromkeysr/   counts)selfr   r    	__class__r'   r(   r3   A   s   zCachePanel.__init__c                 C   s   t | jddS )a  
        Return the currently enabled CachePanel instance or None.

        If a request is in process with a CachePanel enabled, this will return that
        panel (based on the current thread or async task).  Otherwise it will return
        None.
        current_instanceN)r*   _context_locals)clsr'   r'   r(   r>   I   s   	zCachePanel.current_instancec                    s<   t tdstjt fdd}|t_dt_d S d S )N_djdt_patchedc                    s*   | |}   }|d urt||| |S r   )r>   r0   )r;   r#   r$   r!   r@   r&   r'   r(   r)   ]   s
   
z!CachePanel.ready.<locals>.wrapperT)hasattrr   create_connectionr+   r,   rA   )r@   r)   r'   rB   r(   readyT   s   

zCachePanel.readyc	           
   
   C   s   |dks|dkr|d u r|  j d7  _ n.|  jd7  _n&|dkrBd|v r(|d n|d }	|  jt|7  _|  j t|	t| 7  _ |d9 }|  j|7  _| j|  d7  < | j||||t|||d d S )	Nr   r      r   keysr   i  )timer%   r   r    tracetemplate_infobackend)r6   r5   lenr4   r:   r7   appendr   )
r;   r%   
time_takenreturn_valuer   r    rI   rJ   rK   rG   r'   r'   r(   _store_call_infoh   s*   zCachePanel._store_call_infoc           
      C   sp   d |_ zt }||i |}t | }	W | |_ n| |_ w | j||	|||tddt | dt|j dd |S )N   )skipz ())r%   rN   rO   r   r    rI   rJ   rK   )r   r   rP   r
   r   type__name__)
r;   r$   r#   r%   r&   r   r    
start_timevaluetr'   r'   r(   r      s"   
zCachePanel._record_callCachec                 C   s2   |   }t|d}tdd|||dd S )Nr7   z$%(cache_calls)d call in %(time).2fmsz%%(cache_calls)d calls in %(time).2fmsr4   )cache_callsrH   )	get_statsrL   r   r   )r;   statsrZ   r'   r'   r(   nav_subtitle   s   zCachePanel.nav_subtitlec                 C   s"   |   d}tdd|d|i S )Ntotal_cachesz"Cache calls from %(count)d backendz#Cache calls from %(count)d backendscount)r[   r   r   )r;   r_   r'   r'   r(   title   s   zCachePanel.titlec                 C   s*   |   D ]
\}}t|||  q| | j_d S r   )initialized_cachesr0   r?   r>   )r;   r$   r#   r'   r'   r(   enable_instrumentation   s   z!CachePanel.enable_instrumentationc                 C   s.   t | jdr	| j`tjddD ]}d |_qd S )Nr>   T)initialized_only)rC   r?   r>   r   allr   )r;   r$   r'   r'   r(   disable_instrumentation   s
   z"CachePanel.disable_instrumentationc                 c   s*    t D ]}tt j|rt | |fV  qdS )z
        Return the initialized caches and aliases.

        This does the same as`caches.all(initialized_only=True)`, but keeps
        the alias with each cache instance.
        N)r   rC   _connections)r;   r#   r'   r'   r(   ra      s   zCachePanel.initialized_cachesc                 C   s<   |  t| j| j| j| j| j| jtttddgd d S )NCACHESdefault)total_callsr7   r4   r5   r6   r:   r^   )	record_statsrL   r7   r4   r5   r6   r:   r*   r   )r;   requestresponser'   r'   r(   generate_stats   s   zCachePanel.generate_statsc                 C   s8   |   }|dd}d|dd}| d|| d S )Nr4   r   zCache {} Callsri   )r[   r   formatrecord_server_timing)r;   rk   rl   r\   rW   r`   r'   r'   r(   generate_server_timing   s   z!CachePanel.generate_server_timing)rU   
__module____qualname____doc__templateis_asyncr   r?   r3   classmethodr>   rE   rP   r   _	nav_titlepropertyr]   r`   rb   re   ra   rm   rp   __classcell__r'   r'   r<   r(   r1   6   s,    


$
	
r1   )r+   rH   r   asgiref.localr   django.confr   django.core.cacher   r   django.utils.translationr   rw   r   debug_toolbar.panelsr	   debug_toolbar.utilsr
   r   r   r/   r.   r0   r1   r'   r'   r'   r(   <module>   s    