From c905cc7416b87bb17ec4d9ec920188a9fba8e407 Mon Sep 17 00:00:00 2001 From: ichuang Date: Tue, 2 Apr 2013 16:45:06 -0400 Subject: [PATCH] add masquerade.py --- lms/djangoapps/courseware/masquerade.py | 103 ++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 lms/djangoapps/courseware/masquerade.py diff --git a/lms/djangoapps/courseware/masquerade.py b/lms/djangoapps/courseware/masquerade.py new file mode 100644 index 0000000000..24d0c9f355 --- /dev/null +++ b/lms/djangoapps/courseware/masquerade.py @@ -0,0 +1,103 @@ +#---------------------------------------- Masequerade ---------------------------------------- +# +# 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 json +import logging +import urllib + +from functools import partial + +from django.conf import settings +from django.core.context_processors import csrf +from django.core.urlresolvers import reverse +from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required +from django.http import Http404 +from django.shortcuts import redirect +from mitxmako.shortcuts import render_to_response, render_to_string +#from django.views.decorators.csrf import ensure_csrf_cookie +from django_future.csrf import ensure_csrf_cookie +from django.views.decorators.cache import cache_control +from django.http import HttpResponse + +from courseware import grades +from courseware.access import has_access +from courseware.courses import (get_courses, get_course_with_access, + get_courses_by_university, sort_by_announcement) +import courseware.tabs as tabs +from courseware.models import StudentModuleCache +from module_render import toc_for_course, get_module, get_instance_module, get_module_for_descriptor + +from django_comment_client.utils import get_discussion_title + +from student.models import UserTestGroup, CourseEnrollment +from util.cache import cache, cache_if_anonymous +from xmodule.modulestore import Location +from xmodule.modulestore.django import modulestore +from xmodule.modulestore.exceptions import InvalidLocationError, ItemNotFoundError, NoPathToItem +from xmodule.modulestore.search import path_to_location + +log = logging.getLogger(__name__) + +def handle_ajax(request, marg): + log.debug('masquerade handle_ajax marg=%s' % marg) + return HttpResponse(json.dumps({})) + + +MASQ_VAR = 'masquerade_identity' + +class Masquerade(object): + ''' + Manage masquerade identity (allows staff to view courseware as either staff or student) + + State variables: + + actual_user = User instance of the real, un-masqueraded user + user = User instance (what actual user is masquerading as) + usertype = "staff" or "student" or "nonstaff" + + ''' + + def __init__(self, request, staff_access=False): + ''' + request = Django http request object + ''' + self.request = request + self.actual_user = request.user + self.user = request.user + self.usertype = "nonstaff" + if request.user is not None and staff_access: + self.usertype = request.session.get(MASQ_VAR,'staff') + if self.usertype=='student': + self.user = self.get_student_user() + + def get_student_user(self): + ''' + Each staff user can have a corresponding student identity, with + the same username + "__student". Return that User. + Create the student user if doesn't already exist. + ''' + suffix = '__student' + if self.user.username.endswith(suffix): + return self.user + user = User.get_or_create(username=self.user+suffix, email=self.user.email) + profile = UserProfile.get_or_create(user=user, name=self.user.profile.name+suffix) + return user + + def toggle_status(self): + """ + Toggle status from staff from student + """ + if self.usertype=='student': + self.user = self.actual_user + elif self.usertype=='staff': + self.user = self.get_student_user() + + def view_status(self): + ''' + Return string version of status of view + ''' + STAT = {'staff': 'Staff view', 'student': 'Student view'} + return STAT.get(self.usertype,'')