populate dropdown
This commit is contained in:
@@ -174,7 +174,7 @@ def forum_form_discussion(request, course_id):
|
||||
return render_to_response('discussion/index.html', context)
|
||||
|
||||
def render_single_thread(request, discussion_id, course_id, thread_id):
|
||||
|
||||
|
||||
thread = cc.Thread.find(thread_id).retrieve(recursive=True).to_dict()
|
||||
threads, query_params = get_threads(request, course_id)
|
||||
|
||||
@@ -212,6 +212,7 @@ def single_thread(request, course_id, discussion_id, thread_id):
|
||||
|
||||
else:
|
||||
course = get_course_with_access(request.user, course_id, 'load')
|
||||
category_map = utils.get_discussion_category_map(course)
|
||||
threads, query_params = get_threads(request, course_id)
|
||||
|
||||
recent_active_threads = cc.search_recent_active_threads(
|
||||
@@ -238,6 +239,7 @@ def single_thread(request, course_id, discussion_id, thread_id):
|
||||
'course_id': course.id,
|
||||
'thread_id': thread_id,
|
||||
'threads': json.dumps(threads),
|
||||
'category_map': category_map,
|
||||
}
|
||||
|
||||
return render_to_response('discussion/single_thread.html', context)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from collections import defaultdict
|
||||
from importlib import import_module
|
||||
from courseware.models import StudentModuleCache
|
||||
from courseware.module_render import get_module
|
||||
@@ -21,8 +22,6 @@ import pystache_custom as pystache
|
||||
_FULLMODULES = None
|
||||
_DISCUSSIONINFO = None
|
||||
|
||||
|
||||
|
||||
def extract(dic, keys):
|
||||
return {k: dic.get(k) for k in keys}
|
||||
|
||||
@@ -40,80 +39,101 @@ def merge_dict(dic1, dic2):
|
||||
def get_full_modules():
|
||||
global _FULLMODULES
|
||||
if not _FULLMODULES:
|
||||
class_path = settings.MODULESTORE['default']['ENGINE']
|
||||
module_path, _, class_name = class_path.rpartition('.')
|
||||
class_ = getattr(import_module(module_path), class_name)
|
||||
modulestore = class_(**dict(settings.MODULESTORE['default']['OPTIONS'].items() + [('eager', True)]))
|
||||
_FULLMODULES = modulestore.modules
|
||||
_FULLMODULES = modulestore().modules
|
||||
return _FULLMODULES
|
||||
|
||||
def get_categorized_discussion_info(request, course):
|
||||
def get_discussion_id_map(course):
|
||||
"""
|
||||
return a dict of the form {category: modules}
|
||||
"""
|
||||
global _DISCUSSIONINFO
|
||||
if not _DISCUSSIONINFO:
|
||||
initialize_discussion_info(request, course)
|
||||
return _DISCUSSIONINFO['categorized']
|
||||
initialize_discussion_info(course)
|
||||
return _DISCUSSIONINFO['id_map']
|
||||
|
||||
def get_discussion_title(request, course, discussion_id):
|
||||
def get_discussion_title(course, discussion_id):
|
||||
global _DISCUSSIONINFO
|
||||
if not _DISCUSSIONINFO:
|
||||
initialize_discussion_info(request, course)
|
||||
initialize_discussion_info(course)
|
||||
title = _DISCUSSIONINFO['by_id'].get(discussion_id, {}).get('title', '(no title)')
|
||||
return title
|
||||
|
||||
def initialize_discussion_info(request, course):
|
||||
def get_discussion_category_map(course):
|
||||
|
||||
global _DISCUSSIONINFO
|
||||
if not _DISCUSSIONINFO:
|
||||
initialize_discussion_info(course)
|
||||
return _DISCUSSIONINFO['category_map']
|
||||
|
||||
def initialize_discussion_info(course):
|
||||
|
||||
global _DISCUSSIONINFO
|
||||
if _DISCUSSIONINFO:
|
||||
return
|
||||
|
||||
course_id = course.id
|
||||
_, course_name, _ = course_id.split('/')
|
||||
user = request.user
|
||||
url_course_id = course_id.replace('/', '_').replace('.', '_')
|
||||
|
||||
_is_course_discussion = lambda x: x[0].dict()['category'] == 'discussion' \
|
||||
and x[0].dict()['course'] == course_name
|
||||
|
||||
_get_module_descriptor = operator.itemgetter(1)
|
||||
all_modules = get_full_modules()[course_id]
|
||||
|
||||
def _get_module(module_descriptor):
|
||||
print module_descriptor
|
||||
module = get_module(user, request, module_descriptor.location, student_module_cache)
|
||||
return module
|
||||
discussion_id_map = {}
|
||||
unexpanded_category_map = defaultdict(list)
|
||||
for location, module in all_modules.items():
|
||||
if location.category == 'discussion':
|
||||
id = module.metadata['id']
|
||||
category = module.metadata['discussion_category']
|
||||
title = module.metadata['for']
|
||||
sort_key = module.metadata.get('sort_key', title)
|
||||
discussion_id_map[id] = {"location": location, "title": title}
|
||||
category = " / ".join([x.strip() for x in category.split("/")])
|
||||
unexpanded_category_map[category].append({"title": title, "id": id,
|
||||
"sort_key": sort_key})
|
||||
|
||||
def _extract_info(module):
|
||||
return {
|
||||
'title': module.title,
|
||||
'discussion_id': module.discussion_id,
|
||||
'category': module.discussion_category,
|
||||
}
|
||||
category_map = {"entries": defaultdict(dict), "subcategories": defaultdict(dict)}
|
||||
for category_path, entries in unexpanded_category_map.items():
|
||||
node = category_map["subcategories"]
|
||||
path = [x.strip() for x in category_path.split("/")]
|
||||
for level in path[:-1]:
|
||||
if level not in node:
|
||||
node[level] = {"subcategories": defaultdict(dict),
|
||||
"entries": defaultdict(dict),
|
||||
"sort_key": level}
|
||||
node = node[level]["subcategories"]
|
||||
|
||||
def _pack_with_id(info):
|
||||
return (info['discussion_id'], info)
|
||||
level = path[-1]
|
||||
if level not in node:
|
||||
node[level] = {"subcategories": defaultdict(dict),
|
||||
"entries": defaultdict(dict),
|
||||
"sort_key": level}
|
||||
for entry in entries:
|
||||
node[level]["entries"][entry["title"]] = {"id": entry["id"],
|
||||
"sort_key": entry["sort_key"]}
|
||||
|
||||
discussion_module_descriptors = map(_get_module_descriptor,
|
||||
filter(_is_course_discussion,
|
||||
get_full_modules().items()))
|
||||
def sort_map_entries(map):
|
||||
things = []
|
||||
for title, entry in map["entries"].items():
|
||||
things.append((title, entry))
|
||||
for title, category in map["subcategories"].items():
|
||||
things.append((title, category))
|
||||
sort_map_entries(map["subcategories"][title])
|
||||
map["children"] = [x[0] for x in sorted(things, key=lambda x: x[1]["sort_key"])]
|
||||
|
||||
student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(user, course)
|
||||
|
||||
discussion_info = map(_extract_info, map(_get_module, discussion_module_descriptors))
|
||||
sort_map_entries(category_map)
|
||||
#for level in category_map["subcategories"].values():
|
||||
# sort_map_entries(level)
|
||||
|
||||
_DISCUSSIONINFO = {}
|
||||
|
||||
_DISCUSSIONINFO['by_id'] = dict(map(_pack_with_id, discussion_info))
|
||||
_DISCUSSIONINFO['id_map'] = discussion_id_map
|
||||
|
||||
_DISCUSSIONINFO['categorized'] = dict((category, list(l)) \
|
||||
for category, l in itertools.groupby(discussion_info, operator.itemgetter('category')))
|
||||
_DISCUSSIONINFO['category_map'] = category_map
|
||||
|
||||
_DISCUSSIONINFO['categorized']['General'] = [{
|
||||
'title': 'General discussion',
|
||||
'discussion_id': url_course_id,
|
||||
'category': 'General',
|
||||
}]
|
||||
# TODO delete me when you've used me
|
||||
#_DISCUSSIONINFO['categorized']['General'] = [{
|
||||
# 'title': 'General',
|
||||
# 'discussion_id': url_course_id,
|
||||
# 'category': 'General',
|
||||
#}]
|
||||
|
||||
class JsonResponse(HttpResponse):
|
||||
def __init__(self, data=None):
|
||||
|
||||
26
lms/templates/discussion/_filter_dropdown.html
Normal file
26
lms/templates/discussion/_filter_dropdown.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<%def name="render_dropdown(map)">
|
||||
% for child in map["children"]:
|
||||
% if child in map["entries"]:
|
||||
${render_entry(map["entries"], child)}
|
||||
%else:
|
||||
${render_category(map["subcategories"], child)}
|
||||
%endif
|
||||
%endfor
|
||||
</%def>
|
||||
|
||||
<%def name="render_entry(entries, entry)">
|
||||
<li><a href="#"><span class="board-name" data-discussion_id="${entries[entry]}">${entry}</span> <span class="unread">1,248</span></a></li>
|
||||
</%def>
|
||||
|
||||
<%def name="render_category(categories, category)">
|
||||
<li>
|
||||
<a href="#"><span class="board-name">${category}</span></a>
|
||||
<ul>
|
||||
${render_dropdown(categories[category])}
|
||||
</ul>
|
||||
</li>
|
||||
</%def>
|
||||
|
||||
<ul class="board-drop-menu">
|
||||
${render_dropdown(category_map)}
|
||||
</ul>
|
||||
@@ -132,24 +132,7 @@
|
||||
<a href="#" class="board-drop-icon"></a>
|
||||
<a href="#" class="board-drop-btn"><span class="current-board">Homework / Week 1</span> <span class="drop-arrow">▾</span></a>
|
||||
</div>
|
||||
<ul class="board-drop-menu">
|
||||
<li><a href="#"><span class="board-name">All</span> <span class="unread">1,248</span></a></li>
|
||||
<li><a href="#"><span class="board-name">Following</span></a></li>
|
||||
<li><a href="#"><span class="board-name">General</span> <span class="unread">124</span></a></li>
|
||||
<li>
|
||||
<a href="#"><span class="board-name">Homework</span> <span class="unread">27</span></a>
|
||||
<ul>
|
||||
<li><a href="#"><span class="board-name">Week 1</span> <span class="unread">24</span></a></li>
|
||||
<li>
|
||||
<a href="#"><span class="board-name">Week 2</span> <span class="unread">27</span></a>
|
||||
<ul>
|
||||
<li><a href="#"><span class="board-name">Problem 1</span> <span class="unread">14</span></a></li>
|
||||
<li><a href="#"><span class="board-name">Problem 2</span> <span class="unread">13</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<%include file="_filter_dropdown.html" />
|
||||
<div class="search">
|
||||
<form class="post-search">
|
||||
<input type="text" placeholder="Search all discussions" class="post-search-field">
|
||||
|
||||
Reference in New Issue
Block a user