From 4eeae08fb542a7bcea15aa360dccda3287127a99 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 13 May 2016 15:22:31 -0400 Subject: [PATCH] Added CBVs for Manufacturers --- netbox/dcim/forms.py | 15 +++++ netbox/dcim/models.py | 3 + netbox/dcim/tables.py | 26 +++++++- netbox/dcim/urls.py | 6 ++ netbox/dcim/views.py | 66 ++++++++++++++----- netbox/templates/_base.html | 7 +- .../dcim/inc/manufacturer_table.html | 14 ++++ netbox/templates/dcim/manufacturer_list.html | 21 ++++++ 8 files changed, 139 insertions(+), 19 deletions(-) create mode 100644 netbox/templates/dcim/inc/manufacturer_table.html create mode 100644 netbox/templates/dcim/manufacturer_list.html diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 18d7d636a..e87816ffe 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -185,6 +185,21 @@ class RackFilterForm(forms.Form, BootstrapMixin): widget=forms.SelectMultiple(attrs={'size': 8})) +# +# Manufacturers +# + +class ManufacturerForm(forms.ModelForm, BootstrapMixin): + + class Meta: + model = Manufacturer + fields = ['name', 'slug'] + + +class ManufacturerBulkDeleteForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField(queryset=Manufacturer.objects.all(), widget=forms.MultipleHiddenInput) + + # # Device types # diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index e5b247425..0ea725bed 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -265,6 +265,9 @@ class Manufacturer(models.Model): def __unicode__(self): return self.name + def get_absolute_url(self): + return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug) + class DeviceType(models.Model): """ diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 8dc93ba4c..4de884c13 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from .models import Site, RackGroup, Rack, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate, \ +from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\ PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Device, ConsolePort, PowerPort DEVICE_LINK = """ @@ -16,6 +16,10 @@ DEVICEROLE_EDIT_LINK = """ {% if perms.dcim.change_devicerole %}Edit{% endif %} """ +MANUFACTURER_EDIT_LINK = """ +{% if perms.dcim.change_manufacturer %}Edit{% endif %} +""" + STATUS_ICON = """ """ @@ -87,6 +91,26 @@ class RackTable(tables.Table): } +# +# Manufacturers +# + +class ManufacturerTable(tables.Table): + pk = tables.CheckBoxColumn(visible=False, default='') + name = tables.LinkColumn(verbose_name='Name') + devicetype_count = tables.Column(verbose_name='Device Types') + slug = tables.Column(verbose_name='Slug') + edit = tables.TemplateColumn(template_code=MANUFACTURER_EDIT_LINK, verbose_name='') + + class Meta: + model = Manufacturer + fields = ('pk', 'name', 'devicetype_count', 'slug', 'edit') + empty_text = "No device types were found." + attrs = { + 'class': 'table table-hover', + } + + # # Device types # diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index fb657e169..34fff7d4e 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -33,6 +33,12 @@ urlpatterns = [ url(r'^racks/(?P\d+)/edit/$', views.RackEditView.as_view(), name='rack_edit'), url(r'^racks/(?P\d+)/delete/$', views.RackDeleteView.as_view(), name='rack_delete'), + # Manufacturers + url(r'^manufacturers/$', views.ManufacturerListView.as_view(), name='manufacturer_list'), + url(r'^manufacturers/add/$', views.ManufacturerAddView.as_view(), name='manufacturer_add'), + url(r'^manufacturers/delete/$', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'), + url(r'^manufacturers/(?P[\w-]+)/edit/$', views.ManufacturerEditView.as_view(), name='manufacturer_edit'), + # Device types url(r'^device-types/$', views.DeviceTypeListView.as_view(), name='devicetype_list'), url(r'^device-types/add/$', views.DeviceTypeAddView.as_view(), name='devicetype_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 13bbe34b5..34950f4ce 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -20,25 +20,25 @@ from utilities.forms import ConfirmationForm from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView, ObjectAddView,\ ObjectEditView, ObjectDeleteView -from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, ConsoleConnectionFilter, \ +from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, ConsoleConnectionFilter,\ PowerConnectionFilter, InterfaceConnectionFilter -from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm, RackGroupBulkDeleteForm, RackForm, \ - RackImportForm, RackBulkEditForm, RackBulkDeleteForm, RackFilterForm, 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, \ +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, DeviceType, DeviceRole, ConsolePortTemplate, ConsoleServerPortTemplate, \ - PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, Device, ConsolePort, ConsoleServerPort, PowerPort, \ - PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED -from .tables import SiteTable, RackGroupTable, RackTable, DeviceTypeTable, DeviceRoleTable, DeviceTable, \ - DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable, \ - ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable, \ +from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, DeviceRole, ConsolePortTemplate,\ + ConsoleServerPortTemplate, PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, 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 @@ -245,6 +245,38 @@ class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): default_redirect_url = 'dcim:rack_list' +# +# Manufacturers +# + +class ManufacturerListView(ObjectListView): + queryset = Manufacturer.objects.annotate(devicetype_count=Count('device_types')) + table = ManufacturerTable + edit_permissions = ['dcim.change_manufacturer', 'dcim.delete_manufacturer'] + template_name = 'dcim/manufacturer_list.html' + + +class ManufacturerAddView(PermissionRequiredMixin, ObjectAddView): + permission_required = 'dcim.add_manufacturer' + model = Manufacturer + form_class = ManufacturerForm + cancel_url = 'dcim:manufacturer_list' + + +class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView): + permission_required = 'dcim.change_manufacturer' + model = Manufacturer + form_class = ManufacturerForm + return_url = 'dcim:manufacturer_list' + + +class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_manufacturer' + cls = Manufacturer + form = ManufacturerBulkDeleteForm + default_redirect_url = 'dcim:manufacturer_list' + + # # Device types # diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 62837727a..1163d8edd 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -44,7 +44,7 @@ {% endif %} -