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