From 687cebc91f24e27e7ef6cfad602f50328d387d8e Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 13 Jun 2026 11:50:06 +0330 Subject: [PATCH] online class problem fixed --- apps/course/tests/test_live_session_api.py | 3 +- apps/course/views/course.py | 49 ++++++++++------------ 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/apps/course/tests/test_live_session_api.py b/apps/course/tests/test_live_session_api.py index 37b2bf4..c3186b8 100644 --- a/apps/course/tests/test_live_session_api.py +++ b/apps/course/tests/test_live_session_api.py @@ -221,15 +221,14 @@ class CourseLiveSessionAPITests(APITestCase): 'http://testserver/?access_token=joined-prof-token' ) - @mock.patch('apps.course.views.course.jwt.encode', return_value='teacher-access-token') @mock.patch('apps.course.views.course.PlugNMeetClient') def test_validate_returns_direct_access_token_for_professor_when_class_is_not_online( self, mock_client_cls, - _mock_jwt_encode, ): mock_client = mock_client_cls.return_value mock_client.create_room.return_value = {'status': 'success'} + mock_client.get_join_token.return_value = {'token': 'teacher-access-token'} self.client.force_authenticate(user=self.professor) url = reverse( diff --git a/apps/course/views/course.py b/apps/course/views/course.py index 45af00b..d2ee7a9 100644 --- a/apps/course/views/course.py +++ b/apps/course/views/course.py @@ -45,7 +45,6 @@ from apps.account.serializers import UserProfileSerializer from utils.exceptions import AppAPIException from utils.redis import OnlineClassTokenManager import time -import jwt UserModel = get_user_model() @@ -712,6 +711,13 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): def _build_professor_direct_redirect_path(self, course: Course, user) -> Optional[str]: try: session = self._ensure_professor_live_session(course) + redirect_path = self._build_live_redirect_path_for_room( + course=course, + user=user, + room_id=session.room_id, + ) + if redirect_path: + return redirect_path except (ImproperlyConfigured, PlugNMeetError, Exception) as exc: logger.warning( "[Online Validate] Failed to create professor live session - course=%s user_id=%s error=%s", @@ -720,10 +726,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): str(exc), ) return None - - access_token = self._build_professor_access_token(user, session.room_id) - frontend_base = get_online_class_frontend_base() - return f"{frontend_base}/?access_token={access_token}" + return None def _ensure_professor_live_session(self, course: Course) -> CourseLiveSession: session = ( @@ -751,27 +754,6 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): }) return session - def _build_professor_access_token(self, user, room_id: str) -> str: - token_payload = { - "room_id": room_id, - "user_info": { - "name": user.get_full_name() or user.email or user.username or f"user-{user.id}", - "user_id": str(user.id), - "is_admin": True, - "is_hidden": False, - }, - } - return jwt.encode( - { - "iss": settings.PLUGNMEET_API_KEY, - "exp": int(time.time()) + 3600, - "sub": str(user.id), - **token_payload, - }, - settings.PLUGNMEET_API_SECRET, - algorithm="HS256", - ) - @staticmethod def _get_live_session_subject(course: Course) -> str: title = "" @@ -867,6 +849,17 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): if not session or not session.room_id: return None + return self._build_live_redirect_path_for_room( + course=course, + user=user, + room_id=session.room_id, + request=request, + ) + + def _build_live_redirect_path_for_room(self, course: Course, user, room_id: str, request=None) -> Optional[str]: + if not room_id: + return None + is_admin = bool(user.can_manage_course(course)) user_info = { 'user_id': str(user.id), @@ -875,7 +868,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): } user_metadata = {} - profile_pic = self._build_profile_url(request, user) + profile_pic = self._build_profile_url(request, user) if request is not None else None if profile_pic: user_metadata['profilePic'] = profile_pic @@ -900,7 +893,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): try: client = PlugNMeetClient() response = client.get_join_token({ - 'room_id': session.room_id, + 'room_id': room_id, 'user_info': user_info, }) except (PlugNMeetError, Exception) as exc: