views.py 13 KB

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