o
    >hl/                     @   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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)copy)sync_to_async)connections)path)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,   ~/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/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_display8   s(   
r>   c                 C   s   | d S )Nraw_sqlr,   )queryr,   r,   r-   _similar_query_keyT   s   rA   c                 C   s,   | d d u rdnt | d }| d t|fS )N
raw_paramsr,   r?   )tuplerepr)r@   rB   r,   r,   r-   _duplicate_query_keyX   s   rE   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   rX   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  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[   w   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`   rR   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)r_   r&   rj   rh   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 )NrR   durationrF   )
time_spentnum_queriesrm   rn   )r]   appendr^   r\   )r`   rb   rR   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)rK   r]   r   r\   )r`   rr   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 connectionsrU   )rK   r^   r   )r`   rU   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)rP   zsql_explain/sql_explainzsql_profile/sql_profile)r   r   rv   rw   rx   )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)r`   r,   r,   r-   aenable_instrumentation   s   z SQLPanel.aenable_instrumentationc                 C   s    t  D ]	}t| | |_qd S N)r   allr   _djdt_loggerr`   
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              	      s8  t   t fdd}tt}tt}| jrst 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< t|d |d< | j| d |d< z|d | j d |d < W n ty5   d|d < Y nw ||d!< |d  |d!  |d"< ||d  7 }t|d# |d#< ||d#  |d$< |||< q~|
 D ]}|dd urqd|d< qct  }t|| j|d% t|| j|d& | t| j d'd d(| j| jd) d S )*Nc                      s   t  S r}   )rL   r,   rO   r,   r-   <lambda>   s    z)SQLPanel.generate_stats.<locals>.<lambda>SQL_WARNING_THRESHOLDr   g      p@g      @)r   r   r         rF      	rgb_colorrR   ri   T
ends_transstarts_transin_trans	iso_levelr(   trans_status)initial)auto_idr   formsql)with_togglerl   is_slowr?   	is_selectd   width_ratiostart_offset
end_offset
stacktracetrace_colorsimilar	duplicatec                 S   s   | d d  S )NrF   rm   r,   )xr,   r,   r-   r   :  s    )key)rN   queriesrs   )r   r   listr]   dt_settings
get_configrI   rK   r^   	enumeratevaluesminrA   ro   rE   r&   r.   r>   r
   r   r   r   r   r   r\   ZeroDivisionErrorr   rX   record_statssortedrJ   )r`   requestresponsetrace_colorssimilar_query_groupsduplicate_query_groupssql_warning_thresholdwidth_ratio_tallyfactorndbrgbrV   nnnclast_by_aliasr@   rR   ri   
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   rs   r   )	get_statsformatrK   r&   record_server_timing)r`   r   r   statsru   valuer,   r,   r-   generate_server_timingA  s   zSQLPanel.generate_server_timing)__name__
__module____qualname____doc__is_asyncr[   rj   rk   rp   r   	nav_titlepropertyrt   ru   templateclassmethodrz   r|   r{   r   r   r   __classcell__r,   r,   rc   r-   rY   o   s(    


lrY   )'re   collectionsr   r   asgiref.syncr   	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   r   debug_toolbar.utilsr   r.   r>   rA   rE   rX   rY   r,   r,   r,   r-   <module>   s*     