1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Merge pull request #15421 from netbox-community/15413-search-cache-attrs

Closes #15413: Enable caching of object attributes in search index
This commit is contained in:
Jeremy Stretch
2024-03-15 11:38:06 -04:00
committed by GitHub
2 changed files with 31 additions and 4 deletions

View File

@ -1,6 +1,9 @@
from collections import namedtuple
from decimal import Decimal
from django.core.exceptions import FieldDoesNotExist
from django.db import models
from netaddr import IPAddress, IPNetwork
from ipam.fields import IPAddressField, IPNetworkField
from netbox.registry import registry
@ -56,6 +59,24 @@ class SearchIndex:
return FieldTypes.INTEGER
return FieldTypes.STRING
@staticmethod
def get_attr_type(instance, field_name):
"""
Return the data type of the specified object attribute.
"""
value = getattr(instance, field_name)
if type(value) is str:
return FieldTypes.STRING
if type(value) is int:
return FieldTypes.INTEGER
if type(value) in (float, Decimal):
return FieldTypes.FLOAT
if type(value) is IPNetwork:
return FieldTypes.CIDR
if type(value) is IPAddress:
return FieldTypes.INET
return FieldTypes.STRING
@staticmethod
def get_field_value(instance, field_name):
"""
@ -82,7 +103,11 @@ class SearchIndex:
# Capture built-in fields
for name, weight in cls.fields:
type_ = cls.get_field_type(instance, name)
try:
type_ = cls.get_field_type(instance, name)
except FieldDoesNotExist:
# Not a concrete field; handle as an object attribute
type_ = cls.get_attr_type(instance, name)
value = cls.get_field_value(instance, name)
if type_ and value:
values.append(

View File

@ -263,9 +263,11 @@ class SearchTable(tables.Table):
super().__init__(data, **kwargs)
def render_field(self, value, record):
if hasattr(record.object, value):
return title(record.object._meta.get_field(value).verbose_name)
return value
try:
model_field = record.object._meta.get_field(value)
return title(model_field.verbose_name)
except FieldDoesNotExist:
return value
def render_value(self, value):
if not self.highlight: