
    lhb                        d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	 d dl
mZmZ d dlmZmZ d dlmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZm Z  d d	l!m"Z"m#Z#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/m0Z1 d dl2m3Z3 d dl/m0Z0 	 d dl4m5Z5 	 d dl4m8Z8 	 d dl9m:Z: d dl<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF e.dd dkD  rd dlGmHZH ndZHd dlImJZJ eJrTd dlImKZK d dlImLZL d dlImMZM d d lImNZN d d!lImOZO d d"lImPZP d d#lQmRZR d d$lSmTZT d d%lUmVZV d d&lWmXZX d d'lmYZY d d(l'mZZZ d d)l[m\Z\m]Z]m^Z^m_Z_ e.d*k  rd+ Z`nd, Z`d-Za G d. d/e#      Zbd0ac ej                         Zed1 Zfd2 Zgd3 Zhd4 Zid5 Zjd6 Zkd7 Zld8 Zmd9 ZndAd:Zo G d; d<e+      Zpd= Zqd> Zrd? Zsd@ Zty# e6$ r
 d dl7m5Z5 Y w xY w# e6$ r
 d dl7m8Z8 Y w xY w# e;$ r dZ:Y w xY w# e6$ r	  e$d      w xY w)B    N)import_module)OPSPANDATA)add_global_event_processorshould_send_default_pii)add_global_repr_processoradd_repr_sequence_type)SOURCE_FOR_STYLETransactionSource)add_query_sourcerecord_sql_queries)
AnnotatedValueHAS_REAL_CONTEXTVARSCONTEXTVARS_ERROR_MESSAGESENSITIVE_DATA_SUBSTITUTEloggercapture_internal_exceptionsensure_integration_enabledevent_from_exceptiontransaction_from_functionwalk_exception_chain)_check_minimum_versionIntegrationDidNotEnable)ignore_logger)SentryWsgiMiddleware)DEFAULT_HTTP_METHODS_TO_CAPTURERequestExtractor)VERSIONsettings)signals)resolve)Resolver404)ASGIRequestzDjango not installed)LEGACY_RESOLVER)!get_template_frame_from_exceptionpatch_templates)patch_django_middlewares)patch_signals)patch_views   )      )patch_caching)TYPE_CHECKING)Any)Callable)Dict)Optional)Union)List)WSGIRequest)HttpResponse)	QueryDict)MultiValueDict)Span)_ScopedResponse)EventHintEventProcessorNotImplementedType)r-   
   c                 "    | j                         S Nis_authenticatedrequest_users    y/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/sentry_sdk/integrations/django/__init__.pyrE   rE   ^   s    ,,..    c                     | j                   S rC   rD   rF   s    rH   rE   rE   d   s    ,,,rI   )function_nameurlc                   `    e Zd ZdZdZde Zde ZdZdZdZ	dZ
g Zdddd	defd
Zed        Zy)DjangoIntegrationa  
    Auto instrument a Django application.

    :param transaction_style: How to derive transaction names. Either `"function_name"` or `"url"`. Defaults to `"url"`.
    :param middleware_spans: Whether to create spans for middleware. Defaults to `True`.
    :param signals_spans: Whether to create spans for signals. Defaults to `True`.
    :param signals_denylist: A list of signals to ignore when creating spans.
    :param cache_spans: Whether to create spans for cache operations. Defaults to `False`.
    djangoz
auto.http.zauto.db. NrL   TFc                     |t         vrt        d|dt         d      || _        || _        || _        |xs g | _        || _        t        t        t        j                  |            | _        y )Nz%Invalid value for transaction_style: z (must be in ))TRANSACTION_STYLE_VALUES
ValueErrortransaction_stylemiddleware_spanssignals_spanssignals_denylistcache_spanstuplemapstrupperhttp_methods_to_capture)selfrU   rV   rW   rY   rX   r^   s          rH   __init__zDjangoIntegration.__init__   sn     $<<$&>@  "3 0* 0 6B&',S<S-T'U$rI   c                     t        t        t               t                t	        d       t	        d       ddlm j                  t        t              fd       } | _        t                t                t        j                  j                  t               t        d        }t         d        }t#                t%                t'                t)                t+                t-                t.        t/                y y )Nzdjango.serverzdjango.requestr   )WSGIHandlerc                 
   	j                  |       }ddlm} |j                  }t	        j
                         j                  t              }t        ||t        j                  |r|j                  nt              } |||      S )Nr   r    )span_originr^   )__get__django.confr!   USE_X_FORWARDED_HOST
