U 췀g @sxddlmZddlmZddlZddlmZddlmZddl m Z e rdddl m Z ddl m Z mZd d Zd d ZdS) wraps)SignalN)OP)DJANGO_VERSION) TYPE_CHECKING)Callable)AnyUnioncCsd}t|dr|j}nBt|dr(|j}n0t|drXt|drXt|jdrXd|jjd}|dkrht|St|dr|jd|}|S) N __qualname____name__funczpartial() __module__.)hasattrr r rstrr)receivernamer]/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/integrations/django/signals_handlers.py_get_receiver_names"   rcs*ddlmtjfdd}|t_dS)z Patch django signal receivers to create a span. This only wraps sync receivers. Django>=5.0 introduced async receivers, but since we don't create transactions for ASGI Django, we don't wrap them. rDjangoIntegrationcstdkr||\}}n||}g}fdd}t}|rr|jrr||jkrrt|D]\}}||||<q\tdkr||fS|SdS)N)rcstfdd}|S)Nc sJt}tjtj|jd$}|d|||W5QRSQRXdS)N)oproriginsignal)r sentry_sdkZ start_spanrZ EVENT_DJANGOrset_data)argskwargsZ signal_namespan)rrrrwrapper?s zdpatch_signals.._sentry_live_receivers..sentry_sync_receiver_wrapper..wrapperr)rr#r)rrsentry_sync_receiver_wrapper=s zSpatch_signals.._sentry_live_receivers..sentry_sync_receiver_wrapper)rrZ get_clientZget_integrationZ signals_spansZsignals_denylist enumerate)selfZsenderZsync_receiversZasync_receiversr$Z integrationidxrrZold_live_receiversrr_sentry_live_receivers5s"  z-patch_signals.._sentry_live_receiversN)sentry_sdk.integrations.djangorrZ_live_receivers)r)rr(r patch_signals)s &r+) functoolsrZdjango.dispatchrrZsentry_sdk.constsrr*rtypingrcollections.abcrr r rr+rrrrs