views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.shortcuts import get_object_or_404
  3. from circuits.models import Circuit
  4. from dcim.models import Cable, Device, Location, Rack, RackReservation, Site
  5. from ipam.models import Aggregate, IPAddress, IPRange, Prefix, VLAN, VRF, ASN
  6. from netbox.views import generic
  7. from utilities.utils import count_related
  8. from virtualization.models import VirtualMachine, Cluster
  9. from . import filtersets, forms, tables
  10. from .models import *
  11. #
  12. # Tenant groups
  13. #
  14. class TenantGroupListView(generic.ObjectListView):
  15. queryset = TenantGroup.objects.add_related_count(
  16. TenantGroup.objects.all(),
  17. Tenant,
  18. 'group',
  19. 'tenant_count',
  20. cumulative=True
  21. )
  22. filterset = filtersets.TenantGroupFilterSet
  23. filterset_form = forms.TenantGroupFilterForm
  24. table = tables.TenantGroupTable
  25. class TenantGroupView(generic.ObjectView):
  26. queryset = TenantGroup.objects.all()
  27. def get_extra_context(self, request, instance):
  28. tenants = Tenant.objects.restrict(request.user, 'view').filter(
  29. group=instance
  30. )
  31. tenants_table = tables.TenantTable(tenants, user=request.user, exclude=('group',))
  32. tenants_table.configure(request)
  33. return {
  34. 'tenants_table': tenants_table,
  35. }
  36. class TenantGroupEditView(generic.ObjectEditView):
  37. queryset = TenantGroup.objects.all()
  38. form = forms.TenantGroupForm
  39. class TenantGroupDeleteView(generic.ObjectDeleteView):
  40. queryset = TenantGroup.objects.all()
  41. class TenantGroupBulkImportView(generic.BulkImportView):
  42. queryset = TenantGroup.objects.all()
  43. model_form = forms.TenantGroupCSVForm
  44. table = tables.TenantGroupTable
  45. class TenantGroupBulkEditView(generic.BulkEditView):
  46. queryset = TenantGroup.objects.add_related_count(
  47. TenantGroup.objects.all(),
  48. Tenant,
  49. 'group',
  50. 'tenant_count',
  51. cumulative=True
  52. )
  53. filterset = filtersets.TenantGroupFilterSet
  54. table = tables.TenantGroupTable
  55. form = forms.TenantGroupBulkEditForm
  56. class TenantGroupBulkDeleteView(generic.BulkDeleteView):
  57. queryset = TenantGroup.objects.add_related_count(
  58. TenantGroup.objects.all(),
  59. Tenant,
  60. 'group',
  61. 'tenant_count',
  62. cumulative=True
  63. )
  64. table = tables.TenantGroupTable
  65. #
  66. # Tenants
  67. #
  68. class TenantListView(generic.ObjectListView):
  69. queryset = Tenant.objects.all()
  70. filterset = filtersets.TenantFilterSet
  71. filterset_form = forms.TenantFilterForm
  72. table = tables.TenantTable
  73. class TenantView(generic.ObjectView):
  74. queryset = Tenant.objects.prefetch_related('group')
  75. def get_extra_context(self, request, instance):
  76. stats = {
  77. 'site_count': Site.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  78. 'rack_count': Rack.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  79. 'rackreservation_count': RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  80. 'location_count': Location.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  81. 'device_count': Device.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  82. 'vrf_count': VRF.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  83. 'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  84. 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  85. 'iprange_count': IPRange.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  86. 'ipaddress_count': IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  87. 'vlan_count': VLAN.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  88. 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  89. 'virtualmachine_count': VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  90. 'cluster_count': Cluster.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  91. 'cable_count': Cable.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  92. 'asn_count': ASN.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  93. }
  94. return {
  95. 'stats': stats,
  96. }
  97. class TenantEditView(generic.ObjectEditView):
  98. queryset = Tenant.objects.all()
  99. form = forms.TenantForm
  100. class TenantDeleteView(generic.ObjectDeleteView):
  101. queryset = Tenant.objects.all()
  102. class TenantBulkImportView(generic.BulkImportView):
  103. queryset = Tenant.objects.all()
  104. model_form = forms.TenantCSVForm
  105. table = tables.TenantTable
  106. class TenantBulkEditView(generic.BulkEditView):
  107. queryset = Tenant.objects.prefetch_related('group')
  108. filterset = filtersets.TenantFilterSet
  109. table = tables.TenantTable
  110. form = forms.TenantBulkEditForm
  111. class TenantBulkDeleteView(generic.BulkDeleteView):
  112. queryset = Tenant.objects.prefetch_related('group')
  113. filterset = filtersets.TenantFilterSet
  114. table = tables.TenantTable
  115. #
  116. # Contact groups
  117. #
  118. class ContactGroupListView(generic.ObjectListView):
  119. queryset = ContactGroup.objects.add_related_count(
  120. ContactGroup.objects.all(),
  121. Contact,
  122. 'group',
  123. 'contact_count',
  124. cumulative=True
  125. )
  126. filterset = filtersets.ContactGroupFilterSet
  127. filterset_form = forms.ContactGroupFilterForm
  128. table = tables.ContactGroupTable
  129. class ContactGroupView(generic.ObjectView):
  130. queryset = ContactGroup.objects.all()
  131. def get_extra_context(self, request, instance):
  132. child_groups = ContactGroup.objects.add_related_count(
  133. ContactGroup.objects.all(),
  134. Contact,
  135. 'group',
  136. 'contact_count',
  137. cumulative=True
  138. ).restrict(request.user, 'view').filter(
  139. parent__in=instance.get_descendants(include_self=True)
  140. )
  141. child_groups_table = tables.ContactGroupTable(child_groups)
  142. child_groups_table.columns.hide('actions')
  143. contacts = Contact.objects.restrict(request.user, 'view').filter(
  144. group=instance
  145. )
  146. contacts_table = tables.ContactTable(contacts, user=request.user, exclude=('group',))
  147. contacts_table.configure(request)
  148. return {
  149. 'child_groups_table': child_groups_table,
  150. 'contacts_table': contacts_table,
  151. }
  152. class ContactGroupEditView(generic.ObjectEditView):
  153. queryset = ContactGroup.objects.all()
  154. form = forms.ContactGroupForm
  155. class ContactGroupDeleteView(generic.ObjectDeleteView):
  156. queryset = ContactGroup.objects.all()
  157. class ContactGroupBulkImportView(generic.BulkImportView):
  158. queryset = ContactGroup.objects.all()
  159. model_form = forms.ContactGroupCSVForm
  160. table = tables.ContactGroupTable
  161. class ContactGroupBulkEditView(generic.BulkEditView):
  162. queryset = ContactGroup.objects.add_related_count(
  163. ContactGroup.objects.all(),
  164. Contact,
  165. 'group',
  166. 'contact_count',
  167. cumulative=True
  168. )
  169. filterset = filtersets.ContactGroupFilterSet
  170. table = tables.ContactGroupTable
  171. form = forms.ContactGroupBulkEditForm
  172. class ContactGroupBulkDeleteView(generic.BulkDeleteView):
  173. queryset = ContactGroup.objects.add_related_count(
  174. ContactGroup.objects.all(),
  175. Contact,
  176. 'group',
  177. 'contact_count',
  178. cumulative=True
  179. )
  180. table = tables.ContactGroupTable
  181. #
  182. # Contact roles
  183. #
  184. class ContactRoleListView(generic.ObjectListView):
  185. queryset = ContactRole.objects.all()
  186. filterset = filtersets.ContactRoleFilterSet
  187. filterset_form = forms.ContactRoleFilterForm
  188. table = tables.ContactRoleTable
  189. class ContactRoleView(generic.ObjectView):
  190. queryset = ContactRole.objects.all()
  191. def get_extra_context(self, request, instance):
  192. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  193. role=instance
  194. )
  195. contacts_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  196. contacts_table.columns.hide('role')
  197. contacts_table.configure(request)
  198. return {
  199. 'contacts_table': contacts_table,
  200. 'assignment_count': ContactAssignment.objects.filter(role=instance).count(),
  201. }
  202. class ContactRoleEditView(generic.ObjectEditView):
  203. queryset = ContactRole.objects.all()
  204. form = forms.ContactRoleForm
  205. class ContactRoleDeleteView(generic.ObjectDeleteView):
  206. queryset = ContactRole.objects.all()
  207. class ContactRoleBulkImportView(generic.BulkImportView):
  208. queryset = ContactRole.objects.all()
  209. model_form = forms.ContactRoleCSVForm
  210. table = tables.ContactRoleTable
  211. class ContactRoleBulkEditView(generic.BulkEditView):
  212. queryset = ContactRole.objects.all()
  213. filterset = filtersets.ContactRoleFilterSet
  214. table = tables.ContactRoleTable
  215. form = forms.ContactRoleBulkEditForm
  216. class ContactRoleBulkDeleteView(generic.BulkDeleteView):
  217. queryset = ContactRole.objects.all()
  218. table = tables.ContactRoleTable
  219. #
  220. # Contacts
  221. #
  222. class ContactListView(generic.ObjectListView):
  223. queryset = Contact.objects.annotate(
  224. assignment_count=count_related(ContactAssignment, 'contact')
  225. )
  226. filterset = filtersets.ContactFilterSet
  227. filterset_form = forms.ContactFilterForm
  228. table = tables.ContactTable
  229. class ContactView(generic.ObjectView):
  230. queryset = Contact.objects.all()
  231. def get_extra_context(self, request, instance):
  232. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  233. contact=instance
  234. )
  235. assignments_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  236. assignments_table.columns.hide('contact')
  237. assignments_table.configure(request)
  238. return {
  239. 'assignments_table': assignments_table,
  240. 'assignment_count': ContactAssignment.objects.filter(contact=instance).count(),
  241. }
  242. class ContactEditView(generic.ObjectEditView):
  243. queryset = Contact.objects.all()
  244. form = forms.ContactForm
  245. class ContactDeleteView(generic.ObjectDeleteView):
  246. queryset = Contact.objects.all()
  247. class ContactBulkImportView(generic.BulkImportView):
  248. queryset = Contact.objects.all()
  249. model_form = forms.ContactCSVForm
  250. table = tables.ContactTable
  251. class ContactBulkEditView(generic.BulkEditView):
  252. queryset = Contact.objects.prefetch_related('group')
  253. filterset = filtersets.ContactFilterSet
  254. table = tables.ContactTable
  255. form = forms.ContactBulkEditForm
  256. class ContactBulkDeleteView(generic.BulkDeleteView):
  257. queryset = Contact.objects.prefetch_related('group')
  258. filterset = filtersets.ContactFilterSet
  259. table = tables.ContactTable
  260. #
  261. # Contact assignments
  262. #
  263. class ContactAssignmentEditView(generic.ObjectEditView):
  264. queryset = ContactAssignment.objects.all()
  265. form = forms.ContactAssignmentForm
  266. template_name = 'tenancy/contactassignment_edit.html'
  267. def alter_object(self, instance, request, args, kwargs):
  268. if not instance.pk:
  269. # Assign the object based on URL kwargs
  270. content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type'))
  271. instance.object = get_object_or_404(content_type.model_class(), pk=request.GET.get('object_id'))
  272. return instance
  273. class ContactAssignmentDeleteView(generic.ObjectDeleteView):
  274. queryset = ContactAssignment.objects.all()