Skip to content

Commit

Permalink
Merge pull request #15421 from netbox-community/15413-search-cache-attrs
Browse files Browse the repository at this point in the history
Closes #15413: Enable caching of object attributes in search index
  • Loading branch information
jeremystretch authored Mar 15, 2024
2 parents 9062d99 + 7357f95 commit b58c85c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
27 changes: 26 additions & 1 deletion netbox/netbox/search/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -56,6 +59,24 @@ def get_field_type(instance, field_name):
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):
"""
Expand All @@ -82,7 +103,11 @@ def to_cache(cls, instance, custom_fields=None):

# 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(
Expand Down
8 changes: 5 additions & 3 deletions netbox/netbox/tables/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,11 @@ def __init__(self, data, highlight=None, **kwargs):
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:
Expand Down

0 comments on commit b58c85c

Please sign in to comment.