119 lines
4.3 KiB
Python
119 lines
4.3 KiB
Python
'''
|
|
---------------------------------------- Masquerade ----------------------------------------
|
|
Allow course staff to see a student or staff view of courseware.
|
|
Which kind of view has been selected is stored in the session state.
|
|
'''
|
|
|
|
import logging
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.views.decorators.http import require_POST
|
|
from util.json_request import expect_json, JsonResponse
|
|
|
|
from opaque_keys.edx.keys import CourseKey
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
# The key used to store a user's course-level masquerade information in the Django session.
|
|
# The value is a dict from course keys to CourseMasquerade objects.
|
|
MASQUERADE_SETTINGS_KEY = 'masquerade_settings'
|
|
|
|
|
|
class CourseMasquerade(object):
|
|
"""
|
|
Masquerade settings for a particular course.
|
|
"""
|
|
def __init__(self, course_key, role='student', user_partition_id=None, group_id=None):
|
|
self.course_key = course_key
|
|
self.role = role
|
|
self.user_partition_id = user_partition_id
|
|
self.group_id = group_id
|
|
|
|
|
|
@require_POST
|
|
@login_required
|
|
@expect_json
|
|
def handle_ajax(request, course_key_string):
|
|
"""
|
|
Handle AJAX posts to update the current user's masquerade for the specified course.
|
|
The masquerade settings are stored in the Django session as a dict from course keys
|
|
to CourseMasquerade objects.
|
|
"""
|
|
course_key = CourseKey.from_string(course_key_string)
|
|
masquerade_settings = request.session.get(MASQUERADE_SETTINGS_KEY, {})
|
|
request_json = request.json
|
|
role = request_json.get('role', 'student')
|
|
user_partition_id = request_json.get('user_partition_id', None)
|
|
group_id = request_json.get('group_id', None)
|
|
masquerade_settings[course_key] = CourseMasquerade(
|
|
course_key,
|
|
role=role,
|
|
user_partition_id=user_partition_id,
|
|
group_id=group_id
|
|
)
|
|
request.session[MASQUERADE_SETTINGS_KEY] = masquerade_settings
|
|
return JsonResponse()
|
|
|
|
|
|
def setup_masquerade(request, course_key, staff_access=False):
|
|
"""
|
|
Sets up masquerading for the current user within the current request. The
|
|
request's user is updated to have a 'masquerade_settings' attribute with
|
|
the dict of all masqueraded settings if called from within a request context.
|
|
The function then returns the CourseMasquerade object for the specified
|
|
course key, or None if there isn't one.
|
|
"""
|
|
if request.user is None:
|
|
return None
|
|
|
|
if not settings.FEATURES.get('ENABLE_MASQUERADE', False):
|
|
return None
|
|
|
|
if not staff_access: # can masquerade only if user has staff access to course
|
|
return None
|
|
|
|
masquerade_settings = request.session.get(MASQUERADE_SETTINGS_KEY, {})
|
|
|
|
# Store the masquerade settings on the user so it can be accessed without the request
|
|
request.user.masquerade_settings = masquerade_settings
|
|
|
|
# Return the masquerade for the current course, or none if there isn't one
|
|
return masquerade_settings.get(course_key, None)
|
|
|
|
|
|
def get_course_masquerade(user, course_key):
|
|
"""
|
|
Returns the masquerade for the current user for the specified course. If no masquerade has
|
|
been installed, then a default no-op masquerade is returned.
|
|
"""
|
|
masquerade_settings = getattr(user, 'masquerade_settings', {})
|
|
return masquerade_settings.get(course_key, None)
|
|
|
|
|
|
def get_masquerade_role(user, course_key):
|
|
"""
|
|
Returns the role that the user is masquerading as, or None if no masquerade is in effect.
|
|
"""
|
|
course_masquerade = get_course_masquerade(user, course_key)
|
|
return course_masquerade.role if course_masquerade else None
|
|
|
|
|
|
def is_masquerading_as_student(user, course_key):
|
|
"""
|
|
Returns true if the user is a staff member masquerading as a student.
|
|
"""
|
|
return get_masquerade_role(user, course_key) == 'student'
|
|
|
|
|
|
def get_masquerading_group_info(user, course_key):
|
|
"""
|
|
If the user is masquerading as belonging to a group, then this method returns
|
|
two values: the id of the group, and the id of the user partition that the group
|
|
belongs to. If the user is not masquerading as a group, then None is returned.
|
|
"""
|
|
course_masquerade = get_course_masquerade(user, course_key)
|
|
if not course_masquerade:
|
|
return None, None
|
|
return course_masquerade.group_id, course_masquerade.user_partition_id
|