From a07aa69321d45a3c62e12d7d88e4b587166fc4b3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 16 May 2016 11:54:17 -0400 Subject: [PATCH] Added CBVs for Platforms --- netbox/dcim/forms.py | 15 ++++++ netbox/dcim/models.py | 3 ++ netbox/dcim/tables.py | 26 ++++++++- netbox/dcim/urls.py | 6 +++ netbox/dcim/views.py | 54 ++++++++++++++----- netbox/templates/_base.html | 5 ++ netbox/templates/dcim/inc/platform_table.html | 14 +++++ netbox/templates/dcim/platform_list.html | 21 ++++++++ 8 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 netbox/templates/dcim/inc/platform_table.html create mode 100644 netbox/templates/dcim/platform_list.html diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index e87816ffe..c4651ed58 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -291,6 +291,21 @@ class DeviceRoleBulkDeleteForm(ConfirmationForm): pk = forms.ModelMultipleChoiceField(queryset=DeviceRole.objects.all(), widget=forms.MultipleHiddenInput) +# +# Platforms +# + +class PlatformForm(forms.ModelForm, BootstrapMixin): + + class Meta: + model = Platform + fields = ['name', 'slug'] + + +class PlatformBulkDeleteForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField(queryset=Platform.objects.all(), widget=forms.MultipleHiddenInput) + + # # Devices # diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 0ea725bed..ac1bb17a1 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -413,6 +413,9 @@ class Platform(models.Model): def __unicode__(self): return self.name + def get_absolute_url(self): + return "{}?platform={}".format(reverse('dcim:device_list'), self.slug) + class Device(models.Model): """ diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 4de884c13..940461207 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\ - PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Device, ConsolePort, PowerPort + PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Platform, Device, ConsolePort, PowerPort DEVICE_LINK = """ {{ record.name|default:'Unnamed device' }} @@ -20,6 +20,10 @@ MANUFACTURER_EDIT_LINK = """ {% if perms.dcim.change_manufacturer %}Edit{% endif %} """ +PLATFORM_EDIT_LINK = """ +{% if perms.dcim.change_platform %}Edit{% endif %} +""" + STATUS_ICON = """ """ @@ -218,6 +222,26 @@ class DeviceRoleTable(tables.Table): } +# +# Platforms +# + +class PlatformTable(tables.Table): + pk = tables.CheckBoxColumn(visible=False, default='') + name = tables.LinkColumn(verbose_name='Name') + device_count = tables.Column(verbose_name='Devices') + slug = tables.Column(verbose_name='Slug') + edit = tables.TemplateColumn(template_code=PLATFORM_EDIT_LINK, verbose_name='') + + class Meta: + model = Platform + fields = ('pk', 'name', 'device_count', 'slug', 'edit') + empty_text = "No platforms were found." + attrs = { + 'class': 'table table-hover', + } + + # # Devices # diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index c65cc832c..e81d02354 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -76,6 +76,12 @@ urlpatterns = [ url(r'^device-roles/delete/$', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'), url(r'^device-roles/(?P[\w-]+)/edit/$', views.DeviceRoleEditView.as_view(), name='devicerole_edit'), + # Platforms + url(r'^platforms/$', views.PlatformListView.as_view(), name='platform_list'), + url(r'^platforms/add/$', views.PlatformEditView.as_view(), name='platform_add'), + url(r'^platforms/delete/$', views.PlatformBulkDeleteView.as_view(), name='platform_bulk_delete'), + url(r'^platforms/(?P[\w-]+)/edit/$', views.PlatformEditView.as_view(), name='platform_edit'), + # Devices url(r'^devices/$', views.DeviceListView.as_view(), name='device_list'), url(r'^devices/add/$', views.DeviceEditView.as_view(), name='device_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 56c0d503d..3405a16ad 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -25,21 +25,22 @@ from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm, RackGroupBulkDeleteForm, RackForm,\ RackImportForm, RackBulkEditForm, RackBulkDeleteForm, RackFilterForm, ManufacturerForm, ManufacturerBulkDeleteForm,\ DeviceTypeForm, DeviceTypeBulkEditForm, DeviceTypeBulkDeleteForm, DeviceTypeFilterForm, DeviceRoleForm,\ - DeviceRoleBulkDeleteForm, DeviceForm, DeviceImportForm, DeviceBulkEditForm, DeviceBulkDeleteForm, DeviceFilterForm,\ - ConsolePortForm, ConsolePortCreateForm, ConsolePortConnectionForm, ConsoleConnectionImportForm,\ - ConsoleServerPortForm, ConsoleServerPortCreateForm, ConsoleServerPortConnectionForm, PowerPortForm,\ - PowerPortCreateForm, PowerPortConnectionForm, PowerConnectionImportForm, PowerOutletForm, PowerOutletCreateForm,\ - PowerOutletConnectionForm, InterfaceForm, InterfaceCreateForm, InterfaceBulkCreateForm, InterfaceConnectionForm,\ - InterfaceConnectionDeletionForm, InterfaceConnectionImportForm, ConsoleConnectionFilterForm,\ - PowerConnectionFilterForm, InterfaceConnectionFilterForm, IPAddressForm, ConsolePortTemplateForm,\ - ConsoleServerPortTemplateForm, PowerPortTemplateForm, PowerOutletTemplateForm, InterfaceTemplateForm -from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, DeviceRole, ConsolePortTemplate,\ - ConsoleServerPortTemplate, PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, Device, ConsolePort,\ + DeviceRoleBulkDeleteForm, PlatformForm, PlatformBulkDeleteForm, DeviceForm, DeviceImportForm, DeviceBulkEditForm,\ + DeviceBulkDeleteForm, DeviceFilterForm, ConsolePortForm, ConsolePortCreateForm, ConsolePortConnectionForm,\ + ConsoleConnectionImportForm, ConsoleServerPortForm, ConsoleServerPortCreateForm, ConsoleServerPortConnectionForm,\ + PowerPortForm, PowerPortCreateForm, PowerPortConnectionForm, PowerConnectionImportForm, PowerOutletForm,\ + PowerOutletCreateForm, PowerOutletConnectionForm, InterfaceForm, InterfaceCreateForm, InterfaceBulkCreateForm,\ + InterfaceConnectionForm, InterfaceConnectionDeletionForm, InterfaceConnectionImportForm,\ + ConsoleConnectionFilterForm, PowerConnectionFilterForm, InterfaceConnectionFilterForm, IPAddressForm,\ + ConsolePortTemplateForm, ConsoleServerPortTemplateForm, PowerPortTemplateForm, PowerOutletTemplateForm,\ + InterfaceTemplateForm +from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\ + PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Platform, Device, ConsolePort,\ ConsoleServerPort, PowerPort, PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED from .tables import SiteTable, RackGroupTable, RackTable, ManufacturerTable, DeviceTypeTable, DeviceRoleTable,\ - DeviceTable, DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable,\ - ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable,\ - InterfaceTemplateTable + PlatformTable, DeviceTable, DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable,\ + InterfaceConnectionTable, ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable,\ + PowerOutletTemplateTable, InterfaceTemplateTable EXPANSION_PATTERN = '\[(\d+-\d+)\]' @@ -239,6 +240,7 @@ class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_manufacturer' model = Manufacturer form_class = ManufacturerForm + success_url = 'dcim:manufacturer_list' cancel_url = 'dcim:manufacturer_list' @@ -470,6 +472,32 @@ class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): default_redirect_url = 'dcim:devicerole_list' +# +# Platforms +# + +class PlatformListView(ObjectListView): + queryset = Platform.objects.annotate(device_count=Count('devices')) + table = PlatformTable + edit_permissions = ['dcim.change_platform', 'dcim.delete_platform'] + template_name = 'dcim/platform_list.html' + + +class PlatformEditView(PermissionRequiredMixin, ObjectEditView): + permission_required = 'dcim.change_platform' + model = Platform + form_class = PlatformForm + success_url = 'dcim:platform_list' + cancel_url = 'dcim:platform_list' + + +class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_platform' + cls = Platform + form = PlatformBulkDeleteForm + default_redirect_url = 'dcim:platform_list' + + # # Devices # diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index d1e39dfec..5a3f9e2a1 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -71,6 +71,11 @@ {% if perms.dcim.add_manufacturer %}
  • Add a Manufacturer
  • {% endif %} +
  • +
  • Platforms
  • + {% if perms.dcim.add_platform %} +
  • Add a Platform
  • + {% endif %}