Browse Source

Added CBVs for Manufacturers

Jeremy Stretch 9 years ago
parent
commit
4eeae08fb5

+ 15 - 0
netbox/dcim/forms.py

@@ -186,6 +186,21 @@ class RackFilterForm(forms.Form, BootstrapMixin):
 
 
 
 
 #
 #
+# 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
 # Device types
 #
 #
 
 

+ 3 - 0
netbox/dcim/models.py

@@ -265,6 +265,9 @@ class Manufacturer(models.Model):
     def __unicode__(self):
     def __unicode__(self):
         return self.name
         return self.name
 
 
+    def get_absolute_url(self):
+        return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug)
+
 
 
 class DeviceType(models.Model):
 class DeviceType(models.Model):
     """
     """

+ 25 - 1
netbox/dcim/tables.py

@@ -1,7 +1,7 @@
 import django_tables2 as tables
 import django_tables2 as tables
 from django_tables2.utils import Accessor
 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
     PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Device, ConsolePort, PowerPort
 
 
 DEVICE_LINK = """
 DEVICE_LINK = """
@@ -16,6 +16,10 @@ DEVICEROLE_EDIT_LINK = """
 {% if perms.dcim.change_devicerole %}<a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>{% endif %}
 {% if perms.dcim.change_devicerole %}<a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>{% endif %}
 """
 """
 
 
+MANUFACTURER_EDIT_LINK = """
+{% if perms.dcim.change_manufacturer %}<a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>{% endif %}
+"""
+
 STATUS_ICON = """
 STATUS_ICON = """
 <span class="glyphicon glyphicon-{% if record.status %}ok-sign text-success" title="Active{% else %}minus-sign text-danger" title="Offline{% endif %}" aria-hidden="true"></span>
 <span class="glyphicon glyphicon-{% if record.status %}ok-sign text-success" title="Active{% else %}minus-sign text-danger" title="Offline{% endif %}" aria-hidden="true"></span>
 """
 """
@@ -88,6 +92,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
 # Device types
 #
 #
 
 

+ 6 - 0
netbox/dcim/urls.py

@@ -33,6 +33,12 @@ urlpatterns = [
     url(r'^racks/(?P<pk>\d+)/edit/$', views.RackEditView.as_view(), name='rack_edit'),
     url(r'^racks/(?P<pk>\d+)/edit/$', views.RackEditView.as_view(), name='rack_edit'),
     url(r'^racks/(?P<pk>\d+)/delete/$', views.RackDeleteView.as_view(), name='rack_delete'),
     url(r'^racks/(?P<pk>\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<slug>[\w-]+)/edit/$', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
+
     # Device types
     # Device types
     url(r'^device-types/$', views.DeviceTypeListView.as_view(), name='devicetype_list'),
     url(r'^device-types/$', views.DeviceTypeListView.as_view(), name='devicetype_list'),
     url(r'^device-types/add/$', views.DeviceTypeAddView.as_view(), name='devicetype_add'),
     url(r'^device-types/add/$', views.DeviceTypeAddView.as_view(), name='devicetype_add'),

+ 49 - 17
netbox/dcim/views.py

@@ -20,25 +20,25 @@ from utilities.forms import ConfirmationForm
 from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView, ObjectAddView,\
 from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView, ObjectAddView,\
     ObjectEditView, ObjectDeleteView
     ObjectEditView, ObjectDeleteView
 
 
-from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, ConsoleConnectionFilter, \
+from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, ConsoleConnectionFilter,\
     PowerConnectionFilter, InterfaceConnectionFilter
     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
     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
     InterfaceTemplateTable
 
 
 
 
@@ -246,6 +246,38 @@ class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 
 
 
 
 #
 #
+# 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
 # Device types
 #
 #
 
 

+ 6 - 1
netbox/templates/_base.html

@@ -44,7 +44,7 @@
                             {% endif %}
                             {% endif %}
                         </ul>
                         </ul>
                     </li>
                     </li>
-                    <li class="dropdown{% if '/devices/' in request.path or '/device-types/' in request.path or '/device-roles/' in request.path or '-connections/' in request.path %} active{% endif %}">
+                    <li class="dropdown{% if '/devices/' in request.path or '/device-types/' in request.path or '/device-roles/' in request.path or '/manufacturers/' in request.path or '-connections/' in request.path %} active{% endif %}">
                         <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Devices <span class="caret"></span></a>
                         <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Devices <span class="caret"></span></a>
                         <ul class="dropdown-menu">
                         <ul class="dropdown-menu">
                             <li><a href="{% url 'dcim:device_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Devices</a></li>
                             <li><a href="{% url 'dcim:device_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Devices</a></li>
@@ -67,6 +67,11 @@
                                 <li><a href="{% url 'dcim:devicerole_add' %}"><i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add a Device Role</a></li>
                                 <li><a href="{% url 'dcim:devicerole_add' %}"><i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add a Device Role</a></li>
                             {% endif %}
                             {% endif %}
                             <li class="divider"></li>
                             <li class="divider"></li>
+                            <li><a href="{% url 'dcim:manufacturer_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Manufacturers</a></li>
+                            {% if perms.dcim.add_manufacturer %}
+                                <li><a href="{% url 'dcim:manufacturer_add' %}"><i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add a Manufacturer</a></li>
+                            {% endif %}
+                            <li class="divider"></li>
                             <li><a href="{% url 'dcim:console_connections_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Console Connections</a></li>
                             <li><a href="{% url 'dcim:console_connections_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Console Connections</a></li>
                             {% if perms.dcim.change_consoleport %}
                             {% if perms.dcim.change_consoleport %}
                                 <li><a href="{% url 'dcim:console_connections_import' %}"><i class="glyphicon glyphicon-import" aria-hidden="true"></i> Import Console Connections</a></li>
                                 <li><a href="{% url 'dcim:console_connections_import' %}"><i class="glyphicon glyphicon-import" aria-hidden="true"></i> Import Console Connections</a></li>

+ 14 - 0
netbox/templates/dcim/inc/manufacturer_table.html

@@ -0,0 +1,14 @@
+{% load render_table from django_tables2 %}
+{% if perms.dcim.delete_manufacturer %}
+    <form method="post" class="form form-horizontal">
+        {% csrf_token %}
+        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
+        {% render_table table table_template|default:'table.html' %}
+        <button type="submit" name="_delete" formaction="{% url 'dcim:manufacturer_bulk_delete' %}" class="btn btn-danger btn-sm">
+            <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
+            Delete Selected
+        </button>
+    </form>
+{% else %}
+    {% render_table table table_template|default:'table.html' %}
+{% endif %}

+ 21 - 0
netbox/templates/dcim/manufacturer_list.html

@@ -0,0 +1,21 @@
+{% extends '_base.html' %}
+{% load helpers %}
+
+{% block title %}Manufacturers{% endblock %}
+
+{% block content %}
+<div class="pull-right">
+    {% if perms.dcim.add_manufacturer %}
+        <a href="{% url 'dcim:manufacturer_add' %}" class="btn btn-primary">
+            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+            Add a manufacturer
+        </a>
+    {% endif %}
+</div>
+<h1>Manufacturers</h1>
+<div class="row">
+	<div class="col-md-12">
+        {% include 'dcim/inc/manufacturer_table.html' %}
+    </div>
+</div>
+{% endblock %}