Parcourir la source

Added CBVs for Platforms

Jeremy Stretch il y a 9 ans
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
 #
 

+ 3 - 0
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):
     """

+ 25 - 1
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 = """
 <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 %}
 """
 
+PLATFORM_EDIT_LINK = """
+{% if perms.dcim.change_platform %}<a href="{% url 'dcim:platform_edit' slug=record.slug %}">Edit</a>{% endif %}
+"""
+
 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>
 """
@@ -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
 #
 

+ 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/(?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
     url(r'^devices/$', views.DeviceListView.as_view(), name='device_list'),
     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,\
     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'
 
 
@@ -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
 #
 

+ 5 - 0
netbox/templates/_base.html

@@ -71,6 +71,11 @@
                             {% 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: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>
                     </li>
                     <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 %}