o
    gJ.                     @   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rRz dd l }|jjtd|jjtd|jjtd|jjtdi}W n1 tyQ   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 nw t| ||S )N
postgresqlr   zRead uncommittedzRead committedzRepeatable readSerializable
Autocommit)psycopgIsolationLevelREAD_UNCOMMITTED_READ_COMMITTEDREPEATABLE_READSERIALIZABLEImportErrorpsycopg2.extensions
extensionsISOLATION_LEVEL_AUTOCOMMIT ISOLATION_LEVEL_READ_UNCOMMITTEDISOLATION_LEVEL_READ_COMMITTEDISOLATION_LEVEL_REPEATABLE_READISOLATION_LEVEL_SERIALIZABLE
ValueErrorgetvendorlevelr   choicespsycopg2 r*   ^/var/www/html/bloggers_ems/venv/lib/python3.10/site-packages/debug_toolbar/panels/sql/panel.pyget_isolation_level_display   s.   
r,   c                 C   s   | dkr]z+d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 n1 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 nw t| ||S )Nr   r   IdleActivezIn transactionzIn errorUnknown)r   pqTransactionStatusIDLEr   ACTIVEINTRANSINERRORUNKNOWNr   r   r   TRANSACTION_STATUS_IDLETRANSACTION_STATUS_ACTIVETRANSACTION_STATUS_INTRANSTRANSACTION_STATUS_INERROR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   rC   c                 C   s   t t}|  D ]-\\}}}t|}|dkr5t|}	|D ]}
||
| d< |	|
| d< q||  |7  < q| D ]\}}|| || d< q:d S )N   _count_color)r   intitemslennext)query_groups	databasescolorsnamecountsalias_keyquery_groupcountcolorr>   db_infor*   r*   r+   _process_query_groups[   s   rV   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+   rY   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hexr]   r^   rP   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)r]   r$   rh   rf   r*   r*   r+   current_transaction_id   s   
zSQLPanel.current_transaction_idc                 K   sz   | j | |d }|| jvr|d dd| j|< n| j| d  |d 7  < | j| d  d7  < |  j|d 7  _d S )NrP   durationrD   )
time_spentnum_queriesrk   rl   )r[   appendr\   rZ   )r^   r`   rP   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)rI   r[   r   rZ   )r^   rp   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 connectionsrS   )rI   r\   r   )r^   rS   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)rN   zsql_explain/sql_explainzsql_profile/sql_profile)r   r   rt   ru   rv   )clsr*   r*   r+   get_urls   s   zSQLPanel.get_urlsc                 C   s    t  D ]	}t| | |_qd S N)r   allr   _djdt_loggerr^   
connectionr*   r*   r+   enable_instrumentation   s   zSQLPanel.enable_instrumentationc                 C   s   t  D ]}d |_qd S ry   )r   rz   r{   r|   r*   r*   r+   disable_instrumentation   s   z SQLPanel.disable_instrumentationc              	      sB  t   t fdd}tt}tt}| jrxt d }d}tdt| jd  }t	| j
 D ]G\}	}
g d}|	d }d	|	d |  ||< |}|| |k rttd	||  d	}||  |7  < |d
7 }|dkrjd}|||< || |k sO||
d< q1i }| jD ]}|d }||t|f | ||t|f | |d}||i }|d}||kr|d urd|d< |d urd|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y:   d|d!< Y nw ||d"< |d! |d"  |d#< ||d! 7 }t|d$ |d$< ||d$  |d%< |||< q~|
 D ]}|dd urvd|d< qht  }t|| j|d& t|| j|d' | t| j  d(d d)| j| jd* d S )+Nc                      s   t  S ry   )rJ   r*   rM   r*   r+   <lambda>   s    z)SQLPanel.generate_stats.<locals>.<lambda>SQL_WARNING_THRESHOLDr   g      p@g      @)r   r   r         rD      	rgb_colorrP   rg   T
ends_transstarts_transin_trans	iso_levelr&   trans_status)initial)auto_idr   formsql)with_togglerj   is_slowr=   select	is_selectd   width_ratiostart_offset
end_offset
stacktracetrace_colorsimilar	duplicatec                 S   s   | d d  S )NrD   rk   r*   )xr*   r*   r+   r   .  s    )key)rL   queriesrq   )!r   r   listr[   dt_settings
get_configrG   rI   r\   	enumeratevaluesminr?   rm   rC   r$   r,   r<   r	   r   r   r   r   lowerlstrip
startswithrZ   ZeroDivisionErrorr   rV   record_statssortedrH   )r^   requestresponsetrace_colorssimilar_query_groupsduplicate_query_groupssql_warning_thresholdwidth_ratio_tallyfactorndbrgbrT   nnnclast_by_aliasr>   rP   rg   
prev_queryprev_trans_idfinal_querygroup_colorsr*   r   r+   generate_stats   s   








zSQLPanel.generate_statsc                 C   s<   |   }dt|dg }|dd}| d|| d S )NzSQL {} queriesr   rq   r   )	get_statsformatrI   r$   record_server_timing)r^   r   r   statsrs   valuer*   r*   r+   generate_server_timing5  s   zSQLPanel.generate_server_timing)__name__
__module____qualname____doc__rY   rh   ri   rn   r   	nav_titlepropertyrr   rs   templateclassmethodrx   r~   r   r   r   __classcell__r*   r*   ra   r+   rW   j   s$    


nrW   )$rc   collectionsr   r   	django.dbr   django.urlsr   django.utils.translationr   r   r   debug_toolbarr   r   debug_toolbar.formsr	   debug_toolbar.panelsr
   debug_toolbar.panels.sqlr   debug_toolbar.panels.sql.formsr   !debug_toolbar.panels.sql.trackingr   debug_toolbar.panels.sql.utilsr   r   debug_toolbar.utilsr   r,   r<   r?   rC   rV   rW   r*   r*   r*   r+   <module>   s(     