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
51 lines
1.1 KiB
Python
51 lines
1.1 KiB
Python
import uuid
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.db import models
|
|
|
|
from utilities.fields import RestrictedGenericForeignKey
|
|
|
|
__all__ = (
|
|
'CachedValue',
|
|
)
|
|
|
|
|
|
class CachedValue(models.Model):
|
|
id = models.UUIDField(
|
|
primary_key=True,
|
|
default=uuid.uuid4,
|
|
editable=False
|
|
)
|
|
timestamp = models.DateTimeField(
|
|
auto_now_add=True,
|
|
editable=False
|
|
)
|
|
object_type = models.ForeignKey(
|
|
to=ContentType,
|
|
on_delete=models.CASCADE,
|
|
related_name='+'
|
|
)
|
|
object_id = models.PositiveBigIntegerField()
|
|
object = RestrictedGenericForeignKey(
|
|
ct_field='object_type',
|
|
fk_field='object_id'
|
|
)
|
|
field = models.CharField(
|
|
max_length=200
|
|
)
|
|
type = models.CharField(
|
|
max_length=30
|
|
)
|
|
value = models.TextField(
|
|
db_index=True
|
|
)
|
|
weight = models.PositiveSmallIntegerField(
|
|
default=1000
|
|
)
|
|
|
|
class Meta:
|
|
ordering = ('weight', 'object_type', 'object_id')
|
|
|
|
def __str__(self):
|
|
return f'{self.object_type} {self.object_id}: {self.field}={self.value}'
|