views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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. class TenantGroupBulkEditView(generic.BulkEditView):
  50. queryset = TenantGroup.objects.add_related_count(
  51. TenantGroup.objects.all(),
  52. Tenant,
  53. 'group',
  54. 'tenant_count',
  55. cumulative=True
  56. )
  57. filterset = filtersets.TenantGroupFilterSet
  58. table = tables.TenantGroupTable
  59. form = forms.TenantGroupBulkEditForm
  60. class TenantGroupBulkDeleteView(generic.BulkDeleteView):
  61. queryset = TenantGroup.objects.add_related_count(
  62. TenantGroup.objects.all(),
  63. Tenant,
  64. 'group',
  65. 'tenant_count',
  66. cumulative=True
  67. )
  68. table = tables.TenantGroupTable
  69. #
  70. # Tenants
  71. #
  72. class TenantListView(generic.ObjectListView):
  73. queryset = Tenant.objects.all()
  74. filterset = filtersets.TenantFilterSet
  75. filterset_form = forms.TenantFilterForm
  76. table = tables.TenantTable
  77. @register_model_view(Tenant)
  78. class TenantView(generic.ObjectView):
  79. queryset = Tenant.objects.all()
  80. def get_extra_context(self, request, instance):
  81. related_models = [
  82. # DCIM
  83. (Site.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  84. (Rack.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  85. (RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  86. (Location.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  87. (Device.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  88. (VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  89. (Cable.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  90. # IPAM
  91. (VRF.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  92. (Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  93. (Prefix.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  94. (IPRange.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  95. (IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  96. (ASN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  97. (VLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  98. (L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  99. # Circuits
  100. (Circuit.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  101. # Virtualization
  102. (VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  103. (Cluster.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  104. # Wireless
  105. (WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  106. (WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
  107. ]
  108. return {
  109. 'related_models': related_models,
  110. }
  111. @register_model_view(Tenant, 'edit')
  112. class TenantEditView(generic.ObjectEditView):
  113. queryset = Tenant.objects.all()
  114. form = forms.TenantForm
  115. @register_model_view(Tenant, 'delete')
  116. class TenantDeleteView(generic.ObjectDeleteView):
  117. queryset = Tenant.objects.all()
  118. class TenantBulkImportView(generic.BulkImportView):
  119. queryset = Tenant.objects.all()
  120. model_form = forms.TenantImportForm
  121. class TenantBulkEditView(generic.BulkEditView):
  122. queryset = Tenant.objects.all()
  123. filterset = filtersets.TenantFilterSet
  124. table = tables.TenantTable
  125. form = forms.TenantBulkEditForm
  126. class TenantBulkDeleteView(generic.BulkDeleteView):
  127. queryset = Tenant.objects.all()
  128. filterset = filtersets.TenantFilterSet
  129. table = tables.TenantTable
  130. #
  131. # Contact groups
  132. #
  133. class ContactGroupListView(generic.ObjectListView):
  134. queryset = ContactGroup.objects.add_related_count(
  135. ContactGroup.objects.all(),
  136. Contact,
  137. 'group',
  138. 'contact_count',
  139. cumulative=True
  140. )
  141. filterset = filtersets.ContactGroupFilterSet
  142. filterset_form = forms.ContactGroupFilterForm
  143. table = tables.ContactGroupTable
  144. @register_model_view(ContactGroup)
  145. class ContactGroupView(generic.ObjectView):
  146. queryset = ContactGroup.objects.all()
  147. def get_extra_context(self, request, instance):
  148. groups = instance.get_descendants(include_self=True)
  149. related_models = (
  150. (Contact.objects.restrict(request.user, 'view').filter(group__in=groups), 'group_id'),
  151. )
  152. return {
  153. 'related_models': related_models,
  154. }
  155. @register_model_view(ContactGroup, 'edit')
  156. class ContactGroupEditView(generic.ObjectEditView):
  157. queryset = ContactGroup.objects.all()
  158. form = forms.ContactGroupForm
  159. @register_model_view(ContactGroup, 'delete')
  160. class ContactGroupDeleteView(generic.ObjectDeleteView):
  161. queryset = ContactGroup.objects.all()
  162. class ContactGroupBulkImportView(generic.BulkImportView):
  163. queryset = ContactGroup.objects.all()
  164. model_form = forms.ContactGroupImportForm
  165. class ContactGroupBulkEditView(generic.BulkEditView):
  166. queryset = ContactGroup.objects.add_related_count(
  167. ContactGroup.objects.all(),
  168. Contact,
  169. 'group',
  170. 'contact_count',
  171. cumulative=True
  172. )
  173. filterset = filtersets.ContactGroupFilterSet
  174. table = tables.ContactGroupTable
  175. form = forms.ContactGroupBulkEditForm
  176. class ContactGroupBulkDeleteView(generic.BulkDeleteView):
  177. queryset = ContactGroup.objects.add_related_count(
  178. ContactGroup.objects.all(),
  179. Contact,
  180. 'group',
  181. 'contact_count',
  182. cumulative=True
  183. )
  184. table = tables.ContactGroupTable
  185. #
  186. # Contact roles
  187. #
  188. class ContactRoleListView(generic.ObjectListView):
  189. queryset = ContactRole.objects.all()
  190. filterset = filtersets.ContactRoleFilterSet
  191. filterset_form = forms.ContactRoleFilterForm
  192. table = tables.ContactRoleTable
  193. @register_model_view(ContactRole)
  194. class ContactRoleView(generic.ObjectView):
  195. queryset = ContactRole.objects.all()
  196. def get_extra_context(self, request, instance):
  197. related_models = (
  198. (ContactAssignment.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
  199. )
  200. return {
  201. 'related_models': related_models,
  202. }
  203. @register_model_view(ContactRole, 'edit')
  204. class ContactRoleEditView(generic.ObjectEditView):
  205. queryset = ContactRole.objects.all()
  206. form = forms.ContactRoleForm
  207. @register_model_view(ContactRole, 'delete')
  208. class ContactRoleDeleteView(generic.ObjectDeleteView):
  209. queryset = ContactRole.objects.all()
  210. class ContactRoleBulkImportView(generic.BulkImportView):
  211. queryset = ContactRole.objects.all()
  212. model_form = forms.ContactRoleImportForm
  213. class ContactRoleBulkEditView(generic.BulkEditView):
  214. queryset = ContactRole.objects.all()
  215. filterset = filtersets.ContactRoleFilterSet
  216. table = tables.ContactRoleTable
  217. form = forms.ContactRoleBulkEditForm
  218. class ContactRoleBulkDeleteView(generic.BulkDeleteView):
  219. queryset = ContactRole.objects.all()
  220. table = tables.ContactRoleTable
  221. #
  222. # Contacts
  223. #
  224. class ContactListView(generic.ObjectListView):
  225. queryset = Contact.objects.annotate(
  226. assignment_count=count_related(ContactAssignment, 'contact')
  227. )
  228. filterset = filtersets.ContactFilterSet
  229. filterset_form = forms.ContactFilterForm
  230. table = tables.ContactTable
  231. @register_model_view(Contact)
  232. class ContactView(generic.ObjectView):
  233. queryset = Contact.objects.all()
  234. @register_model_view(Contact, 'edit')
  235. class ContactEditView(generic.ObjectEditView):
  236. queryset = Contact.objects.all()
  237. form = forms.ContactForm
  238. @register_model_view(Contact, 'delete')
  239. class ContactDeleteView(generic.ObjectDeleteView):
  240. queryset = Contact.objects.all()
  241. class ContactBulkImportView(generic.BulkImportView):
  242. queryset = Contact.objects.all()
  243. model_form = forms.ContactImportForm
  244. class ContactBulkEditView(generic.BulkEditView):
  245. queryset = Contact.objects.annotate(
  246. assignment_count=count_related(ContactAssignment, 'contact')
  247. )
  248. filterset = filtersets.ContactFilterSet
  249. table = tables.ContactTable
  250. form = forms.ContactBulkEditForm
  251. class ContactBulkDeleteView(generic.BulkDeleteView):
  252. queryset = Contact.objects.annotate(
  253. assignment_count=count_related(ContactAssignment, 'contact')
  254. )
  255. filterset = filtersets.ContactFilterSet
  256. table = tables.ContactTable
  257. #
  258. # Contact assignments
  259. #
  260. class ContactAssignmentListView(generic.ObjectListView):
  261. queryset = ContactAssignment.objects.all()
  262. filterset = filtersets.ContactAssignmentFilterSet
  263. filterset_form = forms.ContactAssignmentFilterForm
  264. table = tables.ContactAssignmentTable
  265. actions = ('export', 'bulk_delete')
  266. @register_model_view(ContactAssignment, 'edit')
  267. class ContactAssignmentEditView(generic.ObjectEditView):
  268. queryset = ContactAssignment.objects.all()
  269. form = forms.ContactAssignmentForm
  270. template_name = 'tenancy/contactassignment_edit.html'
  271. def alter_object(self, instance, request, args, kwargs):
  272. if not instance.pk:
  273. # Assign the object based on URL kwargs
  274. content_type = get_object_or_404(ContentType, pk=request.GET.get('content_type'))
  275. instance.object = get_object_or_404(content_type.model_class(), pk=request.GET.get('object_id'))
  276. return instance
  277. def get_extra_addanother_params(self, request):
  278. return {
  279. 'content_type': request.GET.get('content_type'),
  280. 'object_id': request.GET.get('object_id'),
  281. }
  282. class ContactAssignmentBulkDeleteView(generic.BulkDeleteView):
  283. queryset = ContactAssignment.objects.all()
  284. filterset = filtersets.ContactAssignmentFilterSet
  285. table = tables.ContactAssignmentTable
  286. @register_model_view(ContactAssignment, 'delete')
  287. class ContactAssignmentDeleteView(generic.ObjectDeleteView):
  288. queryset = ContactAssignment.objects.all()