33from typing import TYPE_CHECKING
44
55import edx_api_doc_tools as apidocs
6- from django .contrib .auth . models import User
6+ from django .contrib .auth import get_user_model
77from django .shortcuts import get_object_or_404
88from edx_api_doc_tools import ParameterLocation
99from rest_framework import status
1717from .serializers import CredentialEligibilityResponseSerializer , CredentialSerializer
1818
1919if TYPE_CHECKING :
20+ from django .contrib .auth .models import User
2021 from rest_framework .request import Request
2122
2223
@@ -157,10 +158,12 @@ class CredentialEligibilityView(APIView):
157158
158159 permission_classes = (IsAuthenticated , IsAdminOrSelf , CanAccessLearningContext )
159160
160- def _get_eligibility_data (self , user : User , config : "CredentialConfiguration" , credentials : list ) -> dict :
161+ def _get_eligibility_data (
162+ self , user : "User" , config : CredentialConfiguration , credentials_by_config_id : dict [int , Credential ]
163+ ) -> dict :
161164 """Calculate eligibility data for a credential configuration."""
162165 progress_data = config .get_user_eligibility_details (user_id = user .id )
163- existing_credential = next (( cred for cred in credentials if cred . configuration_id == config .id ), None )
166+ existing_credential = credentials_by_config_id . get ( config .id )
164167
165168 return {
166169 'credential_type_id' : config .credential_type .pk ,
@@ -237,11 +240,11 @@ def get(self, request: "Request", learning_context_key: str) -> Response:
237240 }
238241 """
239242 username = request .query_params .get ('username' )
240- user = get_object_or_404 (User , username = username ) if username else request .user
243+ user = get_object_or_404 (get_user_model () , username = username ) if username else request .user
241244
242245 configurations = CredentialConfiguration .objects .filter (
243246 learning_context_key = learning_context_key
244- ).select_related ('credential_type' )
247+ ).select_related ('credential_type' , 'periodic_task' )
245248
246249 retrieval_func = request .query_params .get ('retrieval_func' )
247250 if retrieval_func :
@@ -251,8 +254,11 @@ def get(self, request: "Request", learning_context_key: str) -> Response:
251254 credentials = Credential .objects .filter (user_id = user .id , configuration__in = configurations ).exclude (
252255 status__in = [Credential .Status .ERROR , Credential .Status .INVALIDATED ]
253256 )
257+ credentials_by_config_id = {credential .configuration_id : credential for credential in credentials }
254258
255- eligibility_data = [self ._get_eligibility_data (user , config , credentials ) for config in configurations ]
259+ eligibility_data = [
260+ self ._get_eligibility_data (user , config , credentials_by_config_id ) for config in configurations
261+ ]
256262
257263 response_data = {
258264 'context_key' : learning_context_key ,
0 commit comments