from rest_framework.request import Request from rest_framework.exceptions import NotFound, PermissionDenied from labs.api.base import Endpoint from labs.lab_manager_v2.lab_instance import LabInstance from labs.lab_manager_v2.lab_spec import load_lab_spec from labs.lab_manager_v2.exceptions import LabNotFoundError from labs.models import ( LabInstance as DBLabInstance, LabQuiz as DBLabQuiz, LabQuizSubmission as DBLabQuizSubmission, User, ) class LabDetailBaseEndpoint(Endpoint): def convert_args( self, request: Request, lab_code: str, *args, **kwargs, ): try: lab_spec = load_lab_spec(lab_code) except LabNotFoundError: raise NotFound(detail="Lab not found") kwargs["lab_spec"] = lab_spec kwargs["lab_code"] = lab_code user: User = request.user if lab_spec.employee_only: if not (user.is_authenticated and user.is_pingcap_employee): raise PermissionDenied(detail="This lab is for employees only.") return args, kwargs LAB_INSTANCE_NOT_FOUND_ERROR = "Lab instance not found" class LabInstanceDetailBaseEndpoint(Endpoint): def convert_args( self, request: Request, lab_instance_id: int, *args, **kwargs, ): try: db_lab_instance = DBLabInstance.objects.get( id=lab_instance_id, exited_at__isnull=True, ) user = request.user if not user.is_staff: if db_lab_instance.user != user: raise NotFound(detail=LAB_INSTANCE_NOT_FOUND_ERROR) except DBLabInstance.DoesNotExist: raise NotFound(detail=LAB_INSTANCE_NOT_FOUND_ERROR) kwargs["lab_instance"] = LabInstance(db_lab_instance) return args, kwargs class LabInstanceQuizBaseEndpoint(LabInstanceDetailBaseEndpoint): def convert_args( self, request: Request, language_code: str, quiz_slug: str, *args, **kwargs, ): args, kwargs = super(LabInstanceQuizBaseEndpoint, self).convert_args( request, *args, **kwargs ) lab_instance: DBLabInstance = kwargs["lab_instance"].db_lab_instance try: lab_quiz = DBLabQuiz.objects.get( lab_code=lab_instance.lab_code, language_code=language_code, content_hash=quiz_slug, ) except DBLabQuiz.DoesNotExist: raise NotFound(detail="Lab quiz not found") try: lab_quiz_submission = DBLabQuizSubmission.objects.get( lab_instance=lab_instance, lab_quiz=lab_quiz, user=request.user, ) except DBLabQuizSubmission.DoesNotExist: lab_quiz_submission = None kwargs["lab_quiz"] = lab_quiz kwargs["lab_quiz_submission"] = lab_quiz_submission return args, kwargs