diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index cadf7912d..10c9e63f3 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -98,3 +98,12 @@ class ManagedFileForm(SyncedDataMixin, NetBoxModelForm): raise forms.ValidationError("Cannot upload a file and sync from an existing file") return self.cleaned_data + + def save(self, *args, **kwargs): + # If a file was uploaded, save it to disk + if self.cleaned_data['upload_file']: + self.instance.file_path = self.cleaned_data['upload_file'].name + with open(self.instance.full_path, 'wb+') as new_file: + new_file.write(self.cleaned_data['upload_file'].read()) + + return super().save(*args, **kwargs) diff --git a/netbox/core/models/files.py b/netbox/core/models/files.py index a080d30c8..f17d58cb4 100644 --- a/netbox/core/models/files.py +++ b/netbox/core/models/files.py @@ -74,11 +74,14 @@ class ManagedFile(SyncedDataMixin, models.Model): def sync_data(self): if self.data_file: - self.file_path = self.data_path + self.file_path = os.path.basename(self.data_path) self.data_file.write_to_disk(self.full_path, overwrite=True) def delete(self, *args, **kwargs): # Delete file from disk - os.remove(self.full_path) + try: + os.remove(self.full_path) + except FileNotFoundError: + pass return super().delete(*args, **kwargs) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index fcd60462c..30fb14462 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -850,7 +850,7 @@ class ScriptModuleManager(models.Manager.from_queryset(RestrictedQuerySet)): return super().get_queryset().filter(file_root='scripts') -class ScriptModule(JobResultsMixin, WebhooksMixin, PythonModuleMixin, ManagedFile): +class ScriptModule(PythonModuleMixin, ManagedFile): """ Proxy model for script module files. """ @@ -901,7 +901,7 @@ class ReportModuleManager(models.Manager.from_queryset(RestrictedQuerySet)): return super().get_queryset().filter(file_root='reports') -class ReportModule(JobResultsMixin, WebhooksMixin, PythonModuleMixin, ManagedFile): +class ReportModule(PythonModuleMixin, ManagedFile): """ Proxy model for report module files. """ diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index c838ee759..c56eabeda 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -94,7 +94,7 @@ urlpatterns = [ # Reports path('reports/', views.ReportListView.as_view(), name='report_list'), - path('reports/add/', views.ScriptModuleCreateView.as_view(), name='reportmodule_add'), + path('reports/add/', views.ReportModuleCreateView.as_view(), name='reportmodule_add'), path('reports/results//', views.ReportResultView.as_view(), name='report_result'), path('reports//', include(get_model_urls('extras', 'reportmodule'))), path('reports/./', views.ReportView.as_view(), name='report'), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0a441b6fd..d58d3716f 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -827,7 +827,7 @@ class ReportListView(ContentTypePermissionRequiredMixin, View): } return render(request, 'extras/report_list.html', { - 'model': ScriptModule, + 'model': ReportModule, 'report_modules': report_modules, 'job_results': job_results, })