a
    Ig&                     @   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_manyZset_manyZdelete_manyZhas_keyincrZdecrZincr_versionZdecr_versionc                    s4   t  t fdd}t | d S )Nc                     s2    j }|d u r| i |S | | |S d S N)_djdt_panel_record_call)argskwargspanelcachenameoriginal_method V/var/www/html/django/DPS/env/lib/python3.9/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!   _monkey_patch_method!   s    
r'   c                 C   s(   t | ds$tD ]}t| | qd| _d S )N_djdt_patchedT)hasattrWRAPPED_CACHE_METHODSr'   r(   )r   r   r    r    r!   _monkey_patch_cache/   s    
r+   c                       s   e 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  ZS )
CachePanelz3
    Panel that displays the cache statistics.
    zdebug_toolbar/panels/cache.htmlc                    s>   t  j|i | d| _d| _d| _g | _dd tD | _d S )Nr   c                 S   s   i | ]
}|d qS )r   r    ).0r   r    r    r!   
<dictcomp>E       z'CachePanel.__init__.<locals>.<dictcomp>)super__init__
total_timehitsmissescallsr*   counts)selfr   r   	__class__r    r!   r1   ?   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:   G   s    	zCachePanel.current_instancec                    s8   t tds4tjt fdd}|t_dt_d S )Nr(   c                    s,   | |}   }|d ur(t| ||_|S r   )r:   r+   r   )r7   aliasr   r   r<   r   r    r!   r"   [   s    
z!CachePanel.ready.<locals>.wrapperT)r)   r   create_connectionr$   r%   r(   )r<   r"   r    r>   r!   readyR   s    
zCachePanel.readyc	           
   
   C   s   |dks|dkr8|d u r(|  j d7  _ q|  jd7  _nL|dkrd|v rP|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)r4   r3   lenr2   r6   r5   appendr   )
r7   r   
time_takenreturn_valuer   r   rD   rE   rF   rB   r    r    r!   _store_call_infog   s*    zCachePanel._store_call_infoc           	   
   C   s^   d |_ z(t }||i |}t | }W | |_ n| |_ 0 | j|||||tddt |d |S )N   )skip)r   rI   rJ   r   r   rD   rE   rF   )r   r   rK   r
   r   )	r7   r   r   r   r   r   
start_timevaluetr    r    r!   r      s"    
zCachePanel._record_callCachec                 C   s"   t | j}tdd||| jd S )Nz$%(cache_calls)d call in %(time).2fmsz%%(cache_calls)d calls in %(time).2fms)cache_callsrC   )rG   r5   r   r2   )r7   rR   r    r    r!   nav_subtitle   s    

zCachePanel.nav_subtitlec                 C   s&   t ttddg}tdd|d|i S )NZCACHESdefaultz"Cache calls from %(count)d backendz#Cache calls from %(count)d backendscount)rG   r#   r   r   )r7   rU   r    r    r!   title   s    zCachePanel.titlec                 C   s,   t jddD ]}t| | |_q| | j_d S )NTZinitialized_only)r   allr+   r   r;   r:   r7   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:   TrW   )r)   r;   r:   r   rX   r   rY   r    r    r!   disable_instrumentation   s    z"CachePanel.disable_instrumentationc              	   C   s,   |  t| j| j| j| j| j| jd d S )N)total_callsr5   r2   r3   r4   r6   )Zrecord_statsrG   r5   r2   r3   r4   r6   )r7   requestresponser    r    r!   generate_stats   s    zCachePanel.generate_statsc                 C   s8   |   }|dd}d|dd}| d|| d S )Nr2   r   zCache {} Callsr\   )Z	get_statsr   formatZrecord_server_timing)r7   r]   r^   statsrO   rV   r    r    r!   generate_server_timing   s    z!CachePanel.generate_server_timing)__name__
__module____qualname____doc__templater   r;   r1   classmethodr:   r@   rK   r   _Z	nav_titlepropertyrS   rV   rZ   r[   r_   rb   __classcell__r    r    r8   r!   r,   6   s&   


$

r,   )r$   rC   r   Zasgiref.localr   Zdjango.confr   Zdjango.core.cacher   r   Zdjango.utils.translationr   ri   r   Zdebug_toolbar.panelsr	   Zdebug_toolbar.utilsr
   r   r   r*   r'   r+   r,   r    r    r    r!   <module>   s   