Skip to content

Commit

Permalink
#9047 - Link Circuits to Provider Account instead of Provider
Browse files Browse the repository at this point in the history
  • Loading branch information
DanSheps committed Mar 22, 2023
1 parent 22fdd61 commit 1a6bd72
Show file tree
Hide file tree
Showing 19 changed files with 245 additions and 75 deletions.
4 changes: 2 additions & 2 deletions netbox/circuits/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class Meta:

class CircuitSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail')
provider = NestedProviderSerializer()
provider_account = NestedProviderAccountSerializer()
status = ChoiceField(choices=CircuitStatusChoices, required=False)
type = NestedCircuitTypeSerializer()
tenant = NestedTenantSerializer(required=False, allow_null=True)
Expand All @@ -115,7 +115,7 @@ class CircuitSerializer(NetBoxModelSerializer):
class Meta:
model = Circuit
fields = [
'id', 'url', 'display', 'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date',
'id', 'url', 'display', 'cid', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date',
'commit_rate', 'description', 'termination_a', 'termination_z', 'comments', 'tags', 'custom_fields',
'created', 'last_updated',
]
Expand Down
4 changes: 2 additions & 2 deletions netbox/circuits/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def get_view_name(self):

class ProviderViewSet(NetBoxModelViewSet):
queryset = Provider.objects.prefetch_related('asns', 'tags').annotate(
circuit_count=count_related(Circuit, 'provider')
circuit_count=count_related(Circuit, 'provider_account__provider')
)
serializer_class = serializers.ProviderSerializer
filterset_class = filtersets.ProviderFilterSet
Expand All @@ -46,7 +46,7 @@ class CircuitTypeViewSet(NetBoxModelViewSet):

class CircuitViewSet(NetBoxModelViewSet):
queryset = Circuit.objects.prefetch_related(
'type', 'tenant', 'provider', 'termination_a', 'termination_z'
'type', 'tenant', 'provider_account', 'provider_account__provider', 'termination_a', 'termination_z'
).prefetch_related('tags')
serializer_class = serializers.CircuitSerializer
filterset_class = filtersets.CircuitFilterSet
Expand Down
20 changes: 13 additions & 7 deletions netbox/circuits/filtersets.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,37 +24,37 @@
class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(),
field_name='circuits__terminations__site__region',
field_name='accounts__circuits__terminations__site__region',
lookup_expr='in',
label=_('Region (ID)'),
)
region = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(),
field_name='circuits__terminations__site__region',
field_name='accounts__circuits__terminations__site__region',
lookup_expr='in',
to_field_name='slug',
label=_('Region (slug)'),
)
site_group_id = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(),
field_name='circuits__terminations__site__group',
field_name='accounts__circuits__terminations__site__group',
lookup_expr='in',
label=_('Site group (ID)'),
)
site_group = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(),
field_name='circuits__terminations__site__group',
field_name='accounts__circuits__terminations__site__group',
lookup_expr='in',
to_field_name='slug',
label=_('Site group (slug)'),
)
site_id = django_filters.ModelMultipleChoiceFilter(
field_name='circuits__terminations__site',
field_name='accounts__circuits__terminations__site',
queryset=Site.objects.all(),
label=_('Site'),
)
site = django_filters.ModelMultipleChoiceFilter(
field_name='circuits__terminations__site__slug',
field_name='accounts__circuits__terminations__site__slug',
queryset=Site.objects.all(),
to_field_name='slug',
label=_('Site (slug)'),
Expand Down Expand Up @@ -142,15 +142,21 @@ class Meta:

class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
provider_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account__provider',
queryset=Provider.objects.all(),
label=_('Provider (ID)'),
)
provider = django_filters.ModelMultipleChoiceFilter(
field_name='provider__slug',
field_name='provider_account__provider__slug',
queryset=Provider.objects.all(),
to_field_name='slug',
label=_('Provider (slug)'),
)
provider_account_id = django_filters.ModelMultipleChoiceFilter(
field_name='provider_account',
queryset=ProviderAccount.objects.all(),
label=_('ProviderAccount (ID)'),
)
provider_network_id = django_filters.ModelMultipleChoiceFilter(
field_name='terminations__provider_network',
queryset=ProviderNetwork.objects.all(),
Expand Down
7 changes: 7 additions & 0 deletions netbox/circuits/forms/bulk_edit.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,13 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm):
queryset=Provider.objects.all(),
required=False
)
provider_account = DynamicModelChoiceField(
queryset=ProviderAccount.objects.all(),
required=False,
query_params={
'provider': '$provider'
}
)
status = forms.ChoiceField(
choices=add_blank_choice(CircuitStatusChoices),
required=False,
Expand Down
8 changes: 4 additions & 4 deletions netbox/circuits/forms/bulk_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ class Meta:


class CircuitImportForm(NetBoxModelImportForm):
provider = CSVModelChoiceField(
queryset=Provider.objects.all(),
provider_account = CSVModelChoiceField(
queryset=ProviderAccount.objects.all(),
to_field_name='name',
help_text=_('Assigned provider')
help_text=_('Assigned provider account')
)
type = CSVModelChoiceField(
queryset=CircuitType.objects.all(),
Expand All @@ -92,7 +92,7 @@ class CircuitImportForm(NetBoxModelImportForm):
class Meta:
model = Circuit
fields = [
'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
'cid', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
'description', 'comments', 'tags'
]

Expand Down
8 changes: 8 additions & 0 deletions netbox/circuits/forms/filtersets.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,14 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi
required=False,
label=_('Provider')
)
provider_account_id = DynamicModelMultipleChoiceField(
queryset=Provider.objects.all(),
required=False,
query_params={
'provider_id': '$provider_id'
},
label=_('Provider')
)
provider_network_id = DynamicModelMultipleChoiceField(
queryset=ProviderNetwork.objects.all(),
required=False,
Expand Down
40 changes: 33 additions & 7 deletions netbox/circuits/forms/model_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class Meta:


class ProviderAccountForm(NetBoxModelForm):
provider = DynamicModelChoiceField(
queryset=Provider.objects.all()
)
comments = CommentField()

class Meta:
Expand Down Expand Up @@ -88,24 +91,37 @@ class Meta:

class CircuitForm(TenancyForm, NetBoxModelForm):
provider = DynamicModelChoiceField(
queryset=Provider.objects.all()
required=False,
queryset=Provider.objects.all(),
initial_params={
'accounts': '$provider_account'
},
)
provider_account = DynamicModelChoiceField(
queryset=ProviderAccount.objects.all(),
initial_params={
'circuits': '$circuit'
},
query_params={
'provider': '$provider',
}
)
type = DynamicModelChoiceField(
queryset=CircuitType.objects.all()
)
comments = CommentField()

fieldsets = (
('Circuit', ('provider', 'cid', 'type', 'status', 'description', 'tags')),
('Circuit', ('provider', 'provider_account', 'cid', 'type', 'status', 'description', 'tags')),
('Service Parameters', ('install_date', 'termination_date', 'commit_rate')),
('Tenancy', ('tenant_group', 'tenant')),
)

class Meta:
model = Circuit
fields = [
'cid', 'type', 'provider', 'status', 'install_date', 'termination_date', 'commit_rate', 'description',
'tenant_group', 'tenant', 'comments', 'tags',
'cid', 'type', 'provider', 'provider_account', 'status', 'install_date', 'termination_date', 'commit_rate',
'description', 'tenant_group', 'tenant', 'comments', 'tags',
]
help_texts = {
'cid': _("Unique circuit ID"),
Expand All @@ -123,8 +139,18 @@ class CircuitTerminationForm(NetBoxModelForm):
provider = DynamicModelChoiceField(
queryset=Provider.objects.all(),
required=False,
initial_params={
'accounts': '$provider_account'
}
)
provider_account = DynamicModelChoiceField(
queryset=ProviderAccount.objects.all(),
required=False,
initial_params={
'circuits': '$circuit'
},
query_params={
'provider': '$provider',
}
)
circuit = DynamicModelChoiceField(
Expand Down Expand Up @@ -174,9 +200,9 @@ class CircuitTerminationForm(NetBoxModelForm):
class Meta:
model = CircuitTermination
fields = [
'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'provider_network_provider',
'provider_network', 'mark_connected', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info',
'description', 'tags',
'provider', 'provider_account', 'circuit', 'term_side', 'region', 'site_group', 'site',
'provider_network_provider', 'provider_network', 'mark_connected', 'port_speed', 'upstream_speed',
'xconnect_id', 'pp_info', 'description', 'tags',
]
help_texts = {
'port_speed': _("Physical circuit speed"),
Expand Down
51 changes: 51 additions & 0 deletions netbox/circuits/migrations/0042_provideraccount.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,22 @@ def revert_provideraccounts_from_providers(apps, schema_editor):
provideraccount.provider.save()


def migrate_circuits_to_provideraccount(apps, schema_editor):
Circuit = apps.get_model('circuits', 'Circuit')
circuits = Circuit.objects.all()
for circuit in circuits:
circuit.provider_account = circuit.provider.accounts.order_by('pk').first()
circuit.save()


def migrate_circuits_from_provideraccount(apps, schema_editor):
Circuit = apps.get_model('circuits', 'Circuit')
circuits = Circuit.objects.all().order_by('pk')
for circuit in circuits:
circuit.provider = circuit.provider_account.provider
circuit.save()


class Migration(migrations.Migration):

dependencies = [
Expand Down Expand Up @@ -75,4 +91,39 @@ class Migration(migrations.Migration):
model_name='provider',
name='account',
),
migrations.AddField(
model_name='circuit',
name='provider_account',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.provideraccount', null=True, blank=True),
preserve_default=False,
),
migrations.AlterField(
model_name='circuit',
name='provider',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, related_name='circuits', to='circuits.provider', null=True, blank=True),
),
migrations.RunPython(
migrate_circuits_to_provideraccount, migrate_circuits_from_provideraccount
),
migrations.AlterField(
model_name='circuit',
name='provider_account',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.provideraccount'),
),
migrations.RemoveConstraint(
model_name='circuit',
name='circuits_circuit_unique_provider_cid',
),
migrations.AlterModelOptions(
name='circuit',
options={'ordering': ['provider_account', 'cid']},
),
migrations.AddConstraint(
model_name='circuit',
constraint=models.UniqueConstraint(fields=('provider_account', 'cid'), name='circuits_circuit_unique_provider_cid'),
),
migrations.RemoveField(
model_name='circuit',
name='provider',
),
]
12 changes: 6 additions & 6 deletions netbox/circuits/models/circuits.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ class Circuit(PrimaryModel):
max_length=100,
verbose_name='Circuit ID'
)
provider = models.ForeignKey(
to='circuits.Provider',
provider_account = models.ForeignKey(
to='circuits.ProviderAccount',
on_delete=models.PROTECT,
related_name='circuits'
)
Expand Down Expand Up @@ -102,18 +102,18 @@ class Circuit(PrimaryModel):
)

clone_fields = (
'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate', 'description',
'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate', 'description',
)
prerequisite_models = (
'circuits.CircuitType',
'circuits.Provider',
'circuits.ProviderAccount',
)

class Meta:
ordering = ['provider', 'cid']
ordering = ['provider_account', 'cid']
constraints = (
models.UniqueConstraint(
fields=('provider', 'cid'),
fields=('provider_account', 'cid'),
name='%(app_label)s_%(class)s_unique_provider_cid'
),
)
Expand Down
1 change: 1 addition & 0 deletions netbox/circuits/models/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class Meta:
def __str__(self):
if self.name:
return f'{self.account} ({self.name})'
return f'{self.account}'

def get_absolute_url(self):
return reverse('circuits:provideraccount', args=[self.pk])
Expand Down
8 changes: 7 additions & 1 deletion netbox/circuits/tables/circuits.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import django_tables2 as tables
from django_tables2.utils import Accessor

from circuits.models import *
from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin

Expand Down Expand Up @@ -48,6 +50,10 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
verbose_name='Circuit ID'
)
provider = tables.Column(
accessor=Accessor('provider_account__provider'),
linkify=True
)
provider_account = tables.Column(
linkify=True
)
status = columns.ChoiceFieldColumn()
Expand All @@ -68,7 +74,7 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
class Meta(NetBoxTable.Meta):
model = Circuit
fields = (
'pk', 'id', 'cid', 'provider', 'type', 'status', 'tenant', 'tenant_group', 'termination_a', 'termination_z',
'pk', 'id', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'tenant_group', 'termination_a', 'termination_z',
'install_date', 'termination_date', 'commit_rate', 'description', 'comments', 'contacts', 'tags', 'created',
'last_updated',
)
Expand Down
8 changes: 4 additions & 4 deletions netbox/circuits/tables/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ class Meta(NetBoxTable.Meta):


class ProviderAccountTable(ContactsColumnMixin, NetBoxTable):
name = tables.Column(
account = tables.Column(
linkify=True
)
account = tables.Column()
name = tables.Column()
provider = tables.Column(
linkify=True
)
Expand All @@ -72,9 +72,9 @@ class ProviderAccountTable(ContactsColumnMixin, NetBoxTable):
class Meta(NetBoxTable.Meta):
model = ProviderAccount
fields = (
'pk', 'id', 'account', 'name', 'provider', 'comments', 'contacts', 'tags', 'created', 'last_updated',
'pk', 'id', 'account', 'name', 'provider', 'circuit_count', 'comments', 'contacts', 'tags', 'created', 'last_updated',
)
default_columns = ('pk', 'account', 'name', 'provider')
default_columns = ('pk', 'account', 'name', 'provider', 'circuit_count')


class ProviderNetworkTable(NetBoxTable):
Expand Down
Loading

0 comments on commit 1a6bd72

Please sign in to comment.