Просмотр исходного кода

#4416: Establish a dedicated view for VirtualChassis objects

Jeremy Stretch 5 лет назад
Родитель
Сommit
fed9408b90

+ 1 - 1
netbox/dcim/models/__init__.py

@@ -1722,7 +1722,7 @@ class VirtualChassis(ChangeLoggedModel):
         return str(self.master) if hasattr(self, 'master') else 'New Virtual Chassis'
 
     def get_absolute_url(self):
-        return self.master.get_absolute_url()
+        return reverse('dcim:virtualchassis', kwargs={'pk': self.pk})
 
     def clean(self):
 

+ 7 - 16
netbox/dcim/tables.py

@@ -165,15 +165,6 @@ UTILIZATION_GRAPH = """
 {% utilization_graph value %}
 """
 
-VIRTUALCHASSIS_ACTIONS = """
-<a href="{% url 'dcim:virtualchassis_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Change log">
-    <i class="fa fa-history"></i>
-</a>
-{% if perms.dcim.change_virtualchassis %}
-    <a href="{% url 'dcim:virtualchassis_edit' pk=record.pk %}?return_url={{ request.path }}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
-{% endif %}
-"""
-
 CABLE_TERMINATION_PARENT = """
 {% if value.device %}
     <a href="{{ value.device.get_absolute_url }}">{{ value.device }}</a>
@@ -1050,17 +1041,17 @@ class InventoryItemTable(BaseTable):
 
 class VirtualChassisTable(BaseTable):
     pk = ToggleColumn()
-    master = tables.LinkColumn()
-    member_count = tables.Column(verbose_name='Members')
-    actions = tables.TemplateColumn(
-        template_code=VIRTUALCHASSIS_ACTIONS,
-        attrs={'td': {'class': 'text-right noprint'}},
-        verbose_name=''
+    name = tables.Column(
+        accessor=Accessor('master__name'),
+        linkify=True
+    )
+    member_count = tables.Column(
+        verbose_name='Members'
     )
 
     class Meta(BaseTable.Meta):
         model = VirtualChassis
-        fields = ('pk', 'master', 'domain', 'member_count', 'actions')
+        fields = ('pk', 'name', 'domain', 'member_count')
 
 
 #

+ 1 - 0
netbox/dcim/urls.py

@@ -321,6 +321,7 @@ urlpatterns = [
     # Virtual chassis
     path('virtual-chassis/', views.VirtualChassisListView.as_view(), name='virtualchassis_list'),
     path('virtual-chassis/add/', views.VirtualChassisCreateView.as_view(), name='virtualchassis_add'),
+    path('virtual-chassis/<int:pk>/', views.VirtualChassisView.as_view(), name='virtualchassis'),
     path('virtual-chassis/<int:pk>/edit/', views.VirtualChassisEditView.as_view(), name='virtualchassis_edit'),
     path('virtual-chassis/<int:pk>/delete/', views.VirtualChassisDeleteView.as_view(), name='virtualchassis_delete'),
     path('virtual-chassis/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='virtualchassis_changelog', kwargs={'model': VirtualChassis}),

+ 11 - 1
netbox/dcim/views.py

@@ -32,7 +32,6 @@ from virtualization.models import VirtualMachine
 from . import filters, forms, tables
 from .choices import DeviceFaceChoices
 from .constants import NONCONNECTABLE_IFACE_TYPES
-from .exceptions import CableTraceSplit
 from .models import (
     Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
     DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
@@ -2368,6 +2367,17 @@ class VirtualChassisListView(PermissionRequiredMixin, ObjectListView):
     action_buttons = ('export',)
 
 
+class VirtualChassisView(PermissionRequiredMixin, View):
+    permission_required = 'dcim.view_virtualchassis'
+
+    def get(self, request, pk):
+        virtualchassis = get_object_or_404(VirtualChassis.objects.prefetch_related('members'), pk=pk)
+
+        return render(request, 'dcim/virtualchassis.html', {
+            'virtualchassis': virtualchassis,
+        })
+
+
 class VirtualChassisCreateView(PermissionRequiredMixin, View):
     permission_required = 'dcim.add_virtualchassis'
 

+ 3 - 13
netbox/templates/dcim/device.html

@@ -232,19 +232,9 @@
                         {% endfor %}
                     </table>
                     <div class="panel-footer text-right noprint">
-                        {% if perms.dcim.change_virtualchassis %}
-                            <a href="{% url 'dcim:virtualchassis_add_member' pk=device.virtual_chassis.pk %}?site={{ device.site.pk }}&rack={{ device.rack.pk }}&return_url={{ device.get_absolute_url }}" class="btn btn-primary btn-xs">
-                                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Member
-                            </a>
-                            <a href="{% url 'dcim:virtualchassis_edit' pk=device.virtual_chassis.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
-                                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit Virtual Chassis
-                            </a>
-                        {% endif %}
-                        {% if perms.dcim.delete_virtualchassis %}
-                            <a href="{% url 'dcim:virtualchassis_delete' pk=device.virtual_chassis.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
-                                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete Virtual Chassis
-                            </a>
-                        {% endif %}
+                        <a href="{{ device.virtual_chassis.get_absolute_url }}" class="btn btn-primary btn-xs">
+                            <span class="fa fa-arrow-right" aria-hidden="true"></span> View Virtual Chassis
+                        </a>
                     </div>
                 </div>
             {% endif %}

+ 111 - 0
netbox/templates/dcim/virtualchassis.html

@@ -0,0 +1,111 @@
+{% extends 'base.html' %}
+{% load buttons %}
+{% load custom_links %}
+{% load helpers %}
+{% load plugins %}
+
+{% block header %}
+    <div class="row noprint">
+        <div class="col-sm-8 col-md-9">
+            <ol class="breadcrumb">
+                <li><a href="{% url 'dcim:virtualchassis_list' %}">Virtual Chassis</a></li>
+                <li><a href="{% url 'dcim:virtualchassis_list' %}?site={{ virtualchassis.master.site.slug }}">{{ virtualchassis.master.site }}</a></li>
+                <li>{{ virtualchassis }}</li>
+            </ol>
+        </div>
+        <div class="col-sm-4 col-md-3">
+            <form action="{% url 'dcim:virtualchassis_list' %}" method="get">
+                <div class="input-group">
+                    <input type="text" name="q" class="form-control" placeholder="Search virtual chassis" />
+                    <span class="input-group-btn">
+                        <button type="submit" class="btn btn-primary">
+                            <span class="fa fa-search" aria-hidden="true"></span>
+                        </button>
+                    </span>
+                </div>
+            </form>
+        </div>
+    </div>
+    <div class="pull-right noprint">
+        {% plugin_buttons virtualchassis %}
+        {% if perms.dcim.change_virtualchassis %}
+            {% edit_button virtualchassis %}
+        {% endif %}
+        {% if perms.dcim.delete_virtualchassis %}
+            {% delete_button virtualchassis %}
+        {% endif %}
+    </div>
+    <h1>{% block title %}{{ virtualchassis }}{% endblock %}</h1>
+    {% include 'inc/created_updated.html' with obj=virtualchassis %}
+    <div class="pull-right noprint">
+        {% custom_links virtualchassis %}
+    </div>
+    <ul class="nav nav-tabs">
+        <li role="presentation"{% if not active_tab %} class="active"{% endif %}>
+            <a href="{{ virtualchassis.get_absolute_url }}">Virtual Chassis</a>
+        </li>
+        {% if perms.extras.view_objectchange %}
+            <li role="presentation"{% if active_tab == 'changelog' %} class="active"{% endif %}>
+                <a href="{% url 'dcim:virtualchassis_changelog' pk=virtualchassis.pk %}">Change Log</a>
+            </li>
+        {% endif %}
+    </ul>
+{% endblock %}
+
+{% block content %}
+<div class="row">
+	<div class="col-md-4">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <strong>Virtual Chassis</strong>
+            </div>
+            <table class="table table-hover panel-body attr-table">
+                <tr>
+                    <td>Domain</td>
+                    <td>{{ virtualchassis.domain|placeholder }}</td>
+
+            </table>
+        </div>
+        {% include 'extras/inc/tags_panel.html' with tags=virtualchassis.tags.all url='dcim:virtualchassis_list' %}
+        {% plugin_left_page virtualchassis %}
+    </div>
+    <div class="col-md-8">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <strong>Members</strong>
+            </div>
+            <table class="table table-hover panel-body attr-table">
+                <tr>
+                    <th>Device</th>
+                    <th>Position</th>
+                    <th>Master</th>
+                    <th>Priority</th>
+                </tr>
+                {% for vc_member in virtualchassis.members.all %}
+                    <tr{% if vc_member == device %} class="info"{% endif %}>
+                        <td>
+                            <a href="{{ vc_member.get_absolute_url }}">{{ vc_member }}</a>
+                        </td>
+                        <td><span class="badge badge-default">{{ vc_member.vc_position }}</span></td>
+                        <td>{% if virtualchassis.master == vc_member %}<i class="fa fa-check text-success"></i>{% endif %}</td>
+                        <td>{{ vc_member.vc_priority|placeholder }}</td>
+                    </tr>
+                {% endfor %}
+            </table>
+            {% if perms.dcim.change_virtualchassis %}
+                <div class="panel-footer text-right noprint">
+                    <a href="{% url 'dcim:virtualchassis_add_member' pk=virtualchassis.pk %}?site={{ virtualchassis.master.site.pk }}&rack={{ virtualchassis.master.rack.pk }}" class="btn btn-primary btn-xs">
+                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Member
+                    </a>
+                </div>
+            {% endif %}
+        </div>
+        {% plugin_right_page virtualchassis %}
+	</div>
+</div>
+<div class="row">
+    <div class="col-md-12">
+        {% plugin_full_width_page virtualchassis %}
+    </div>
+</div>
+{% endblock %}