From 8f3d6f703ddc067cfe4678b44ad9e6fff75e6838 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Thu, 5 Feb 2026 12:14:59 +0330 Subject: [PATCH] Refactor CourseOnlineClassTokenValidateAPIView to improve permission handling and logging - Updated permission classes to allow any user for GET requests, enhancing accessibility. - Added detailed logging for both GET and POST requests to track request data and processing steps. - Improved handling of user authentication status in log messages for better traceability. --- apps/course/views/course.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/apps/course/views/course.py b/apps/course/views/course.py index 84d0a3e..59c57b7 100644 --- a/apps/course/views/course.py +++ b/apps/course/views/course.py @@ -415,13 +415,9 @@ class CourseOnlineClassTokenAPIView(GenericAPIView): class CourseOnlineClassTokenValidateAPIView(GenericAPIView): + permission_classes = [AllowAny] serializer_class = OnlineClassTokenVerifySerializer - def get_permissions(self): - if self.request.method == 'GET': - return [IsAuthenticated()] - return [AllowAny()] - @swagger_auto_schema( tags=['Imam-Javad - Course'], operation_description="Get course and user data for authenticated user.", @@ -452,6 +448,14 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): } ) def get(self, request, slug, *args, **kwargs): + print("=" * 80) + print(f"[Online Validate GET] REQUEST RECEIVED {request.data}") + print(f"[Online Validate GET] slug={slug}") + print(f"[Online Validate GET] user={request.user}") + print(f"[Online Validate GET] user.is_authenticated={request.user.is_authenticated}") + print(f"[Online Validate GET] user.id={request.user.id if request.user.is_authenticated else 'N/A'}") + print("=" * 80) + logger.info(f"[Online Validate GET] Request received - slug={slug} user_id={request.user.id if request.user.is_authenticated else 'anonymous'}") detail_view = CourseDetailAPIView() @@ -459,6 +463,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): course = get_object_or_404(queryset, slug=slug) user = request.user + print(f"[Online Validate GET] Course found - course_id={course.id} slug={slug} is_online={course.is_online}") logger.info(f"[Online Validate GET] Course found - course_id={course.id} slug={slug} is_online={course.is_online}") # DEPRECATED: Polling approach replaced by webhook integration @@ -469,11 +474,12 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): user_data = UserProfileSerializer(user, context={'request': request}).data metadata = self._build_metadata( course, - {'user_id': user.id, 'extra': {}, 'generated_at': timezone.now().isoformat()}, + {'user_id': user.id if user.is_authenticated else None, 'extra': {}, 'generated_at': timezone.now().isoformat()}, user=user, ) - logger.info(f"[Online Validate GET] Success - user_id={user.id} course={slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}") + print(f"[Online Validate GET] Success - metadata={metadata}") + logger.info(f"[Online Validate GET] Success - user_id={user.id if user.is_authenticated else 'anonymous'} course={slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}") return Response({ 'course': course_data, @@ -504,29 +510,40 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): } ) def post(self, request, *args, **kwargs): + print("=" * 80) + print(f"[Online Validate POST] REQUEST RECEIVED") + print(f"[Online Validate POST] request.data={request.data}") + print(f"[Online Validate POST] has_token={'token' in request.data}") + print("=" * 80) + logger.info(f"[Online Validate POST] Request received - has_token={'token' in request.data}") serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) token_value = serializer.validated_data['token'] + print(f"[Online Validate POST] Token extracted - token={token_value[:16]}...") logger.info(f"[Online Validate POST] Token extracted - token={token_value[:16]}...") manager = OnlineClassTokenManager() try: payload = manager.get_payload(token_value) + print(f"[Online Validate POST] Token decoded successfully - payload={payload}") logger.info(f"[Online Validate POST] Token decoded successfully - payload={payload}") except Exception as e: + print(f"[Online Validate POST] Token decode FAILED - error={str(e)} type={type(e).__name__}") logger.error(f"[Online Validate POST] Token decode failed - error={str(e)} type={type(e).__name__}") raise course_id = payload.get('course_id') user_id = payload.get('user_id') if not course_id or not user_id: + print(f"[Online Validate POST] Invalid token payload - course_id={course_id} user_id={user_id}") logger.warning(f"[Online Validate POST] Invalid token payload - course_id={course_id} user_id={user_id}") raise AppAPIException({'message': 'Token payload is invalid.'}, status_code=status.HTTP_400_BAD_REQUEST) + print(f"[Online Validate POST] Processing for user_id={user_id} course_id={course_id}") logger.info(f"[Online Validate POST] Processing for user_id={user_id} course_id={course_id}") detail_view = CourseDetailAPIView() @@ -534,12 +551,14 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): course = get_object_or_404(queryset, pk=course_id) user = get_object_or_404(UserModel.objects.all(), pk=user_id) + print(f"[Online Validate POST] Course found - slug={course.slug} is_online={course.is_online}") logger.info(f"[Online Validate POST] Course found - slug={course.slug} is_online={course.is_online}") course_data = CourseDetailSerializer(course, context={'request': request}).data user_data = UserProfileSerializer(user, context={'request': request}).data metadata = self._build_metadata(course, payload, user=user) + print(f"[Online Validate POST] Success - metadata={metadata}") logger.info(f"[Online Validate POST] Success - user_id={user_id} course={course.slug} can_create={metadata.get('can_create_live_session')} can_join={metadata.get('can_join_live_session')}") return Response({