a
    IgJ.                     @   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 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 Zdd Zdd Z dd Z!dd Z"G dd deZ#dS )    N)defaultdict)copy)connections)path)gettext_lazyngettext)settings)SignedDataForm)Panel)views)SQLSelectForm)wrap_cursor)contrasting_color_generatorreformat_sql)render_stacktracec                 C   s   | dkrz@dd l }|jjtd|jjtd|jjtd|jjtdi}W q ty   dd l}|j	j
td|j	jtd|j	jtd|j	jtd|j	jtdi}Y q0 nt| ||S )N
postgresqlr   zRead uncommittedzRead committedzRepeatable readZSerializableZ
Autocommit)psycopgZIsolationLevelZREAD_UNCOMMITTED_ZREAD_COMMITTEDZREPEATABLE_READZSERIALIZABLEImportErrorpsycopg2.extensions
extensionsZISOLATION_LEVEL_AUTOCOMMITZ ISOLATION_LEVEL_READ_UNCOMMITTEDZISOLATION_LEVEL_READ_COMMITTEDZISOLATION_LEVEL_REPEATABLE_READZISOLATION_LEVEL_SERIALIZABLE
ValueErrorgetvendorlevelr   choicesZpsycopg2 r   Z/var/www/html/django/DPS/env/lib/python3.9/site-packages/debug_toolbar/panels/sql/panel.pyget_isolation_level_display   s,    r   c                 C   s   | dkrzVdd l }|jjjtd|jjjtd|jjjtd|jjjtd|jjjtdi}W q t	y   dd l
}|jjtd|jjtd|jjtd|jjtd|jjtdi}Y q0 nt| ||S )Nr   r   IdleZActivezIn transactionzIn errorUnknown)r   ZpqZTransactionStatusZIDLEr   ZACTIVEZINTRANSZINERRORUNKNOWNr   r   r   ZTRANSACTION_STATUS_IDLEZTRANSACTION_STATUS_ACTIVEZTRANSACTION_STATUS_INTRANSZTRANSACTION_STATUS_INERRORZTRANSACTION_STATUS_UNKNOWNr   r   r   r   r   r   get_transaction_status_display3   s&    	r#   c                 C   s   | d S )Nraw_sqlr   )queryr   r   r   _similar_query_keyO   s    r&   c                 C   s,   | d d u rdn
t | d }| d t|fS )N
raw_paramsr   r$   )tuplerepr)r%   r'   r   r   r   _duplicate_query_keyS   s    r*   c                 C   s   t t}|  D ]Z\\}}}t|}|dkrt|}	|D ] }
||
| d< |	|
| d< q8||  |7  < q| D ]\}}|| || d< qtd S )N   _count_color)r   intitemslennext)Zquery_groups	databasescolorsnamecountsalias_keyZquery_groupcountcolorr%   Zdb_infor   r   r   _process_query_groups[   s    r:   c                       s   e Zd ZdZ fddZdd Zdd Zdd	 Zed
Z	e
dd Ze
dd ZdZedd Zdd Zdd Zdd Zdd Z  ZS )SQLPanelze
    Panel that displays information about the SQL queries run while processing
    the request.
    c                    s.   t  j|i | d| _g | _i | _i | _d S )Nr   )super__init__	_sql_time_queries
_databases_transaction_ids)selfargskwargs	__class__r   r   r=   p   s
    zSQLPanel.__init__c                 C   s   t  j}|| j|< |S )z`
        Generate and return a new synthetic transaction ID for the specified DB alias.
        )uuiduuid4hexrA   rB   r6   trans_idr   r   r   new_transaction_idx   s    

zSQLPanel.new_transaction_idc                 C   s"   | j |}|du r| |}|S )zY
        Return the current synthetic transaction ID for the specified DB alias.
        N)rA   r   rL   rJ   r   r   r   current_transaction_id   s    
zSQLPanel.current_transaction_idc                 K   sz   | j | |d }|| jvr4|d dd| j|< n0| j| d  |d 7  < | j| d  d7  < |  j|d 7  _d S )Nr6   durationr+   )
time_spentnum_queriesrO   rP   )r?   appendr@   r>   )rB   rD   r6   r   r   r   record   s    
zSQLPanel.recordSQLc                 C   s"   t | j}tdd||| jd S )Nz)%(query_count)d query in %(sql_time).2fmsz+%(query_count)d queries in %(sql_time).2fms)query_countsql_time)r0   r?   r   r>   )rB   rT   r   r   r   nav_subtitle   s    
zSQLPanel.nav_subtitlec                 C   s   t | j}tdd|d|i S )Nz%SQL queries from %(count)d connectionz&SQL queries from %(count)d connectionsr8   )r0   r@   r   )rB   r8   r   r   r   title   s    
zSQLPanel.titlezdebug_toolbar/panels/sql.htmlc                 C   s.   t dtjddt dtjddt dtjddgS )Nzsql_select/
sql_select)r4   zsql_explain/sql_explainzsql_profile/sql_profile)r   r   rX   rY   rZ   )clsr   r   r   get_urls   s    zSQLPanel.get_urlsc                 C   s    t  D ]}t| | |_qd S N)r   allr   _djdt_loggerrB   
connectionr   r   r   enable_instrumentation   s    zSQLPanel.enable_instrumentationc                 C   s   t  D ]
}d |_qd S r]   )r   r^   r_   r`   r   r   r   disable_instrumentation   s    z SQLPanel.disable_instrumentationc              	      sF  t   t fdd}tt}tt}| jrt d }d}tdt| jd  }t	| j
 D ]\}	}
