Fixes #2626: Remove extraneous permissions generated from proxy models

This commit is contained in:
Jeremy Stretch 2018-12-05 16:53:58 -05:00
parent 2a07e8f3f0
commit 870edbb44a
5 changed files with 64 additions and 109 deletions

View File

@ -47,6 +47,7 @@ NetBox now supports modeling physical cables for console, power, and interface c
* [#2616](https://github.com/digitalocean/netbox/issues/2616) - Convert Rack `outer_unit` and Cable `length_unit` to integer-based choice fields * [#2616](https://github.com/digitalocean/netbox/issues/2616) - Convert Rack `outer_unit` and Cable `length_unit` to integer-based choice fields
* [#2632](https://github.com/digitalocean/netbox/issues/2632) - Change representation of null values from `0` to `null` * [#2632](https://github.com/digitalocean/netbox/issues/2632) - Change representation of null values from `0` to `null`
* [#2639](https://github.com/digitalocean/netbox/issues/2639) - Fix preservation of length/dimensions unit for racks and cables * [#2639](https://github.com/digitalocean/netbox/issues/2639) - Fix preservation of length/dimensions unit for racks and cables
* [#2626](https://github.com/digitalocean/netbox/issues/2626) - Remove extraneous permissions generated from proxy models
## API Changes ## API Changes

View File

@ -313,36 +313,4 @@ class Migration(migrations.Migration):
migrations.DeleteModel( migrations.DeleteModel(
name='InterfaceConnection', name='InterfaceConnection',
), ),
# Proxy models
migrations.CreateModel(
name='ConsoleConnection',
fields=[
],
options={
'proxy': True,
'indexes': [],
},
bases=('dcim.consoleport',),
),
migrations.CreateModel(
name='InterfaceConnection',
fields=[
],
options={
'proxy': True,
'indexes': [],
},
bases=('dcim.interface',),
),
migrations.CreateModel(
name='PowerConnection',
fields=[
],
options={
'proxy': True,
'indexes': [],
},
bases=('dcim.powerport',),
),
] ]

View File

@ -2631,64 +2631,3 @@ class Cable(ChangeLoggedModel):
# (A path end, B path end, connected/planned) # (A path end, B path end, connected/planned)
return a_path[-1][2], b_path[-1][2], path_status return a_path[-1][2], b_path[-1][2], path_status
#
# Connection proxy models
#
class ConsoleConnection(ConsolePort):
csv_headers = [
'console_server', 'port', 'device', 'console_port', 'connection_status',
]
class Meta:
proxy = True
def to_csv(self):
return (
self.connected_endpoint.device.identifier if self.connected_endpoint else None,
self.connected_endpoint.name if self.connected_endpoint else None,
self.device.identifier,
self.name,
self.get_connection_status_display(),
)
class PowerConnection(PowerPort):
csv_headers = [
'pdu', 'outlet', 'device', 'power_port', 'connection_status',
]
class Meta:
proxy = True
def to_csv(self):
return (
self.connected_endpoint.device.identifier if self.connected_endpoint else None,
self.connected_endpoint.name if self.connected_endpoint else None,
self.device.identifier,
self.name,
self.get_connection_status_display(),
)
class InterfaceConnection(Interface):
csv_headers = [
'device_a', 'interface_a', 'device_b', 'interface_b', 'connection_status',
]
class Meta:
proxy = True
def to_csv(self):
return (
self.connected_endpoint.device.identifier if self.connected_endpoint else None,
self.connected_endpoint.name if self.connected_endpoint else None,
self.device.identifier,
self.name,
self.get_connection_status_display(),
)

View File

@ -4,11 +4,10 @@ from django_tables2.utils import Accessor
from tenancy.tables import COL_TENANT from tenancy.tables import COL_TENANT
from utilities.tables import BaseTable, BooleanColumn, ColorColumn, ToggleColumn from utilities.tables import BaseTable, BooleanColumn, ColorColumn, ToggleColumn
from .models import ( from .models import (
Cable, ConsoleConnection, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceConnection, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
InterfaceTemplate, InventoryItem, Manufacturer, Platform, PowerConnection, PowerOutlet, PowerOutletTemplate, InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
VirtualChassis,
) )
REGION_LINK = """ REGION_LINK = """
@ -683,7 +682,7 @@ class ConsoleConnectionTable(BaseTable):
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ConsoleConnection model = ConsolePort
fields = ('console_server', 'connected_endpoint', 'device', 'name', 'connection_status') fields = ('console_server', 'connected_endpoint', 'device', 'name', 'connection_status')
@ -706,7 +705,7 @@ class PowerConnectionTable(BaseTable):
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = PowerConnection model = PowerPort
fields = ('pdu', 'connected_endpoint', 'device', 'name', 'connection_status') fields = ('pdu', 'connected_endpoint', 'device', 'name', 'connection_status')
@ -745,7 +744,7 @@ class InterfaceConnectionTable(BaseTable):
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = InterfaceConnection model = Interface
fields = ( fields = (
'device_a', 'interface_a', 'description_a', 'device_b', 'interface_b', 'description_b', 'connection_status', 'device_a', 'interface_a', 'description_a', 'device_b', 'interface_b', 'description_b', 'connection_status',
) )

View File

@ -17,6 +17,7 @@ from ipam.models import Prefix, VLAN
from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.paginator import EnhancedPaginator from utilities.paginator import EnhancedPaginator
from utilities.utils import csv_format
from utilities.views import ( from utilities.views import (
BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, GetReturnURLMixin, BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, GetReturnURLMixin,
ObjectDeleteView, ObjectEditView, ObjectListView, ObjectDeleteView, ObjectEditView, ObjectListView,
@ -24,11 +25,10 @@ from utilities.views import (
from virtualization.models import VirtualMachine from virtualization.models import VirtualMachine
from . import filters, forms, tables from . import filters, forms, tables
from .models import ( from .models import (
Cable, ConsoleConnection, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceConnection, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
InterfaceTemplate, InventoryItem, Manufacturer, Platform, PowerConnection, PowerOutlet, PowerOutletTemplate, InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
VirtualChassis,
) )
@ -1688,7 +1688,7 @@ class CableBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# #
class ConsoleConnectionsListView(ObjectListView): class ConsoleConnectionsListView(ObjectListView):
queryset = ConsoleConnection.objects.select_related( queryset = ConsolePort.objects.select_related(
'device', 'connected_endpoint__device' 'device', 'connected_endpoint__device'
).filter( ).filter(
connected_endpoint__isnull=False connected_endpoint__isnull=False
@ -1700,9 +1700,25 @@ class ConsoleConnectionsListView(ObjectListView):
table = tables.ConsoleConnectionTable table = tables.ConsoleConnectionTable
template_name = 'dcim/console_connections_list.html' template_name = 'dcim/console_connections_list.html'
def queryset_to_csv(self):
csv_data = [
# Headers
','.join(['console_server', 'port', 'device', 'console_port', 'connection_status'])
]
for obj in self.queryset:
csv = csv_format([
obj.connected_endpoint.device.identifier if obj.connected_endpoint else None,
obj.connected_endpoint.name if obj.connected_endpoint else None,
obj.device.identifier,
obj.name,
obj.get_connection_status_display(),
])
csv_data.append(csv)
return csv_data
class PowerConnectionsListView(ObjectListView): class PowerConnectionsListView(ObjectListView):
queryset = PowerConnection.objects.select_related( queryset = PowerPort.objects.select_related(
'device', 'connected_endpoint__device' 'device', 'connected_endpoint__device'
).filter( ).filter(
connected_endpoint__isnull=False connected_endpoint__isnull=False
@ -1714,9 +1730,25 @@ class PowerConnectionsListView(ObjectListView):
table = tables.PowerConnectionTable table = tables.PowerConnectionTable
template_name = 'dcim/power_connections_list.html' template_name = 'dcim/power_connections_list.html'
def queryset_to_csv(self):
csv_data = [
# Headers
','.join(['pdu', 'outlet', 'device', 'power_port', 'connection_status'])
]
for obj in self.queryset:
csv = csv_format([
obj.connected_endpoint.device.identifier if obj.connected_endpoint else None,
obj.connected_endpoint.name if obj.connected_endpoint else None,
obj.device.identifier,
obj.name,
obj.get_connection_status_display(),
])
csv_data.append(csv)
return csv_data
class InterfaceConnectionsListView(ObjectListView): class InterfaceConnectionsListView(ObjectListView):
queryset = InterfaceConnection.objects.select_related( queryset = Interface.objects.select_related(
'device', 'cable', '_connected_interface__device' 'device', 'cable', '_connected_interface__device'
).filter( ).filter(
# Avoid duplicate connections by only selecting the lower PK in a connected pair # Avoid duplicate connections by only selecting the lower PK in a connected pair
@ -1730,6 +1762,22 @@ class InterfaceConnectionsListView(ObjectListView):
table = tables.InterfaceConnectionTable table = tables.InterfaceConnectionTable
template_name = 'dcim/interface_connections_list.html' template_name = 'dcim/interface_connections_list.html'
def queryset_to_csv(self):
csv_data = [
# Headers
','.join(['device_a', 'interface_a', 'device_b', 'interface_b', 'connection_status'])
]
for obj in self.queryset:
csv = csv_format([
obj.connected_endpoint.device.identifier if obj.connected_endpoint else None,
obj.connected_endpoint.name if obj.connected_endpoint else None,
obj.device.identifier,
obj.name,
obj.get_connection_status_display(),
])
csv_data.append(csv)
return csv_data
# #
# Inventory items # Inventory items