mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* Initial work on new search backend * Clean up search backends * Return only the most relevant result per object * Clear any pre-existing cached entries on cache() * #6003: Implement global search functionality for custom field values * Tweak field weights & document guidance * Extend search() to accept a lookup type * Move get_registry() out of SearchBackend * Enforce object permissions when returning search results * Add indexers for remaining models * Avoid calling remove() on non-cacheable objects * Use new search backend by default * Extend search backend to filter by object type * Clean up search view form * Enable specifying lookup logic * Add indexes for value field * Remove object type selector from search bar * Introduce SearchTable and enable HTMX for results * Enable pagination * Remove legacy search backend * Cleanup * Use a UUID for CachedValue primary key * Refactoring search methods * Define max search results limit * Extend reindex command to support specifying particular models * Add clear() and size to SearchBackend * Optimize bulk caching performance * Highlight matched portion of field value * Performance improvements for reindexing * Started on search tests * Cleanup & docs * Documentation updates * Clean up SearchIndex * Flatten search registry to register by app_label.model_name * Clean up search backend classes * Clean up RestrictedGenericForeignKey and RestrictedPrefetch * Resolve migrations conflict
34 lines
999 B
Python
34 lines
999 B
Python
import collections
|
|
|
|
from extras.constants import EXTRAS_FEATURES
|
|
|
|
|
|
class Registry(dict):
|
|
"""
|
|
Central registry for registration of functionality. Once a store (key) is defined, it cannot be overwritten or
|
|
deleted (although its value may be manipulated).
|
|
"""
|
|
def __getitem__(self, key):
|
|
try:
|
|
return super().__getitem__(key)
|
|
except KeyError:
|
|
raise KeyError(f"Invalid store: {key}")
|
|
|
|
def __setitem__(self, key, value):
|
|
if key in self:
|
|
raise KeyError(f"Store already set: {key}")
|
|
super().__setitem__(key, value)
|
|
|
|
def __delitem__(self, key):
|
|
raise TypeError("Cannot delete stores from registry")
|
|
|
|
|
|
# Initialize the global registry
|
|
registry = Registry()
|
|
registry['model_features'] = {
|
|
feature: collections.defaultdict(set) for feature in EXTRAS_FEATURES
|
|
}
|
|
registry['denormalized_fields'] = collections.defaultdict(list)
|
|
registry['search'] = dict()
|
|
registry['views'] = collections.defaultdict(dict)
|