models.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from django.contrib.contenttypes.fields import GenericRelation
  2. from django.db import models
  3. from django.urls import reverse
  4. from taggit.managers import TaggableManager
  5. from extras.models import CustomFieldModel, TaggedItem
  6. from utilities.models import ChangeLoggedModel
  7. __all__ = (
  8. 'Tenant',
  9. 'TenantGroup',
  10. )
  11. class TenantGroup(ChangeLoggedModel):
  12. """
  13. An arbitrary collection of Tenants.
  14. """
  15. name = models.CharField(
  16. max_length=50,
  17. unique=True
  18. )
  19. slug = models.SlugField(
  20. unique=True
  21. )
  22. csv_headers = ['name', 'slug']
  23. class Meta:
  24. ordering = ['name']
  25. def __str__(self):
  26. return self.name
  27. def get_absolute_url(self):
  28. return "{}?group={}".format(reverse('tenancy:tenant_list'), self.slug)
  29. def to_csv(self):
  30. return (
  31. self.name,
  32. self.slug,
  33. )
  34. class Tenant(ChangeLoggedModel, CustomFieldModel):
  35. """
  36. A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal
  37. department.
  38. """
  39. name = models.CharField(
  40. max_length=30,
  41. unique=True
  42. )
  43. slug = models.SlugField(
  44. unique=True
  45. )
  46. group = models.ForeignKey(
  47. to='tenancy.TenantGroup',
  48. on_delete=models.SET_NULL,
  49. related_name='tenants',
  50. blank=True,
  51. null=True
  52. )
  53. description = models.CharField(
  54. max_length=100,
  55. blank=True,
  56. help_text='Long-form name (optional)'
  57. )
  58. comments = models.TextField(
  59. blank=True
  60. )
  61. custom_field_values = GenericRelation(
  62. to='extras.CustomFieldValue',
  63. content_type_field='obj_type',
  64. object_id_field='obj_id'
  65. )
  66. tags = TaggableManager(through=TaggedItem)
  67. csv_headers = ['name', 'slug', 'group', 'description', 'comments']
  68. clone_fields = [
  69. 'group', 'description',
  70. ]
  71. class Meta:
  72. ordering = ['group', 'name']
  73. def __str__(self):
  74. return self.name
  75. def get_absolute_url(self):
  76. return reverse('tenancy:tenant', args=[self.slug])
  77. def to_csv(self):
  78. return (
  79. self.name,
  80. self.slug,
  81. self.group.name if self.group else None,
  82. self.description,
  83. self.comments,
  84. )