From 10fc6bd7fd2d6e356826a24c5aa4c20193086fa4 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Mon, 13 Oct 2025 19:45:28 +0330 Subject: [PATCH] fix(course): base URL from request and default path Use request.build_absolute_uri('/') to derive the base domain instead of relying on ONLINE_CLASS_FRONTEND_DOMAIN/SITE_DOMAIN. This produces correct entry URLs based on the incoming request. Add ONLINE_CLASS_DEFAULT_PATH (default: 'join-class') as a fallback when redirect_path is not provided. Update the view to pass request to _build_base_url. --- apps/course/views/course.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/course/views/course.py b/apps/course/views/course.py index 2e65d15..b9c65bc 100644 --- a/apps/course/views/course.py +++ b/apps/course/views/course.py @@ -324,17 +324,20 @@ class CourseOnlineClassTokenAPIView(GenericAPIView): user_token, _ = Token.objects.get_or_create(user=request.user) identifier = f"{request.user.id}:{user_token.key[:8]}" 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, { 'course_id': course.id, 'user_id': request.user.id, 'user_token': user_token.key, + 'redirect_path': path_value, 'extra': { '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) return Response({ @@ -343,13 +346,15 @@ class CourseOnlineClassTokenAPIView(GenericAPIView): 'expires_in': getattr(settings, 'ONLINE_CLASS_TOKEN_TTL', 300), }, 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('/') domain = base_uri.rstrip('/') default_path = getattr(settings, 'ONLINE_CLASS_DEFAULT_PATH', 'join-class') target_path = redirect_path or default_path 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 def _user_has_access(user, course: Course) -> bool: @@ -426,6 +431,7 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): 'scheduled_times': timing_data, 'generated_at': payload.get('generated_at'), 'validated_at': timezone.now().isoformat(), + 'redirect_path': payload.get('redirect_path'), } metadata.update(self._resolve_live_session_timings(course, payload)) return metadata