sentry_sdk
get_clientget_integrationrN   r   originr^   r   )
r_   environstart_responsebound_old_appr!   use_x_forwarded_forintegration
middlewarerb   old_apps
           rH   sentry_patched_wsgi_handlerzADjangoIntegration.setup_once.<locals>.sentry_patched_wsgi_handler   sy     $OOD+>M,"*"?"?$//1AABSTK-#-44 #  778	J g~66rI   c                 ,   || S |j                  dd       }|| S | j                  dd       }|| S |j                  dd       }|| S t        t        |      t        |            D ]  \  }\  }}}t	        |      }||j                  di       j                  dg       }t        t        t        |                  D ]6  }	||	   }
|
j                  d      dv s|
j                  d      d	k(  s1|	d
z  }	 n t        |      }	|j                  |	|        | S )Nexc_info	exceptionvalues
stacktraceframesfunction)zParser.parseparserendermodulezdjango.template.baser-   )getzipreversedr   r'   rangeleninsert)eventhintru   rv   rw   _	exc_valueframery   ifs              rH   process_django_templatesz>DjangoIntegration.setup_once.<locals>.process_django_templates   s2    |xx
D1H		+t4I ]]8T2F~03 "6x"@1 ,,	,Ay! :)D$&]]<<@@2NF%eCK&89 	("1IEE*-1TT !h3I IFA!	(  KMM!U+%,( LrI   c                     	 ddl m} t	        | |      r| j
                  rt        S d| j                  j                  | j                  t        |       fz  S # t        $ r	 t        cY S w xY w)Nr   )QuerySetz<%s from %s at 0x%x>)
django.db.models.queryr   	ExceptionNotImplemented
isinstance_result_cache	__class____name__
__module__id)valuer   r   s      rH   _django_queryset_reprz;DjangoIntegration.setup_once.<locals>._django_queryset_repr   sl    	& < eX.%2E2E%%)((  5	-    &%%&s   A A'&A')r   rN   DJANGO_VERSIONinstall_sql_hookr   django.core.handlers.wsgirb   __call__r   _patch_get_response_patch_django_asgi_handlerr"   got_request_exceptionconnect_got_request_exceptionr   r   _patch_channelsr)   r+   r(   r*   "add_template_context_repr_sequencer/   )rs   r   r   rb   rr   s      @@rH   
setup_oncezDjangoIntegration.setup_once   s     	0.A 	o&&'9&&	#$5w	?	7 
@	7,  ;"$%%--.DE	#(	 
$(	T 
#	 
#	, 	 "*,$O %rI   )r   r   __qualname____doc__
identifierrk   	origin_dbrU   rV   rW   rY   rX   r   r`   staticmethodr    rI   rH   rN   rN   l   sr     J*&F:,'IMK   ?V2 x xrI   rN   Fc                     t         ryt        5  t         r
	 ddd       yda t               5  	 ddlm}  | j
                  fd}|| _        ddd       ddd       y# t        $ r Y w xY w# 1 sw Y   !xY w# 1 sw Y   yxY w)a  
    Patch Django Rest Framework for more/better request data. DRF's request
    type is a wrapper around Django's request type. The attribute we're
    interested in is `request.data`, which is a cached property containing a
    parsed request body. Reading a request body from that property is more
    reliable than reading from any of Django's own properties, as those don't
    hold payloads in memory and therefore can only be accessed once.

    We patch the Django request object to include a weak backreference to the
    DRF request object, such that we can later use either in
    `DjangoRequestExtractor`.

    This function is not called directly on SDK setup, because importing almost
    any part of Django Rest Framework will try to access Django settings (where
    `sentry_sdk.init()` might be called from in the first place). Instead we
    run this function on every request and do the patching on the first
    request.
    NTr   )APIViewc                     t               5  t        j                  |      |j                  _        	 d d d         | |g|i |S # 1 sw Y   xY wrC   )r   weakrefref_request_sentry_drf_request_backref)r_   requestargskwargsold_drf_initials       rH   sentry_patched_drf_initialz._patch_drf.<locals>.sentry_patched_drf_initialE  sW    46 GN{{#H((D 	
 +4J4J6JJ s   %AA)_DRF_PATCHED_DRF_PATCH_LOCKr   rest_framework.viewsr   initialImportError)r   r   r   s     @rH   
_patch_drfr     s    . 	 == = (* 	==8 #*//K #=#	== =  	= 	== =sI   A8A8A,AA,A8	A)&A,(A))A,,A5	1A88Bc                      	 ddl m}  t        st	        j
                  dt        z          ddlm}  ||        y # t        $ r Y y w xY w)Nr   )AsgiHandlerz3We detected that you are using Django channels 2.0.) patch_channels_asgi_handler_impl)	channels.httpr   r   r   r   warningr   #sentry_sdk.integrations.django.asgir   )r   r   s     rH   r   r   Q  sJ    -   	A'(	

 U$[1%     9 	AAc                      	 ddl m}  t        st	        j
                  dt        z          ddlm}  ||        y # t        $ r Y y w xY w)Nr   )ASGIHandlerz(We detected that you are using Django 3.)patch_django_asgi_handler_impl)	django.core.handlers.asgir   r   r   r   r   r   r   r   )r   r   s     rH   r   r   j  sH    9   	69RR	
 S";/  r   c                    	 d }|dk(  r6t        |j                        j                  }t        t	        |d|            }n\|dk(  rWt        |d      r,t        j                   |j                  |j                        }nt        j                   |j                        }||j                  }t        j                  }n	t        |   }| j                  ||       y # t        $ rj t        t        j                         }t        |d      rB|j"                  }t%        |t&              r	|| _        Y y t        t	        |d|            | _        Y y Y y t*        $ r Y y w xY w)NrK   
view_classrL   urlconf)r   )source
handler404)r#   pathfuncr   getattrhasattrr&   	path_infor   r   URLr
   set_transaction_namer$   r   r!   ROOT_URLCONFr   r   r\   transactionr   )scoperU   r   transaction_namefnr   r   handlers           rH    _set_transaction_name_and_sourcer     s?   %/&++B8\SU9VW%'w	*#2#:#:%%w$  $3#:#:7;L;L#M #&00&**F%&78F"" 	# 	
   5 56 7L)((G'3'$+!$=G\7;%! *  s   CC AE*E	EEc                    t        j                         j                  t              }|y t	                t        j
                         }t        ||j                  |        |j                  t        t        j                  |       |             y rC   )rh   ri   rj   rN   r   get_current_scoper   rU   add_event_processor"_make_wsgi_request_event_processorr   r   r   rp   r   s      rH   _before_get_responser     sk    '')99:KLKL((*E$UK,I,I7S	*7;;w+?MrI   c                 8    t        | d      syt        |||        y)z
    Some django middlewares overwrite request.urlconf
    so we need to respect that contract,
    so we try to resolve the url again.
    r   N)r   r   )r   r   rU   s      rH   _attempt_resolve_againr     s     7I&$U,=wGrI   c                     t        j                         j                  t              }||j                  dk7  ry t        j
                         }t        | ||j                         y )NrL   )rh   ri   rj   rN   rU   r   r   r   s      rH   _after_get_responser     sR    '')99:KLKk;;uD((*E7E;+H+HIrI   c                      ddl m}  | j                  fd}|| _        t        | d      rddlm}  || t               yy)zU
    patch get_response, because at that point we have the Django request object
    r   )BaseHandlerc                 F    t        |        | |      }t        |       |S rC   )r   r   )r_   r   rvold_get_responses      rH   sentry_patched_get_responsez8_patch_get_response.<locals>.sentry_patched_get_response  s$    W%dG,G$	rI   get_response_async)patch_get_response_asyncN)django.core.handlers.baser   get_responser   r   r   r   )r   r   r   r   s      @rH   r   r     sA    
 6"//  ;K{01P .BC 2rI   c                       fd}|S )Nc                 <           }|| S t         d u}|rt        |      t         k(  r| S t               5  t        |      j	                  |        d d d        t               r!t               5  t        ||        d d d        | S | S # 1 sw Y   6xY w# 1 sw Y   | S xY wrC   )r%   typer   DjangoRequestExtractorextract_into_eventr   _set_user_info)r   r   r   django_3weak_requests       rH   wsgi_request_event_processorzH_make_wsgi_request_event_processor.<locals>.wsgi_request_event_processor  s    
 .?Ld*W4L(* 	F"7+>>uE	F #$,. /w./ u	F 	F/ s   B,BBBr   )r   rp   r   s   `  rH   r   r     s    . ('rI   c                 b   t        j                         }|j                  t              }|y | :|j                  dk(  r+t        j
                         }t        | ||j                         t        t        j                         |j                  ddd      \  }}t        j                  ||       y )NrL   rO   F)r   handled)client_options	mechanism)r   )rh   ri   rj   rN   rU   r   r   r   sysru   optionscapture_event)r   r   clientrp   r   r   r   s          rH   r   r     s    ""$F(():;K{<<E,,.w{/L/LM&~~#6KE4
 U.rI   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
r   c                 h    	 |j                         }||}|| _        y # t        $ r
 Y || _        y w xY wrC   )r   AttributeErrorr   )r_   r   drf_requests      rH   r`   zDjangoRequestExtractor.__init__  sD    	!==?K&%   		s    	11c                 .    | j                   j                  S rC   )r   METAr_   s    rH   envzDjangoRequestExtractor.env$      ||   rI   c                     t         j                  t         j                  g}i }| j                  j                  j                         D ]  \  }}||v r
t        ||<   |||<    |S rC   )django_settingsCSRF_COOKIE_NAMESESSION_COOKIE_NAMEr   COOKIESitemsr   )r_   privacy_cookiesclean_cookieskeyvals        rH   cookieszDjangoRequestExtractor.cookies(  sn     ,,//

 ,,224 	)HCo%%>c"%(c"		) rI   c                 .    | j                   j                  S rC   )r   bodyr  s    rH   raw_datazDjangoRequestExtractor.raw_data8  r  rI   c                 .    | j                   j                  S rC   )r   POSTr  s    rH   formzDjangoRequestExtractor.form<  r  rI   c                 .    | j                   j                  S rC   )r   FILESr  s    rH   fileszDjangoRequestExtractor.files@  s    ||!!!rI   c                     |j                   S rC   )size)r_   files     rH   size_of_filez#DjangoRequestExtractor.size_of_fileD  s    yyrI   c                 x    	 | j                   j                  S # t        $ r t        j                  |       cY S w xY wrC   )r   datar   r   parsed_bodyr  s    rH   r#  z"DjangoRequestExtractor.parsed_bodyH  s7    	6<<$$$ 	6#//55	6s    99N)r   r   r   r`   r  r  r  r  r  r   r#  r   rI   rH   r   r     s*    ! !!"6rI   r   c                    |j                  di       }t        | dd       }|t        |      sy 	 |j                  dt        |j                               	 |j                  d|j                         	 |j                  d|j                                y # t
        $ r Y Jw xY w# t
        $ r Y <w xY w# t
        $ r Y y w xY w)Nuserr   emailusername)