g d}|	d }d	|	d |  ||< |}|| |k rtd	||  d	}||  |7  < |d
7 }|dkrd}|||< q||
d< qbi }| jD ]}|d }||t|f | ||t|f | |d}||i }|d}||krz|d urhd|d< |d urzd|d< |d urd|d< d|v rt|d |d |d< d|v rt|d |d |d< td tt|djd|d< |d rt|d dd|d< |d |k|d< |d   d|d< | j| d |d< z|d | j d  |d!< W n tyx   d|d!< Y n0 ||d"< |d! |d"  |d#< ||d! 7 }t|d$ |d$< ||d$  |d%< |||< q|
 D ]}|dd urd|d< qt  }t|| j|d& t|| j|d' | t| j  d(d d)| j| jd* d S )+Nc                      s   t  S r]   )r1   r   r3   r   r   <lambda>       z)SQLPanel.generate_stats.<locals>.<lambda>ZSQL_WARNING_THRESHOLDr   g      p@g      @)r   r   r         r+      Z	rgb_colorr6   rK   TZ
ends_transZstarts_transZin_transZ	iso_levelr   Ztrans_status)initial)Zauto_idrj   formsql)Zwith_togglerN   Zis_slowr$   selectZ	is_selectd   Zwidth_ratioZstart_offsetZ
end_offsetZ
stacktraceZtrace_colorZsimilarZ	duplicatec                 S   s   | d d  S )Nr+   rO   r   )xr   r   r   re   .  rf   )key)r2   queriesrU   )!r   r   listr?   dt_settingsZ
get_configr.   r0   r@   	enumeratevaluesminr&   rQ   r*   r   r   r#   r	   r   r   rj   r   lowerlstrip
startswithr>   ZeroDivisionErrorr   r:   Zrecord_statssortedr/   )rB   requestresponseZtrace_colorsZsimilar_query_groupsZduplicate_query_groupsZsql_warning_thresholdZwidth_ratio_tallyfactorndbrgbr9   nnncZlast_by_aliasr%   r6   rK   Z
prev_queryZprev_trans_idZfinal_queryZgroup_colorsr   rd   r   generate_stats   s    














zSQLPanel.generate_statsc                 C   s<   |   }dt|dg }|dd}| d|| d S )NzSQL {} queriesrq   rU   r   )Z	get_statsformatr0   r   Zrecord_server_timing)rB   r|   r}   statsrW   valuer   r   r   generate_server_timing5  s    zSQLPanel.generate_server_timing)__name__
__module____qualname____doc__r=   rL   rM   rR   r   Z	nav_titlepropertyrV   rW   templateclassmethodr\   rb   rc   r   r   __classcell__r   r   rE   r   r;   j   s"   


nr;   )$rG   collectionsr   r   Z	django.dbr   Zdjango.urlsr   Zdjango.utils.translationr   r   r   Zdebug_toolbarr   rs   Zdebug_toolbar.formsr	   Zdebug_toolbar.panelsr
   Zdebug_toolbar.panels.sqlr   Zdebug_toolbar.panels.sql.formsr   Z!debug_toolbar.panels.sql.trackingr   Zdebug_toolbar.panels.sql.utilsr   r   Zdebug_toolbar.utilsr   r   r#   r&   r*   r:   r;   r   r   r   r   <module>   s&    