1717from drf_spectacular .utils import OpenApiParameter , OpenApiResponse , extend_schema
1818from rest_framework import serializers
1919from rest_framework .generics import GenericAPIView
20+ from rest_framework .request import clone_request
2021from rest_framework .response import Response
2122from rest_framework .serializers import ValidationError
2223from rest_framework .views import APIView
3132from InvenTree .sso import sso_registration_enabled
3233from plugin .serializers import MetadataSerializer
3334from users .models import ApiToken
34- from users .permissions import check_user_permission
35+ from users .permissions import check_user_permission , prefetch_rule_sets
3536
3637from .helpers import plugins_info
3738from .helpers_email import is_email_configured
@@ -767,6 +768,13 @@ def post(self, request, *args, **kwargs):
767768
768769 search_filters = self .get_result_filters ()
769770
771+ # Create a clone of the request object to modify
772+ # Use GET method for the individual list views
773+ cloned_request = clone_request (request , 'GET' )
774+
775+ # Fetch and cache all groups associated with the current user
776+ groups = prefetch_rule_sets (request .user )
777+
770778 for key , cls in self .get_result_types ().items ():
771779 # Only return results which are specifically requested
772780 if key in data :
@@ -790,22 +798,23 @@ def post(self, request, *args, **kwargs):
790798 view = cls ()
791799
792800 # Override regular query params with specific ones for this search request
793- request ._request .GET = params
794- view .request = request
801+ cloned_request ._request .GET = params
802+ view .request = cloned_request
795803 view .format_kwarg = 'format'
796804
797805 # Check permissions and update results dict with particular query
798806 model = view .serializer_class .Meta .model
799807
808+ if not check_user_permission (
809+ request .user , model , 'view' , groups = groups
810+ ):
811+ results [key ] = {
812+ 'error' : _ ('User does not have permission to view this model' )
813+ }
814+ continue
815+
800816 try :
801- if check_user_permission (request .user , model , 'view' ):
802- results [key ] = view .list (request , * args , ** kwargs ).data
803- else :
804- results [key ] = {
805- 'error' : _ (
806- 'User does not have permission to view this model'
807- )
808- }
817+ results [key ] = view .list (request , * args , ** kwargs ).data
809818 except Exception as exc :
810819 results [key ] = {'error' : str (exc )}
811820
0 commit comments