Browse Source

online class problem fixed

master
Mohsen Taba 1 month ago
parent
commit
687cebc91f
  1. 3
      apps/course/tests/test_live_session_api.py
  2. 49
      apps/course/views/course.py

3
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(

49
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:

Loading…
Cancel
Save