From 5e8fbcdc8d80071f48c272ce08892a638dd00ba7 Mon Sep 17 00:00:00 2001 From: ichuang Date: Thu, 17 May 2012 22:29:45 -0400 Subject: [PATCH] fix multicourse; fix bug in I4xSystem - self.filestore not set when filestore not None. mitxhome.html now properly automatically lists all courses given in settings.COURSE_SETTINGS. mitxhome now served from multicourse.views. optioninput.html was missing; fixed. cleaned up access to request.session for coursename in courseware/views.py --- djangoapps/courseware/module_render.py | 10 ++++--- djangoapps/courseware/views.py | 27 +++++++++---------- .../multicourse/multicourse_settings.py | 5 ++++ djangoapps/multicourse/views.py | 25 ++++++++++++++++- lib/util/views.py | 6 ----- templates/mitxhome.html | 8 +++--- templates/optioninput.html | 25 +++++++++++++++++ urls.py | 2 +- 8 files changed, 77 insertions(+), 31 deletions(-) create mode 100644 templates/optioninput.html diff --git a/djangoapps/courseware/module_render.py b/djangoapps/courseware/module_render.py index 210cddb0b2..fc7240286f 100644 --- a/djangoapps/courseware/module_render.py +++ b/djangoapps/courseware/module_render.py @@ -13,8 +13,8 @@ from fs.osfs import OSFS from django.conf import settings from mitxmako.shortcuts import render_to_string - from models import StudentModule +from multicourse import multicourse_settings import courseware.modules @@ -31,6 +31,8 @@ class I4xSystem(object): self.track_function = track_function if not filestore: self.filestore = OSFS(settings.DATA_DIR) + else: + self.filestore = filestore self.render_function = render_function self.exception404 = Http404 def __repr__(self): @@ -95,15 +97,15 @@ def render_x_module(user, request, xml_module, module_object_preload): state = smod.state # get coursename if stored - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) + xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course # Create a new instance ajax_url = settings.MITX_ROOT_URL + '/modx/'+module_type+'/'+module_id+'/' system = I4xSystem(track_function = make_track_function(request), render_function = lambda x: render_module(user, request, x, module_object_preload), ajax_url = ajax_url, - filestore = None + filestore = OSFS(settings.DATA_DIR + xp), ) instance=module_class(system, etree.tostring(xml_module), diff --git a/djangoapps/courseware/views.py b/djangoapps/courseware/views.py index 56409b65a5..17b6471222 100644 --- a/djangoapps/courseware/views.py +++ b/djangoapps/courseware/views.py @@ -2,6 +2,8 @@ import logging import urllib import json +from fs.osfs import OSFS + from django.conf import settings from django.core.context_processors import csrf from django.contrib.auth.models import User @@ -38,9 +40,7 @@ def gradebook(request): if 'course_admin' not in content_parser.user_groups(request.user): raise Http404 - # TODO: This should be abstracted out. We repeat this logic many times. - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) student_objects = User.objects.all()[:100] student_info = [{'username' :s.username, @@ -68,8 +68,7 @@ def profile(request, student_id = None): user_info = UserProfile.objects.get(user=student) # request.user.profile_cache # - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) context={'name':user_info.name, 'username':student.username, @@ -110,8 +109,7 @@ def render_section(request, section): if not settings.COURSEWARE_ENABLED: return redirect('/') - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) try: dom = content_parser.section_file(user, section, coursename) @@ -251,8 +249,8 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): ajax_url = settings.MITX_ROOT_URL + '/modx/'+module+'/'+id+'/' # get coursename if stored - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) + xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course # Grab the XML corresponding to the request from course.xml try: @@ -269,7 +267,7 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): system = I4xSystem(track_function = make_track_function(request), render_function = None, ajax_url = ajax_url, - filestore = None + filestore = OSFS(settings.DATA_DIR + xp), ) try: @@ -311,8 +309,8 @@ def quickedit(request, id=None): return redirect('/') # get coursename if stored - if 'coursename' in request.session: coursename = request.session['coursename'] - else: coursename = None + coursename = multicourse_settings.get_coursename_from_request(request) + xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course def get_lcp(coursename,id): # Grab the XML corresponding to the request from course.xml @@ -325,9 +323,8 @@ def quickedit(request, id=None): system = I4xSystem(track_function = make_track_function(request), render_function = None, ajax_url = ajax_url, - filestore = None, - coursename = coursename, - role = 'staff' if request.user.is_staff else 'student', # TODO: generalize this + filestore = OSFS(settings.DATA_DIR + xp), + #role = 'staff' if request.user.is_staff else 'student', # TODO: generalize this ) instance=courseware.modules.get_module_class(module)(system, xml, diff --git a/djangoapps/multicourse/multicourse_settings.py b/djangoapps/multicourse/multicourse_settings.py index 99c9ef8620..7ed9ec4efe 100644 --- a/djangoapps/multicourse/multicourse_settings.py +++ b/djangoapps/multicourse/multicourse_settings.py @@ -42,6 +42,11 @@ else: # default to 6.002_Spring_2012 #----------------------------------------------------------------------------- # wrapper functions around course settings +def get_coursename_from_request(request): + if 'coursename' in request.session: coursename = request.session['coursename'] + else: coursename = None + return coursename + def get_course_settings(coursename): if not coursename: if hasattr(settings,'COURSE_DEFAULT'): diff --git a/djangoapps/multicourse/views.py b/djangoapps/multicourse/views.py index d0662b710e..15c4a7a382 100644 --- a/djangoapps/multicourse/views.py +++ b/djangoapps/multicourse/views.py @@ -1 +1,24 @@ -# multicourse/views.py +import datetime +import json +import sys + +from django.conf import settings +from django.contrib.auth.models import User +from django.core.context_processors import csrf +from django.core.mail import send_mail +from django.http import Http404 +from django.http import HttpResponse +from django.shortcuts import redirect +from mitxmako.shortcuts import render_to_response, render_to_string + +import courseware.capa.calc +import track.views +from multicourse import multicourse_settings + +def mitxhome(request): + ''' Home page (link from main header). List of courses. ''' + if settings.ENABLE_MULTICOURSE: + context = {'courseinfo' : multicourse_settings.COURSE_SETTINGS} + return render_to_response("mitxhome.html", context) + return info(request) + diff --git a/lib/util/views.py b/lib/util/views.py index a071208e92..941e4082c5 100644 --- a/lib/util/views.py +++ b/lib/util/views.py @@ -61,12 +61,6 @@ def info(request): ''' Info page (link from main header) ''' return render_to_response("info.html", {}) -def mitxhome(request): - ''' Home page (link from main header). List of courses. ''' - if settings.ENABLE_MULTICOURSE: - return render_to_response("mitxhome.html", {}) - return info(request) - # From http://djangosnippets.org/snippets/1042/ def parse_accept_header(accept): """Parse the Accept header *accept*, returning a list with pairs of diff --git a/templates/mitxhome.html b/templates/mitxhome.html index af821c1c84..182446ed35 100644 --- a/templates/mitxhome.html +++ b/templates/mitxhome.html @@ -28,10 +28,10 @@ $(document).ready(function(){

Courses available:

+ % for coursename, info in courseinfo.items(): +
  • ${info['title']} (${coursename})
  • + % endfor + diff --git a/templates/optioninput.html b/templates/optioninput.html new file mode 100644 index 0000000000..c23f433082 --- /dev/null +++ b/templates/optioninput.html @@ -0,0 +1,25 @@ +
    + + + + + + % if state == 'unsubmitted': + + % elif state == 'correct': + + % elif state == 'incorrect': + + % elif state == 'incomplete': + + % endif +
    diff --git a/urls.py b/urls.py index f286b17760..e33dd39ec6 100644 --- a/urls.py +++ b/urls.py @@ -70,7 +70,7 @@ if settings.COURSEWARE_ENABLED: ) if settings.ENABLE_MULTICOURSE: - urlpatterns += (url(r'^mitxhome$', 'util.views.mitxhome'),) + urlpatterns += (url(r'^mitxhome$', 'multicourse.views.mitxhome'),) if settings.QUICKEDIT: urlpatterns += (url(r'^quickedit/(?P[^/]*)$', 'courseware.views.quickedit'),)