From f193dd428160fba58571bbf2f0793a411bf1b825 Mon Sep 17 00:00:00 2001 From: George Cox Date: Sat, 25 Jun 2022 21:48:10 +0100 Subject: [PATCH] add "Location" to CircuitTermination model and form --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- netbox/circuits/forms/models.py | 12 ++++++++++-- netbox/circuits/models/circuits.py | 12 ++++++++++-- .../templates/circuits/circuittermination_edit.html | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a026878bb..582d4a037 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,7 +9,7 @@ IF YOUR PULL REQUEST DOES NOT REFERENCE AN ACCEPTED BUG REPORT OR FEATURE REQUEST, IT WILL BE MARKED AS INVALID AND CLOSED. --> -### Fixes: +### Fixes: 9604 diff --git a/netbox/circuits/forms/models.py b/netbox/circuits/forms/models.py index 8fd5fb92d..10445ba70 100644 --- a/netbox/circuits/forms/models.py +++ b/netbox/circuits/forms/models.py @@ -2,7 +2,7 @@ from django import forms from django.utils.translation import gettext as _ from circuits.models import * -from dcim.models import Region, Site, SiteGroup +from dcim.models import Location, Region, Site, SiteGroup from ipam.models import ASN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm @@ -150,6 +150,14 @@ class CircuitTerminationForm(BootstrapMixin, forms.ModelForm): }, required=False ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + query_params={ + 'region_id': '$region', + 'site_id': '$site', + }, + required=False + ) provider_network = DynamicModelChoiceField( queryset=ProviderNetwork.objects.all(), required=False @@ -158,7 +166,7 @@ class CircuitTerminationForm(BootstrapMixin, forms.ModelForm): class Meta: model = CircuitTermination fields = [ - 'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', + 'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'location', 'provider_network', 'mark_connected', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', ] help_texts = { diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 02ba5209d..90638003b 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -154,6 +154,13 @@ class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination): blank=True, null=True ) + location = models.ForeignKey( + to='dcim.Location', + on_delete=models.PROTECT, + related_name='circuit_terminations', + blank=True, + null=True + ) provider_network = models.ForeignKey( to='circuits.ProviderNetwork', on_delete=models.PROTECT, @@ -204,9 +211,10 @@ class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination): # Must define either site *or* provider network if self.site is None and self.provider_network is None: - raise ValidationError("A circuit termination must attach to either a site or a provider network.") + raise ValidationError("A circuit termination must attach to either a site [+optionally a location] or a provider network.") + if self.site and self.provider_network: - raise ValidationError("A circuit termination cannot attach to both a site and a provider network.") + raise ValidationError("A circuit termination cannot attach to both a site [+optionally a location] and a provider network.") def to_objectchange(self, action): objectchange = super().to_objectchange(action) diff --git a/netbox/templates/circuits/circuittermination_edit.html b/netbox/templates/circuits/circuittermination_edit.html index f8393f945..d2c9c7bb6 100644 --- a/netbox/templates/circuits/circuittermination_edit.html +++ b/netbox/templates/circuits/circuittermination_edit.html @@ -29,6 +29,7 @@ {% render_field form.region %} {% render_field form.site_group %} {% render_field form.site %} + {% render_field form.location %}
{% render_field form.provider_network %}