views.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. from django.contrib import messages
  2. from django.shortcuts import get_object_or_404, redirect
  3. from netbox.views import generic
  4. from netbox.views.generic.base import BaseObjectView
  5. from utilities.rqworker import get_queue_for_model, get_workers_for_queue
  6. from utilities.utils import count_related
  7. from utilities.views import register_model_view
  8. from . import filtersets, forms, tables
  9. from .models import *
  10. #
  11. # Data sources
  12. #
  13. class DataSourceListView(generic.ObjectListView):
  14. queryset = DataSource.objects.annotate(
  15. file_count=count_related(DataFile, 'source')
  16. )
  17. filterset = filtersets.DataSourceFilterSet
  18. filterset_form = forms.DataSourceFilterForm
  19. table = tables.DataSourceTable
  20. @register_model_view(DataSource)
  21. class DataSourceView(generic.ObjectView):
  22. queryset = DataSource.objects.all()
  23. def get_extra_context(self, request, instance):
  24. related_models = (
  25. (DataFile.objects.restrict(request.user, 'view').filter(source=instance), 'source_id'),
  26. )
  27. queue_name = get_queue_for_model(DataSource)
  28. sync_enabled = bool(get_workers_for_queue(queue_name))
  29. return {
  30. 'sync_enabled': sync_enabled,
  31. 'related_models': related_models,
  32. }
  33. @register_model_view(DataSource, 'sync')
  34. class DataSourceSyncView(BaseObjectView):
  35. queryset = DataSource.objects.all()
  36. def get_required_permission(self):
  37. return 'core.sync_datasource'
  38. def get(self, request, pk):
  39. # Redirect GET requests to the object view
  40. datasource = get_object_or_404(self.queryset, pk=pk)
  41. return redirect(datasource.get_absolute_url())
  42. def post(self, request, pk):
  43. datasource = get_object_or_404(self.queryset, pk=pk)
  44. job_result = datasource.enqueue_sync_job(request)
  45. messages.success(request, f"Queued job #{job_result.pk} to sync {datasource}")
  46. return redirect(datasource.get_absolute_url())
  47. @register_model_view(DataSource, 'edit')
  48. class DataSourceEditView(generic.ObjectEditView):
  49. queryset = DataSource.objects.all()
  50. form = forms.DataSourceForm
  51. @register_model_view(DataSource, 'delete')
  52. class DataSourceDeleteView(generic.ObjectDeleteView):
  53. queryset = DataSource.objects.all()
  54. class DataSourceBulkImportView(generic.BulkImportView):
  55. queryset = DataSource.objects.all()
  56. model_form = forms.DataSourceImportForm
  57. class DataSourceBulkEditView(generic.BulkEditView):
  58. queryset = DataSource.objects.annotate(
  59. count_files=count_related(DataFile, 'source')
  60. )
  61. filterset = filtersets.DataSourceFilterSet
  62. table = tables.DataSourceTable
  63. form = forms.DataSourceBulkEditForm
  64. class DataSourceBulkDeleteView(generic.BulkDeleteView):
  65. queryset = DataSource.objects.annotate(
  66. count_files=count_related(DataFile, 'source')
  67. )
  68. filterset = filtersets.DataSourceFilterSet
  69. table = tables.DataSourceTable
  70. #
  71. # Data files
  72. #
  73. class DataFileListView(generic.ObjectListView):
  74. queryset = DataFile.objects.defer('data')
  75. filterset = filtersets.DataFileFilterSet
  76. filterset_form = forms.DataFileFilterForm
  77. table = tables.DataFileTable
  78. actions = ('bulk_delete',)
  79. @register_model_view(DataFile)
  80. class DataFileView(generic.ObjectView):
  81. queryset = DataFile.objects.all()
  82. @register_model_view(DataFile, 'delete')
  83. class DataFileDeleteView(generic.ObjectDeleteView):
  84. queryset = DataFile.objects.all()
  85. class DataFileBulkDeleteView(generic.BulkDeleteView):
  86. queryset = DataFile.objects.defer('data')
  87. filterset = filtersets.DataFileFilterSet
  88. table = tables.DataFileTable
  89. #
  90. # Jobs
  91. #
  92. class JobListView(generic.ObjectListView):
  93. queryset = Job.objects.all()
  94. filterset = filtersets.JobFilterSet
  95. filterset_form = forms.JobFilterForm
  96. table = tables.JobTable
  97. actions = ('export', 'delete', 'bulk_delete', )
  98. class JobDeleteView(generic.ObjectDeleteView):
  99. queryset = Job.objects.all()
  100. class JobBulkDeleteView(generic.BulkDeleteView):
  101. queryset = Job.objects.all()
  102. filterset = filtersets.JobFilterSet
  103. table = tables.JobTable