diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py index 5ffc15f55..009baae73 100644 --- a/netbox/circuits/forms.py +++ b/netbox/circuits/forms.py @@ -57,6 +57,21 @@ class ProviderBulkDeleteForm(ConfirmationForm): pk = forms.ModelMultipleChoiceField(queryset=Provider.objects.all(), widget=forms.MultipleHiddenInput) +# +# Circuit types +# + +class CircuitTypeForm(forms.ModelForm, BootstrapMixin): + + class Meta: + model = CircuitType + fields = ['name', 'slug'] + + +class CircuitTypeBulkDeleteForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField(queryset=CircuitType.objects.all(), widget=forms.MultipleHiddenInput) + + # # Circuits # diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py index d26bbac03..584601e62 100644 --- a/netbox/circuits/models.py +++ b/netbox/circuits/models.py @@ -58,6 +58,9 @@ class CircuitType(models.Model): def __unicode__(self): return self.name + def get_absolute_url(self): + return "{}?type={}".format(reverse('circuits:circuit_list'), self.slug) + class Circuit(models.Model): """ diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 251462861..98c4a4455 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -1,7 +1,12 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from .models import Circuit, Provider +from .models import Circuit, CircuitType, Provider + + +CIRCUITTYPE_EDIT_LINK = """ +{% if perms.circuit.change_circuittype %}Edit{% endif %} +""" # @@ -23,6 +28,26 @@ class ProviderTable(tables.Table): } +# +# Circuit types +# + +class CircuitTypeTable(tables.Table): + pk = tables.CheckBoxColumn(visible=False, default='') + name = tables.LinkColumn(verbose_name='Name') + circuit_count = tables.Column(verbose_name='Circuits') + slug = tables.Column(verbose_name='Slug') + edit = tables.TemplateColumn(template_code=CIRCUITTYPE_EDIT_LINK, verbose_name='') + + class Meta: + model = CircuitType + fields = ('pk', 'name', 'circuit_count', 'slug', 'edit') + empty_text = "No circuit types found." + attrs = { + 'class': 'table table-hover', + } + + # # Circuits # diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 0822e6543..9da31f0b6 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -3,6 +3,24 @@ from django.conf.urls import url from . import views urlpatterns = [ + + # Providers + url(r'^providers/$', views.ProviderListView.as_view(), name='provider_list'), + url(r'^providers/add/$', views.ProviderAddView.as_view(), name='provider_add'), + url(r'^providers/import/$', views.ProviderBulkImportView.as_view(), name='provider_import'), + url(r'^providers/edit/$', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'), + url(r'^providers/delete/$', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'), + url(r'^providers/(?P[\w-]+)/$', views.provider, name='provider'), + url(r'^providers/(?P[\w-]+)/edit/$', views.ProviderEditView.as_view(), name='provider_edit'), + url(r'^providers/(?P[\w-]+)/delete/$', views.ProviderDeleteView.as_view(), name='provider_delete'), + + # Circuit types + url(r'^circuit-types/$', views.CircuitTypeListView.as_view(), name='circuittype_list'), + url(r'^circuit-types/add/$', views.CircuitTypeAddView.as_view(), name='circuittype_add'), + url(r'^circuit-types/delete/$', views.CircuitTypeBulkDeleteView.as_view(), name='circuittype_bulk_delete'), + url(r'^circuit-types/(?P[\w-]+)/edit/$', views.CircuitTypeEditView.as_view(), name='circuittype_edit'), + + # Circuits url(r'^circuits/$', views.CircuitListView.as_view(), name='circuit_list'), url(r'^circuits/add/$', views.CircuitAddView.as_view(), name='circuit_add'), url(r'^circuits/import/$', views.CircuitBulkImportView.as_view(), name='circuit_import'), @@ -12,12 +30,4 @@ urlpatterns = [ url(r'^circuits/(?P\d+)/edit/$', views.CircuitEditView.as_view(), name='circuit_edit'), url(r'^circuits/(?P\d+)/delete/$', views.CircuitDeleteView.as_view(), name='circuit_delete'), - url(r'^providers/$', views.ProviderListView.as_view(), name='provider_list'), - url(r'^providers/add/$', views.ProviderAddView.as_view(), name='provider_add'), - url(r'^providers/import/$', views.ProviderBulkImportView.as_view(), name='provider_import'), - url(r'^providers/edit/$', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'), - url(r'^providers/delete/$', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'), - url(r'^providers/(?P[\w-]+)/$', views.provider, name='provider'), - url(r'^providers/(?P[\w-]+)/edit/$', views.ProviderEditView.as_view(), name='provider_edit'), - url(r'^providers/(?P[\w-]+)/delete/$', views.ProviderDeleteView.as_view(), name='provider_delete'), ] diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 586fac25e..f1fcc07db 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -7,10 +7,11 @@ from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, Object ObjectEditView, ObjectDeleteView from .filters import CircuitFilter -from .forms import CircuitForm, CircuitImportForm, CircuitBulkEditForm, CircuitBulkDeleteForm, CircuitFilterForm,\ - ProviderForm, ProviderImportForm, ProviderBulkEditForm, ProviderBulkDeleteForm -from .models import Circuit, Provider -from .tables import CircuitTable, ProviderTable +from .forms import CircuitTypeForm, CircuitTypeBulkDeleteForm, CircuitForm, CircuitImportForm, CircuitBulkEditForm,\ + CircuitBulkDeleteForm, CircuitFilterForm, ProviderForm, ProviderImportForm, ProviderBulkEditForm,\ + ProviderBulkDeleteForm +from .models import Circuit, CircuitType, Provider +from .tables import CircuitTable, CircuitTypeTable, ProviderTable # @@ -89,6 +90,38 @@ class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): default_redirect_url = 'circuits:provider_list' +# +# Circuit Types +# + +class CircuitTypeListView(ObjectListView): + queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')) + table = CircuitTypeTable + edit_permissions = ['circuits.change_circuittype', 'circuits.delete_circuittype'] + template_name = 'circuits/circuittype_list.html' + + +class CircuitTypeAddView(PermissionRequiredMixin, ObjectAddView): + permission_required = 'circuits.add_circuittype' + model = CircuitType + form_class = CircuitTypeForm + cancel_url = 'circuits:circuittype_list' + + +class CircuitTypeEditView(PermissionRequiredMixin, ObjectEditView): + permission_required = 'circuits.change_circuittype' + model = CircuitType + form_class = CircuitTypeForm + return_url = 'circuits:circuittype_list' + + +class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'circuits.delete_circuittype' + cls = CircuitType + form = CircuitTypeBulkDeleteForm + default_redirect_url = 'circuits:circuittype_list' + + # # Circuits # diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 2fb0d8ac6..62837727a 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -149,6 +149,13 @@
  • Add a Circuit
  • Import Circuits
  • {% endif %} + {% if perms.circuits.add_circuit or perms.circuits.add_circuittype %} +
  • + {% endif %} +
  • Circuit Types
  • + {% if perms.circuits.add_circuittype %} +
  • Add a Circuit Type
  • + {% endif %} {% if request.user.is_authenticated %} diff --git a/netbox/templates/circuits/circuittype_list.html b/netbox/templates/circuits/circuittype_list.html new file mode 100644 index 000000000..160acc464 --- /dev/null +++ b/netbox/templates/circuits/circuittype_list.html @@ -0,0 +1,21 @@ +{% extends '_base.html' %} +{% load helpers %} + +{% block title %}Circuit Types{% endblock %} + +{% block content %} +
    + {% if perms.circuits.add_circuittype %} + + + Add a circuit type + + {% endif %} +
    +

    Circuit Types

    +
    +
    + {% include 'circuits/inc/circuittype_table.html' %} +
    +
    +{% endblock %} diff --git a/netbox/templates/circuits/inc/circuittype_table.html b/netbox/templates/circuits/inc/circuittype_table.html new file mode 100644 index 000000000..b20f31da5 --- /dev/null +++ b/netbox/templates/circuits/inc/circuittype_table.html @@ -0,0 +1,14 @@ +{% load render_table from django_tables2 %} +{% if perms.circuits.delete_circuittype %} +
    + {% csrf_token %} + + {% render_table table table_template|default:'table.html' %} + +
    +{% else %} + {% render_table table table_template|default:'table.html' %} +{% endif %} diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index adf07b9b5..f35d58b4f 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -147,6 +147,8 @@ class ObjectEditView(View): obj.get_absolute_url(), obj)) if '_addanother' in request.POST: return redirect(request.path) + elif self.return_url: + return redirect(self.return_url) else: return redirect(obj.get_absolute_url())