setdefaultr   rE   r\   pkr   r&  get_username)r   r   	user_infor%  s       rH   r   r   P  s      ,I7FD)D|+D1T3tww<0Wdjj1Z):):)<=  
  
  s5   %B B" 2 B1 	BB"	B.-B.1	B=<B=c                     	 ddl m}  	 ddlm} 	 | j                  | j                  |j                  t        t              d	fd	       }t        t              fd       }t        t              fd       }|| _        || _        ||_	        t        d       y# t        $ r	 ddlm}  Y w xY w# t        $ r	 ddlm} Y w xY w# t        $ r Y yw xY w)
z9If installed this causes Django's queries to be captured.r   )CursorWrapper)BaseDatabaseWrapperNc                    t        | j                  ||ddt        j                        5 }t	        ||         | ||      }d d d        t               5  t               d d d        S # 1 sw Y   )xY w# 1 sw Y   S xY w)NformatFcursorqueryparams_list
paramstyleexecutemanyrd   r   r2  rN   r   _set_db_datar   r   )r_   sqlparamsspanresultreal_executes        rH   executez!install_sql_hook.<locals>.execute  s      ;;)33
 		5 t$!$V4F		5 )* 	#T"	# 		5 		5	#    A*A6*A36B c                    t        | j                  ||ddt        j                        5 }t	        ||         | ||      }d d d        t               5  t               d d d        S # 1 sw Y   )xY w# 1 sw Y   S xY w)Nr0  Tr1  r7  )r_   r9  
