Skip to content

Commit 10d29d5

Browse files
committed
fixup! feat: implement eligibility REST API endpoint
1 parent 07ff8dd commit 10d29d5

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

learning_credentials/api/v1/views.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import TYPE_CHECKING
44

55
import edx_api_doc_tools as apidocs
6-
from django.contrib.auth.models import User
6+
from django.contrib.auth import get_user_model
77
from django.shortcuts import get_object_or_404
88
from edx_api_doc_tools import ParameterLocation
99
from rest_framework import status
@@ -17,6 +17,7 @@
1717
from .serializers import CredentialEligibilityResponseSerializer, CredentialSerializer
1818

1919
if 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

Comments
 (0)