Misc cleanup

This commit is contained in:
Jeremy Stretch 2024-10-30 17:08:11 -04:00
parent 9dace08ed1
commit 3d45fabcfc
6 changed files with 58 additions and 35 deletions

View File

@ -26,26 +26,26 @@ __all__ = (
class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='circuits__terminations___site__region', field_name='circuits__terminations___region',
lookup_expr='in', lookup_expr='in',
label=_('Region (ID)'), label=_('Region (ID)'),
) )
region = TreeNodeMultipleChoiceFilter( region = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='circuits__terminations___site__region', field_name='circuits__terminations___region',
lookup_expr='in', lookup_expr='in',
to_field_name='slug', to_field_name='slug',
label=_('Region (slug)'), label=_('Region (slug)'),
) )
site_group_id = TreeNodeMultipleChoiceFilter( site_group_id = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(), queryset=SiteGroup.objects.all(),
field_name='circuits__terminations___site__group', field_name='circuits__terminations___site_group',
lookup_expr='in', lookup_expr='in',
label=_('Site group (ID)'), label=_('Site group (ID)'),
) )
site_group = TreeNodeMultipleChoiceFilter( site_group = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(), queryset=SiteGroup.objects.all(),
field_name='circuits__terminations___site__group', field_name='circuits__terminations___site_group',
lookup_expr='in', lookup_expr='in',
to_field_name='slug', to_field_name='slug',
label=_('Site group (slug)'), label=_('Site group (slug)'),
@ -193,26 +193,26 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte
) )
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='terminations___site__region', field_name='terminations___region',
lookup_expr='in', lookup_expr='in',
label=_('Region (ID)'), label=_('Region (ID)'),
) )
region = TreeNodeMultipleChoiceFilter( region = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='terminations___site__region', field_name='terminations___region',
lookup_expr='in', lookup_expr='in',
to_field_name='slug', to_field_name='slug',
label=_('Region (slug)'), label=_('Region (slug)'),
) )
site_group_id = TreeNodeMultipleChoiceFilter( site_group_id = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(), queryset=SiteGroup.objects.all(),
field_name='terminations___site__group', field_name='terminations___site_group',
lookup_expr='in', lookup_expr='in',
label=_('Site group (ID)'), label=_('Site group (ID)'),
) )
site_group = TreeNodeMultipleChoiceFilter( site_group = TreeNodeMultipleChoiceFilter(
queryset=SiteGroup.objects.all(), queryset=SiteGroup.objects.all(),
field_name='terminations___site__group', field_name='terminations___site_group',
lookup_expr='in', lookup_expr='in',
to_field_name='slug', to_field_name='slug',
label=_('Site group (slug)'), label=_('Site group (slug)'),

View File

@ -143,7 +143,7 @@ class CircuitTerminationImportRelatedForm(BaseCircuitTerminationImportForm):
'pp_info', 'description' 'pp_info', 'description'
] ]
labels = { labels = {
'termination_id': 'Termination ID', 'termination_id': _('Termination ID'),
} }
@ -156,7 +156,7 @@ class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTermination
'pp_info', 'description', 'tags' 'pp_info', 'description', 'tags'
] ]
labels = { labels = {
'termination_id': 'Termination ID', 'termination_id': _('Termination ID'),
} }

View File

