Skip to content

Commit f23d7e6

Browse files
author
Omripresent
committed
Add support loading module as python package or standalone file
1 parent bf1c191 commit f23d7e6

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

netbox/extras/scripts.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.conf import settings
1111
from django.core.validators import RegexValidator
1212
from django.db import transaction
13+
from django.db.models import Q
1314
from django.utils.functional import classproperty
1415

1516
from core.choices import JobStatusChoices
@@ -462,7 +463,7 @@ def is_variable(obj):
462463

463464

464465
def get_module_and_script(module_name, script_name):
465-
module = ScriptModule.objects.get(file_path=f'{module_name}.py')
466+
module = ScriptModule.objects.get(Q(file_path=f'{module_name}.py') | Q(file_path=f'{module_name}/__init__.py'))
466467
script = module.scripts.get(script_name)
467468
return module, script
468469

netbox/extras/views.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,7 @@ class ReportListView(ContentTypePermissionRequiredMixin, View):
855855
"""
856856
Retrieve all the available reports from disk and the recorded Job (if any) for each.
857857
"""
858+
858859
def get_required_permission(self):
859860
return 'extras.view_report'
860861

@@ -871,11 +872,15 @@ class ReportView(ContentTypePermissionRequiredMixin, View):
871872
"""
872873
Display a single Report and its associated Job (if any).
873874
"""
875+
874876
def get_required_permission(self):
875877
return 'extras.view_report'
876878

877879
def get(self, request, module, name):
878-
module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module)
880+
module = get_object_or_404(
881+
ReportModule.objects.restrict(request.user),
882+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py')
883+
)
879884
report = module.reports[name]()
880885

881886
object_type = ContentType.objects.get(app_label='extras', model='reportmodule')
@@ -896,7 +901,10 @@ def post(self, request, module, name):
896901
if not request.user.has_perm('extras.run_report'):
897902
return HttpResponseForbidden()
898903

899-
module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module)
904+
module = get_object_or_404(
905+
ReportModule.objects.restrict(request.user),
906+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
907+
)
900908
report = module.reports[name]()
901909
form = ReportForm(request.POST, scheduling_enabled=report.scheduling_enabled)
902910

@@ -935,7 +943,10 @@ def get_required_permission(self):
935943
return 'extras.view_report'
936944

937945
def get(self, request, module, name):
938-
module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module)
946+
module = get_object_or_404(
947+
ReportModule.objects.restrict(request.user),
948+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py')
949+
)
939950
report = module.reports[name]()
940951

941952
return render(request, 'extras/report/source.html', {
@@ -951,7 +962,10 @@ def get_required_permission(self):
951962
return 'extras.view_report'
952963

953964
def get(self, request, module, name):
954-
module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module)
965+
module = get_object_or_404(
966+
ReportModule.objects.restrict(request.user),
967+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
968+
)
955969
report = module.reports[name]()
956970

957971
object_type = ContentType.objects.get(app_label='extras', model='reportmodule')
@@ -980,6 +994,7 @@ class ReportResultView(ContentTypePermissionRequiredMixin, View):
980994
"""
981995
Display a Job pertaining to the execution of a Report.
982996
"""
997+
983998
def get_required_permission(self):
984999
return 'extras.view_report'
9851000

@@ -1046,7 +1061,10 @@ def get_required_permission(self):
10461061
return 'extras.view_script'
10471062

10481063
def get(self, request, module, name):
1049-
module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
1064+
module = get_object_or_404(
1065+
ScriptModule.objects.restrict(request.user),
1066+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
1067+
)
10501068
script = module.scripts[name]()
10511069
form = script.as_form(initial=normalize_querydict(request.GET))
10521070

@@ -1070,7 +1088,10 @@ def post(self, request, module, name):
10701088
if not request.user.has_perm('extras.run_script'):
10711089
return HttpResponseForbidden()
10721090

1073-
module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
1091+
module = get_object_or_404(
1092+
ScriptModule.objects.restrict(request.user),
1093+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
1094+
)
10741095
script = module.scripts[name]()
10751096
form = script.as_form(request.POST, request.FILES)
10761097

@@ -1107,7 +1128,10 @@ def get_required_permission(self):
11071128
return 'extras.view_script'
11081129

11091130
def get(self, request, module, name):
1110-
module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
1131+
module = get_object_or_404(
1132+
ScriptModule.objects.restrict(request.user),
1133+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
1134+
)
11111135
script = module.scripts[name]()
11121136

11131137
return render(request, 'extras/script/source.html', {
@@ -1123,7 +1147,10 @@ def get_required_permission(self):
11231147
return 'extras.view_script'
11241148

11251149
def get(self, request, module, name):
1126-
module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module)
1150+
module = get_object_or_404(
1151+
ScriptModule.objects.restrict(request.user),
1152+
Q(file_path=f'{module}.py') | Q(file_path=f'{module}/__init__.py'),
1153+
)
11271154
script = module.scripts[name]()
11281155

11291156
object_type = ContentType.objects.get(app_label='extras', model='scriptmodule')

0 commit comments

Comments
 (0)