o
    `oi&                     @   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                     s.    j }|d u r| i |S | | |S N)_djdt_panel_record_call)argskwargspanelcachenameoriginal_method b/var/www/html/kuke-dev/django-kuke/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!   _monkey_patch_method!   s   
r'   c                 C   s,   t | dstD ]}t| | qd| _d S 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   s    z'CachePanel.__init__.<locals>.<dictcomp>)super__init__
total_timehitsmissescallsr*   counts)selfr   r   	__class__r    r!   r0   ?   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!   r9   G   s   	zCachePanel.current_instancec                    s<   t tdstjt fdd}|t_dt_d S d S )Nr(   c                    s,   | |}   }|d urt| ||_|S r   )r9   r+   r   )r6   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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)r3   r2   lenr1   r5   r4   appendr   )
r6   r   
time_takenreturn_valuer   r   rC   rD   rE   rA   r    r    r!   _store_call_infog   s*   zCachePanel._store_call_infoc           	   
   C   s^   d |_ zt }||i |}t | }W | |_ n| |_ w | j|||||tddt |d |S )N   )skip)r   rH   rI   r   r   rC   rD   rE   )r   r   rJ   r
   r   )	r6   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_callsrB   )rF   r4   r   r1   )r6   rQ   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)rF   r#   r   r   )r6   rT   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:   r9   r6   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 )Nr9   TrV   )r)   r:   r9   r   rW   r   rX   r    r    r!   disable_instrumentation   s
   z"CachePanel.disable_instrumentationc              	   C   s,   |  t| j| j| j| j| j| jd d S )N)total_callsr4   r1   r2   r3   r5   )Zrecord_statsrF   r4   r1   r2   r3   r5   )r6   requestresponser    r    r!   generate_stats   s   zCachePanel.generate_statsc                 C   s8   |   }|dd}d|dd}| d|| d S )Nr1   r   zCache {} Callsr[   )Z	get_statsr   formatZrecord_server_timing)r6   r\   r]   statsrN   rU   r    r    r!   generate_server_timing   s   z!CachePanel.generate_server_timing)__name__
__module____qualname____doc__templater   r:   r0   classmethodr9   r?   rJ   r   _Z	nav_titlepropertyrR   rU   rY   rZ   r^   ra   __classcell__r    r    r7   r!   r,   6   s(    


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