1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Introduced CableView and CableEditView

This commit is contained in:
Jeremy Stretch
2018-10-25 15:51:12 -04:00
parent f134a6ec63
commit 2d90fc608e
7 changed files with 122 additions and 7 deletions

View File

@ -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')

View File

@ -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

View File

@ -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')
#

View File

@ -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

View File

@ -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

View File

@ -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 %}

View File

@ -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>