o
    PDi,                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ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mZ d dlmZ d dlmZmZ d dlmZ d dlm Z  d dl!m"Z" e #dZ$dd Z%dd Z&e Z'g dZ(dd Z)G dd dZ*G dd dZ+dS )    N)settings)DatabaseErrorroutertransaction)SQLCompiler)NoReverseMatchreverse)timezone)gettext_lazy)models)DataCollector)SilkyConfig)SilkNotConfigured)RequestModelFactoryResponseModelFactory)dynamic)silk_meta_profiler)execute_sqlzsilk.middlewarec                 O   sL   zt d|  g|R i |}W |S  ty%   t | g|R i |}Y |S w )Nzsilk:%s)r   r   )nameargskwargsr r   H/var/www/Datamplify/venv/lib/python3.10/site-packages/silk/middleware.pysilky_reverse   s   r   c                   C   s   t dS )Nsummary)r   r   r   r   r   	get_fpath"   s   r   )z4django.contrib.sessions.middleware.SessionMiddlewarez7django.contrib.auth.middleware.AuthenticationMiddlewarez4django.contrib.messages.middleware.MessageMiddlewarec                 C   sv   t jrt | s
dS nt jdk rt t jd krdS z	| jt }W n ty/   d}Y nw | jt jv }|p9| S )zLwe want to avoid recording any requests/sql queries etc that belong to SilkyFd   g      Y@)	configSILKY_INTERCEPT_FUNCSILKY_INTERCEPT_PERCENTrandompath
startswithr   r   SILKY_IGNORE_PATHS)requestsilkyignoredr   r   r   _should_intercept.   s   


r(   c                   @   s   e Zd Zdd Zdd ZdS )TestMiddlewarec                 C   s   |S Nr   selfr%   responser   r   r   process_responseC      zTestMiddleware.process_responsec                 C   s   d S r*   r   )r,   r%   r   r   r   process_requestF   r/   zTestMiddleware.process_requestN)__name__
__module____qualname__r.   r0   r   r   r   r   r)   B   s    r)   c                   @   sV   e Zd Zdd Zdd Zdd Ze dd Zej	e
ejd	d
d Zdd ZdS )SilkyMiddlewarec                 C   s.   t jrttttj@ sttd|| _d S )NzgSILKY_AUTHENTICATION can not be enabled without Session, Authentication or Message Django's middlewares)	r   SILKY_AUTHENTICATIONsetAUTH_AND_SESSION_MIDDLEWARESr   
MIDDLEWAREr   _get_response)r,   r:   r   r   r   __init__K   s   
zSilkyMiddleware.__init__c                 C   s*   |  | i |_| |}| ||}|S r*   )r0   silk_filtersr:   r.   r+   r   r   r   __call__V   s
   

zSilkyMiddleware.__call__c                 C   s   t j}|D ]<}|d}|d}|d}|d}|d}|r<|r<|r3|r3tj|||||d qtj|||d qtd| d S )	Nmodulefunction
start_lineend_liner   )r>   funcr@   rA   r   )r>   rB   r   zInvalid dynamic mapping %s)r   SILKY_DYNAMIC_PROFILINGgetr   inject_context_manager_funcprofile_function_or_methodKeyError)r,   dynamic_profile_configsconfr>   r?   r@   rA   r   r   r   r   _apply_dynamic_mappingse   s*   




z'SilkyMiddleware._apply_dynamic_mappingsc                 C   s   t    t|sd S td d|_|   ttds#tj	t_
t	t_	t }|j}|jr1||}t| }t  j||d d S )Nr0   T_execute_sql)should_profile)r   clearr(   Loggerdebugsilk_is_interceptedrJ   hasattrr   r   rK   r   SILKY_PYTHON_PROFILERSILKY_PYTHON_PROFILER_FUNCr   construct_request_model	configure)r,   r%   silky_configrL   request_modelr   r   r   r0   {   s   



zSilkyMiddleware.process_request)usingc                 C   s   t d t 3 t }|  |j}|r%t|  t	 |_
|  nt dt| d t|  W d    n1 s>w   Y  |rI|  t d d S )NzProcess responsezqNo request model was available when processing response. Did something go wrong in process_request/process_view?
z

zProcess response done.)rN   rO   r   r   stop_python_profilerr%   r   construct_response_modelr	   nowend_timefinaliseerrorstrsave)r,   r%   r-   	collectorsilk_requestr   r   r   _process_response   s.   


z!SilkyMiddleware._process_responsec              	   C   s   d}d}t |ddrB||krB|dkrtd|  z	| || W |S  ttfy9   ||kr7td Y |S Y nw |d7 }||ks|S )N      rP   Fz&Retrying _process_response; attempt %sz<Exhausted _process_response attempts; not processing request)getattrrN   rO   rc   AttributeErrorr   warning)r,   r%   r-   max_attemptsattemptsr   r   r   r.      s(   
z SilkyMiddleware.process_responseN)r1   r2   r3   r;   r=   rJ   r   r0   r   atomicr   db_for_writer   SQLQueryrc   r.   r   r   r   r   r4   J   s    

r4   ),loggingr!   django.confr   	django.dbr   r   r   django.db.models.sql.compilerr   django.urlsr   r   django.utilsr	   django.utils.translationr
   r9   silkr   silk.collectorr   silk.configr   silk.errorsr   silk.model_factoryr   r   silk.profilingr   silk.profiling.profilerr   silk.sqlr   	getLoggerrN   r   r   r   r7   r(   r)   r4   r   r   r   r   <module>   s0    
