models.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.core.exceptions import ValidationError
  2. from django.db import models
  3. from django.urls import reverse
  4. from mptt.models import MPTTModel, TreeForeignKey
  5. from extras.utils import extras_features
  6. from netbox.models import NestedGroupModel, PrimaryModel
  7. from utilities.querysets import RestrictedQuerySet
  8. __all__ = (
  9. 'Tenant',
  10. 'TenantGroup',
  11. )
  12. @extras_features('custom_fields', 'custom_links', 'export_templates', 'webhooks')
  13. class TenantGroup(NestedGroupModel):
  14. """
  15. An arbitrary collection of Tenants.
  16. """
  17. name = models.CharField(
  18. max_length=100,
  19. unique=True
  20. )
  21. slug = models.SlugField(
  22. max_length=100,
  23. unique=True
  24. )
  25. parent = TreeForeignKey(
  26. to='self',
  27. on_delete=models.CASCADE,
  28. related_name='children',
  29. blank=True,
  30. null=True,
  31. db_index=True
  32. )
  33. description = models.CharField(
  34. max_length=200,
  35. blank=True
  36. )
  37. class Meta:
  38. ordering = ['name']
  39. def get_absolute_url(self):
  40. return reverse('tenancy:tenantgroup', args=[self.pk])
  41. @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
  42. class Tenant(PrimaryModel):
  43. """
  44. A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal
  45. department.
  46. """
  47. name = models.CharField(
  48. max_length=100,
  49. unique=True
  50. )
  51. slug = models.SlugField(
  52. max_length=100,
  53. unique=True
  54. )
  55. group = models.ForeignKey(
  56. to='tenancy.TenantGroup',
  57. on_delete=models.SET_NULL,
  58. related_name='tenants',
  59. blank=True,
  60. null=True
  61. )
  62. description = models.CharField(
  63. max_length=200,
  64. blank=True
  65. )
  66. comments = models.TextField(
  67. blank=True
  68. )
  69. objects = RestrictedQuerySet.as_manager()
  70. clone_fields = [
  71. 'group', 'description',
  72. ]
  73. class Meta:
  74. ordering = ['name']
  75. def __str__(self):
  76. return self.name
  77. def get_absolute_url(self):
  78. return reverse('tenancy:tenant', args=[self.pk])