mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Applied tenancy to circuits
This commit is contained in:
@ -21,10 +21,11 @@ class CircuitTypeAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
@admin.register(Circuit)
|
@admin.register(Circuit)
|
||||||
class CircuitAdmin(admin.ModelAdmin):
|
class CircuitAdmin(admin.ModelAdmin):
|
||||||
list_display = ['cid', 'provider', 'type', 'site', 'install_date', 'port_speed', 'commit_rate', 'xconnect_id']
|
list_display = ['cid', 'provider', 'type', 'tenant', 'site', 'install_date', 'port_speed', 'commit_rate',
|
||||||
list_filter = ['provider']
|
'xconnect_id']
|
||||||
|
list_filter = ['provider', 'type', 'tenant']
|
||||||
exclude = ['interface']
|
exclude = ['interface']
|
||||||
|
|
||||||
def get_queryset(self, request):
|
def get_queryset(self, request):
|
||||||
qs = super(CircuitAdmin, self).get_queryset(request)
|
qs = super(CircuitAdmin, self).get_queryset(request)
|
||||||
return qs.select_related('provider', 'type', 'site')
|
return qs.select_related('provider', 'type', 'tenant', 'site')
|
||||||
|
@ -2,6 +2,7 @@ from rest_framework import serializers
|
|||||||
|
|
||||||
from circuits.models import Provider, CircuitType, Circuit
|
from circuits.models import Provider, CircuitType, Circuit
|
||||||
from dcim.api.serializers import SiteNestedSerializer, InterfaceNestedSerializer
|
from dcim.api.serializers import SiteNestedSerializer, InterfaceNestedSerializer
|
||||||
|
from tenancy.api.serializers import TenantNestedSerializer
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -45,13 +46,14 @@ class CircuitTypeNestedSerializer(CircuitTypeSerializer):
|
|||||||
class CircuitSerializer(serializers.ModelSerializer):
|
class CircuitSerializer(serializers.ModelSerializer):
|
||||||
provider = ProviderNestedSerializer()
|
provider = ProviderNestedSerializer()
|
||||||
type = CircuitTypeNestedSerializer()
|
type = CircuitTypeNestedSerializer()
|
||||||
|
tenant = TenantNestedSerializer()
|
||||||
site = SiteNestedSerializer()
|
site = SiteNestedSerializer()
|
||||||
interface = InterfaceNestedSerializer()
|
interface = InterfaceNestedSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Circuit
|
model = Circuit
|
||||||
fields = ['id', 'cid', 'provider', 'type', 'site', 'interface', 'install_date', 'port_speed', 'commit_rate',
|
fields = ['id', 'cid', 'provider', 'type', 'tenant', 'site', 'interface', 'install_date', 'port_speed',
|
||||||
'xconnect_id', 'comments']
|
'commit_rate', 'xconnect_id', 'comments']
|
||||||
|
|
||||||
|
|
||||||
class CircuitNestedSerializer(CircuitSerializer):
|
class CircuitNestedSerializer(CircuitSerializer):
|
||||||
|
@ -99,7 +99,7 @@ class CircuitForm(forms.ModelForm, BootstrapMixin):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Circuit
|
model = Circuit
|
||||||
fields = [
|
fields = [
|
||||||
'cid', 'type', 'provider', 'site', 'rack', 'device', 'livesearch', 'interface', 'install_date',
|
'cid', 'type', 'provider', 'tenant', 'site', 'rack', 'device', 'livesearch', 'interface', 'install_date',
|
||||||
'port_speed', 'commit_rate', 'xconnect_id', 'pp_info', 'comments'
|
'port_speed', 'commit_rate', 'xconnect_id', 'pp_info', 'comments'
|
||||||
]
|
]
|
||||||
help_texts = {
|
help_texts = {
|
||||||
|
22
netbox/circuits/migrations/0004_circuit_add_tenant.py
Normal file
22
netbox/circuits/migrations/0004_circuit_add_tenant.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.8 on 2016-07-26 19:29
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tenancy', '0001_initial'),
|
||||||
|
('circuits', '0003_provider_32bit_asn_support'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='circuit',
|
||||||
|
name='tenant',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='tenancy.Tenant'),
|
||||||
|
),
|
||||||
|
]
|
@ -3,6 +3,7 @@ from django.db import models
|
|||||||
|
|
||||||
from dcim.fields import ASNField
|
from dcim.fields import ASNField
|
||||||
from dcim.models import Site, Interface
|
from dcim.models import Site, Interface
|
||||||
|
from tenancy.models import Tenant
|
||||||
from utilities.models import CreatedUpdatedModel
|
from utilities.models import CreatedUpdatedModel
|
||||||
|
|
||||||
|
|
||||||
@ -66,6 +67,7 @@ class Circuit(CreatedUpdatedModel):
|
|||||||
cid = models.CharField(max_length=50, verbose_name='Circuit ID')
|
cid = models.CharField(max_length=50, verbose_name='Circuit ID')
|
||||||
provider = models.ForeignKey('Provider', related_name='circuits', on_delete=models.PROTECT)
|
provider = models.ForeignKey('Provider', related_name='circuits', on_delete=models.PROTECT)
|
||||||
type = models.ForeignKey('CircuitType', related_name='circuits', on_delete=models.PROTECT)
|
type = models.ForeignKey('CircuitType', related_name='circuits', on_delete=models.PROTECT)
|
||||||
|
tenant = models.ForeignKey(Tenant, related_name='circuits', blank=True, null=True, on_delete=models.PROTECT)
|
||||||
site = models.ForeignKey(Site, related_name='circuits', on_delete=models.PROTECT)
|
site = models.ForeignKey(Site, related_name='circuits', on_delete=models.PROTECT)
|
||||||
interface = models.OneToOneField(Interface, related_name='circuit', blank=True, null=True)
|
interface = models.OneToOneField(Interface, related_name='circuit', blank=True, null=True)
|
||||||
install_date = models.DateField(blank=True, null=True, verbose_name='Date installed')
|
install_date = models.DateField(blank=True, null=True, verbose_name='Date installed')
|
||||||
|
@ -53,10 +53,11 @@ class CircuitTable(BaseTable):
|
|||||||
cid = tables.LinkColumn('circuits:circuit', args=[Accessor('pk')], verbose_name='ID')
|
cid = tables.LinkColumn('circuits:circuit', args=[Accessor('pk')], verbose_name='ID')
|
||||||
type = tables.Column(verbose_name='Type')
|
type = tables.Column(verbose_name='Type')
|
||||||
provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')], verbose_name='Provider')
|
provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')], verbose_name='Provider')
|
||||||
|
tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
|
||||||
site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
|
site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
|
||||||
port_speed_human = tables.Column(verbose_name='Port Speed')
|
port_speed_human = tables.Column(verbose_name='Port Speed')
|
||||||
commit_rate_human = tables.Column(verbose_name='Commit Rate')
|
commit_rate_human = tables.Column(verbose_name='Commit Rate')
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = Circuit
|
model = Circuit
|
||||||
fields = ('pk', 'cid', 'type', 'provider', 'site', 'port_speed_human', 'commit_rate_human')
|
fields = ('pk', 'cid', 'type', 'provider', 'tenant', 'site', 'port_speed_human', 'commit_rate_human')
|
||||||
|
@ -109,7 +109,7 @@ class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class CircuitListView(ObjectListView):
|
class CircuitListView(ObjectListView):
|
||||||
queryset = Circuit.objects.select_related('provider', 'type', 'site')
|
queryset = Circuit.objects.select_related('provider', 'type', 'tenant', 'site')
|
||||||
filter = filters.CircuitFilter
|
filter = filters.CircuitFilter
|
||||||
filter_form = forms.CircuitFilterForm
|
filter_form = forms.CircuitFilterForm
|
||||||
table = tables.CircuitTable
|
table = tables.CircuitTable
|
||||||
|
@ -57,6 +57,45 @@
|
|||||||
<td>Circuit ID</td>
|
<td>Circuit ID</td>
|
||||||
<td>{{ circuit.cid }}</td>
|
<td>{{ circuit.cid }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Type</td>
|
||||||
|
<td><a href="{{ circuit.type.get_absolute_url }}">{{ circuit.type }}</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Tenant</td>
|
||||||
|
<td>
|
||||||
|
{% if circuit.tenant %}
|
||||||
|
<a href="{{ circuit.tenant.get_absolute_url }}">{{ circuit.tenant }}</a>
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted">N/A</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Port Speed</td>
|
||||||
|
<td>{{ circuit.port_speed_human }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Commit Rate</td>
|
||||||
|
<td>{% if circuit.commit_rate %}{{ circuit.commit_rate_human }}{% else %}<span class="text-muted">N/A</span>{% endif %}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Created</td>
|
||||||
|
<td>{{ circuit.created }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Last Updated</td>
|
||||||
|
<td>{{ circuit.last_updated }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<strong>Termination</strong>
|
||||||
|
</div>
|
||||||
|
<table class="table table-hover panel-body">
|
||||||
<tr>
|
<tr>
|
||||||
<td>Site</td>
|
<td>Site</td>
|
||||||
<td>
|
<td>
|
||||||
@ -75,36 +114,36 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Install Date</td>
|
<td>Install Date</td>
|
||||||
<td>{{ circuit.install_date }}</td>
|
<td>
|
||||||
</tr>
|
{% if circuit.install_date %}
|
||||||
<tr>
|
{{ circuit.install_date }}
|
||||||
<td>Port Speed</td>
|
{% else %}
|
||||||
<td>{{ circuit.port_speed_human }}</td>
|
<span class="text-muted">N/A</span>
|
||||||
</tr>
|
{% endif %}
|
||||||
<tr>
|
</td>
|
||||||
<td>Commit Rate</td>
|
|
||||||
<td>{% if circuit.commit_rate %}{{ circuit.commit_rate_human }}{% else %}<span class="text-muted">N/A</span>{% endif %}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Cross-Connect</td>
|
<td>Cross-Connect</td>
|
||||||
<td>{{ circuit.xconnect_id }}</td>
|
<td>
|
||||||
|
{% if circuit.xconnect_id %}
|
||||||
|
{{ circuit.xconnect_id }}
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted">N/A</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Patch Panel/Port</td>
|
<td>Patch Panel/Port</td>
|
||||||
<td>{{ circuit.pp_info }}</td>
|
<td>
|
||||||
</tr>
|
{% if circuit.pp_info %}
|
||||||
<tr>
|
{{ circuit.pp_info }}
|
||||||
<td>Created</td>
|
{% else %}
|
||||||
<td>{{ circuit.created }}</td>
|
<span class="text-muted">N/A</span>
|
||||||
</tr>
|
{% endif %}
|
||||||
<tr>
|
</td>
|
||||||
<td>Last Updated</td>
|
|
||||||
<td>{{ circuit.last_updated }}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<strong>Comments</strong>
|
<strong>Comments</strong>
|
||||||
|
@ -9,13 +9,19 @@
|
|||||||
{% render_field form.provider %}
|
{% render_field form.provider %}
|
||||||
{% render_field form.cid %}
|
{% render_field form.cid %}
|
||||||
{% render_field form.type %}
|
{% render_field form.type %}
|
||||||
|
{% render_field form.tenant %}
|
||||||
{% render_field form.install_date %}
|
{% render_field form.install_date %}
|
||||||
{% render_field form.port_speed %}
|
|
||||||
{% render_field form.commit_rate %}
|
|
||||||
{% render_field form.xconnect_id %}
|
{% render_field form.xconnect_id %}
|
||||||
{% render_field form.pp_info %}
|
{% render_field form.pp_info %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading"><strong>Bandwidth</strong></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{% render_field form.port_speed %}
|
||||||
|
{% render_field form.commit_rate %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading"><strong>Termination</strong></div>
|
<div class="panel-heading"><strong>Termination</strong></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
Reference in New Issue
Block a user