Browse Source

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.
master
mortezaei 7 months ago
parent
commit
10fc6bd7fd
  1. 14
      apps/course/views/course.py

14
apps/course/views/course.py

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

Loading…
Cancel
Save