Files

73 lines
2.3 KiB
Python

"""
Additional utilities for Learner Home
"""
import logging
from django.urls import reverse
from django.contrib.auth import get_user_model
from django.core.exceptions import MultipleObjectsReturned
from rest_framework.exceptions import PermissionDenied, NotFound
from common.djangoapps.student.models import (
get_user_by_username_or_email,
)
from lms.djangoapps.course_home_api.toggles import course_home_mfe_progress_tab_is_active
from openedx.features.course_experience.url_helpers import get_learning_mfe_home_url
log = logging.getLogger(__name__)
User = get_user_model()
def get_masquerade_user(request):
"""
Determine if the user is masquerading
Returns:
- masquerade_user if allowed and masquerade user found
- None if not masquerading
Raises:
- PermissionDenied if user is not staff
- NotFound if masquerade user does not exist
"""
if request.GET.get("user"):
if not request.user.is_staff:
log.info(
f"[Learner Home] {request.user.username} attempted to masquerade but is not staff"
)
raise PermissionDenied()
masquerade_identifier = request.GET.get("user")
try:
masquerade_user = get_user_by_username_or_email(masquerade_identifier)
except User.DoesNotExist:
raise NotFound() # pylint: disable=raise-missing-from
except MultipleObjectsReturned:
msg = (
f"[Learner Home] {masquerade_identifier} could refer to multiple learners. "
" Defaulting to username."
)
log.info(msg)
masquerade_user = User.objects.get(username=masquerade_identifier)
success_msg = (
f"[Learner Home] {request.user.username} masquerades as "
f"{masquerade_user.username} - {masquerade_user.email}"
)
log.info(success_msg)
return masquerade_user
def course_progress_url(course_key) -> str:
"""
Returns the course progress page's URL for the current user.
:param course_key: The course key for which the home url is being requested.
:return: The course progress page URL.
"""
if course_home_mfe_progress_tab_is_active(course_key):
return get_learning_mfe_home_url(course_key, url_fragment='progress')
return reverse('progress', kwargs={'course_id': course_key})