diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 852e3d8a77..d32f3d81ec 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -46,11 +46,12 @@ def toc_for_course(user, request, course, active_chapter, active_section): 'format': format, 'due': due, 'active' : bool}, ...] active is set for the section and chapter corresponding to the passed - parameters. Everything else comes from the xml, or defaults to "". + parameters, which are expected to be url_names of the chapter+section. + Everything else comes from the xml, or defaults to "". chapters with name 'hidden' are skipped. ''' - + student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(user, course, depth=2) course = get_module(user, request, course.location, student_module_cache) @@ -59,8 +60,8 @@ def toc_for_course(user, request, course, active_chapter, active_section): sections = list() for section in chapter.get_display_items(): - active = (chapter.display_name == active_chapter and - section.display_name == active_section) + active = (chapter.url_name == active_chapter and + section.url_name == active_section) hide_from_toc = section.metadata.get('hide_from_toc', 'false').lower() == 'true' if not hide_from_toc: @@ -73,7 +74,7 @@ def toc_for_course(user, request, course, active_chapter, active_section): chapters.append({'display_name': chapter.display_name, 'url_name': chapter.url_name, 'sections': sections, - 'active': chapter.display_name == active_chapter}) + 'active': chapter.url_name == active_chapter}) return chapters @@ -122,10 +123,10 @@ def get_module(user, request, location, student_module_cache, position=None): position within module Returns: xmodule instance - + ''' descriptor = modulestore().get_item(location) - + #TODO Only check the cache if this module can possibly have state instance_module = None shared_module = None @@ -133,13 +134,13 @@ def get_module(user, request, location, student_module_cache, position=None): if descriptor.stores_state: instance_module = student_module_cache.lookup(descriptor.category, descriptor.location.url()) - + shared_state_key = getattr(descriptor, 'shared_state_key', None) if shared_state_key is not None: shared_module = student_module_cache.lookup(descriptor.category, shared_state_key) - - + + instance_state = instance_module.state if instance_module is not None else None shared_state = shared_module.state if shared_module is not None else None @@ -206,13 +207,13 @@ def get_instance_module(user, module, student_module_cache): """ if user.is_authenticated(): if not module.descriptor.stores_state: - log.exception("Attempted to get the instance_module for a module " + log.exception("Attempted to get the instance_module for a module " + str(module.id) + " which does not store state.") return None - + instance_module = student_module_cache.lookup(module.category, module.location.url()) - + if not instance_module: instance_module = StudentModule( student=user, @@ -222,11 +223,11 @@ def get_instance_module(user, module, student_module_cache): max_grade=module.max_score()) instance_module.save() student_module_cache.append(instance_module) - + return instance_module else: return None - + def get_shared_instance_module(user, module, student_module_cache): """ Return shared_module is a StudentModule specific to all modules with the same @@ -236,7 +237,7 @@ def get_shared_instance_module(user, module, student_module_cache): if user.is_authenticated(): # To get the shared_state_key, we need to descriptor descriptor = modulestore().get_item(module.location) - + shared_state_key = getattr(module, 'shared_state_key', None) if shared_state_key is not None: shared_module = student_module_cache.lookup(module.category, @@ -251,7 +252,7 @@ def get_shared_instance_module(user, module, student_module_cache): student_module_cache.append(shared_module) else: shared_module = None - + return shared_module else: return None @@ -259,7 +260,7 @@ def get_shared_instance_module(user, module, student_module_cache): @csrf_exempt def xqueue_callback(request, userid, id, dispatch): ''' - Entry point for graded results from the queueing system. + Entry point for graded results from the queueing system. ''' # Test xqueue package, which we expect to be: # xpackage = {'xqueue_header': json.dumps({'lms_key':'secretkey',...}), @@ -331,7 +332,7 @@ def modx_dispatch(request, dispatch=None, id=None): instance_module = get_instance_module(request.user, instance, student_module_cache) shared_module = get_shared_instance_module(request.user, instance, student_module_cache) - + # Don't track state for anonymous users (who don't have student modules) if instance_module is not None: oldgrade = instance_module.grade diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index ac00626063..59f8de7b38 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -69,12 +69,12 @@ def gradebook(request, course_id): if 'course_admin' not in user_groups(request.user): raise Http404 course = check_course(course_id) - + student_objects = User.objects.all()[:100] student_info = [] - + #TODO: Only select students who are in the course - for student in student_objects: + for student in student_objects: student_info.append({ 'username': student.username, 'id': student.id, @@ -104,10 +104,10 @@ def profile(request, course_id, student_id=None): student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(request.user, course) course_module = get_module(request.user, request, course.location, student_module_cache) - + courseware_summary = grades.progress_summary(student, course_module, course.grader, student_module_cache) grade_summary = grades.grade(request.user, request, course, student_module_cache) - + context = {'name': user_info.name, 'username': student.username, 'location': user_info.location, @@ -129,19 +129,14 @@ def render_accordion(request, course, chapter, section): If chapter and section are '' or None, renders a default accordion. + course, chapter, and section are the url_names. + Returns the html string''' # grab the table of contents toc = toc_for_course(request.user, request, course, 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.title), + context = dict([('toc', toc), ('course_id', course.id), ('csrf', csrf(request)['csrf_token'])] + template_imports.items()) return render_to_string('accordion.html', context) diff --git a/lms/static/coffee/src/navigation.coffee b/lms/static/coffee/src/navigation.coffee index 7ba0a94fad..1d6b8a8117 100644 --- a/lms/static/coffee/src/navigation.coffee +++ b/lms/static/coffee/src/navigation.coffee @@ -1,9 +1,16 @@ class @Navigation constructor: -> if $('#accordion').length + # First look for an active section active = $('#accordion ul:has(li.active)').index('#accordion ul') + # if we didn't find one, look for an active chapter + if active < 0 + active = $('#accordion h3.active').index('#accordion h3') + # if that didn't work either, default to 0 + if active < 0 + active = 0 $('#accordion').bind('accordionchange', @log).accordion - active: if active >= 0 then active else 1 + active: active header: 'h3' autoHeight: false $('#open_close_accordion a').click @toggle diff --git a/lms/templates/accordion.html b/lms/templates/accordion.html index 353b83db70..1f514fe4a4 100644 --- a/lms/templates/accordion.html +++ b/lms/templates/accordion.html @@ -1,7 +1,8 @@ <%! from django.core.urlresolvers import reverse %> <%def name="make_chapter(chapter)"> -

${chapter['display_name']}

+

${chapter['display_name']} +