-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* 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
- Loading branch information
1 parent
5d56d95
commit 9628dea
Showing
50 changed files
with
1,557 additions
and
653 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# Search | ||
|
||
NetBox v3.4 introduced a new global search mechanism, which employs the `extras.CachedValue` model to store discrete field values from many models in a single table. | ||
|
||
## SearchIndex | ||
|
||
To enable search support for a model, declare and register a subclass of `netbox.search.SearchIndex` for it. Typically, this will be done within an app's `search.py` module. | ||
|
||
```python | ||
from netbox.search import SearchIndex, register_search | ||
|
||
@register_search | ||
class MyModelIndex(SearchIndex): | ||
model = MyModel | ||
fields = ( | ||
('name', 100), | ||
('description', 500), | ||
('comments', 5000), | ||
) | ||
``` | ||
|
||
A SearchIndex subclass defines both its model and a list of two-tuples specifying which model fields to be indexed and the weight (precedence) associated with each. Guidance on weight assignment for fields is provided below. | ||
|
||
### Field Weight Guidance | ||
|
||
| Weight | Field Role | Examples | | ||
|--------|--------------------------------------------------|----------------------------------------------------| | ||
| 50 | Unique serialized attribute | Device.asset_tag | | ||
| 60 | Unique serialized attribute (per related object) | Device.serial | | ||
| 100 | Primary human identifier | Device.name, Circuit.cid, Cable.label | | ||
| 110 | Slug | Site.slug | | ||
| 200 | Secondary identifier | Provider.account, DeviceType.part_number | | ||
| 300 | Highly unique descriptive attribute | CircuitTermination.xconnect_id, IPAddress.dns_name | | ||
| 500 | Description | Site.description | | ||
| 1000 | Custom field default | - | | ||
| 2000 | Other discrete attribute | CircuitTermination.port_speed | | ||
| 5000 | Comment field | Site.comments | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,55 @@ | ||
import circuits.filtersets | ||
import circuits.tables | ||
from circuits.models import Circuit, Provider, ProviderNetwork | ||
from netbox.search import SearchIndex, register_search | ||
from utilities.utils import count_related | ||
from . import models | ||
|
||
|
||
@register_search() | ||
class ProviderIndex(SearchIndex): | ||
model = Provider | ||
queryset = Provider.objects.annotate(count_circuits=count_related(Circuit, 'provider')) | ||
filterset = circuits.filtersets.ProviderFilterSet | ||
table = circuits.tables.ProviderTable | ||
url = 'circuits:provider_list' | ||
@register_search | ||
class CircuitIndex(SearchIndex): | ||
model = models.Circuit | ||
fields = ( | ||
('cid', 100), | ||
('description', 500), | ||
('comments', 5000), | ||
) | ||
|
||
|
||
@register_search() | ||
class CircuitIndex(SearchIndex): | ||
model = Circuit | ||
queryset = Circuit.objects.prefetch_related( | ||
'type', 'provider', 'tenant', 'tenant__group', 'terminations__site' | ||
@register_search | ||
class CircuitTerminationIndex(SearchIndex): | ||
model = models.CircuitTermination | ||
fields = ( | ||
('xconnect_id', 300), | ||
('pp_info', 300), | ||
('description', 500), | ||
('port_speed', 2000), | ||
('upstream_speed', 2000), | ||
) | ||
|
||
|
||
@register_search | ||
class CircuitTypeIndex(SearchIndex): | ||
model = models.CircuitType | ||
fields = ( | ||
('name', 100), | ||
('slug', 110), | ||
('description', 500), | ||
) | ||
|
||
|
||
@register_search | ||
class ProviderIndex(SearchIndex): | ||
model = models.Provider | ||
fields = ( | ||
('name', 100), | ||
('account', 200), | ||
('comments', 5000), | ||
) | ||
filterset = circuits.filtersets.CircuitFilterSet | ||
table = circuits.tables.CircuitTable | ||
url = 'circuits:circuit_list' | ||
|
||
|
||
@register_search() | ||
@register_search | ||
class ProviderNetworkIndex(SearchIndex): | ||
model = ProviderNetwork | ||
queryset = ProviderNetwork.objects.prefetch_related('provider') | ||
filterset = circuits.filtersets.ProviderNetworkFilterSet | ||
table = circuits.tables.ProviderNetworkTable | ||
url = 'circuits:providernetwork_list' | ||
model = models.ProviderNetwork | ||
fields = ( | ||
('name', 100), | ||
('service_id', 200), | ||
('description', 500), | ||
('comments', 5000), | ||
) |
Oops, something went wrong.