Ensure that models can still be registered with ReferenceIndex.register_model after the initial set of signals has been connected

pull/10374/head
Matt Westcott 2023-04-19 19:48:27 +01:00
rodzic 072c8f21e1
commit 85c9b6689f
3 zmienionych plików z 24 dodań i 9 usunięć

Wyświetl plik

@ -17,8 +17,6 @@ By default, the index will store references between objects managed within the W
When introduced in Wagtail 4.1, the Reference Index recorded references in all application models by default. Wagtail 5.0 reduced the scope of the default models to those specifically linked with Wagtail.
```
Apps with models that are indexed need to listed in `INSTALLED_APPS` before the `wagtail` app.
The reference index does not require any further configuration. However there are circumstances where it may be necessary to add or remove models from the index.
(registering_a_model_for_indexing)=

Wyświetl plik

@ -250,6 +250,9 @@ class ReferenceIndex(models.Model):
"""
Registers the model for indexing.
"""
if model in cls.indexed_models:
return
if cls.model_is_indexable(model):
cls.indexed_models.add(model)
cls._register_as_tracked_model(model)
@ -260,7 +263,16 @@ class ReferenceIndex(models.Model):
Add the model and all of its ParentalKey-linked children to the set of
models to be tracked by signal handlers.
"""
if model in cls.tracked_models:
return
from wagtail.signal_handlers import (
connect_reference_index_signal_handlers_for_model,
)
cls.tracked_models.add(model)
connect_reference_index_signal_handlers_for_model(model)
for child_relation in get_all_child_relations(model):
if cls.model_is_indexable(
child_relation.related_model,

Wyświetl plik

@ -99,16 +99,24 @@ def remove_reference_index_on_delete(instance, **kwargs):
ReferenceIndex.remove_for_object(instance)
def connect_reference_index_signal_handlers_for_model(model):
post_save.connect(update_reference_index_on_save, sender=model)
post_delete.connect(remove_reference_index_on_delete, sender=model)
def connect_reference_index_signal_handlers(**kwargs):
for model in ReferenceIndex.tracked_models:
post_save.connect(update_reference_index_on_save, sender=model)
post_delete.connect(remove_reference_index_on_delete, sender=model)
connect_reference_index_signal_handlers_for_model(model)
def disconnect_reference_index_signal_handlers_for_model(model):
post_save.disconnect(update_reference_index_on_save, sender=model)
post_delete.disconnect(remove_reference_index_on_delete, sender=model)
def disconnect_reference_index_signal_handlers(**kwargs):
for model in ReferenceIndex.tracked_models:
post_save.disconnect(update_reference_index_on_save, sender=model)
post_delete.disconnect(remove_reference_index_on_delete, sender=model)
disconnect_reference_index_signal_handlers_for_model(model)
def register_signal_handlers():
@ -121,9 +129,6 @@ def register_signal_handlers():
post_save.connect(reset_locales_display_names_cache, sender=Locale)
post_delete.connect(reset_locales_display_names_cache, sender=Locale)
# Reference index signal handlers
connect_reference_index_signal_handlers()
# Disconnect reference index signals while migrations are running
# (we don't want to log references in migrations as the ReferenceIndex model might not exist)
pre_migrate.connect(disconnect_reference_index_signal_handlers)