views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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, 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. 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  84. 'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  85. 'ipaddress_count': IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  86. 'vlan_count': VLAN.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  87. 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  88. 'virtualmachine_count': VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  89. 'cluster_count': Cluster.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  90. 'cable_count': Cable.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  91. 'asn_count': ASN.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
  92. }
  93. return {
  94. 'stats': stats,
  95. }
  96. class TenantEditView(generic.ObjectEditView):
  97. queryset = Tenant.objects.all()
  98. form = forms.TenantForm
  99. class TenantDeleteView(generic.ObjectDeleteView):
  100. queryset = Tenant.objects.all()
  101. class TenantBulkImportView(generic.BulkImportView):
  102. queryset = Tenant.objects.all()
  103. model_form = forms.TenantCSVForm
  104. table = tables.TenantTable
  105. class TenantBulkEditView(generic.BulkEditView):
  106. queryset = Tenant.objects.prefetch_related('group')
  107. filterset = filtersets.TenantFilterSet
  108. table = tables.TenantTable
  109. form = forms.TenantBulkEditForm
  110. class TenantBulkDeleteView(generic.BulkDeleteView):
  111. queryset = Tenant.objects.prefetch_related('group')
  112. filterset = filtersets.TenantFilterSet
  113. table = tables.TenantTable
  114. #
  115. # Contact groups
  116. #
  117. class ContactGroupListView(generic.ObjectListView):
  118. queryset = ContactGroup.objects.add_related_count(
  119. ContactGroup.objects.all(),
  120. Contact,
  121. 'group',
  122. 'contact_count',
  123. cumulative=True
  124. )
  125. filterset = filtersets.ContactGroupFilterSet
  126. filterset_form = forms.ContactGroupFilterForm
  127. table = tables.ContactGroupTable
  128. class ContactGroupView(generic.ObjectView):
  129. queryset = ContactGroup.objects.all()
  130. def get_extra_context(self, request, instance):
  131. child_groups = ContactGroup.objects.add_related_count(
  132. ContactGroup.objects.all(),
  133. Contact,
  134. 'group',
  135. 'contact_count',
  136. cumulative=True
  137. ).restrict(request.user, 'view').filter(
  138. parent__in=instance.get_descendants(include_self=True)
  139. )
  140. child_groups_table = tables.ContactGroupTable(child_groups)
  141. child_groups_table.columns.hide('actions')
  142. contacts = Contact.objects.restrict(request.user, 'view').filter(
  143. group=instance
  144. )
  145. contacts_table = tables.ContactTable(contacts, user=request.user, exclude=('group',))
  146. contacts_table.configure(request)
  147. return {
  148. 'child_groups_table': child_groups_table,
  149. 'contacts_table': contacts_table,
  150. }
  151. class ContactGroupEditView(generic.ObjectEditView):
  152. queryset = ContactGroup.objects.all()
  153. form = forms.ContactGroupForm
  154. class ContactGroupDeleteView(generic.ObjectDeleteView):
  155. queryset = ContactGroup.objects.all()
  156. class ContactGroupBulkImportView(generic.BulkImportView):
  157. queryset = ContactGroup.objects.all()
  158. model_form = forms.ContactGroupCSVForm
  159. table = tables.ContactGroupTable
  160. class ContactGroupBulkEditView(generic.BulkEditView):
  161. queryset = ContactGroup.objects.add_related_count(
  162. ContactGroup.objects.all(),
  163. Contact,
  164. 'group',
  165. 'contact_count',
  166. cumulative=True
  167. )
  168. filterset = filtersets.ContactGroupFilterSet
  169. table = tables.ContactGroupTable
  170. form = forms.ContactGroupBulkEditForm
  171. class ContactGroupBulkDeleteView(generic.BulkDeleteView):
  172. queryset = ContactGroup.objects.add_related_count(
  173. ContactGroup.objects.all(),
  174. Contact,
  175. 'group',
  176. 'contact_count',
  177. cumulative=True
  178. )
  179. table = tables.ContactGroupTable
  180. #
  181. # Contact roles
  182. #
  183. class ContactRoleListView(generic.ObjectListView):
  184. queryset = ContactRole.objects.all()
  185. filterset = filtersets.ContactRoleFilterSet
  186. filterset_form = forms.ContactRoleFilterForm
  187. table = tables.ContactRoleTable
  188. class ContactRoleView(generic.ObjectView):
  189. queryset = ContactRole.objects.all()
  190. def get_extra_context(self, request, instance):
  191. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  192. role=instance
  193. )
  194. contacts_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  195. contacts_table.columns.hide('role')
  196. contacts_table.configure(request)
  197. return {
  198. 'contacts_table': contacts_table,
  199. 'assignment_count': ContactAssignment.objects.filter(role=instance).count(),
  200. }
  201. class ContactRoleEditView(generic.ObjectEditView):
  202. queryset = ContactRole.objects.all()
  203. form = forms.ContactRoleForm
  204. class ContactRoleDeleteView(generic.ObjectDeleteView):
  205. queryset = ContactRole.objects.all()
  206. class ContactRoleBulkImportView(generic.BulkImportView):
  207. queryset = ContactRole.objects.all()
  208. model_form = forms.ContactRoleCSVForm
  209. table = tables.ContactRoleTable
  210. class ContactRoleBulkEditView(generic.BulkEditView):
  211. queryset = ContactRole.objects.all()
  212. filterset = filtersets.ContactRoleFilterSet
  213. table = tables.ContactRoleTable
  214. form = forms.ContactRoleBulkEditForm
  215. class ContactRoleBulkDeleteView(generic.BulkDeleteView):
  216. queryset = ContactRole.objects.all()
  217. table = tables.ContactRoleTable
  218. #
  219. # Contacts
  220. #
  221. class ContactListView(generic.ObjectListView):
  222. queryset = Contact.objects.annotate(
  223. assignment_count=count_related(ContactAssignment, 'contact')
  224. )
  225. filterset = filtersets.ContactFilterSet
  226. filterset_form = forms.ContactFilterForm
  227. table = tables.ContactTable
  228. class ContactView(generic.ObjectView):
  229. queryset = Contact.objects.all()
  230. def get_extra_context(self, request, instance):
  231. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  232. contact=instance
  233. )
  234. assignments_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  235. assignments_table.columns.hide('contact')
  236. assignments_table.configure(request)
  237. return {
  238. 'assignments_table': assignments_table,
  239. 'assignment_count': ContactAssignment.objects.filter(contact=instance).count(),
  240. }
  241. class ContactEditView(generic.ObjectEditView):
  242. queryset = Contact.objects.all()
  243. form = forms.ContactForm
  244. class ContactDeleteView(generic.ObjectDeleteView):
  245. queryset = Contact.objects.all()
  246. class ContactBulkImportView(generic.BulkImportView):
  247. queryset = Contact.objects.all()
  248. model_form = forms.ContactCSVForm
  249. table = tables.ContactTable
  250. class ContactBulkEditView(generic.BulkEditView):
  251. queryset = Contact.objects.prefetch_related('group')
  252. filterset = filtersets.ContactFilterSet
  253. table = tables.ContactTable
  254. form = forms.ContactBulkEditForm
  255. class ContactBulkDeleteView(generic.BulkDeleteView):
  256. queryset = Contact.objects.prefetch_related('group')
  257. filterset = filtersets.ContactFilterSet
  258. table = tables.ContactTable
  259. #
  260. # Contact assignments
  261. #
  262. class ContactAssignmentEditView(generic.ObjectEditView):
  263. queryset = ContactAssignment.objects.all()
  264. form = forms.ContactAssignmentForm
  265. template_name = 'tenancy/contactassignment_edit.html'
  266. def alter_object(self, instance, request, args, kwargs):
  267. if not instance.pk:
  268. # Assign the object based on URL kwargs
  269. content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type'))
  270. instance.object = get_object_or_404(content_type.model_class(), pk=request.GET.get('object_id'))
  271. return instance
  272. class ContactAssignmentDeleteView(generic.ObjectDeleteView):
  273. queryset = ContactAssignment.objects.all()