views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.shortcuts import get_object_or_404
  3. from django.utils.translation import gettext_lazy as _
  4. from netbox.views import generic
  5. from utilities.query import count_related
  6. from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view
  7. from . import filtersets, forms, tables
  8. from .models import *
  9. class ObjectContactsView(generic.ObjectChildrenView):
  10. child_model = ContactAssignment
  11. table = tables.ContactAssignmentTable
  12. filterset = filtersets.ContactAssignmentFilterSet
  13. filterset_form = forms.ContactAssignmentFilterForm
  14. template_name = 'tenancy/object_contacts.html'
  15. tab = ViewTab(
  16. label=_('Contacts'),
  17. badge=lambda obj: obj.contacts.count(),
  18. permission='tenancy.view_contactassignment',
  19. weight=5000
  20. )
  21. def get_children(self, request, parent):
  22. return ContactAssignment.objects.restrict(request.user, 'view').filter(
  23. object_type=ContentType.objects.get_for_model(parent),
  24. object_id=parent.pk
  25. ).order_by('priority', 'contact', 'role')
  26. def get_table(self, *args, **kwargs):
  27. table = super().get_table(*args, **kwargs)
  28. # Hide object columns
  29. table.columns.hide('object_type')
  30. table.columns.hide('object')
  31. return table
  32. #
  33. # Tenant groups
  34. #
  35. @register_model_view(TenantGroup, 'list', path='', detail=False)
  36. class TenantGroupListView(generic.ObjectListView):
  37. queryset = TenantGroup.objects.add_related_count(
  38. TenantGroup.objects.all(),
  39. Tenant,
  40. 'group',
  41. 'tenant_count',
  42. cumulative=True
  43. )
  44. filterset = filtersets.TenantGroupFilterSet
  45. filterset_form = forms.TenantGroupFilterForm
  46. table = tables.TenantGroupTable
  47. @register_model_view(TenantGroup)
  48. class TenantGroupView(GetRelatedModelsMixin, generic.ObjectView):
  49. queryset = TenantGroup.objects.all()
  50. def get_extra_context(self, request, instance):
  51. groups = instance.get_descendants(include_self=True)
  52. return {
  53. 'related_models': self.get_related_models(request, groups),
  54. }
  55. @register_model_view(TenantGroup, 'add', detail=False)
  56. @register_model_view(TenantGroup, 'edit')
  57. class TenantGroupEditView(generic.ObjectEditView):
  58. queryset = TenantGroup.objects.all()
  59. form = forms.TenantGroupForm
  60. @register_model_view(TenantGroup, 'delete')
  61. class TenantGroupDeleteView(generic.ObjectDeleteView):
  62. queryset = TenantGroup.objects.all()
  63. @register_model_view(TenantGroup, 'bulk_import', detail=False)
  64. class TenantGroupBulkImportView(generic.BulkImportView):
  65. queryset = TenantGroup.objects.all()
  66. model_form = forms.TenantGroupImportForm
  67. @register_model_view(TenantGroup, 'bulk_edit', path='edit', detail=False)
  68. class TenantGroupBulkEditView(generic.BulkEditView):
  69. queryset = TenantGroup.objects.add_related_count(
  70. TenantGroup.objects.all(),
  71. Tenant,
  72. 'group',
  73. 'tenant_count',
  74. cumulative=True
  75. )
  76. filterset = filtersets.TenantGroupFilterSet
  77. table = tables.TenantGroupTable
  78. form = forms.TenantGroupBulkEditForm
  79. @register_model_view(TenantGroup, 'bulk_delete', path='delete', detail=False)
  80. class TenantGroupBulkDeleteView(generic.BulkDeleteView):
  81. queryset = TenantGroup.objects.add_related_count(
  82. TenantGroup.objects.all(),
  83. Tenant,
  84. 'group',
  85. 'tenant_count',
  86. cumulative=True
  87. )
  88. filterset = filtersets.TenantGroupFilterSet
  89. table = tables.TenantGroupTable
  90. #
  91. # Tenants
  92. #
  93. @register_model_view(Tenant, 'list', path='', detail=False)
  94. class TenantListView(generic.ObjectListView):
  95. queryset = Tenant.objects.all()
  96. filterset = filtersets.TenantFilterSet
  97. filterset_form = forms.TenantFilterForm
  98. table = tables.TenantTable
  99. @register_model_view(Tenant)
  100. class TenantView(GetRelatedModelsMixin, generic.ObjectView):
  101. queryset = Tenant.objects.all()
  102. def get_extra_context(self, request, instance):
  103. return {
  104. 'related_models': self.get_related_models(request, instance),
  105. }
  106. @register_model_view(Tenant, 'add', detail=False)
  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. @register_model_view(Tenant, 'bulk_import', detail=False)
  115. class TenantBulkImportView(generic.BulkImportView):
  116. queryset = Tenant.objects.all()
  117. model_form = forms.TenantImportForm
  118. @register_model_view(Tenant, 'bulk_edit', path='edit', detail=False)
  119. class TenantBulkEditView(generic.BulkEditView):
  120. queryset = Tenant.objects.all()
  121. filterset = filtersets.TenantFilterSet
  122. table = tables.TenantTable
  123. form = forms.TenantBulkEditForm
  124. @register_model_view(Tenant, 'bulk_delete', path='delete', detail=False)
  125. class TenantBulkDeleteView(generic.BulkDeleteView):
  126. queryset = Tenant.objects.all()
  127. filterset = filtersets.TenantFilterSet
  128. table = tables.TenantTable
  129. @register_model_view(Tenant, 'contacts')
  130. class TenantContactsView(ObjectContactsView):
  131. queryset = Tenant.objects.all()
  132. #
  133. # Contact groups
  134. #
  135. @register_model_view(ContactGroup, 'list', path='', detail=False)
  136. class ContactGroupListView(generic.ObjectListView):
  137. queryset = ContactGroup.objects.add_related_count(
  138. ContactGroup.objects.all(),
  139. Contact,
  140. 'group',
  141. 'contact_count',
  142. cumulative=True
  143. )
  144. filterset = filtersets.ContactGroupFilterSet
  145. filterset_form = forms.ContactGroupFilterForm
  146. table = tables.ContactGroupTable
  147. @register_model_view(ContactGroup)
  148. class ContactGroupView(GetRelatedModelsMixin, generic.ObjectView):
  149. queryset = ContactGroup.objects.all()
  150. def get_extra_context(self, request, instance):
  151. groups = instance.get_descendants(include_self=True)
  152. return {
  153. 'related_models': self.get_related_models(request, groups),
  154. }
  155. @register_model_view(ContactGroup, 'add', detail=False)
  156. @register_model_view(ContactGroup, 'edit')
  157. class ContactGroupEditView(generic.ObjectEditView):
  158. queryset = ContactGroup.objects.all()
  159. form = forms.ContactGroupForm
  160. @register_model_view(ContactGroup, 'delete')
  161. class ContactGroupDeleteView(generic.ObjectDeleteView):
  162. queryset = ContactGroup.objects.all()
  163. @register_model_view(ContactGroup, 'bulk_import', detail=False)
  164. class ContactGroupBulkImportView(generic.BulkImportView):
  165. queryset = ContactGroup.objects.all()
  166. model_form = forms.ContactGroupImportForm
  167. @register_model_view(ContactGroup, 'bulk_edit', path='edit', detail=False)
  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. @register_model_view(ContactGroup, 'bulk_delete', path='delete', detail=False)
  180. class ContactGroupBulkDeleteView(generic.BulkDeleteView):
  181. queryset = ContactGroup.objects.add_related_count(
  182. ContactGroup.objects.all(),
  183. Contact,
  184. 'group',
  185. 'contact_count',
  186. cumulative=True
  187. )
  188. filterset = filtersets.ContactGroupFilterSet
  189. table = tables.ContactGroupTable
  190. #
  191. # Contact roles
  192. #
  193. @register_model_view(ContactRole, 'list', path='', detail=False)
  194. class ContactRoleListView(generic.ObjectListView):
  195. queryset = ContactRole.objects.all()
  196. filterset = filtersets.ContactRoleFilterSet
  197. filterset_form = forms.ContactRoleFilterForm
  198. table = tables.ContactRoleTable
  199. @register_model_view(ContactRole)
  200. class ContactRoleView(GetRelatedModelsMixin, generic.ObjectView):
  201. queryset = ContactRole.objects.all()
  202. def get_extra_context(self, request, instance):
  203. return {
  204. 'related_models': self.get_related_models(request, instance),
  205. }
  206. @register_model_view(ContactRole, 'add', detail=False)
  207. @register_model_view(ContactRole, 'edit')
  208. class ContactRoleEditView(generic.ObjectEditView):
  209. queryset = ContactRole.objects.all()
  210. form = forms.ContactRoleForm
  211. @register_model_view(ContactRole, 'delete')
  212. class ContactRoleDeleteView(generic.ObjectDeleteView):
  213. queryset = ContactRole.objects.all()
  214. @register_model_view(ContactRole, 'bulk_import', detail=False)
  215. class ContactRoleBulkImportView(generic.BulkImportView):
  216. queryset = ContactRole.objects.all()
  217. model_form = forms.ContactRoleImportForm
  218. @register_model_view(ContactRole, 'bulk_edit', path='edit', detail=False)
  219. class ContactRoleBulkEditView(generic.BulkEditView):
  220. queryset = ContactRole.objects.all()
  221. filterset = filtersets.ContactRoleFilterSet
  222. table = tables.ContactRoleTable
  223. form = forms.ContactRoleBulkEditForm
  224. @register_model_view(ContactRole, 'bulk_delete', path='delete', detail=False)
  225. class ContactRoleBulkDeleteView(generic.BulkDeleteView):
  226. queryset = ContactRole.objects.all()
  227. filterset = filtersets.ContactRoleFilterSet
  228. table = tables.ContactRoleTable
  229. #
  230. # Contacts
  231. #
  232. @register_model_view(Contact, 'list', path='', detail=False)
  233. class ContactListView(generic.ObjectListView):
  234. queryset = Contact.objects.annotate(
  235. assignment_count=count_related(ContactAssignment, 'contact')
  236. )
  237. filterset = filtersets.ContactFilterSet
  238. filterset_form = forms.ContactFilterForm
  239. table = tables.ContactTable
  240. @register_model_view(Contact)
  241. class ContactView(generic.ObjectView):
  242. queryset = Contact.objects.all()
  243. @register_model_view(Contact, 'add', detail=False)
  244. @register_model_view(Contact, 'edit')
  245. class ContactEditView(generic.ObjectEditView):
  246. queryset = Contact.objects.all()
  247. form = forms.ContactForm
  248. @register_model_view(Contact, 'delete')
  249. class ContactDeleteView(generic.ObjectDeleteView):
  250. queryset = Contact.objects.all()
  251. @register_model_view(Contact, 'bulk_import', detail=False)
  252. class ContactBulkImportView(generic.BulkImportView):
  253. queryset = Contact.objects.all()
  254. model_form = forms.ContactImportForm
  255. @register_model_view(Contact, 'bulk_edit', path='edit', detail=False)
  256. class ContactBulkEditView(generic.BulkEditView):
  257. queryset = Contact.objects.annotate(
  258. assignment_count=count_related(ContactAssignment, 'contact')
  259. )
  260. filterset = filtersets.ContactFilterSet
  261. table = tables.ContactTable
  262. form = forms.ContactBulkEditForm
  263. @register_model_view(Contact, 'bulk_delete', path='delete', detail=False)
  264. class ContactBulkDeleteView(generic.BulkDeleteView):
  265. queryset = Contact.objects.annotate(
  266. assignment_count=count_related(ContactAssignment, 'contact')
  267. )
  268. filterset = filtersets.ContactFilterSet
  269. table = tables.ContactTable
  270. #
  271. # Contact assignments
  272. #
  273. @register_model_view(ContactAssignment, 'list', path='', detail=False)
  274. class ContactAssignmentListView(generic.ObjectListView):
  275. queryset = ContactAssignment.objects.all()
  276. filterset = filtersets.ContactAssignmentFilterSet
  277. filterset_form = forms.ContactAssignmentFilterForm
  278. table = tables.ContactAssignmentTable
  279. actions = {
  280. 'export': {'view'},
  281. 'bulk_import': {'add'},
  282. 'bulk_edit': {'change'},
  283. 'bulk_delete': {'delete'},
  284. }
  285. @register_model_view(ContactAssignment, 'add', detail=False)
  286. @register_model_view(ContactAssignment, 'edit')
  287. class ContactAssignmentEditView(generic.ObjectEditView):
  288. queryset = ContactAssignment.objects.all()
  289. form = forms.ContactAssignmentForm
  290. def alter_object(self, instance, request, args, kwargs):
  291. if not instance.pk:
  292. # Assign the object based on URL kwargs
  293. object_type = get_object_or_404(ContentType, pk=request.GET.get('object_type'))
  294. instance.object = get_object_or_404(object_type.model_class(), pk=request.GET.get('object_id'))
  295. return instance
  296. def get_extra_addanother_params(self, request):
  297. return {
  298. 'object_type': request.GET.get('object_type'),
  299. 'object_id': request.GET.get('object_id'),
  300. }
  301. @register_model_view(ContactAssignment, 'bulk_import', detail=False)
  302. class ContactAssignmentBulkImportView(generic.BulkImportView):
  303. queryset = ContactAssignment.objects.all()
  304. model_form = forms.ContactAssignmentImportForm
  305. @register_model_view(ContactAssignment, 'bulk_edit', path='edit', detail=False)
  306. class ContactAssignmentBulkEditView(generic.BulkEditView):
  307. queryset = ContactAssignment.objects.all()
  308. filterset = filtersets.ContactAssignmentFilterSet
  309. table = tables.ContactAssignmentTable
  310. form = forms.ContactAssignmentBulkEditForm
  311. @register_model_view(ContactAssignment, 'bulk_delete', path='delete', detail=False)
  312. class ContactAssignmentBulkDeleteView(generic.BulkDeleteView):
  313. queryset = ContactAssignment.objects.all()
  314. filterset = filtersets.ContactAssignmentFilterSet
  315. table = tables.ContactAssignmentTable
  316. @register_model_view(ContactAssignment, 'delete')
  317. class ContactAssignmentDeleteView(generic.ObjectDeleteView):
  318. queryset = ContactAssignment.objects.all()