Skip to content

Commit a9af541

Browse files
authored
Fixes #19529: fix CLI running of scripts (#19698)
* 19529 fix custom script path * 19529 fix custom script path * 19529 fix custom script path * 19529 fix custom script path * 19680 add object_change migrator * 19680 optimize migration * 19680 optimize migration
1 parent f706572 commit a9af541

File tree

2 files changed

+59
-13
lines changed

2 files changed

+59
-13
lines changed

netbox/extras/forms/scripts.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
import os
2-
1+
from core.choices import JobIntervalChoices
2+
from core.forms import ManagedFileForm
33
from django import forms
4-
from django.conf import settings
54
from django.core.files.storage import storages
65
from django.utils.translation import gettext_lazy as _
7-
8-
from core.choices import JobIntervalChoices
9-
from core.forms import ManagedFileForm
10-
from extras.storage import ScriptFileSystemStorage
116
from utilities.datetime import local_now
127
from utilities.forms.widgets import DateTimePicker, NumberWithOptions
138

@@ -74,12 +69,7 @@ def save(self, *args, **kwargs):
7469
storage = storages.create_storage(storages.backends["scripts"])
7570

7671
filename = self.cleaned_data['upload_file'].name
77-
if isinstance(storage, ScriptFileSystemStorage):
78-
full_path = os.path.join(settings.SCRIPTS_ROOT, filename)
79-
else:
80-
full_path = filename
81-
82-
self.instance.file_path = full_path
72+
self.instance.file_path = filename
8373
data = self.cleaned_data['upload_file']
8474
storage.save(filename, data)
8575

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from django.conf import settings
2+
from django.core.files.storage import storages
3+
from django.db import migrations
4+
from urllib.parse import urlparse
5+
6+
from extras.storage import ScriptFileSystemStorage
7+
8+
9+
def normalize(url):
10+
parsed_url = urlparse(url)
11+
if not parsed_url.path.endswith('/'):
12+
return url + '/'
13+
return url
14+
15+
16+
def fix_script_paths(apps, schema_editor):
17+
"""
18+
Fix script paths for scripts that had incorrect path from NB 4.3.
19+
"""
20+
storage = storages.create_storage(storages.backends["scripts"])
21+
if not isinstance(storage, ScriptFileSystemStorage):
22+
return
23+
24+
ScriptModule = apps.get_model('extras', 'ScriptModule')
25+
script_root_path = normalize(settings.SCRIPTS_ROOT)
26+
for script in ScriptModule.objects.filter(file_path__startswith=script_root_path):
27+
script.file_path = script.file_path[len(script_root_path):]
28+
script.save()
29+
30+
31+
class Migration(migrations.Migration):
32+
33+
dependencies = [
34+
('extras', '0128_tableconfig'),
35+
]
36+
37+
operations = [
38+
migrations.RunPython(code=fix_script_paths, reverse_code=migrations.RunPython.noop),
39+
]
40+
41+
42+
def oc_fix_script_paths(objectchange, reverting):
43+
script_root_path = normalize(settings.SCRIPTS_ROOT)
44+
45+
for data in (objectchange.prechange_data, objectchange.postchange_data):
46+
if data is None:
47+
continue
48+
49+
if file_path := data.get('file_path'):
50+
if file_path.startswith(script_root_path):
51+
data['file_path'] = file_path[len(script_root_path):]
52+
53+
54+
objectchange_migrators = {
55+
'extras.scriptmodule': oc_fix_script_paths,
56+
}

0 commit comments

Comments
 (0)