@ -1,5 +1,4 @@
import datetime import datetime
import json
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.test import override_settings from django.test import override_settings
@ -192,36 +191,31 @@ class CircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase):
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
def test_bulk_import_objects_with_terminations(self): def test_bulk_import_objects_with_terminations(self):
json_data = """ site = Site.objects.first()
json_data = f"""
[ [
{ {{
"cid": "Circuit 7", "cid": "Circuit 7",
"provider": "Provider 1", "provider": "Provider 1",
"type": "Circuit Type 1", "type": "Circuit Type 1",
"status": "active", "status": "active",
"description": "Testing Import", "description": "Testing Import",
"terminations": [ "terminations": [
{ {{
"term_side": "A", "term_side": "A",
"termination_type": "dcim.site", "termination_type": "dcim.site",
"termination_id": "1" "termination_id": "{site.pk}"
}, }},
{ {{
"term_side": "Z", "term_side": "Z",
"termination_type": "dcim.site", "termination_type": "dcim.site",
"termination_id": "1" "termination_id": "{site.pk}"
} }}
] ]
} }}
] ]
""" """
# Fix up the termination site id
site = Site.objects.first()
data = json.loads(json_data)
data[0]["terminations"][0]["termination_id"] = data[0]["terminations"][1]["termination_id"] = site.id
json_data = json.dumps(data)
initial_count = self._get_queryset().count() initial_count = self._get_queryset().count()
data = { data = {
'data': json_data, 'data': json_data,

View File

@ -257,8 +257,7 @@ class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
class CircuitListView(generic.ObjectListView): class CircuitListView(generic.ObjectListView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'tenant__group', 'termination_a___site', 'termination_z___site', 'tenant__group', 'termination_a__termination', 'termination_z__termination',
'termination_a___provider_network', 'termination_z___provider_network',
) )
filterset = filtersets.CircuitFilterSet filterset = filtersets.CircuitFilterSet
filterset_form = forms.CircuitFilterForm filterset_form = forms.CircuitFilterForm
@ -298,8 +297,7 @@ class CircuitBulkImportView(generic.BulkImportView):
class CircuitBulkEditView(generic.BulkEditView): class CircuitBulkEditView(generic.BulkEditView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'termination_a___site', 'termination_z___site', 'tenant__group', 'termination_a__termination', 'termination_z__termination',
'termination_a___provider_network', 'termination_z___provider_network',
) )
filterset = filtersets.CircuitFilterSet filterset = filtersets.CircuitFilterSet
table = tables.CircuitTable table = tables.CircuitTable
@ -308,8 +306,7 @@ class CircuitBulkEditView(generic.BulkEditView):
class CircuitBulkDeleteView(generic.BulkDeleteView): class CircuitBulkDeleteView(generic.BulkDeleteView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'termination_a___site', 'termination_z___site', 'tenant__group', 'termination_a__termination', 'termination_z__termination',
'termination_a___provider_network', 'termination_z___provider_network',
) )
filterset = filtersets.CircuitFilterSet filterset = filtersets.CircuitFilterSet
table = tables.CircuitTable table = tables.CircuitTable

View File

@ -461,6 +461,10 @@ class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, Organi
devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]
children: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]] children: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]]
@strawberry_django.field
def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]:
return self.circuit_terminations.all()
@strawberry_django.type( @strawberry_django.type(
models.Manufacturer, models.Manufacturer,
@ -704,6 +708,10 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
def parent(self) -> Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None: def parent(self) -> Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None:
return self.parent return self.parent
@strawberry_django.field
def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]:
return self.circuit_terminations.all()
@strawberry_django.type( @strawberry_django.type(
models.Site, models.Site,
@ -748,6 +756,10 @@ class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
def parent(self) -> Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None: def parent(self) -> Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None:
return self.parent return self.parent
@strawberry_django.field
def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]:
return self.circuit_terminations.all()
@strawberry_django.type( @strawberry_django.type(
models.VirtualChassis, models.VirtualChassis,

View File

@ -242,6 +242,10 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView):
extra=( extra=(
(Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
(Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
(
Circuit.objects.restrict(request.user, 'view').filter(terminations___region=instance).distinct(),
'region_id'
),
), ),
), ),
} }
@ -324,6 +328,10 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView):
extra=( extra=(
(Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
(Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
(
Circuit.objects.restrict(request.user, 'view').filter(terminations___site_group=instance).distinct(),
'site_group_id'
),
), ),
), ),
} }
@ -404,8 +412,10 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView):
scope_id=instance.pk scope_id=instance.pk
), 'site'), ), 'site'),
(ASN.objects.restrict(request.user, 'view').filter(sites=instance), 'site_id'), (ASN.objects.restrict(request.user, 'view').filter(sites=instance), 'site_id'),
(Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(), (
'site_id'), Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(),
'site_id'
),
), ),
), ),
} }
@ -475,7 +485,17 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView):
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
locations = instance.get_descendants(include_self=True) locations = instance.get_descendants(include_self=True)
return { return {
'related_models': self.get_related_models(request, locations, [CableTermination]), 'related_models': self.get_related_models(
request,
locations,
[CableTermination],
(
(
Circuit.objects.restrict(request.user, 'view').filter(terminations___location=instance).distinct(),
'location_id'
),
),
),
} }