|
25 | 25 | is_platform_admin, |
26 | 26 | ) |
27 | 27 | import json |
| 28 | +import logging |
| 29 | + |
| 30 | + |
| 31 | +logger = logging.getLogger(__name__) |
28 | 32 |
|
29 | 33 |
|
30 | 34 | @method_decorator(ensure_csrf_cookie, name="get") |
@@ -462,6 +466,34 @@ def get(self, request, *args, **kwargs) -> JsonResponse: # type: ignore[no-unty |
462 | 466 | ) |
463 | 467 |
|
464 | 468 |
|
| 469 | +@method_decorator(accessible_for(roles={"admin", "editor", "viewer"}), name="get") |
| 470 | +class SingleLearnerView(View): |
| 471 | + def get(self, request, *args, **kwargs) -> JsonResponse: # type: ignore[no-untyped-def] |
| 472 | + try: |
| 473 | + learner = Learner.objects.get(id=kwargs["learner_id"]) |
| 474 | + enrollments = Enrollment.objects.filter(learner=learner) |
| 475 | + enroolments_list = [] |
| 476 | + for enrollment in enrollments: |
| 477 | + enroolments_list.append( |
| 478 | + serializers.EnrollmentSummaryResponse( |
| 479 | + id=enrollment.id, |
| 480 | + course_title=enrollment.course.title, |
| 481 | + status=EnrollmentStatus(enrollment.status), |
| 482 | + ) |
| 483 | + ) |
| 484 | + return JsonResponse( |
| 485 | + serializers.LearnerDetailResponse( |
| 486 | + id=learner.id, email=learner.email, enrollments=enroolments_list |
| 487 | + ).model_dump(), |
| 488 | + status=200, |
| 489 | + ) |
| 490 | + except Learner.DoesNotExist: |
| 491 | + return JsonResponse({"error": "Learner not found"}, status=404) |
| 492 | + except ValidationError as e: |
| 493 | + logger.error(f"Error in SingleLearnerView: {e.json()}") |
| 494 | + return JsonResponse({"error": "An internal error occurred."}, status=500) |
| 495 | + |
| 496 | + |
465 | 497 | class RootView(View): |
466 | 498 | def get(self, request, *args, **kwargs) -> JsonResponse: # type: ignore[no-untyped-def] |
467 | 499 | return JsonResponse({"message": "Email Learning API is running."}, status=200) |
0 commit comments