Skip to content
Snippets Groups Projects
Commit 1ec3209d authored by Piotr Mitros's avatar Piotr Mitros
Browse files

Moved courseware from minidom to lxml2. Appears to work, but big change. may still have bugs.

parent 8539b926
No related branches found
No related tags found
No related merge requests found
......@@ -29,6 +29,9 @@ from django.conf import settings
import content_parser
import sys
from lxml import etree
import uuid
modx_modules={'problem':capa_module.LoncapaModule,
......@@ -80,9 +83,8 @@ def modx_dispatch(request, module=None, dispatch=None, id=None):
def vertical_module(request, module):
''' Layout module which lays out content vertically.
'''
contents=[(e.getAttribute("name"),render_module(request, e)) \
for e in module.childNodes \
if e.nodeType==1]
contents=[(e.get("name"),render_module(request, e)) \
for e in module]
init_js="".join([e[1]['init_js'] for e in contents if 'init_js' in e[1]])
destroy_js="".join([e[1]['destroy_js'] for e in contents if 'destroy_js' in e[1]])
......@@ -107,9 +109,8 @@ def seq_module(request, module):
"destroy_js":m['destroy_js'],
'init_js':m['init_js'],
'type':m['type']}
contents=[(e.getAttribute("name"),j(render_module(request, e))) \
for e in module.childNodes \
if e.nodeType==1]
contents=[(e.get("name"),j(render_module(request, e))) \
for e in module]
js=""
......@@ -125,12 +126,12 @@ def seq_module(request, module):
# IDs to sequences.
destroy_js="".join([e[1]['destroy_js'] for e in contents if 'destroy_js' in e[1]])
if module.nodeName == 'sequential':
if module.tag == 'sequential':
return {'init_js':js+render_to_string('seq_module.js',params),
"destroy_js":destroy_js,
'content':render_to_string('seq_module.html',params),
'type':'sequential'}
if module.nodeName == 'tab':
if module.tag == 'tab':
params['id'] = 'tab'
return {'init_js':js+render_to_string('tab_module.js',params),
"destroy_js":destroy_js,
......@@ -141,9 +142,9 @@ def seq_module(request, module):
def render_x_module(request, xml_module):
''' Generic module for extensions. This renders to HTML. '''
# Check if problem has an instance in DB
module_type=xml_module.nodeName
module_type=xml_module.tag
module_class=modx_modules[module_type]
module_id=xml_module.getAttribute(module_class.id_attribute)
module_id=xml_module.get(module_class.id_attribute) or "" # TODO: remove or ""
# Grab state from database
s = StudentModule.objects.filter(student=request.user,
......@@ -157,7 +158,7 @@ def render_x_module(request, xml_module):
# Create a new instance
ajax_url = '/modx/'+module_type+'/'+module_id+'/'
instance=module_class(xml_module.toxml(),
instance=module_class(etree.tostring(xml_module),
module_id,
ajax_url=ajax_url,
state=state,
......@@ -190,9 +191,9 @@ module_types={'video':render_x_module,
def render_module(request, module):
''' Generic dispatch for internal modules. '''
if module==None:
if module==None :
return {"content":""}
if str(module.localName) in module_types:
return module_types[module.localName](request, module)
if str(module.tag) in module_types:
return module_types[module.tag](request, module)
print "rm404"
raise Http404
from django.http import HttpResponse
from django.template import Context, loader
from djangomako.shortcuts import render_to_response, render_to_string
from xml.dom.minidom import parse, parseString
import json, os, sys
from django.core.context_processors import csrf
......@@ -33,6 +32,9 @@ from module_render import *
from lxml import etree
etree.set_default_parser(etree.XMLParser(dtd_validation=False, load_dtd=False,
remove_comments = True))
template_imports={'urllib':urllib}
def profile(request):
......@@ -114,6 +116,7 @@ def index(request, course="6.002 Spring 2012", chapter="Using the System", secti
# 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("_"," ")
......@@ -147,3 +150,48 @@ def index(request, course="6.002 Spring 2012", chapter="Using the System", secti
return render_to_response('courseware.html', context)
def index(request, course="6.002 Spring 2012", chapter="Using the System", section="Hints"):
''' Displays courseware accordion, and any associated content.
'''
if not settings.COURSEWARE_ENABLED or not request.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('/')
cf = content_parser.course_file(request.user)
dom=etree.parse(cf)
#dom_course=content_parser.dom_select(dom, 'course', course)
#dom_chapter=content_parser.dom_select(dom_course, 'chapter', chapter)
#dom_section=content_parser.dom_select(dom_chapter, 'section', section)
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=render_module(request, module)
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']}
return render_to_response('courseware.html', context)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment