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

Introduced CableView and CableEditView

Jeremy Stretch 7 лет назад
Родитель
Сommit
2d90fc608e

+ 9 - 2
netbox/dcim/forms.py

@@ -2131,7 +2131,7 @@ class RearPortBulkRenameForm(BulkRenameForm):
 # Cables
 #
 
-class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
+class CableCreateForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
     termination_b_site = forms.ModelChoiceField(
         queryset=Site.objects.all(),
         label='Site',
@@ -2198,7 +2198,7 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
         ]
 
     def __init__(self, *args, **kwargs):
-        super(CableForm, self).__init__(*args, **kwargs)
+        super(CableCreateForm, self).__init__(*args, **kwargs)
 
         # Define available types for endpoint B based on the type of endpoint A
         termination_a_type = self.instance.termination_a._meta.model_name
@@ -2207,6 +2207,13 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
         )
 
 
+class CableForm(BootstrapMixin, forms.ModelForm):
+
+    class Meta:
+        model = Cable
+        fields = ('type', 'status', 'label', 'color')
+
+
 class CableFilterForm(BootstrapMixin, forms.Form):
     model = Cable
     q = forms.CharField(required=False, label='Search')

+ 3 - 0
netbox/dcim/models.py

@@ -2380,6 +2380,9 @@ class Cable(ChangeLoggedModel):
             return '{} (#{})'.format(self.label, self.pk)
         return '#{}'.format(self.pk)
 
+    def get_absolute_url(self):
+        return reverse('dcim:cable', args=[self.pk])
+
     def get_path_endpoints(self):
         """
         Traverse both ends of a cable path and return its connected endpoints. Note that one or both endpoints may be

+ 5 - 4
netbox/dcim/tables.py

@@ -621,9 +621,10 @@ class DeviceBayTable(BaseTable):
 
 class CableTable(BaseTable):
     # django-tables2 adds CSS `class="label"` which causes rendering issues
-    _label = tables.Column(
-        accessor=Accessor('label'),
-        verbose_name='Label'
+    pk = tables.LinkColumn(
+        viewname='dcim:cable',
+        args=[Accessor('pk')],
+        verbose_name='PK'
     )
     device_a = tables.LinkColumn(
         viewname='dcim:device',
@@ -652,7 +653,7 @@ class CableTable(BaseTable):
 
     class Meta(BaseTable.Meta):
         model = Cable
-        fields = ('_label', 'device_a', 'termination_a', 'device_b', 'termination_b', 'status', 'type', 'color')
+        fields = ('pk', 'device_a', 'termination_a', 'device_b', 'termination_b', 'status', 'type', 'color')
 
 
 #

+ 2 - 0
netbox/dcim/urls.py

@@ -252,6 +252,8 @@ urlpatterns = [
 
     # Cables
     url(r'^cables/$', views.CableListView.as_view(), name='cable_list'),
+    url(r'^cables/(?P<pk>\d+)/$', views.CableView.as_view(), name='cable'),
+    url(r'^cables/(?P<pk>\d+)/edit/$', views.CableEditView.as_view(), name='cable_edit'),
     url(r'^cables/(?P<pk>\d+)/delete/$', views.CableDeleteView.as_view(), name='cable_delete'),
 
     # Console/power/interface connections

+ 19 - 1
netbox/dcim/views.py

@@ -2023,10 +2023,21 @@ class CableListView(ObjectListView):
     template_name = 'dcim/cable_list.html'
 
 
+class CableView(View):
+
+    def get(self, request, pk):
+
+        cable = get_object_or_404(Cable, pk=pk)
+
+        return render(request, 'dcim/cable.html', {
+            'cable': cable,
+        })
+
+
 class CableCreateView(PermissionRequiredMixin, ObjectEditView):
     permission_required = 'dcim.add_cable'
     model = Cable
-    model_form = forms.CableForm
+    model_form = forms.CableCreateForm
     template_name = 'dcim/cable_connect.html'
 
     def alter_obj(self, obj, request, url_args, url_kwargs):
@@ -2039,6 +2050,13 @@ class CableCreateView(PermissionRequiredMixin, ObjectEditView):
         return obj
 
 
+class CableEditView(PermissionRequiredMixin, ObjectEditView):
+    permission_required = 'dcim.change_cable'
+    model = Cable
+    model_form = forms.CableForm
+    default_return_url = 'dcim:cable_list'
+
+
 class CableDeleteView(PermissionRequiredMixin, ObjectDeleteView):
     permission_required = 'dcim.delete_cable'
     model = Cable

+ 72 - 0
netbox/templates/dcim/cable.html

@@ -0,0 +1,72 @@
+{% extends '_base.html' %}
+{% load helpers %}
+
+{% block header %}
+    <div class="row">
+        <div class="col-md-12">
+            <ol class="breadcrumb">
+                <li><a href="{% url 'dcim:cable_list' %}">Cables</a></li>
+                <li>{{ cable }}</li>
+            </ol>
+        </div>
+    </div>
+    <div class="pull-right">
+        {% if perms.dcim.change_cable %}
+            <a href="{% url 'dcim:cable_edit' pk=cable.pk %}" class="btn btn-warning">
+                <span class="fa fa-pencil" aria-hidden="true"></span> Edit this cable
+            </a>
+        {% endif %}
+        {% if perms.dcim.delete_cable %}
+            <a href="{% url 'dcim:cable_delete' pk=cable.pk %}" class="btn btn-danger">
+                <span class="fa fa-trash" aria-hidden="true"></span> Delete this cable
+            </a>
+        {% endif %}
+    </div>
+    <h1>{% block title %}Cable {{ cable }}{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+    <div class="row">
+        <div class="col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <strong>Cable</strong>
+                </div>
+                <table class="table table-hover panel-body attr-table">
+                    <tr>
+                        <td>Type</td>
+                        <td>{{ cable.get_type_display }}</td>
+                    </tr>
+                    <tr>
+                        <td>Status</td>
+                        <td>{{ cable.get_status_display }}</td>
+                    </tr>
+                    <tr>
+                        <td>Label</td>
+                        <td>{% if cable.label %}{{ cable.label }}{% else %}<span class="text-muted">N/A</span>{% endif %}</td>
+                    </tr>
+                    <tr>
+                        <td>Color</td>
+                        <td>
+                            <label class="label" style="background-color: #{{ cable.color }}">{{ cable.color }}</label>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <strong>Termination A</strong>
+                </div>
+                {% include 'dcim/inc/cable_termination.html' with termination=cable.termination_a %}
+            </div>
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <strong>Termination B</strong>
+                </div>
+                {% include 'dcim/inc/cable_termination.html' with termination=cable.termination_b %}
+            </div>
+        </div>
+    </div>
+{% endblock %}

+ 12 - 0
netbox/templates/dcim/inc/cable_termination.html

@@ -0,0 +1,12 @@
+<table class="table table-hover panel-body attr-table">
+    <tr>
+        <td>Device</td>
+        <td>
+            <a href="{{ termination.device.parent.get_absolute_url }}">{{ termination.device }}</a>
+        </td>
+    </tr>
+    <tr>
+        <td>Component</td>
+        <td>{{ termination_a }}</td>
+    </tr>
+</table>