param_listr;  r<  real_executemanys        rH   r6  z%install_sql_hook.<locals>.executemany  s      ;;")33
 
	= t$%dC<F
	= )* 	#T"	# 
	= 
	=	# r?  c                 ,   t               5  t        j                  dd       d d d        t        j                  t        j
                  dt        j                        5 }t        ||         |       cd d d        S # 1 sw Y   [xY w# 1 sw Y   y xY w)Nr   r3  )messagecategory)opnamerk   )	r   rh   add_breadcrumb
start_spanr   DBrN   r   r8  )r_   r;  real_connects     rH   r   z!install_sql_hook.<locals>.connect  s     )* 	K%%i'J	K ""uu$..
 	& t$%	& 	&	K 	K	& 	&s   A> B
>B
Bzdjango.db.backendsrC   )django.db.backends.utilsr-  r   django.db.backends.utildjango.db.backendsr.  django.db.backends.base.baser>  r6  r   r  r   rN   r   )r-  r.  r>  r6  r   rK  r=  rB  s        @@@rH   r   r   i  s    ::E:
$,,(44*22
   1<@ A$   13CD E&   1<@& A& $M +M")&'U  :9:  EDE  s3   B! B6 $C !B32B36CC	CCc                 n   t        |d      r|j                  n|}|j                  }| j                  t        j
                  |       t        |d      xrA t        |j                  d      xr) t        j                  |j                  j                        }|r|j                  j                         }nz	 |j                  j                  j                  |j                  j                  j                  d}|j                  j                  j                  }|r|j                  d      s||d<   |j#                  d      xs |j#                  d      }| | j                  t        j$                  |       |j#                  d      }| | j                  t        j&                  |       |j#                  d	      }	|	)| j                  t        j(                  t+        |	             |j#                  d
      }
