views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.shortcuts import get_object_or_404
  3. from django.utils.translation import gettext as _
  4. from circuits.models import Circuit
  5. from dcim.models import Cable, Device, Location, Rack, RackReservation, Site, VirtualDeviceContext
  6. from ipam.models import Aggregate, ASN, IPAddress, IPRange, L2VPN, Prefix, VLAN, VRF
  7. from netbox.views import generic
  8. from utilities.utils import count_related
  9. from utilities.views import register_model_view
  10. from virtualization.models import VirtualMachine, Cluster
  11. from wireless.models import WirelessLAN, WirelessLink
  12. from . import filtersets, forms, tables
  13. from .models import *
  14. #
  15. # Tenant groups
  16. #
  17. class TenantGroupListView(generic.ObjectListView):
  18. queryset = TenantGroup.objects.add_related_count(
  19. TenantGroup.objects.all(),
  20. Tenant,
  21. 'group',
  22. 'tenant_count',
  23. cumulative=True
  24. )
  25. filterset = filtersets.TenantGroupFilterSet
  26. filterset_form = forms.TenantGroupFilterForm
  27. table = tables.TenantGroupTable
  28. @register_model_view(TenantGroup)
  29. class TenantGroupView(generic.ObjectView):
  30. queryset = TenantGroup.objects.all()
  31. def get_extra_context(self, request, instance):
  32. groups = instance.get_descendants(include_self=True)
  33. related_models = (
  34. (Tenant.objects.restrict(request.user, 'view').filter(group__in=groups), 'group_id'),
  35. )
  36. return {
  37. 'related_models': related_models,
  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. related_models = [
  83. # DCIM
  84. (Site.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  85. (Rack.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  86. (RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  87. (Location.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  88. (Device.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  89. (VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  90. (Cable.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  91. # IPAM
  92. (VRF.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  93. (Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  94. (Prefix.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  95. (IPRange.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  96. (IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  97. (ASN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  98. (VLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  99. (L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  100. # Circuits
  101. (Circuit.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  102. # Virtualization
  103. (VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  104. (Cluster.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  105. # Wireless
  106. (WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  107. (WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  108. ]
  109. return {
  110. 'related_models': related_models,
  111. }
  112. @register_model_view(Tenant, 'edit')
  113. class TenantEditView(generic.ObjectEditView):
  114. queryset = Tenant.objects.all()
  115. form = forms.TenantForm
  116. @register_model_view(Tenant, 'delete')
  117. class TenantDeleteView(generic.ObjectDeleteView):
  118. queryset = Tenant.objects.all()
  119. class TenantBulkImportView(generic.BulkImportView):
  120. queryset = Tenant.objects.all()
  121. model_form = forms.TenantImportForm
  122. table = tables.TenantTable
  123. class TenantBulkEditView(generic.BulkEditView):
  124. queryset = Tenant.objects.all()
  125. filterset = filtersets.TenantFilterSet
  126. table = tables.TenantTable
  127. form = forms.TenantBulkEditForm
  128. class TenantBulkDeleteView(generic.BulkDeleteView):
  129. queryset = Tenant.objects.all()
  130. filterset = filtersets.TenantFilterSet
  131. table = tables.TenantTable
  132. #
  133. # Contact groups
  134. #
  135. class ContactGroupListView(generic.ObjectListView):
  136. queryset = ContactGroup.objects.add_related_count(
  137. ContactGroup.objects.all(),
  138. Contact,
  139. 'group',
  140. 'contact_count',
  141. cumulative=True
  142. )
  143. filterset = filtersets.ContactGroupFilterSet
  144. filterset_form = forms.ContactGroupFilterForm
  145. table = tables.ContactGroupTable
  146. @register_model_view(ContactGroup)
  147. class ContactGroupView(generic.ObjectView):
  148. queryset = ContactGroup.objects.all()
  149. def get_extra_context(self, request, instance):
  150. groups = instance.get_descendants(include_self=True)
  151. related_models = (
  152. (Contact.objects.restrict(request.user, 'view').filter(group__in=groups), 'group_id'),
  153. )
  154. return {
  155. 'related_models': related_models,
  156. }
  157. @register_model_view(ContactGroup, 'edit')
  158. class ContactGroupEditView(generic.ObjectEditView):
  159. queryset = ContactGroup.objects.all()
  160. form = forms.ContactGroupForm
  161. @register_model_view(ContactGroup, 'delete')
  162. class ContactGroupDeleteView(generic.ObjectDeleteView):
  163. queryset = ContactGroup.objects.all()
  164. class ContactGroupBulkImportView(generic.BulkImportView):
  165. queryset = ContactGroup.objects.all()
  166. model_form = forms.ContactGroupImportForm
  167. table = tables.ContactGroupTable
  168. class ContactGroupBulkEditView(generic.BulkEditView):
  169. queryset = ContactGroup.objects.add_related_count(
  170. ContactGroup.objects.all(),
  171. Contact,
  172. 'group',
  173. 'contact_count',
  174. cumulative=True
  175. )
  176. filterset = filtersets.ContactGroupFilterSet
  177. table = tables.ContactGroupTable
  178. form = forms.ContactGroupBulkEditForm
  179. class ContactGroupBulkDeleteView(generic.BulkDeleteView):
  180. queryset = ContactGroup.objects.add_related_count(
  181. ContactGroup.objects.all(),
  182. Contact,
  183. 'group',
  184. 'contact_count',
  185. cumulative=True
  186. )
  187. table = tables.ContactGroupTable
  188. #
  189. # Contact roles
  190. #
  191. class ContactRoleListView(generic.ObjectListView):
  192. queryset = ContactRole.objects.all()
  193. filterset = filtersets.ContactRoleFilterSet
  194. filterset_form = forms.ContactRoleFilterForm
  195. table = tables.ContactRoleTable
  196. @register_model_view(ContactRole)
  197. class ContactRoleView(generic.ObjectView):
  198. queryset = ContactRole.objects.all()
  199. def get_extra_context(self, request, instance):
  200. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  201. role=instance
  202. )
  203. contacts_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  204. contacts_table.columns.hide('role')
  205. contacts_table.configure(request)
  206. return {
  207. 'contacts_table': contacts_table,
  208. 'assignment_count': ContactAssignment.objects.filter(role=instance).count(),
  209. }
  210. @register_model_view(ContactRole, 'edit')
  211. class ContactRoleEditView(generic.ObjectEditView):
  212. queryset = ContactRole.objects.all()
  213. form = forms.ContactRoleForm
  214. @register_model_view(ContactRole, 'delete')
  215. class ContactRoleDeleteView(generic.ObjectDeleteView):
  216. queryset = ContactRole.objects.all()
  217. class ContactRoleBulkImportView(generic.BulkImportView):
  218. queryset = ContactRole.objects.all()
  219. model_form = forms.ContactRoleImportForm
  220. table = tables.ContactRoleTable
  221. class ContactRoleBulkEditView(generic.BulkEditView):
  222. queryset = ContactRole.objects.all()
  223. filterset = filtersets.ContactRoleFilterSet
  224. table = tables.ContactRoleTable
  225. form = forms.ContactRoleBulkEditForm
  226. class ContactRoleBulkDeleteView(generic.BulkDeleteView):
  227. queryset = ContactRole.objects.all()
  228. table = tables.ContactRoleTable
  229. #
  230. # Contacts
  231. #
  232. class ContactListView(generic.ObjectListView):
  233. queryset = Contact.objects.annotate(
  234. assignment_count=count_related(ContactAssignment, 'contact')
  235. )
  236. filterset = filtersets.ContactFilterSet
  237. filterset_form = forms.ContactFilterForm
  238. table = tables.ContactTable
  239. @register_model_view(Contact)
  240. class ContactView(generic.ObjectView):
  241. queryset = Contact.objects.all()
  242. def get_extra_context(self, request, instance):
  243. contact_assignments = ContactAssignment.objects.restrict(request.user, 'view').filter(
  244. contact=instance
  245. )
  246. assignments_table = tables.ContactAssignmentTable(contact_assignments, user=request.user)
  247. assignments_table.columns.hide('contact')
  248. assignments_table.configure(request)
  249. return {
  250. 'assignments_table': assignments_table,
  251. 'assignment_count': ContactAssignment.objects.filter(contact=instance).count(),
  252. }
  253. @register_model_view(Contact, 'edit')
  254. class ContactEditView(generic.ObjectEditView):
  255. queryset = Contact.objects.all()
  256. form = forms.ContactForm
  257. @register_model_view(Contact, 'delete')
  258. class ContactDeleteView(generic.ObjectDeleteView):
  259. queryset = Contact.objects.all()
  260. class ContactBulkImportView(generic.BulkImportView):
  261. queryset = Contact.objects.all()
  262. model_form = forms.ContactImportForm
  263. table = tables.ContactTable
  264. class ContactBulkEditView(generic.BulkEditView):
  265. queryset = Contact.objects.annotate(
  266. assignment_count=count_related(ContactAssignment, 'contact')
  267. )
  268. filterset = filtersets.ContactFilterSet
  269. table = tables.ContactTable
  270. form = forms.ContactBulkEditForm
  271. class ContactBulkDeleteView(generic.BulkDeleteView):
  272. queryset = Contact.objects.annotate(
  273. assignment_count=count_related(ContactAssignment, 'contact')
  274. )
  275. filterset = filtersets.ContactFilterSet
  276. table = tables.ContactTable
  277. #
  278. # Contact assignments
  279. #
  280. class ContactAssignmentListView(generic.ObjectListView):
  281. queryset = ContactAssignment.objects.all()
  282. filterset = filtersets.ContactAssignmentFilterSet
  283. filterset_form = forms.ContactAssignmentFilterForm
  284. table = tables.ContactAssignmentTable
  285. @register_model_view(ContactAssignment, 'edit')
  286. class ContactAssignmentEditView(generic.ObjectEditView):
  287. queryset = ContactAssignment.objects.all()
  288. form = forms.ContactAssignmentForm
  289. template_name = 'tenancy/contactassignment_edit.html'
  290. def alter_object(self, instance, request, args, kwargs):
  291. if not instance.pk:
  292. # Assign the object based on URL kwargs
  293. content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type'))
  294. instance.object = get_object_or_404(content_type.model_class(), pk=request.GET.get('object_id'))
  295. return instance
  296. def get_extra_addanother_params(self, request):
  297. return {
  298. 'content_type': request.GET.get('content_type'),
  299. 'object_id': request.GET.get('object_id'),
  300. }
  301. @register_model_view(ContactAssignment, 'delete')
  302. class ContactAssignmentDeleteView(generic.ObjectDeleteView):
  303. queryset = ContactAssignment.objects.all()