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:
@ -1,6 +1,9 @@
|
|||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
|
from django.core.exceptions import FieldDoesNotExist
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from netaddr import IPAddress, IPNetwork
|
||||||
|
|
||||||
from ipam.fields import IPAddressField, IPNetworkField
|
from ipam.fields import IPAddressField, IPNetworkField
|
||||||
from netbox.registry import registry
|
from netbox.registry import registry
|
||||||
@ -56,6 +59,24 @@ class SearchIndex:
|
|||||||
return FieldTypes.INTEGER
|
return FieldTypes.INTEGER
|
||||||
return FieldTypes.STRING
|
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
|
@staticmethod
|
||||||
def get_field_value(instance, field_name):
|
def get_field_value(instance, field_name):
|
||||||
"""
|
"""
|
||||||
@ -82,7 +103,11 @@ class SearchIndex:
|
|||||||
|
|
||||||
# Capture built-in fields
|
# Capture built-in fields
|
||||||
for name, weight in cls.fields:
|
for name, weight in cls.fields:
|
||||||
|
try:
|
||||||
type_ = cls.get_field_type(instance, name)
|
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)
|
value = cls.get_field_value(instance, name)
|
||||||
if type_ and value:
|
if type_ and value:
|
||||||
values.append(
|
values.append(
|
||||||
|
@ -263,8 +263,10 @@ class SearchTable(tables.Table):
|
|||||||
super().__init__(data, **kwargs)
|
super().__init__(data, **kwargs)
|
||||||
|
|
||||||
def render_field(self, value, record):
|
def render_field(self, value, record):
|
||||||
if hasattr(record.object, value):
|
try:
|
||||||
return title(record.object._meta.get_field(value).verbose_name)
|
model_field = record.object._meta.get_field(value)
|
||||||
|
return title(model_field.verbose_name)
|
||||||
|
except FieldDoesNotExist:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def render_value(self, value):
|
def render_value(self, value):
|
||||||
|
Reference in New Issue
Block a user