models.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from django.contrib.contenttypes.fields import GenericRelation
  2. from django.db import models
  3. from django.urls import reverse
  4. from mptt.models import MPTTModel, TreeForeignKey
  5. from taggit.managers import TaggableManager
  6. from extras.models import CustomFieldModel, ObjectChange, TaggedItem
  7. from utilities.models import ChangeLoggedModel
  8. from utilities.utils import serialize_object
  9. __all__ = (
  10. 'Tenant',
  11. 'TenantGroup',
  12. )
  13. class TenantGroup(MPTTModel, ChangeLoggedModel):
  14. """
  15. An arbitrary collection of Tenants.
  16. """
  17. name = models.CharField(
  18. max_length=50,
  19. unique=True
  20. )
  21. slug = models.SlugField(
  22. unique=True
  23. )
  24. parent = TreeForeignKey(
  25. to='self',
  26. on_delete=models.CASCADE,
  27. related_name='children',
  28. blank=True,
  29. null=True,
  30. db_index=True
  31. )
  32. description = models.CharField(
  33. max_length=200,
  34. blank=True
  35. )
  36. csv_headers = ['name', 'slug', 'parent', 'description']
  37. class Meta:
  38. ordering = ['name']
  39. class MPTTMeta:
  40. order_insertion_by = ['name']
  41. def __str__(self):
  42. return self.name
  43. def get_absolute_url(self):
  44. return "{}?group={}".format(reverse('tenancy:tenant_list'), self.slug)
  45. def to_csv(self):
  46. return (
  47. self.name,
  48. self.slug,
  49. self.parent.name if self.parent else '',
  50. self.description,
  51. )
  52. def to_objectchange(self, action):
  53. # Remove MPTT-internal fields
  54. return ObjectChange(
  55. changed_object=self,
  56. object_repr=str(self),
  57. action=action,
  58. object_data=serialize_object(self, exclude=['level', 'lft', 'rght', 'tree_id'])
  59. )
  60. class Tenant(ChangeLoggedModel, CustomFieldModel):
  61. """
  62. A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal
  63. department.
  64. """
  65. name = models.CharField(
  66. max_length=30,
  67. unique=True
  68. )
  69. slug = models.SlugField(
  70. unique=True
  71. )
  72. group = models.ForeignKey(
  73. to='tenancy.TenantGroup',
  74. on_delete=models.SET_NULL,
  75. related_name='tenants',
  76. blank=True,
  77. null=True
  78. )
  79. description = models.CharField(
  80. max_length=200,
  81. blank=True
  82. )
  83. comments = models.TextField(
  84. blank=True
  85. )
  86. custom_field_values = GenericRelation(
  87. to='extras.CustomFieldValue',
  88. content_type_field='obj_type',
  89. object_id_field='obj_id'
  90. )
  91. tags = TaggableManager(through=TaggedItem)
  92. csv_headers = ['name', 'slug', 'group', 'description', 'comments']
  93. clone_fields = [
  94. 'group', 'description',
  95. ]
  96. class Meta:
  97. ordering = ['group', 'name']
  98. def __str__(self):
  99. return self.name
  100. def get_absolute_url(self):
  101. return reverse('tenancy:tenant', args=[self.slug])
  102. def to_csv(self):
  103. return (
  104. self.name,
  105. self.slug,
  106. self.group.name if self.group else None,
  107. self.description,
  108. self.comments,
  109. )