diff --git a/netbox/tenancy/models/__init__.py b/netbox/tenancy/models/__init__.py new file mode 100644 index 000000000..6d62edd20 --- /dev/null +++ b/netbox/tenancy/models/__init__.py @@ -0,0 +1,2 @@ +from .contacts import * +from .tenants import * diff --git a/netbox/tenancy/models.py b/netbox/tenancy/models/contacts.py similarity index 66% rename from netbox/tenancy/models.py rename to netbox/tenancy/models/contacts.py index 01ea2d0d5..2669aa121 100644 --- a/netbox/tenancy/models.py +++ b/netbox/tenancy/models/contacts.py @@ -1,116 +1,22 @@ -from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from django.urls import reverse -from mptt.models import MPTTModel, TreeForeignKey +from mptt.models import TreeForeignKey from extras.utils import extras_features from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel +from tenancy.choices import * from utilities.querysets import RestrictedQuerySet -from .choices import * - __all__ = ( 'ContactAssignment', 'Contact', 'ContactGroup', 'ContactRole', - 'Tenant', - 'TenantGroup', ) -# -# Tenants -# - -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class TenantGroup(NestedGroupModel): - """ - An arbitrary collection of Tenants. - """ - name = models.CharField( - max_length=100, - unique=True - ) - slug = models.SlugField( - max_length=100, - unique=True - ) - parent = TreeForeignKey( - to='self', - on_delete=models.CASCADE, - related_name='children', - blank=True, - null=True, - db_index=True - ) - description = models.CharField( - max_length=200, - blank=True - ) - - class Meta: - ordering = ['name'] - - def get_absolute_url(self): - return reverse('tenancy:tenantgroup', args=[self.pk]) - - -@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') -class Tenant(PrimaryModel): - """ - A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal - department. - """ - name = models.CharField( - max_length=100, - unique=True - ) - slug = models.SlugField( - max_length=100, - unique=True - ) - group = models.ForeignKey( - to='tenancy.TenantGroup', - on_delete=models.SET_NULL, - related_name='tenants', - blank=True, - null=True - ) - description = models.CharField( - max_length=200, - blank=True - ) - comments = models.TextField( - blank=True - ) - - # Generic relations - contacts = GenericRelation( - to='tenancy.ContactAssignment' - ) - - objects = RestrictedQuerySet.as_manager() - - clone_fields = [ - 'group', 'description', - ] - - class Meta: - ordering = ['name'] - - def __str__(self): - return self.name - - def get_absolute_url(self): - return reverse('tenancy:tenant', args=[self.pk]) - - -# -# Contacts -# - @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') class ContactGroup(NestedGroupModel): """ diff --git a/netbox/tenancy/models/tenants.py b/netbox/tenancy/models/tenants.py new file mode 100644 index 000000000..7dae2c093 --- /dev/null +++ b/netbox/tenancy/models/tenants.py @@ -0,0 +1,96 @@ +from django.contrib.contenttypes.fields import GenericRelation +from django.db import models +from django.urls import reverse +from mptt.models import TreeForeignKey + +from extras.utils import extras_features +from netbox.models import NestedGroupModel, PrimaryModel +from utilities.querysets import RestrictedQuerySet + +__all__ = ( + 'Tenant', + 'TenantGroup', +) + + +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class TenantGroup(NestedGroupModel): + """ + An arbitrary collection of Tenants. + """ + name = models.CharField( + max_length=100, + unique=True + ) + slug = models.SlugField( + max_length=100, + unique=True + ) + parent = TreeForeignKey( + to='self', + on_delete=models.CASCADE, + related_name='children', + blank=True, + null=True, + db_index=True + ) + description = models.CharField( + max_length=200, + blank=True + ) + + class Meta: + ordering = ['name'] + + def get_absolute_url(self): + return reverse('tenancy:tenantgroup', args=[self.pk]) + + +@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') +class Tenant(PrimaryModel): + """ + A Tenant represents an organization served by the NetBox owner. This is typically a customer or an internal + department. + """ + name = models.CharField( + max_length=100, + unique=True + ) + slug = models.SlugField( + max_length=100, + unique=True + ) + group = models.ForeignKey( + to='tenancy.TenantGroup', + on_delete=models.SET_NULL, + related_name='tenants', + blank=True, + null=True + ) + description = models.CharField( + max_length=200, + blank=True + ) + comments = models.TextField( + blank=True + ) + + # Generic relations + contacts = GenericRelation( + to='tenancy.ContactAssignment' + ) + + objects = RestrictedQuerySet.as_manager() + + clone_fields = [ + 'group', 'description', + ] + + class Meta: + ordering = ['name'] + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('tenancy:tenant', args=[self.pk])