models.py 2.2 KB

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