config.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.core.cache import cache
  2. from django.db import models
  3. from django.urls import reverse
  4. from django.utils.translation import gettext, gettext_lazy as _
  5. from utilities.querysets import RestrictedQuerySet
  6. __all__ = (
  7. 'ConfigRevision',
  8. )
  9. class ConfigRevision(models.Model):
  10. """
  11. An atomic revision of NetBox's configuration.
  12. """
  13. created = models.DateTimeField(
  14. verbose_name=_('created'),
  15. auto_now_add=True
  16. )
  17. comment = models.CharField(
  18. verbose_name=_('comment'),
  19. max_length=200,
  20. blank=True
  21. )
  22. data = models.JSONField(
  23. blank=True,
  24. null=True,
  25. verbose_name=_('configuration data')
  26. )
  27. objects = RestrictedQuerySet.as_manager()
  28. class Meta:
  29. ordering = ['-created']
  30. verbose_name = _('config revision')
  31. verbose_name_plural = _('config revisions')
  32. def __str__(self):
  33. if not self.pk:
  34. return gettext('Default configuration')
  35. if self.is_active:
  36. return gettext('Current configuration')
  37. return gettext('Config revision #{id}').format(id=self.pk)
  38. def __getattr__(self, item):
  39. if self.data and item in self.data:
  40. return self.data[item]
  41. return super().__getattribute__(item)
  42. def get_absolute_url(self):
  43. if not self.pk:
  44. return reverse('core:config') # Default config view
  45. return reverse('core:configrevision', args=[self.pk])
  46. def activate(self):
  47. """
  48. Cache the configuration data.
  49. """
  50. cache.set('config', self.data, None)
  51. cache.set('config_version', self.pk, None)
  52. activate.alters_data = True
  53. @property
  54. def is_active(self):
  55. return cache.get('config_version') == self.pk