Просмотр исходного кода

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

Closes #15413: Enable caching of object attributes in search index
Jeremy Stretch 1 год назад
Родитель
Сommit
b58c85cdb0
2 измененных файлов с 31 добавлено и 4 удалено
  1. 26 1
      netbox/netbox/search/__init__.py
  2. 5 3
      netbox/netbox/tables/tables.py

+ 26 - 1
netbox/netbox/search/__init__.py

@@ -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:
-            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)
             value = cls.get_field_value(instance, name)
             if type_ and value:
             if type_ and value:
                 values.append(
                 values.append(

+ 5 - 3
netbox/netbox/tables/tables.py

@@ -263,9 +263,11 @@ 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):
-            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):
     def render_value(self, value):
         if not self.highlight:
         if not self.highlight: