From 17cecb0d0bcb5ef462eaad40b030d49958a773e4 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 11 Jun 2025 14:58:49 -0700 Subject: [PATCH 1/7] 19529 fix custom script path --- netbox/extras/forms/scripts.py | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/netbox/extras/forms/scripts.py b/netbox/extras/forms/scripts.py index c237b9991dd..5f9820b44e2 100644 --- a/netbox/extras/forms/scripts.py +++ b/netbox/extras/forms/scripts.py @@ -1,13 +1,8 @@ -import os - +from core.choices import JobIntervalChoices +from core.forms import ManagedFileForm from django import forms -from django.conf import settings from django.core.files.storage import storages from django.utils.translation import gettext_lazy as _ - -from core.choices import JobIntervalChoices -from core.forms import ManagedFileForm -from extras.storage import ScriptFileSystemStorage from utilities.datetime import local_now from utilities.forms.widgets import DateTimePicker, NumberWithOptions @@ -74,12 +69,7 @@ def save(self, *args, **kwargs): storage = storages.create_storage(storages.backends["scripts"]) filename = self.cleaned_data['upload_file'].name - if isinstance(storage, ScriptFileSystemStorage): - full_path = os.path.join(settings.SCRIPTS_ROOT, filename) - else: - full_path = filename - - self.instance.file_path = full_path + self.instance.file_path = filename data = self.cleaned_data['upload_file'] storage.save(filename, data) From 39d7ca42fb91b5a2f42512173051f2c382c8b87b Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 12 Jun 2025 07:56:51 -0700 Subject: [PATCH 2/7] 19529 fix custom script path --- .../migrations/0129_fix_script_paths.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 netbox/extras/migrations/0129_fix_script_paths.py diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py new file mode 100644 index 00000000000..4c016178ec4 --- /dev/null +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.core.files.storage import storages +from django.db import migrations + +from extras.storage import ScriptFileSystemStorage + + +def fix_script_paths(apps, schema_editor): + """ + Fix script paths for scripts that had incorrect path from NB 4.3. + """ + storage = storages.create_storage(storages.backends["scripts"]) + if not isinstance(storage, ScriptFileSystemStorage): + return + + ScriptModule = apps.get_model('extras', 'ScriptModule') + for script in ScriptModule.objects.all(): + if script.file_path.startswith(settings.SCRIPTS_ROOT): + script.file_path = script.file_path[len(settings.SCRIPTS_ROOT):] + script.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0128_tableconfig'), + ] + + operations = [ + migrations.RunPython(code=fix_script_paths, reverse_code=migrations.RunPython.noop), + ] From 2ece669bde13a06f87eeec7a601625584cd64416 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 12 Jun 2025 08:10:50 -0700 Subject: [PATCH 3/7] 19529 fix custom script path --- netbox/extras/migrations/0129_fix_script_paths.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index 4c016178ec4..de330d75af3 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -1,10 +1,15 @@ from django.conf import settings from django.core.files.storage import storages from django.db import migrations +from urllib.parse import urlparse from extras.storage import ScriptFileSystemStorage +def normalize(url): + return url if urlparse(url).path else url + "/" + + def fix_script_paths(apps, schema_editor): """ Fix script paths for scripts that had incorrect path from NB 4.3. @@ -14,9 +19,10 @@ def fix_script_paths(apps, schema_editor): return ScriptModule = apps.get_model('extras', 'ScriptModule') + script_root_path = normalize(settings.SCRIPTS_ROOT) for script in ScriptModule.objects.all(): - if script.file_path.startswith(settings.SCRIPTS_ROOT): - script.file_path = script.file_path[len(settings.SCRIPTS_ROOT):] + if script.file_path.startswith(script_root_path): + script.file_path = script.file_path[len(script_root_path):] script.save() From 24b1cb929771ff18044588bc42bda7a4d1507878 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 12 Jun 2025 08:14:57 -0700 Subject: [PATCH 4/7] 19529 fix custom script path --- netbox/extras/migrations/0129_fix_script_paths.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index de330d75af3..88f57634cf4 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -7,7 +7,10 @@ def normalize(url): - return url if urlparse(url).path else url + "/" + parsed_url = urlparse(url) + if not parsed_url.path.endswith('/'): + return url + '/' + return url def fix_script_paths(apps, schema_editor): From 2a4ba5bd362f4a1d638c1216e2f10c416ad80ca7 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 15:26:39 -0700 Subject: [PATCH 5/7] 19680 add object_change migrator --- .../extras/migrations/0129_fix_script_paths.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index 88f57634cf4..047a13f5717 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -38,3 +38,20 @@ class Migration(migrations.Migration): operations = [ migrations.RunPython(code=fix_script_paths, reverse_code=migrations.RunPython.noop), ] + + +def oc_fix_script_paths(objectchange, reverting): + script_root_path = normalize(settings.SCRIPTS_ROOT) + + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + + if file_path := data.get('file_path'): + if file_path.startswith(script_root_path): + data['file_path'] = file_path[len(script_root_path):] + + +objectchange_migrators = { + 'extras.scriptmodule': oc_fix_script_paths, +} From ee873d922bafb3b91c0712f3a92b4bbea765cab8 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 15:29:01 -0700 Subject: [PATCH 6/7] 19680 optimize migration --- netbox/extras/migrations/0129_fix_script_paths.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index 047a13f5717..0e0ed5dcf8d 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -23,10 +23,9 @@ def fix_script_paths(apps, schema_editor): ScriptModule = apps.get_model('extras', 'ScriptModule') script_root_path = normalize(settings.SCRIPTS_ROOT) - for script in ScriptModule.objects.all(): - if script.file_path.startswith(script_root_path): - script.file_path = script.file_path[len(script_root_path):] - script.save() + for script in ScriptModule.object.filter(file_path__startswith=script_root_path): + script.file_path = script.file_path[len(script_root_path):] + script.save() class Migration(migrations.Migration): From a6bbc0b5cf96c5a0814ec38b194ee334cf8abee9 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 15:31:21 -0700 Subject: [PATCH 7/7] 19680 optimize migration --- netbox/extras/migrations/0129_fix_script_paths.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/migrations/0129_fix_script_paths.py b/netbox/extras/migrations/0129_fix_script_paths.py index 0e0ed5dcf8d..1ac8af6d851 100644 --- a/netbox/extras/migrations/0129_fix_script_paths.py +++ b/netbox/extras/migrations/0129_fix_script_paths.py @@ -23,7 +23,7 @@ def fix_script_paths(apps, schema_editor): ScriptModule = apps.get_model('extras', 'ScriptModule') script_root_path = normalize(settings.SCRIPTS_ROOT) - for script in ScriptModule.object.filter(file_path__startswith=script_root_path): + for script in ScriptModule.objects.filter(file_path__startswith=script_root_path): script.file_path = script.file_path[len(script_root_path):] script.save()