@@ -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