From 94657602b03fd451240da320c10be2cfbe1439c2 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Thu, 8 Dec 2011 09:33:06 -0500 Subject: [PATCH] Minor cleanup --- courseware/capa_module.py | 6 +++++- courseware/capa_problem.py | 9 +++++++-- courseware/content_parser.py | 12 ++++++++++++ courseware/views.py | 34 ++++++++++++++++++++-------------- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/courseware/capa_module.py b/courseware/capa_module.py index f3a1806fa5..699eb9a441 100644 --- a/courseware/capa_module.py +++ b/courseware/capa_module.py @@ -29,8 +29,10 @@ class LoncapaModule(XModule): inner_html=self.lcp.get_html() content={'name':self.name, 'html':inner_html} + print "XXXXXXXXXXXXXXXXXXXXXXXXXXX" + print self.lcp.done return render_to_string('problem.html', - {'problem':content, 'id':self.filename}) + {'problem':content, 'id':self.filename, 'done':self.lcp.done}) def __init__(self, xml, item_id, ajax_url=None, track_url=None, state=None): XModule.__init__(self, xml, item_id, ajax_url, track_url, state) @@ -54,6 +56,7 @@ class LoncapaModule(XModule): # Temporary -- move to capa_problem def check_problem(self, get): + self.lcp.done=True answer=dict() # input_resistor_1 ==> resistor_1 for key in get: @@ -64,6 +67,7 @@ class LoncapaModule(XModule): return js def reset_problem(self, get): + self.lcp.done=False self.lcp.answers=dict() self.lcp.context=dict() self.lcp.questions=dict() # Detailed info about questions in problem instance. TODO: Should be by id and not lid. diff --git a/courseware/capa_problem.py b/courseware/capa_problem.py index 885afba2fa..00c33c7498 100644 --- a/courseware/capa_problem.py +++ b/courseware/capa_problem.py @@ -12,7 +12,8 @@ class LoncapaProblem(): 2) Populate any student answers. ''' return json.dumps({'seed':self.seed, 'answers':self.answers, - 'correct_map':self.correct_map}) + 'correct_map':self.correct_map, + 'done':self.done}) def get_score(self): correct=0 @@ -41,7 +42,10 @@ class LoncapaProblem(): else: state={} self.gid=id - + + if 'done' in state: + self.done=state['done'] + if 'seed' in state and state['seed']!=None and state['seed']!="": self.seed=state['seed'] else: @@ -81,6 +85,7 @@ class LoncapaProblem(): self.text=self.contextualize_text(self.text) self.filename=filename + done=False text="" context={} # Execution context from loncapa/python questions={} # Detailed info about questions in problem instance. TODO: Should be by id and not lid. diff --git a/courseware/content_parser.py b/courseware/content_parser.py index 83d597ab2c..2d63b0ed5f 100644 --- a/courseware/content_parser.py +++ b/courseware/content_parser.py @@ -1,6 +1,9 @@ from django.conf import settings from xml.dom.minidom import parse, parseString +''' This file will eventually form an abstraction layer between the +course XML file and the rest of the system. +''' def toc_from_xml(active_chapter,active_section): dom=parse(settings.DATA_DIR+'course.xml') @@ -23,3 +26,12 @@ def toc_from_xml(active_chapter,active_section): 'active':(c.getAttribute("name")==active_chapter)}) return ch +def dom_select(dom, element_type, element_name): + if dom==None: + return None + elements=dom.getElementsByTagName(element_type) + for e in elements: + if e.getAttribute("name")==element_name: + return e + return None + diff --git a/courseware/views.py b/courseware/views.py index b5b262f010..b8be5ba510 100644 --- a/courseware/views.py +++ b/courseware/views.py @@ -16,7 +16,7 @@ from django.http import Http404 import urllib -import capa_module, capa_problem +import capa_module from models import StudentModule @@ -29,6 +29,8 @@ from content_parser import * template_imports={'urllib':urllib} def profile(request): + ''' 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('/') @@ -74,7 +76,7 @@ def profile(request): return render_to_response('profile.html', context) def render_accordion(request,course,chapter,section): - ''' Draws accordion. Takes current position in accordion as + ''' Draws navigation bar. Takes current position in accordion as parameter. Returns (initialization_javascript, content)''' def format_string(string): return urllib.quote(string.replace(' ','_')) @@ -93,15 +95,21 @@ def render_accordion(request,course,chapter,section): 'content':render_to_string('accordion.html',context)} def video_module(request, module): + ''' Shows a video, with subtitles. + ''' id=module.getAttribute('youtube') return {'js':render_to_string('video_init.js',{'id':id}), 'content':render_to_string('video.html',{})} def html_module(request, module): + ''' Show basic text + ''' template_source=module.getAttribute('filename') return {'content':render_to_string(template_source, {})} def tab_module(request, module): + ''' Layout module which lays out content in tabs. + ''' contents=[(e.getAttribute("name"),render_module(request, e)) \ for e in module.childNodes \ if e.nodeType==1] @@ -111,6 +119,8 @@ def tab_module(request, module): 'content':render_to_string('tab_module.html',{'tabs':contents})} 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] @@ -122,6 +132,7 @@ def vertical_module(request, module): modx_modules={'problem':capa_module.LoncapaModule} def render_x_module(request, xml_module): + ''' Generic module for extensions. This renders to HTML. ''' # Check if problem has an instance in DB print xml_module module_id=xml_module.getAttribute(capa_module.LoncapaModule.id_attribute) @@ -148,6 +159,7 @@ def render_x_module(request, xml_module): return {'content':problem.get_html()} def modx_dispatch(request, module=None, dispatch=None, id=None): + ''' Generic module for extensions. This handles AJAX. ''' s = StudentModule.objects.filter(module_type=module, student=request.user, module_id=id) if len(s) == 0: raise Http404 @@ -170,22 +182,16 @@ module_types={'video':video_module, #'lab':lab_module, def render_module(request, module): + ''' Generic dispatch for internal modules. ''' if module==None: return {"content":""} if str(module.localName) in module_types: return module_types[module.localName](request, module) return {"content":""} -def dom_select(dom, element_type, element_name): - if dom==None: - return None - elements=dom.getElementsByTagName(element_type) - for e in elements: - if e.getAttribute("name")==element_name: - return e - return None - def index(request, course="6.002 Spring 2012", chapter="Using the System", section="Hints"): + ''' Displays courseware accordion, and any associated content. + ''' if not request.user.is_authenticated(): return redirect('/') @@ -200,9 +206,9 @@ def index(request, course="6.002 Spring 2012", chapter="Using the System", secti return redirect('/') dom=parse(settings.DATA_DIR+'course.xml') - dom_course=dom_select(dom, 'course', course) - dom_chapter=dom_select(dom_course, 'chapter', chapter) - dom_section=dom_select(dom_chapter, 'section', section) + 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) if dom_section!=None: module=[e for e in dom_section.childNodes if e.nodeType==1][0] else: