Skip to content

Commit

Permalink
Make accordion remember state
Browse files Browse the repository at this point in the history
* use url_name to compare to passed params
* remove unused fields from template context
* Also make it possible to link to a chapter
  • Loading branch information
Victor Shnayder committed Aug 9, 2012
1 parent 8d6d4e1 commit 0d8ed46
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 38 deletions.
39 changes: 20 additions & 19 deletions lms/djangoapps/courseware/module_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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:
Expand All @@ -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


Expand Down Expand Up @@ -122,24 +123,24 @@ 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
if user.is_authenticated():
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
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -251,15 +252,15 @@ 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

@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',...}),
Expand Down Expand Up @@ -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
Expand Down
21 changes: 8 additions & 13 deletions lms/djangoapps/courseware/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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)
Expand Down
9 changes: 8 additions & 1 deletion lms/static/coffee/src/navigation.coffee
Original file line number Diff line number Diff line change
@@ -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
Expand Down
3 changes: 2 additions & 1 deletion lms/templates/accordion.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<%! from django.core.urlresolvers import reverse %>

<%def name="make_chapter(chapter)">
<h3><a href="#">${chapter['display_name']}</a></h3>
<h3 ${' class="active"' if 'active' in chapter and chapter['active'] else ''}><a href="#">${chapter['display_name']}</a>
</h3>

<ul>
% for section in chapter['sections']:
Expand Down
10 changes: 6 additions & 4 deletions lms/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
url(r'^dashboard$', 'student.views.dashboard', name="dashboard"),

url(r'^admin_dashboard$', 'dashboard.views.dashboard'),

url(r'^change_email$', 'student.views.change_email_request'),
url(r'^email_confirm/(?P<key>[^/]*)$', 'student.views.confirm_email_change'),
url(r'^change_name$', 'student.views.change_name_request'),
Expand Down Expand Up @@ -118,7 +118,7 @@
#About the course
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/about$',
'courseware.views.course_about', name="about_course"),

#Inside the course
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/info$',
'courseware.views.course_info', name="info"),
Expand All @@ -130,16 +130,18 @@
'staticbook.views.index_shifted'),
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/?$',
'courseware.views.index', name="courseware"),
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/(?P<chapter>[^/]*)/$',
'courseware.views.index', name="courseware_chapter"),
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/courseware/(?P<chapter>[^/]*)/(?P<section>[^/]*)/$',
'courseware.views.index', name="courseware_section"),
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/profile$',
'courseware.views.profile', name="profile"),
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/profile/(?P<student_id>[^/]*)/$',
'courseware.views.profile'),

# For the instructor
url(r'^courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/gradebook$',
'courseware.views.gradebook'),
'courseware.views.gradebook'),
)

# Multicourse wiki
Expand Down

0 comments on commit 0d8ed46

Please sign in to comment.