Use ObjectTypeRegistry for AdminURLFinder

pull/8067/head
Matt Westcott 2022-02-18 14:34:04 +00:00 zatwierdzone przez Matt Westcott
rodzic 983402d1ad
commit 37fe7ae035
1 zmienionych plików z 4 dodań i 12 usunięć

Wyświetl plik

@ -3,6 +3,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.urls import reverse from django.urls import reverse
from wagtail.core.hooks import search_for_hooks from wagtail.core.hooks import search_for_hooks
from wagtail.utils.registry import ObjectTypeRegistry
""" """
A mechanism for finding the admin edit URL for an arbitrary object instance, optionally applying A mechanism for finding the admin edit URL for an arbitrary object instance, optionally applying
@ -76,12 +77,11 @@ class NullAdminURLFinder:
return None return None
FINDER_CLASSES_BY_MODEL = {} finder_classes = ObjectTypeRegistry()
def register_admin_url_finder(model, handler): def register_admin_url_finder(model, handler):
global FINDER_CLASSES_BY_MODEL finder_classes.register(model, value=handler)
FINDER_CLASSES_BY_MODEL[model] = handler
class AdminURLFinder: class AdminURLFinder:
@ -100,15 +100,7 @@ class AdminURLFinder:
# do we already have a finder for this model and user? # do we already have a finder for this model and user?
finder = self.finders_by_model[model] finder = self.finders_by_model[model]
except KeyError: except KeyError:
finder_class = NullAdminURLFinder finder_class = finder_classes.get(instance) or NullAdminURLFinder
# check all superclasses of model for a registered finder class
for cls in model.__mro__:
try:
finder_class = FINDER_CLASSES_BY_MODEL[cls]
break
except KeyError:
continue
finder = finder_class(self.user) finder = finder_class(self.user)
self.finders_by_model[model] = finder self.finders_by_model[model] = finder