Skip to content
Snippets Groups Projects
views.py 6.63 KiB
Newer Older
David Ormsbee's avatar
David Ormsbee committed
import json
import logging
import os
David Ormsbee's avatar
David Ormsbee committed
import sys
Piotr Mitros's avatar
Piotr Mitros committed
import StringIO
import urllib
David Ormsbee's avatar
David Ormsbee committed
import uuid
Piotr Mitros's avatar
Piotr Mitros committed

from django.conf import settings
David Ormsbee's avatar
David Ormsbee committed
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.views.decorators.cache import cache_control
David Ormsbee's avatar
David Ormsbee committed
from lxml import etree
Piotr Mitros's avatar
Piotr Mitros committed

from module_render import render_module, modx_dispatch
from student.models import UserProfile
Piotr Mitros's avatar
Piotr Mitros committed
import courseware.content_parser as content_parser
import courseware.modules.capa_module
log = logging.getLogger("mitx.courseware")

etree.set_default_parser(etree.XMLParser(dtd_validation=False, load_dtd=False,
                                         remove_comments = True))

Piotr Mitros's avatar
Piotr Mitros committed
template_imports={'urllib':urllib}

Piotr Mitros's avatar
Piotr Mitros committed
@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):
Piotr Mitros's avatar
Piotr Mitros committed
    ''' User profile. Show username, location, etc, as well as grades .
        We need to allow the user to change some of these settings .'''
Piotr Mitros's avatar
Piotr Mitros committed
    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))

Piotr Mitros's avatar
Piotr Mitros committed
    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))
Piotr Mitros's avatar
Piotr Mitros committed
    return render_to_response('profile.html', context)

def render_accordion(request,course,chapter,section):
Piotr Mitros's avatar
Piotr Mitros committed
    ''' Draws navigation bar. Takes current position in accordion as
Piotr Mitros's avatar
Piotr Mitros committed
        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)
Piotr Mitros's avatar
Piotr Mitros committed
    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],
Piotr Mitros's avatar
Piotr Mitros committed
                  ['csrf',csrf(request)['csrf_token']]] + \
Piotr Mitros's avatar
Piotr Mitros committed
                     template_imports.items())
    return {'init_js':render_to_string('accordion_init.js',context), 
Piotr Mitros's avatar
Piotr Mitros committed
            '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)
Piotr Mitros's avatar
Piotr Mitros committed
def index(request, course="6.002 Spring 2012", chapter="Using the System", section="Hints"): 
Piotr Mitros's avatar
Piotr Mitros committed
    ''' Displays courseware accordion, and any associated content. 
    ''' 
    user = request.user
    if not settings.COURSEWARE_ENABLED or not user.is_authenticated():
Piotr Mitros's avatar
Piotr Mitros committed
        return redirect('/')

    # Fixes URLs -- we don't get funny encoding characters from spaces
    # so they remain readable
Piotr Mitros's avatar
Piotr Mitros committed
    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_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)

Piotr Mitros's avatar
Piotr Mitros committed
    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