11"""Attach django-opensearch-dsl to Django's signals and cause things to index."""
22
33import abc
4+ from functools import partial
45
56from django .apps import apps
67from django .core .serializers import deserialize , serialize
7- from django .db import models
8+ from django .db import models , transaction
89from django .dispatch import Signal
910
1011from .apps import DODConfig
@@ -95,7 +96,11 @@ def handle_save_task(app_label, model, pk):
9596 @shared_task ()
9697 def handle_pre_delete_task (data ):
9798 """Delete the instance from model and associated model indices."""
98- instance = next (deserialize ("json" , data , cls = DODConfig .signal_processor_deserializer_class ())).object
99+ instance = next (
100+ deserialize (
101+ "json" , data , cls = DODConfig .signal_processor_deserializer_class ()
102+ )
103+ ).object
99104 registry .delete (instance , raise_on_error = False )
100105 registry .delete_related (instance , raise_on_error = False )
101106
@@ -109,8 +114,21 @@ class CelerySignalProcessor(RealTimeSignalProcessor):
109114 def handle_save (self , sender , instance , ** kwargs ):
110115 """Update the instance in model and associated model indices."""
111116 if instance .__class__ in registry .get_models ():
112- handle_save_task .delay (instance ._meta .app_label , instance .__class__ .__name__ , instance .pk )
117+ transaction .on_commit (
118+ partial (
119+ handle_save_task .delay ,
120+ app_label = instance ._meta .app_label ,
121+ model = instance .__class__ .__name__ ,
122+ pk = instance .pk ,
123+ )
124+ )
113125
114126 def handle_pre_delete (self , sender , instance , ** kwargs ):
115127 """Delete the instance from model and associated model indices."""
116- handle_pre_delete_task .delay (serialize ("json" , [instance ], cls = DODConfig .signal_processor_serializer_class ()))
128+ handle_pre_delete_task .delay (
129+ serialize (
130+ "json" ,
131+ [instance ],
132+ cls = DODConfig .signal_processor_serializer_class (),
133+ )
134+ )
0 commit comments