U \o0@sddlmZddlZddlZddlmZddlmZddl m Z zddlmZWn ek rpddlmZYnXddlmZddlmZdd lmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)dd l*m+Z+dd l,m-Z-ddl.m/Z/ddl0m1Z1ddl2m3Z3edkrddZ4nddZ4Gddde)Z5ddZ6d'ddZ7Gddde/Z8ddZ9Gdd d e:Z;d!d"ZdS)))absolute_importN)VERSION)QuerySet)signals)resolve)Hub)_should_send_default_pii)add_global_event_processor)add_global_repr_processorcapture_internal_exceptionsevent_from_exception safe_reprformat_and_striptransaction_from_functionwalk_exception_chain) Integration) ignore_logger)SentryWsgiMiddleware)RequestExtractor)LEGACY_RESOLVER)!get_template_frame_from_exception) cCs|SNis_authenticatedZ request_userr /__init__.pyr4srcCs|jSrrrrrrr;sc@s*eZdZdZdZdddZeddZdS) DjangoIntegrationdjangoNurlcCs&d}||krtd||f||_dS)N) function_namer!z7Invalid value for transaction_style: %s (must be in %s)) ValueErrortransaction_style)selfr$ZTRANSACTION_STYLE_VALUESrrr__init__EszDjangoIntegration.__init__csttdtdddlm}|jfdd}||_ddlm}|jfdd }||_tj t t d d }t d d }dS)Nz django.serverzdjango.requestr) WSGIHandlercs4tjtdkr||Stfdd||S)Ncsf||Srr)akw)old_appr%rrbzSDjangoIntegration.setup_once..sentry_patched_wsgi_handler..)rcurrentget_integrationrr)r%environZstart_response)r*r%rsentry_patched_wsgi_handler]s  zADjangoIntegration.setup_once..sentry_patched_wsgi_handler) BaseHandlerc sLtj}|t}|dk rB|}|tt||W5QRX||Sr) rr-r.rZconfigure_scopeZadd_event_processor_make_event_processorweakrefref)r%requesthub integrationZscope)old_get_responserrsentry_patched_get_responsens  zADjangoIntegration.setup_once..sentry_patched_get_responsec Ss|dd}|dkr|S|dd}|dkr0|S|dd}|dkrH|St|t|D]\}\}}}t|}|dk rV|didg}ttt|D]4} || } | ddkr| dd kr| d 7} qqt|} || |qV|S) Nexc_info exceptionvaluesZ stacktraceframesZfunction)parseZrendermodulezdjango.template.baser)getziprrreversedrangeleninsert) eventhintr;r<r=_ exc_valueframer>ifrrrprocess_django_templates}s6     z>DjangoIntegration.setup_once..process_django_templatescSs,t|tr|jrtSd|jj|jt|fS)Nz<%s from %s at 0x%x>) isinstancerZ _result_cacheNotImplemented __class____name__ __module__id)valuerHrrr_django_queryset_reprsz;DjangoIntegration.setup_once.._django_queryset_repr)install_sql_hookrZdjango.core.handlers.wsgir'__call__Zdjango.core.handlers.baser2Z get_responserZgot_request_exceptionZconnect_got_request_exceptionr r )r'r1r2r:rNrVr)r*r9r setup_onceOs       'zDjangoIntegration.setup_once)r!)rRrS __qualname__Z identifierr$r& staticmethodrZrrrrr@s  rcsfdd}|S)Nc s}|dkr|Sz>jdkr4tt|jj|d<njdkrNt|j|d<Wntk rdYnXtt| |W5QRXt rtt ||W5QRX|S)Nr"Z transactionr!) r$rrpathfuncr Exceptionr DjangoRequestExtractorZextract_into_eventr_set_user_info)rGrHr6r8 weak_requestrrevent_processors$   z._make_event_processor..event_processorr)rcr8rdrrbrr3sr3cKsJtj}|t}|dk rFtt|jjdddd\}}|j ||ddS)Nr F)typeZhandled)Zclient_optionsZ mechanism)rH) rr-r.rr sysr;ZclientZoptionsZ capture_event)r6kwargsr7r8rGrHrrrrYs  rYc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)r`cCs|jjSr)r6ZMETAr0rrrenvszDjangoRequestExtractor.envcCs|jjSr)r6ZCOOKIESr0rrrcookiesszDjangoRequestExtractor.cookiescCs|jjSr)r6Zbodyr0rrrraw_dataszDjangoRequestExtractor.raw_datacCs|jjSr)r6ZPOSTr0rrrformszDjangoRequestExtractor.formcCs|jjSr)r6ZFILESr0rrrfilesszDjangoRequestExtractor.filescCs|jSr)size)r%filerrr size_of_filesz#DjangoRequestExtractor.size_of_filecCs.z |jjWStk r(t|YSXdSr)r6dataAttributeErrorr parsed_bodyr0rrrrrs z"DjangoRequestExtractor.parsed_bodyN) rRrSr[rhrirjrkrlrorrrrrrr`sr`cCs|di}t|dd}|dks(t|s,dSzt|j|d<Wntk rRYnXz|j|d<Wntk rvYnXz||d<Wntk rYnXdS)NuserrTemailZusername) setdefaultgetattrrstrZpkr_rtZ get_username)r6rGZ user_inforsrrrras   rac@seZdZddZddZdS)_FormatConvertercCs||_g|_dSr) param_mappingparams)r%ryrrrr&sz_FormatConverter.__init__cCs|j|j|dS)Nz%s)rzappendryrA)r%valrrr __getitem__#sz_FormatConverter.__getitem__N)rRrSr[r&r}rrrrrxsrxcCshg}t|tr.t|}|r*||}|j}nd}|p4dD](}|dkrL|dt|}||q6||fS)NrZNULL)rOdictrxrzr{r )sqlrzrvZconvZparamrrr format_sql)s    rc Cstj}|tdkrdSd}d}z t||\}}|r>t||}Wntk rTYnX|s|rt|drz6|rt|dr|||}t |t r| |j j }Wntk rYnX|rt|j|ddW5QRXdS)NmogrifyZquery)messagecategory)rr-r.rrrr_hasattrrrObytesdecodeZ connectionencodingr Zadd_breadcrumb)rrzcursorr7Zreal_sqlZ real_paramsrrr record_sql?s,   rcszddlm}Wn tk r0ddlm}YnXz|j|jWntk rXYdSXddd fdd }fdd }||_||_td dS) z9If installed this causes Django's queries to be captured.r) CursorWrapperNcSs|D]}t|||qdSr)r)r param_listrrzrrrrecord_many_sqlvsz)install_sql_hook..record_many_sqlc s&z|||WSt|||jXdSr)rr)r%rrz) real_executerrexecutezsz!install_sql_hook..executec s&z|||WS|||jXdSr)r)r%rr)real_executemanyrrr executemanysz%install_sql_hook..executemanyzdjango.db.backends)N)Zdjango.db.backends.utilsr ImportErrorZdjango.db.backends.utilrrrqr)rrrr)rrrrrWgs rW)N)N)?Z __future__rrfr4r rZDJANGO_VERSIONZdjango.db.models.queryrZ django.corerZAnyZDictZTupleZUnionZ_ScopedResponseCallableZ WSGIRequestZ HttpResponseZ QueryDictZMultiValueDictZListZ django.urlsrrZdjango.core.urlresolversZ sentry_sdkrZsentry_sdk.hubrZsentry_sdk.scoper Zsentry_sdk.utilsr r r r rrrZsentry_sdk.integrationsrZsentry_sdk.integrations.loggingrZsentry_sdk.integrations.wsgirZ$sentry_sdk.integrations._wsgi_commonrZ+sentry_sdk.integrations.django.transactionsrZ(sentry_sdk.integrations.django.templatesrrrr3rYr`raobjectrxrrrWrrrrs>       $        v!   (