o
    QDiQ2                     @   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
 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 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)sync_to_async)connections)render_to_string)path)cached_property)gettext_lazyngettext)settings)SignedDataForm)Panel)views)SQLSelectForm)wrap_cursor)contrasting_color_generatoris_select_query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-   W/var/www/Datamplify/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_display9   s(   
r?   c                 C   s   | d S )Nraw_sqlr-   )queryr-   r-   r.   _similar_query_keyU   s   rB   c                 C   s,   | d d u rdnt | d }| d t|fS )Nparamsr-   r@   )tuplerepr)rA   
raw_paramsr-   r-   r.   _duplicate_query_keyY   s   rG   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colorrA   db_infor-   r-   r.   _process_query_groupsa   s   rZ   c                       s   e Zd 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dd Zedd Z  ZS )SQLPanelze
    Panel that displays information about the SQL queries run while processing
    the request.
    Tc                    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]   x   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   rT   trans_idr-   r-   r.   new_transaction_id   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   s   t  j|d< | j| |d }|| jvr!|d dd| j|< n| j| d  |d 7  < | j| d  d7  < |  j|d 7  _d S )Ndjdt_query_idrT   durationrH   )
time_spentnum_queriesrp   rq   )rg   rh   ri   r_   appendr`   r^   )rb   rd   rT   r-   r-   r.   record   s   
zSQLPanel.recordSQLc                 C   s4   |   }t|dg }tdd|||dd S )Nqueriesz)%(query_count)d query in %(sql_time).2fmsz+%(query_count)d queries in %(sql_time).2fmssql_time)query_countrv   )	get_statsrM   r'   r	   )rb   statsrw   r-   r-   r.   nav_subtitle   s   zSQLPanel.nav_subtitlec                 C   s&   t |  d}tdd|d|i S )NrP   z%SQL queries from %(count)d connectionz&SQL queries from %(count)d connectionsrW   )rM   rx   r'   r	   )rb   rW   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)rR   zsql_explain/sql_explainzsql_profile/sql_profile)r   r   r|   r}   r~   )clsr-   r-   r.   get_urls   s   zSQLPanel.get_urlsc                    s   t | j I dH  dS )z
        Async version of enable instrumentation.
        For async capable panels having async logic for instrumentation.
        N)r   enable_instrumentation)rb   r-   r-   r.   aenable_instrumentation   s   z SQLPanel.aenable_instrumentationc                 C   s    t  D ]	}t| | |_qd S N)r   allr   _djdt_loggerrb   
connectionr-   r-   r.   r      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              	   C   s  t t}t t}| jr;t d }d}tdt| jd  }t| j	 D ]G\}}	g d}
|d }d|d |  |
|< |}|
| |k rit
d|
|  d}|
|  |7  < |d7 }|d	kr_d}||
|< |
| |k sD|
|	d
< q&i }| 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< |d |k|d< t|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 }|||< qs|	 D ]}|dd ur9d|d< q+t }t|| j|d t|| j|d | t| j dd d | j| jd! d S )"NSQL_WARNING_THRESHOLDr   g      p@g      @)r   r   r         rH      	rgb_colorrT   rk   T
ends_transstarts_transin_trans	iso_levelr)   trans_statusro   is_slowr@   	is_selectd   width_ratiostart_offset
end_offsetsimilar	duplicatec                 S   s   | d d  S )NrH   rp   r-   )xr-   r-   r.   <lambda>0  s    z)SQLPanel.generate_stats.<locals>.<lambda>)key)rP   ru   rv   )r   listr_   dt_settings
get_configrK   rM   r`   	enumeratevaluesminrB   rr   rG   r'   r/   r?   r   r^   ZeroDivisionErrorr   rZ   record_statssortedrL   )rb   requestresponsesimilar_query_groupsduplicate_query_groupssql_warning_thresholdwidth_ratio_tallyfactorndbrgbrX   nnnclast_by_aliasrA   rT   rk   
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 {} queriesru   rv   r   )rx   formatrM   r'   record_server_timing)rb   r   r   ry   r{   valuer-   r-   r.   generate_server_timing7  s   zSQLPanel.generate_server_timingc                    s   | j rN|  }t  t fdd}|dg D ]/}t|d dd|d< td t|d | jj	dd	j
d
|d< t|d |d< ||d  |d< qt| j|S d S )Nc                      s   t  S r   )rN   r-   rQ   r-   r.   r   D  s    z"SQLPanel.content.<locals>.<lambda>ru   sqlT)with_togglern   )rn   
request_id)initial)auto_idr   form
stacktracetrace_color)has_contentrx   r   r   r'   r   r   r   toolbarr   r   r   r   template)rb   ry   trace_colorsrA   r-   r   r.   content?  s&   
	zSQLPanel.content)__name__
__module____qualname____doc__is_asyncr]   rl   rm   rs   r   	nav_titlepropertyrz   r{   r   classmethodr   r   r   r   r   r   r   r   __classcell__r-   r-   re   r.   r[   p   s,    


_r[   )*rg   collectionsr   asgiref.syncr   	django.dbr   django.template.loaderr   django.urlsr   django.utils.functionalr   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   r   debug_toolbar.utilsr   r/   r?   rB   rG   rZ   r[   r-   r-   r-   r.   <module>   s,     