From cefb96fa1d431cbc9f361827a13e0d1a6365b8bd Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Oct 2022 10:42:42 -0400 Subject: [PATCH] Build search form options from registry --- netbox/netbox/search/backends.py | 26 +++++++++++++++---------- netbox/utilities/templatetags/search.py | 6 +----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/netbox/netbox/search/backends.py b/netbox/netbox/search/backends.py index 86cd2538b..f769e4fa6 100644 --- a/netbox/netbox/search/backends.py +++ b/netbox/netbox/search/backends.py @@ -1,3 +1,4 @@ +from collections import defaultdict from importlib import import_module from django.conf import settings @@ -86,17 +87,22 @@ class SearchBackend(object): if self._search_choice_options: return self._search_choice_options - result = list() - result.append(('', 'All Objects')) - for category, items in self._search_choices.items(): - subcategories = list() - for slug, verbose_name in items.items(): - name = verbose_name - name = name[0].upper() + name[1:] - subcategories.append((slug, name)) - result.append((category, tuple(subcategories))) + # Organize choices by category + categories = defaultdict(dict) + for app_label, models in registry['search'].items(): + for name, cls in models.items(): + model = cls.queryset.model + title = model._meta.verbose_name.title() + categories[cls.choice_header][name] = title + + # Compile a nested tuple of choices for form rendering + results = ( + ('', 'All Objects'), + *[(category, choices.items()) for category, choices in categories.items()] + ) + + self._search_choice_options = results - self._search_choice_options = tuple(result) return self._search_choice_options def _use_hooks(self): diff --git a/netbox/utilities/templatetags/search.py b/netbox/utilities/templatetags/search.py index 2cd6e7809..ca8f3ba2a 100644 --- a/netbox/utilities/templatetags/search.py +++ b/netbox/utilities/templatetags/search.py @@ -5,15 +5,11 @@ from django import template from netbox.forms import SearchForm register = template.Library() -search_form = None +search_form = SearchForm() @register.inclusion_tag("search/searchbar.html") def search_options(request) -> Dict: - global search_form - - if not search_form: - search_form = SearchForm() # Provide search options to template. return {