Browse Source

Added CBVs for Platforms

Jeremy Stretch 9 years ago
parent
commit
a07aa69321

+ 15 - 0
netbox/dcim/forms.py

@@ -292,6 +292,21 @@ class DeviceRoleBulkDeleteForm(ConfirmationForm):
 
 
 
 
 #
 #
+# 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
 # Devices
 #
 #
 
 

+ 3 - 0
netbox/dcim/models.py

@@ -413,6 +413,9 @@ class Platform(models.Model):
     def __unicode__(self):
     def __unicode__(self):
         return self.name
         return self.name
 
 
+    def get_absolute_url(self):
+        return "{}?platform={}".format(reverse('dcim:device_list'), self.slug)
+
 
 
 class Device(models.Model):
 class Device(models.Model):
     """
     """

+ 25 - 1
netbox/dcim/tables.py

@@ -2,7 +2,7 @@ import django_tables2 as tables
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
 from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\
 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 = """
 DEVICE_LINK = """
 <a href="{% url 'dcim:device' pk=record.pk %}">{{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}</a>
 <a href="{% url 'dcim:device' pk=record.pk %}">{{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}</a>
@@ -20,6 +20,10 @@ MANUFACTURER_EDIT_LINK = """
 {% if perms.dcim.change_manufacturer %}<a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>{% endif %}
 {% if perms.dcim.change_manufacturer %}<a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>{% endif %}
 """
 """
 
 
+PLATFORM_EDIT_LINK = """
+{% if perms.dcim.change_platform %}<a href="{% url 'dcim:platform_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>
 """
 """
@@ -219,6 +223,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
 # Devices
 #
 #
 
 

+ 6 - 0
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/delete/$', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'),
     url(r'^device-roles/(?P<slug>[\w-]+)/edit/$', views.DeviceRoleEditView.as_view(), name='devicerole_edit'),
     url(r'^device-roles/(?P<slug>[\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<slug>[\w-]+)/edit/$', views.PlatformEditView.as_view(), name='platform_edit'),
+
     # Devices
     # Devices
     url(r'^devices/$', views.DeviceListView.as_view(), name='device_list'),
     url(r'^devices/$', views.DeviceListView.as_view(), name='device_list'),
     url(r'^devices/add/$', views.DeviceEditView.as_view(), name='device_add'),
     url(r'^devices/add/$', views.DeviceEditView.as_view(), name='device_add'),

+ 41 - 13
netbox/dcim/views.py

@@ -25,21 +25,22 @@ from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter
 from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm, RackGroupBulkDeleteForm, RackForm,\
 from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm, RackGroupBulkDeleteForm, RackForm,\
     RackImportForm, RackBulkEditForm, RackBulkDeleteForm, RackFilterForm, ManufacturerForm, ManufacturerBulkDeleteForm,\
     RackImportForm, RackBulkEditForm, RackBulkDeleteForm, RackFilterForm, ManufacturerForm, ManufacturerBulkDeleteForm,\
     DeviceTypeForm, DeviceTypeBulkEditForm, DeviceTypeBulkDeleteForm, DeviceTypeFilterForm, DeviceRoleForm,\
     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
     ConsoleServerPort, PowerPort, PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED
 from .tables import SiteTable, RackGroupTable, RackTable, ManufacturerTable, DeviceTypeTable, DeviceRoleTable,\
 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+)\]'
 EXPANSION_PATTERN = '\[(\d+-\d+)\]'
@@ -239,6 +240,7 @@ class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView):
     permission_required = 'dcim.change_manufacturer'
     permission_required = 'dcim.change_manufacturer'
     model = Manufacturer
     model = Manufacturer
     form_class = ManufacturerForm
     form_class = ManufacturerForm
+    success_url = 'dcim:manufacturer_list'
     cancel_url = 'dcim:manufacturer_list'
     cancel_url = 'dcim:manufacturer_list'
 
 
 
 
@@ -471,6 +473,32 @@ class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 
 
 
 
 #
 #
+# 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
 # Devices
 #
 #
 
 

+ 5 - 0
netbox/templates/_base.html

@@ -71,6 +71,11 @@
                             {% if perms.dcim.add_manufacturer %}
                             {% 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>
                                 <li><a href="{% url 'dcim:manufacturer_add' %}"><i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add a Manufacturer</a></li>
                             {% endif %}
                             {% endif %}
+                            <li class="divider"></li>
+                            <li><a href="{% url 'dcim:platform_list' %}"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Platforms</a></li>
+                            {% if perms.dcim.add_platform %}
+                                <li><a href="{% url 'dcim:platform_add' %}"><i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add a Platform</a></li>
+                            {% endif %}
                         </ul>
                         </ul>
                     </li>
                     </li>
                     <li class="dropdown{% if '-connections/' in request.path %} active{% endif %}">
                     <li class="dropdown{% if '-connections/' in request.path %} active{% endif %}">

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

@@ -0,0 +1,14 @@
+{% load render_table from django_tables2 %}
+{% if perms.dcim.delete_platform %}
+    <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:platform_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/platform_list.html

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