views.py 4.4 KB

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