189 lines
6.6 KiB
Python
189 lines
6.6 KiB
Python
import json
|
|
import logging
|
|
import os
|
|
import random
|
|
import sys
|
|
import StringIO
|
|
import urllib
|
|
import uuid
|
|
|
|
from django.conf import settings
|
|
from django.core.context_processors import csrf
|
|
from django.contrib.auth.models import User
|
|
from django.http import HttpResponse, Http404
|
|
from django.shortcuts import redirect
|
|
from django.template import Context, loader
|
|
from mitxmako.shortcuts import render_to_response, render_to_string
|
|
#from django.views.decorators.csrf import ensure_csrf_cookie
|
|
from django.db import connection
|
|
from django.views.decorators.cache import cache_control
|
|
|
|
from lxml import etree
|
|
|
|
from module_render import render_module, modx_dispatch
|
|
from models import StudentModule
|
|
from student.models import UserProfile
|
|
|
|
import courseware.content_parser as content_parser
|
|
import courseware.modules.capa_module
|
|
|
|
import courseware.grades as grades
|
|
|
|
log = logging.getLogger("mitx.courseware")
|
|
|
|
etree.set_default_parser(etree.XMLParser(dtd_validation=False, load_dtd=False,
|
|
remove_comments = True))
|
|
|
|
template_imports={'urllib':urllib}
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
def gradebook(request):
|
|
if 'course_admin' not in content_parser.user_groups(request.user):
|
|
raise Http404
|
|
student_objects = User.objects.all()[:100]
|
|
student_info = [{'username' :s.username,
|
|
'id' : s.id,
|
|
'email': s.email,
|
|
'grade_info' : grades.grade_sheet(s),
|
|
'realname' : UserProfile.objects.get(user = s).name
|
|
} for s in student_objects]
|
|
|
|
return render_to_response('gradebook.html',{'students':student_info})
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
def profile(request, student_id = None):
|
|
''' User profile. Show username, location, etc, as well as grades .
|
|
We need to allow the user to change some of these settings .'''
|
|
if not request.user.is_authenticated():
|
|
return redirect('/')
|
|
|
|
if student_id == None:
|
|
student = request.user
|
|
else:
|
|
print content_parser.user_groups(request.user)
|
|
if 'course_admin' not in content_parser.user_groups(request.user):
|
|
raise Http404
|
|
student = User.objects.get( id = int(student_id))
|
|
|
|
user_info = UserProfile.objects.get(user=student) # request.user.profile_cache #
|
|
|
|
context={'name':user_info.name,
|
|
'username':student.username,
|
|
'location':user_info.location,
|
|
'language':user_info.language,
|
|
'email':student.email,
|
|
'format_url_params' : content_parser.format_url_params,
|
|
'csrf':csrf(request)['csrf_token']
|
|
}
|
|
context.update(grades.grade_sheet(student))
|
|
|
|
return render_to_response('profile.html', context)
|
|
|
|
def render_accordion(request,course,chapter,section):
|
|
''' Draws navigation bar. Takes current position in accordion as
|
|
parameter. Returns (initialization_javascript, content)'''
|
|
if not course:
|
|
course = "6.002 Spring 2012"
|
|
|
|
toc=content_parser.toc_from_xml(content_parser.course_file(request.user), chapter, section)
|
|
active_chapter=1
|
|
for i in range(len(toc)):
|
|
if toc[i]['active']:
|
|
active_chapter=i
|
|
context=dict([['active_chapter',active_chapter],
|
|
['toc',toc],
|
|
['course_name',course],
|
|
['format_url_params',content_parser.format_url_params],
|
|
['csrf',csrf(request)['csrf_token']]] + \
|
|
template_imports.items())
|
|
return {'init_js':render_to_string('accordion_init.js',context),
|
|
'content':render_to_string('accordion.html',context)}
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
def render_section(request, section):
|
|
''' TODO: Consolidate with index
|
|
'''
|
|
user = request.user
|
|
if not settings.COURSEWARE_ENABLED or not user.is_authenticated():
|
|
return redirect('/')
|
|
|
|
# try:
|
|
dom = content_parser.section_file(user, section)
|
|
#except:
|
|
# raise Http404
|
|
|
|
accordion=render_accordion(request, '', '', '')
|
|
|
|
module_ids = dom.xpath("//@id")
|
|
|
|
module_object_preload = list(StudentModule.objects.filter(student=user,
|
|
module_id__in=module_ids))
|
|
|
|
module=render_module(user, request, dom, module_object_preload)
|
|
|
|
if 'init_js' not in module:
|
|
module['init_js']=''
|
|
|
|
context={'init':accordion['init_js']+module['init_js'],
|
|
'accordion':accordion['content'],
|
|
'content':module['content'],
|
|
'csrf':csrf(request)['csrf_token']}
|
|
|
|
result = render_to_response('courseware.html', context)
|
|
return result
|
|
|
|
|
|
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
|
|
def index(request, course="6.002 Spring 2012", chapter="Using the System", section="Hints"):
|
|
''' Displays courseware accordion, and any associated content.
|
|
'''
|
|
user = request.user
|
|
if not settings.COURSEWARE_ENABLED or not user.is_authenticated():
|
|
return redirect('/')
|
|
|
|
# Fixes URLs -- we don't get funny encoding characters from spaces
|
|
# so they remain readable
|
|
## TODO: Properly replace underscores
|
|
course=course.replace("_"," ")
|
|
chapter=chapter.replace("_"," ")
|
|
section=section.replace("_"," ")
|
|
|
|
# HACK: Force course to 6.002 for now
|
|
# Without this, URLs break
|
|
if course!="6.002 Spring 2012":
|
|
return redirect('/')
|
|
|
|
#import logging
|
|
#log = logging.getLogger("mitx")
|
|
#log.info( "DEBUG: "+str(user) )
|
|
|
|
dom = content_parser.course_file(user)
|
|
dom_module = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]/*[1]",
|
|
course=course, chapter=chapter, section=section)
|
|
if len(dom_module) == 0:
|
|
module = None
|
|
else:
|
|
module = dom_module[0]
|
|
|
|
accordion=render_accordion(request, course, chapter, section)
|
|
|
|
module_ids = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]//@id",
|
|
course=course, chapter=chapter, section=section)
|
|
|
|
module_object_preload = list(StudentModule.objects.filter(student=user,
|
|
module_id__in=module_ids))
|
|
|
|
|
|
module=render_module(user, request, module, module_object_preload)
|
|
|
|
if 'init_js' not in module:
|
|
module['init_js']=''
|
|
|
|
context={'init':accordion['init_js']+module['init_js'],
|
|
'accordion':accordion['content'],
|
|
'content':module['content'],
|
|
'csrf':csrf(request)['csrf_token']}
|
|
|
|
result = render_to_response('courseware.html', context)
|
|
return result
|