|
!| j                  t        j,                  |
       y y # t        $ r |j!                         }Y w xY w)Ndb
connectionget_dsn_parameters)dbnameport/hostrT  databaserU  unix_socket)r   rQ  vendorset_datar   	DB_SYSTEMrR  inspect	isroutinerS  inforT  rU  rW  
startswithr   get_connection_paramsr~   DB_NAMESERVER_ADDRESSSERVER_PORTr\   SERVER_SOCKET_ADDRESS)r;  cursor_or_dbrQ  rZ  is_psycopg2connection_paramspg_hostdb_nameserver_addressserver_portserver_socket_addresss              rH   r8  r8    s   #L$7\BYYFMM($$f- 	l+ 	JL++-AB	Jl55HHI 
 (33FFH	;
 '1166==$//4499! #--2277Gw11#6,3!&)  ##H-R1B1F1Fz1RGh&&0&**62N!h--~>#''/Kh**C,<=-11-@(h446KL )!  	; " 8 8 :	;s   4A9H H43H4c                  F    	 ddl m}  t        |        y # t        $ r Y y w xY w)Nr   BaseContext)django.template.contextrp  r	   r   ro  s    rH   r   r     s$    7{+ s    	  rC   )ur]  r   	threadingr   	importlibr   rh   sentry_sdk.constsr   r   sentry_sdk.scoper   r   sentry_sdk.serializerr   r	   sentry_sdk.tracingr
   r   sentry_sdk.tracing_utilsr   r   sentry_sdk.utilsr   r   r   r   r   r   r   r   r   r   sentry_sdk.integrationsr   r   r   sentry_sdk.integrations.loggingr   sentry_sdk.integrations.wsgir   $sentry_sdk.integrations._wsgi_commonr   r   rO   r   r   rf   r!   r
  django.corer"   django.urlsr#   r   django.core.urlresolversr$   r   r%   r   +sentry_sdk.integrations.django.transactionsr&   (sentry_sdk.integrations.django.templatesr'   r(   )sentry_sdk.integrations.django.middlewarer)   /sentry_sdk.integrations.django.signals_handlersr*   $sentry_sdk.integrations.django.viewsr+   &sentry_sdk.integrations.django.cachingr/   typingr0   r1   r2   r3   r4   r5   r6   r   r7   django.http.responser8   django.http.requestr9   django.utils.datastructuresr:   r;   r<   sentry_sdk._typesr=   r>   r?   r@   rE   rS   rN   r   Lockr   r   r   r   r   r   r   r   r   r   r   r   r   r   r8  r   r   rI   rH   <module>r     s    
   #  * P S B I   V U 9 =
/07#$5'9+
9 H O I <"1DM  51-:'<QQ G/-
 4 g gT  ).."4=n220,'T"
HJD0(8/&46- 46n2O(d1MhM  5445
  9889    /
-
../sf   :G	 F F) !F; F&"G	 %F&&G	 )F84G	 7F88G	 ;GG	 GG	 	G