2022-10-21 13:16:16 -04:00
|
|
|
import uuid
|
|
|
|
|
|
|
|
from django.db import models
|
2023-07-31 22:28:07 +07:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2022-10-21 13:16:16 -04:00
|
|
|
|
2023-11-09 16:21:09 -05:00
|
|
|
from netbox.search.utils import get_indexer
|
2022-10-21 13:16:16 -04:00
|
|
|
from utilities.fields import RestrictedGenericForeignKey
|
2023-02-07 09:40:25 +01:00
|
|
|
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(
|
2023-07-31 22:28:07 +07:00
|
|
|
verbose_name=_('timestamp'),
|
2022-10-21 13:16:16 -04:00
|
|
|
auto_now_add=True,
|
|
|
|
editable=False
|
|
|
|
)
|
|
|
|
object_type = models.ForeignKey(
|
2023-11-16 12:12:51 -05:00
|
|
|
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(
|
2023-07-31 22:28:07 +07:00
|
|
|
verbose_name=_('field'),
|
2022-10-21 13:16:16 -04:00
|
|
|
max_length=200
|
|
|
|
)
|
|
|
|
type = models.CharField(
|
2023-07-31 22:28:07 +07:00
|
|
|
verbose_name=_('type'),
|
2022-10-21 13:16:16 -04:00
|
|
|
max_length=30
|
|
|
|
)
|
2023-07-31 22:28:07 +07:00
|
|
|
value = CachedValueField(
|
|
|
|
verbose_name=_('value'),
|
|
|
|
)
|
2022-10-21 13:16:16 -04:00
|
|
|
weight = models.PositiveSmallIntegerField(
|
2023-07-31 22:28:07 +07:00
|
|
|
verbose_name=_('weight'),
|
2022-10-21 13:16:16 -04:00
|
|
|
default=1000
|
|
|
|
)
|
|
|
|
|
2023-11-03 10:32:59 -04:00
|
|
|
_netbox_private = True
|
|
|
|
|
2022-10-21 13:16:16 -04:00
|
|
|
class Meta:
|
2023-11-01 11:56:14 -04:00
|
|
|
ordering = ('weight', 'object_type', 'value', 'object_id')
|
2023-08-03 10:41:10 -04:00
|
|
|
verbose_name = _('cached value')
|
|
|
|
verbose_name_plural = _('cached values')
|
2024-02-21 10:20:55 -08:00
|
|
|
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}'
|
2023-11-09 16:21:09 -05:00
|
|
|
|
|
|
|
@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
|