mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Converted DCIM object lists to ObjectListView
This commit is contained in:
@ -7,7 +7,7 @@ from . import views
|
|||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
# Sites
|
# Sites
|
||||||
url(r'^sites/$', views.site_list, name='site_list'),
|
url(r'^sites/$', views.SiteListView.as_view(), name='site_list'),
|
||||||
url(r'^sites/add/$', views.site_add, name='site_add'),
|
url(r'^sites/add/$', views.site_add, name='site_add'),
|
||||||
url(r'^sites/import/$', views.SiteBulkImportView.as_view(), name='site_import'),
|
url(r'^sites/import/$', views.SiteBulkImportView.as_view(), name='site_import'),
|
||||||
url(r'^sites/(?P<slug>[\w-]+)/$', views.site, name='site'),
|
url(r'^sites/(?P<slug>[\w-]+)/$', views.site, name='site'),
|
||||||
@ -15,7 +15,7 @@ urlpatterns = [
|
|||||||
url(r'^sites/(?P<slug>[\w-]+)/delete/$', views.site_delete, name='site_delete'),
|
url(r'^sites/(?P<slug>[\w-]+)/delete/$', views.site_delete, name='site_delete'),
|
||||||
|
|
||||||
# Racks
|
# Racks
|
||||||
url(r'^racks/$', views.rack_list, name='rack_list'),
|
url(r'^racks/$', views.RackListView.as_view(), name='rack_list'),
|
||||||
url(r'^racks/add/$', views.rack_add, name='rack_add'),
|
url(r'^racks/add/$', views.rack_add, name='rack_add'),
|
||||||
url(r'^racks/import/$', views.RackBulkImportView.as_view(), name='rack_import'),
|
url(r'^racks/import/$', views.RackBulkImportView.as_view(), name='rack_import'),
|
||||||
url(r'^racks/edit/$', views.RackBulkEditView.as_view(), name='rack_bulk_edit'),
|
url(r'^racks/edit/$', views.RackBulkEditView.as_view(), name='rack_bulk_edit'),
|
||||||
@ -25,7 +25,7 @@ urlpatterns = [
|
|||||||
url(r'^racks/(?P<pk>\d+)/delete/$', views.rack_delete, name='rack_delete'),
|
url(r'^racks/(?P<pk>\d+)/delete/$', views.rack_delete, name='rack_delete'),
|
||||||
|
|
||||||
# Devices
|
# Devices
|
||||||
url(r'^devices/$', views.device_list, name='device_list'),
|
url(r'^devices/$', views.DeviceListView.as_view(), name='device_list'),
|
||||||
url(r'^devices/add/$', views.device_add, name='device_add'),
|
url(r'^devices/add/$', views.device_add, name='device_add'),
|
||||||
url(r'^devices/import/$', views.DeviceBulkImportView.as_view(), name='device_import'),
|
url(r'^devices/import/$', views.DeviceBulkImportView.as_view(), name='device_import'),
|
||||||
url(r'^devices/edit/$', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
|
url(r'^devices/edit/$', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import permission_required
|
from django.contrib.auth.decorators import permission_required
|
||||||
from django.contrib.auth.mixins import PermissionRequiredMixin
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
||||||
@ -10,14 +9,11 @@ from django.http import HttpResponseRedirect
|
|||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.utils.http import urlencode
|
from django.utils.http import urlencode
|
||||||
|
|
||||||
from django_tables2 import RequestConfig
|
|
||||||
from extras.models import ExportTemplate
|
|
||||||
from utilities.error_handlers import handle_protectederror
|
|
||||||
from utilities.forms import ConfirmationForm
|
|
||||||
from utilities.paginator import EnhancedPaginator
|
|
||||||
from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView
|
|
||||||
from ipam.models import Prefix, IPAddress, VLAN
|
from ipam.models import Prefix, IPAddress, VLAN
|
||||||
from circuits.models import Circuit
|
from circuits.models import Circuit
|
||||||
|
from utilities.error_handlers import handle_protectederror
|
||||||
|
from utilities.forms import ConfirmationForm
|
||||||
|
from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView
|
||||||
|
|
||||||
from .filters import RackFilter, DeviceFilter, ConsoleConnectionFilter, PowerConnectionFilter, InterfaceConnectionFilter
|
from .filters import RackFilter, DeviceFilter, ConsoleConnectionFilter, PowerConnectionFilter, InterfaceConnectionFilter
|
||||||
from .forms import SiteForm, SiteImportForm, RackForm, RackImportForm, RackBulkEditForm, RackBulkDeleteForm, \
|
from .forms import SiteForm, SiteImportForm, RackForm, RackImportForm, RackBulkEditForm, RackBulkDeleteForm, \
|
||||||
@ -64,25 +60,10 @@ def expand_pattern(string):
|
|||||||
# Sites
|
# Sites
|
||||||
#
|
#
|
||||||
|
|
||||||
def site_list(request):
|
class SiteListView(ObjectListView):
|
||||||
|
|
||||||
queryset = Site.objects.all()
|
queryset = Site.objects.all()
|
||||||
|
table = SiteTable
|
||||||
# Export
|
template_name = 'dcim/site_list.html'
|
||||||
if 'export' in request.GET:
|
|
||||||
et = get_object_or_404(ExportTemplate, content_type__model='site', name=request.GET.get('export'))
|
|
||||||
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_sites')
|
|
||||||
return response
|
|
||||||
|
|
||||||
site_table = SiteTable(queryset)
|
|
||||||
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(site_table)
|
|
||||||
|
|
||||||
export_templates = ExportTemplate.objects.filter(content_type__model='site')
|
|
||||||
|
|
||||||
return render(request, 'dcim/site_list.html', {
|
|
||||||
'site_table': site_table,
|
|
||||||
'export_templates': export_templates,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def site(request, slug):
|
def site(request, slug):
|
||||||
@ -184,34 +165,14 @@ class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|||||||
# Racks
|
# Racks
|
||||||
#
|
#
|
||||||
|
|
||||||
def rack_list(request):
|
class RackListView(ObjectListView):
|
||||||
|
|
||||||
queryset = Rack.objects.select_related('site').annotate(device_count=Count('devices', distinct=True))
|
queryset = Rack.objects.select_related('site').annotate(device_count=Count('devices', distinct=True))
|
||||||
queryset = RackFilter(request.GET, queryset).qs
|
filter = RackFilter
|
||||||
|
filter_form = RackFilterForm
|
||||||
# Export
|
table = RackTable
|
||||||
if 'export' in request.GET:
|
edit_table = RackBulkEditTable
|
||||||
et = get_object_or_404(ExportTemplate, content_type__model='rack', name=request.GET.get('export'))
|
edit_table_permissions = ['dcim.change_rack', 'dcim.delete_rack']
|
||||||
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_racks')
|
template_name = 'dcim/rack_list.html'
|
||||||
return response
|
|
||||||
|
|
||||||
# Hot-wire direct to rack view if only one rack was returned
|
|
||||||
if queryset.count() == 1:
|
|
||||||
return redirect('dcim:rack', pk=queryset[0].pk)
|
|
||||||
|
|
||||||
if request.user.has_perm('dcim.change_rack') or request.user.has_perm('dcim.delete_rack'):
|
|
||||||
rack_table = RackBulkEditTable(queryset)
|
|
||||||
else:
|
|
||||||
rack_table = RackTable(queryset)
|
|
||||||
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(rack_table)
|
|
||||||
|
|
||||||
export_templates = ExportTemplate.objects.filter(content_type__model='rack')
|
|
||||||
|
|
||||||
return render(request, 'dcim/rack_list.html', {
|
|
||||||
'rack_table': rack_table,
|
|
||||||
'export_templates': export_templates,
|
|
||||||
'filter_form': RackFilterForm(request.GET, label_suffix=''),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def rack(request, pk):
|
def rack(request, pk):
|
||||||
@ -350,34 +311,15 @@ class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|||||||
# Devices
|
# Devices
|
||||||
#
|
#
|
||||||
|
|
||||||
def device_list(request):
|
class DeviceListView(ObjectListView):
|
||||||
|
queryset = Device.objects.select_related('device_type', 'device_type__manufacturer', 'device_role', 'rack',
|
||||||
queryset = Device.objects.select_related('device_type', 'device_type__manufacturer', 'device_role', 'rack', 'rack__site', 'primary_ip')
|
'rack__site', 'primary_ip')
|
||||||
queryset = DeviceFilter(request.GET, queryset).qs
|
filter = DeviceFilter
|
||||||
|
filter_form = DeviceFilterForm
|
||||||
# Export
|
table = DeviceTable
|
||||||
if 'export' in request.GET:
|
edit_table = DeviceBulkEditTable
|
||||||
et = get_object_or_404(ExportTemplate, content_type__model='device', name=request.GET.get('export'))
|
edit_table_permissions = ['dcim.change_device', 'dcim.delete_device']
|
||||||
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_devices')
|
template_name = 'dcim/device_list.html'
|
||||||
return response
|
|
||||||
|
|
||||||
# Hot-wire direct to device view if only one device was returned
|
|
||||||
if queryset.count() == 1:
|
|
||||||
return redirect('dcim:device', pk=queryset[0].pk)
|
|
||||||
|
|
||||||
if request.user.has_perm('dcim.change_device') or request.user.has_perm('dcim.delete_device'):
|
|
||||||
device_table = DeviceBulkEditTable(queryset)
|
|
||||||
else:
|
|
||||||
device_table = DeviceTable(queryset)
|
|
||||||
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(device_table)
|
|
||||||
|
|
||||||
export_templates = ExportTemplate.objects.filter(content_type__model='device')
|
|
||||||
|
|
||||||
return render(request, 'dcim/device_list.html', {
|
|
||||||
'device_table': device_table,
|
|
||||||
'export_templates': export_templates,
|
|
||||||
'filter_form': DeviceFilterForm(request.GET, label_suffix=''),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
def device(request, pk):
|
def device(request, pk):
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
<h1>Devices</h1>
|
<h1>Devices</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
{% include 'dcim/inc/device_table.html' with table=device_table %}
|
{% include 'dcim/inc/device_table.html' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
<h1>Racks</h1>
|
<h1>Racks</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
{% include 'dcim/inc/rack_table.html' with table=rack_table %}
|
{% include 'dcim/inc/rack_table.html' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
@ -26,5 +26,5 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<h1>Sites</h1>
|
<h1>Sites</h1>
|
||||||
{% render_table site_table 'table.html' %}
|
{% render_table table 'table.html' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -2,11 +2,12 @@ from django.conf import settings
|
|||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.admin.views.decorators import staff_member_required
|
from django.contrib.admin.views.decorators import staff_member_required
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.template import TemplateSyntaxError
|
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import transaction, IntegrityError
|
from django.db import transaction, IntegrityError
|
||||||
from django.db.models import ProtectedError
|
from django.db.models import ProtectedError
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
|
from django.template import TemplateSyntaxError
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.generic import View
|
from django.views.generic import View
|
||||||
|
|
||||||
@ -22,7 +23,10 @@ class ObjectListView(View):
|
|||||||
filter = None
|
filter = None
|
||||||
filter_form = None
|
filter_form = None
|
||||||
table = None
|
table = None
|
||||||
|
edit_table = None
|
||||||
|
edit_table_permissions = []
|
||||||
template_name = None
|
template_name = None
|
||||||
|
redirect_on_single_result = True
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
|
||||||
@ -31,7 +35,7 @@ class ObjectListView(View):
|
|||||||
if self.filter:
|
if self.filter:
|
||||||
self.queryset = self.filter(request.GET, self.queryset).qs
|
self.queryset = self.filter(request.GET, self.queryset).qs
|
||||||
|
|
||||||
# Export
|
# Check for export template rendering
|
||||||
if request.GET.get('export'):
|
if request.GET.get('export'):
|
||||||
et = get_object_or_404(ExportTemplate, content_type=object_ct, name=request.GET.get('export'))
|
et = get_object_or_404(ExportTemplate, content_type=object_ct, name=request.GET.get('export'))
|
||||||
try:
|
try:
|
||||||
@ -41,6 +45,17 @@ class ObjectListView(View):
|
|||||||
except TemplateSyntaxError:
|
except TemplateSyntaxError:
|
||||||
messages.error(request, "There was an error rendering the selected export template ({}).".format(et.name))
|
messages.error(request, "There was an error rendering the selected export template ({}).".format(et.name))
|
||||||
|
|
||||||
|
# Attempt to redirect automatically if the query returns a single result
|
||||||
|
if self.redirect_on_single_result and self.queryset.count() == 1:
|
||||||
|
try:
|
||||||
|
return HttpResponseRedirect(self.queryset[0].get_absolute_url())
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Construct the table based on the user's permissions
|
||||||
|
if any([request.user.has_perm(perm) for perm in self.edit_table_permissions]):
|
||||||
|
table = self.edit_table(self.queryset)
|
||||||
|
else:
|
||||||
table = self.table(self.queryset)
|
table = self.table(self.queryset)
|
||||||
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
|
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
|
||||||
.configure(table)
|
.configure(table)
|
||||||
|
Reference in New Issue
Block a user