11"""
22Client API endpoints
33"""
4+ import uuid
5+
46from django .db import IntegrityError , transaction
57from django .db .models import Count , OuterRef , Q , Subquery
68from django .http import HttpResponse
1214from rest_framework .decorators import action
1315from rest_framework .exceptions import NotFound
1416from rest_framework .exceptions import ValidationError as DRFValidationError
17+ from rest_framework .generics import get_object_or_404
1518from rest_framework .response import Response
1619
1720from joanie .core import enums , filters , models , permissions , serializers
@@ -629,24 +632,24 @@ class CourseAccessViewSet(
629632 """
630633 API ViewSet for all interactions with course accesses.
631634
632- GET /api/courses/<course_id>/accesses/:<course_access_id>
635+ GET /api/courses/<course_id|course_code >/accesses/:<course_access_id>
633636 Return list of all course accesses related to the logged-in user or one
634637 course access if an id is provided.
635638
636- POST /api/courses/<course_id>/accesses/ with expected data:
639+ POST /api/courses/<course_id|course_code >/accesses/ with expected data:
637640 - user: str
638641 - role: str [owner|admin|member]
639642 Return newly created course access
640643
641- PUT /api/courses/<course_id>/accesses/<course_access_id>/ with expected data:
644+ PUT /api/courses/<course_id|course_code >/accesses/<course_access_id>/ with expected data:
642645 - role: str [owner|admin|member]
643646 Return updated course access
644647
645- PATCH /api/courses/<course_id>/accesses/<course_access_id>/ with expected data:
648+ PATCH /api/courses/<course_id|course_code >/accesses/<course_access_id>/ with expected data:
646649 - role: str [owner|admin|member]
647650 Return partially updated course access
648651
649- DELETE /api/courses/<course_id>/accesses/<course_access_id>/
652+ DELETE /api/courses/<course_id|course_code >/accesses/<course_access_id>/
650653 Delete targeted course access
651654 """
652655
@@ -702,16 +705,16 @@ class CourseViewSet(
702705 GET /api/courses/
703706 Return list of all courses related to the logged-in user.
704707
705- GET /api/courses/:<course_id>
708+ GET /api/courses/:<course_id|course_code >
706709 Return one course if an id is provided.
707710
708- GET /api/courses/:<course_id>/wish
711+ GET /api/courses/:<course_id|course_code >/wish
709712 Return wish status on this course for the authenticated user
710713
711- POST /api/courses/:<course_id>/wish
714+ POST /api/courses/:<course_id|course_code >/wish
712715 Confirm a wish on this course for the authenticated user
713716
714- DELETE /api/courses/:<course_id>/wish
717+ DELETE /api/courses/:<course_id|course_code >/wish
715718 Delete any existing wish on this course for the authenticated user
716719 """
717720
@@ -723,6 +726,21 @@ class CourseViewSet(
723726 serializer_class = serializers .CourseSerializer
724727 ordering = ["-created_on" ]
725728
729+ def get_object (self ):
730+ """Allow getting a course by its pk or by its code."""
731+ queryset = self .filter_queryset (self .get_queryset ())
732+ try :
733+ uuid .UUID (self .kwargs ["pk" ])
734+ except ValueError :
735+ filter_field = "code__iexact"
736+ else :
737+ filter_field = "pk"
738+
739+ obj = get_object_or_404 (queryset , ** {filter_field : self .kwargs ["pk" ]})
740+ # May raise a permission denied
741+ self .check_object_permissions (self .request , obj )
742+ return obj
743+
726744 def get_queryset (self ):
727745 """
728746 Custom queryset to get user courses
0 commit comments