Skip to content

Commit cc0abcb

Browse files
committed
Remove circular imports from Haystack signal processor
See http://stackoverflow.com/a/17364366/386210 Addresses #887
1 parent 364f955 commit cc0abcb

File tree

1 file changed

+41
-14
lines changed

1 file changed

+41
-14
lines changed

apps/storybase/search/signals.py

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
from django.db.models import signals
2+
from django.db.models.loading import get_model
23

34
from haystack.exceptions import NotHandled
45
from haystack.signals import RealtimeSignalProcessor as HaystackRealtimeSignalProcessor
56

6-
from storybase_asset.models import HtmlAssetTranslation
7-
from storybase_geo.models import Location
8-
from storybase_help.models import Help, HelpTranslation
9-
from storybase_story.models import (SectionAsset, SectionTranslation,
10-
Story, StoryTranslation)
117

128
class RealtimeSignalProcessor(HaystackRealtimeSignalProcessor):
139
"""
@@ -21,15 +17,20 @@ class RealtimeSignalProcessor(HaystackRealtimeSignalProcessor):
2117
and other related models.
2218
"""
2319

24-
# Translate sender classes to the classes that actually have an
25-
# index
20+
# Translate sender model classes to the model classes that
21+
# actually have an index
22+
#
23+
# The class names mapp to a list appropriate for the input
24+
# to ``django.db.models.loading.get_model()`` to avoid
25+
# importing the model directly and causing a circular
26+
# import. See http://stackoverflow.com/a/17364366/386210
2627
_SENDER_MAP = {
27-
'HtmlAssetTranslation': Story,
28-
'Location': Story,
29-
'HelpTranslation': Help,
30-
'SectionAsset': Story,
31-
'SectionTranslation': Story,
32-
'StoryTranslation': Story,
28+
'HtmlAssetTranslation': ['storybase_story', 'Story'],
29+
'Location': ['storybase_story', 'Story'],
30+
'HelpTranslation': ['storybase_help', 'Help'],
31+
'SectionAsset': ['storybase_story', 'Story'],
32+
'SectionTranslation': ['storybase_story', 'Story'],
33+
'StoryTranslation': ['storybase_story', 'Story'],
3334
}
3435

3536
def _get_index(self, using, sender):
@@ -39,7 +40,11 @@ def _get_index(self, using, sender):
3940
This is needed because we update some indexes based on
4041
changes on related models
4142
"""
42-
index_class = self._SENDER_MAP.get(sender.__name__, sender)
43+
if sender.__name__ in self._SENDER_MAP:
44+
index_class = get_model(*self._SENDER_MAP[sender.__name__])
45+
else:
46+
index_class = sender
47+
4348
return self.connections[using].get_unified_index().get_index(index_class)
4449

4550
def handle_method(self, method_name, sender, instance, **kwargs):
@@ -92,6 +97,13 @@ def handle_location_save(self, sender, instance, **kwargs):
9297
self.handle_method('location_update_object', sender, instance, **kwargs)
9398

9499
def _setup_story(self):
100+
# HACK: Import here to avoid circular import
101+
# See http://stackoverflow.com/a/17364366/386210
102+
from storybase_asset.models import HtmlAssetTranslation
103+
from storybase_geo.models import Location
104+
from storybase_story.models import (SectionAsset, SectionTranslation,
105+
Story, StoryTranslation)
106+
95107
# Save signals
96108
signals.post_save.connect(self.handle_save, sender=Story)
97109
signals.post_save.connect(self.handle_translation_save,
@@ -124,6 +136,10 @@ def _setup_story(self):
124136
sender=StoryTranslation)
125137

126138
def _setup_help(self):
139+
# HACK: Import here to avoid circular import
140+
# See http://stackoverflow.com/a/17364366/386210
141+
from storybase_help.models import Help, HelpTranslation
142+
127143
signals.post_save.connect(self.handle_save, sender=Help)
128144
signals.post_save.connect(self.handle_translation_save,
129145
sender=HelpTranslation)
@@ -132,6 +148,13 @@ def _setup_help(self):
132148
sender=HelpTranslation)
133149

134150
def _teardown_story(self):
151+
# HACK: Import here to avoid circular import
152+
# See http://stackoverflow.com/a/17364366/386210
153+
from storybase_asset.models import HtmlAssetTranslation
154+
from storybase_geo.models import Location
155+
from storybase_story.models import (SectionAsset, SectionTranslation,
156+
Story, StoryTranslation)
157+
135158
signals.post_save.disconnect(self.handle_save, sender=Story)
136159
signals.post_save.disconnect(self.handle_translation_save,
137160
sender=StoryTranslation)
@@ -160,6 +183,10 @@ def _teardown_story(self):
160183
sender=StoryTranslation)
161184

162185
def _teardown_help(self):
186+
# HACK: Import here to avoid circular import
187+
# See http://stackoverflow.com/a/17364366/386210
188+
from storybase_help.models import Help, HelpTranslation
189+
163190
signals.post_save.disconnect(self.handle_save, sender=Help)
164191
signals.post_save.disconnect(self.handle_translation_save,
165192
sender=HelpTranslation)

0 commit comments

Comments
 (0)