views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from __future__ import unicode_literals
  2. from django.contrib.auth.mixins import PermissionRequiredMixin
  3. from django.db.models import Count, Q
  4. from django.shortcuts import get_object_or_404, render
  5. from django.urls import reverse
  6. from django.views.generic import View
  7. from circuits.models import Circuit
  8. from dcim.models import Site, Rack, Device, RackReservation
  9. from ipam.models import IPAddress, Prefix, VLAN, VRF
  10. from utilities.views import (
  11. BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
  12. )
  13. from virtualization.models import VirtualMachine
  14. from . import filters, forms, tables
  15. from .models import Tenant, TenantGroup
  16. #
  17. # Tenant groups
  18. #
  19. class TenantGroupListView(ObjectListView):
  20. queryset = TenantGroup.objects.annotate(tenant_count=Count('tenants'))
  21. table = tables.TenantGroupTable
  22. template_name = 'tenancy/tenantgroup_list.html'
  23. class TenantGroupCreateView(PermissionRequiredMixin, ObjectEditView):
  24. permission_required = 'tenancy.add_tenantgroup'
  25. model = TenantGroup
  26. model_form = forms.TenantGroupForm
  27. def get_return_url(self, request, obj):
  28. return reverse('tenancy:tenantgroup_list')
  29. class TenantGroupEditView(TenantGroupCreateView):
  30. permission_required = 'tenancy.change_tenantgroup'
  31. class TenantGroupBulkImportView(PermissionRequiredMixin, BulkImportView):
  32. permission_required = 'tenancy.add_tenantgroup'
  33. model_form = forms.TenantGroupCSVForm
  34. table = tables.TenantGroupTable
  35. default_return_url = 'tenancy:tenantgroup_list'
  36. class TenantGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
  37. permission_required = 'tenancy.delete_tenantgroup'
  38. cls = TenantGroup
  39. queryset = TenantGroup.objects.annotate(tenant_count=Count('tenants'))
  40. table = tables.TenantGroupTable
  41. default_return_url = 'tenancy:tenantgroup_list'
  42. #
  43. # Tenants
  44. #
  45. class TenantListView(ObjectListView):
  46. queryset = Tenant.objects.select_related('group')
  47. filter = filters.TenantFilter
  48. filter_form = forms.TenantFilterForm
  49. table = tables.TenantTable
  50. template_name = 'tenancy/tenant_list.html'
  51. class TenantView(View):
  52. def get(self, request, slug):
  53. tenant = get_object_or_404(Tenant, slug=slug)
  54. stats = {
  55. 'site_count': Site.objects.filter(tenant=tenant).count(),
  56. 'rack_count': Rack.objects.filter(tenant=tenant).count(),
  57. 'rackreservation_count': RackReservation.objects.filter(tenant=tenant).count(),
  58. 'device_count': Device.objects.filter(tenant=tenant).count(),
  59. 'vrf_count': VRF.objects.filter(tenant=tenant).count(),
  60. 'prefix_count': Prefix.objects.filter(
  61. Q(tenant=tenant) |
  62. Q(tenant__isnull=True, vrf__tenant=tenant)
  63. ).count(),
  64. 'ipaddress_count': IPAddress.objects.filter(
  65. Q(tenant=tenant) |
  66. Q(tenant__isnull=True, vrf__tenant=tenant)
  67. ).count(),
  68. 'vlan_count': VLAN.objects.filter(tenant=tenant).count(),
  69. 'circuit_count': Circuit.objects.filter(tenant=tenant).count(),
  70. 'virtualmachine_count': VirtualMachine.objects.filter(tenant=tenant).count(),
  71. }
  72. return render(request, 'tenancy/tenant.html', {
  73. 'tenant': tenant,
  74. 'stats': stats,
  75. })
  76. class TenantCreateView(PermissionRequiredMixin, ObjectEditView):
  77. permission_required = 'tenancy.add_tenant'
  78. model = Tenant
  79. model_form = forms.TenantForm
  80. template_name = 'tenancy/tenant_edit.html'
  81. default_return_url = 'tenancy:tenant_list'
  82. class TenantEditView(TenantCreateView):
  83. permission_required = 'tenancy.change_tenant'
  84. class TenantDeleteView(PermissionRequiredMixin, ObjectDeleteView):
  85. permission_required = 'tenancy.delete_tenant'
  86. model = Tenant
  87. default_return_url = 'tenancy:tenant_list'
  88. class TenantBulkImportView(PermissionRequiredMixin, BulkImportView):
  89. permission_required = 'tenancy.add_tenant'
  90. model_form = forms.TenantCSVForm
  91. table = tables.TenantTable
  92. default_return_url = 'tenancy:tenant_list'
  93. class TenantBulkEditView(PermissionRequiredMixin, BulkEditView):
  94. permission_required = 'tenancy.change_tenant'
  95. cls = Tenant
  96. queryset = Tenant.objects.select_related('group')
  97. filter = filters.TenantFilter
  98. table = tables.TenantTable
  99. form = forms.TenantBulkEditForm
  100. default_return_url = 'tenancy:tenant_list'
  101. class TenantBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
  102. permission_required = 'tenancy.delete_tenant'
  103. cls = Tenant
  104. queryset = Tenant.objects.select_related('group')
  105. filter = filters.TenantFilter
  106. table = tables.TenantTable
  107. default_return_url = 'tenancy:tenant_list'