diff --git a/netbox/core/models/files.py b/netbox/core/models/files.py index 5a321bdc3..7b626a441 100644 --- a/netbox/core/models/files.py +++ b/netbox/core/models/files.py @@ -89,6 +89,9 @@ class ManagedFile(SyncedDataMixin, models.Model): def clean(self): super().clean() + if self.data_file and not self.file_path: + self.file_path = os.path.basename(self.data_path) + # Ensure that the file root and path make a unique pair if self._meta.model.objects.filter(file_root=self.file_root, file_path=self.file_path).exclude(pk=self.pk).exists(): raise ValidationError( diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index e857e59b7..551a8b4f0 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -108,7 +108,7 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile): def __str__(self): return self.python_name - @cached_property + @property def module_scripts(self): def _get_name(cls): @@ -137,9 +137,13 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile): Syncs the file-based module to the database, adding and removing individual Script objects in the database as needed. """ - db_classes = { - script.name: script for script in self.scripts.all() - } + if self.id: + db_classes = { + script.name: script for script in self.scripts.all() + } + else: + db_classes = {} + db_classes_set = set(db_classes.keys()) module_classes_set = set(self.module_scripts.keys()) @@ -158,10 +162,10 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile): def sync_data(self): super().sync_data() - self.sync_classes() def save(self, *args, **kwargs): self.file_root = ManagedFileRootPathChoices.SCRIPTS + self.sync_classes() return super().save(*args, **kwargs)