@ -324,17 +324,20 @@ class CourseOnlineClassTokenAPIView(GenericAPIView):
user_token , _ = Token . objects . get_or_create ( user = request . user )
user_token , _ = Token . objects . get_or_create ( user = request . user )
identifier = f " {request.user.id}:{user_token.key[:8]} "
identifier = f " {request.user.id}:{user_token.key[:8]} "
token = manager . generate_token ( course_id = course . id , user_identifier = identifier )
token = manager . generate_token ( course_id = course . id , user_identifier = identifier )
redirect_path = serializer . validated_data . get ( ' redirect_path ' )
base_url , path_value = self . _build_base_components ( request , redirect_path )
manager . store_token ( token , {
manager . store_token ( token , {
' course_id ' : course . id ,
' course_id ' : course . id ,
' user_id ' : request . user . id ,
' user_id ' : request . user . id ,
' user_token ' : user_token . key ,
' user_token ' : user_token . key ,
' redirect_path ' : path_value ,
' extra ' : {
' extra ' : {
' professor_in_class ' : False ,
' professor_in_class ' : False ,
} ,
} ,
} )
} )
redirect_path = serializer . validated_data . get ( ' redirect_path ' )
base_url = self . _build_base_url ( request , redirect_path )
entry_url = manager . build_entry_url ( token , base_url = base_url )
entry_url = manager . build_entry_url ( token , base_url = base_url )
return Response ( {
return Response ( {
@ -343,13 +346,15 @@ class CourseOnlineClassTokenAPIView(GenericAPIView):
' expires_in ' : getattr ( settings , ' ONLINE_CLASS_TOKEN_TTL ' , 300 ) ,
' expires_in ' : getattr ( settings , ' ONLINE_CLASS_TOKEN_TTL ' , 300 ) ,
} , status = status . HTTP_201_CREATED )
} , status = status . HTTP_201_CREATED )
def _build_base_url ( self , request , redirect_path = None ) - > str :
def _build_base_components ( self , request , redirect_path = None ) :
base_uri = request . build_absolute_uri ( ' / ' )
base_uri = request . build_absolute_uri ( ' / ' )
domain = base_uri . rstrip ( ' / ' )
domain = base_uri . rstrip ( ' / ' )
default_path = getattr ( settings , ' ONLINE_CLASS_DEFAULT_PATH ' , ' join-class ' )
default_path = getattr ( settings , ' ONLINE_CLASS_DEFAULT_PATH ' , ' join-class ' )
target_path = redirect_path or default_path
target_path = redirect_path or default_path
sanitized = str ( target_path ) . strip ( ' / ' )
sanitized = str ( target_path ) . strip ( ' / ' )
return f " {domain}/{sanitized} " if sanitized else domain
path_value = f " /{sanitized} " if sanitized else ' / '
base_url = f " {domain}/{sanitized} " if sanitized else domain
return base_url , path_value
@staticmethod
@staticmethod
def _user_has_access ( user , course : Course ) - > bool :
def _user_has_access ( user , course : Course ) - > bool :
@ -426,6 +431,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
' scheduled_times ' : timing_data ,
' scheduled_times ' : timing_data ,
' generated_at ' : payload . get ( ' generated_at ' ) ,
' generated_at ' : payload . get ( ' generated_at ' ) ,
' validated_at ' : timezone . now ( ) . isoformat ( ) ,
' validated_at ' : timezone . now ( ) . isoformat ( ) ,
' redirect_path ' : payload . get ( ' redirect_path ' ) ,
}
}
metadata . update ( self . _resolve_live_session_timings ( course , payload ) )
metadata . update ( self . _resolve_live_session_timings ( course , payload ) )
return metadata
return metadata