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

80 lines
2.2 KiB
Python
Raw Normal View History

2022-10-21 13:16:16 -04:00
import uuid
from django.db import models
from django.utils.translation import gettext_lazy as _
2022-10-21 13:16:16 -04:00
from netbox.search.utils import get_indexer
2022-10-21 13:16:16 -04:00
from utilities.fields import RestrictedGenericForeignKey
from ..fields import CachedValueField
2022-10-21 13:16:16 -04:00
__all__ = (
'CachedValue',
)
class CachedValue(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False
)
timestamp = models.DateTimeField(
verbose_name=_('timestamp'),
2022-10-21 13:16:16 -04:00
auto_now_add=True,
editable=False
)
object_type = models.ForeignKey(
to='contenttypes.ContentType',
2022-10-21 13:16:16 -04:00
on_delete=models.CASCADE,
related_name='+'
)
object_id = models.PositiveBigIntegerField()
object = RestrictedGenericForeignKey(
ct_field='object_type',
fk_field='object_id'
)
field = models.CharField(
verbose_name=_('field'),
2022-10-21 13:16:16 -04:00
max_length=200
)
type = models.CharField(
verbose_name=_('type'),
2022-10-21 13:16:16 -04:00
max_length=30
)
value = CachedValueField(
verbose_name=_('value'),
)
2022-10-21 13:16:16 -04:00
weight = models.PositiveSmallIntegerField(
verbose_name=_('weight'),
2022-10-21 13:16:16 -04:00
default=1000
)
_netbox_private = True
2022-10-21 13:16:16 -04:00
class Meta:
ordering = ('weight', 'object_type', 'value', 'object_id')
verbose_name = _('cached value')
verbose_name_plural = _('cached values')
indexes = (
models.Index(fields=('object_type', 'object_id'), name='extras_cachedvalue_object'),
)
2022-10-21 13:16:16 -04:00
def __str__(self):
return f'{self.object_type} {self.object_id}: {self.field}={self.value}'
@property
def display_attrs(self):
"""
Render any display attributes associated with this search result.
"""
indexer = get_indexer(self.object_type)
attrs = {}
for attr in indexer.display_attrs:
name = self.object._meta.get_field(attr).verbose_name
if value := getattr(self.object, attr):
if display_func := getattr(self.object, f'get_{attr}_display', None):
attrs[name] = display_func()
else:
attrs[name] = value
return attrs