add a new django-admin command to dump out a course structure document. This is response to an emergency request from Harvard researchers.
This commit is contained in:
@@ -0,0 +1,55 @@
|
|||||||
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
from xmodule.course_module import CourseDescriptor
|
||||||
|
from xmodule.modulestore.django import modulestore
|
||||||
|
from json import dumps
|
||||||
|
from xmodule.modulestore.inheritance import own_metadata
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
filter_list = ['xml_attributes', 'checklists']
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = '''Write out to stdout a structural and metadata information about a course in a flat dictionary serialized
|
||||||
|
in a JSON format. This can be used for analytics.'''
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
if len(args) < 2 or len(args) > 3:
|
||||||
|
raise CommandError("dump_course_structure requires two or more arguments: <location> <outfile> |<db>|")
|
||||||
|
|
||||||
|
course_id = args[0]
|
||||||
|
outfile = args[1]
|
||||||
|
|
||||||
|
# use a user-specified database name, if present
|
||||||
|
# this is useful for doing dumps from databases restored from prod backups
|
||||||
|
if len(args) == 3:
|
||||||
|
settings.MODULESTORE['direct']['OPTIONS']['db'] = args[2]
|
||||||
|
|
||||||
|
loc = CourseDescriptor.id_to_location(course_id)
|
||||||
|
|
||||||
|
store = modulestore()
|
||||||
|
|
||||||
|
course = None
|
||||||
|
try:
|
||||||
|
course = store.get_item(loc, depth=4)
|
||||||
|
except:
|
||||||
|
print 'Could not find course at {0}'.format(course_id)
|
||||||
|
return
|
||||||
|
|
||||||
|
info = {}
|
||||||
|
|
||||||
|
def dump_into_dict(module, info):
|
||||||
|
filtered_metadata = dict((key, value) for key, value in own_metadata(module).iteritems()
|
||||||
|
if key not in filter_list)
|
||||||
|
info[module.location.url()] = {
|
||||||
|
'category': module.location.category,
|
||||||
|
'children': module.children if hasattr(module, 'children') else [],
|
||||||
|
'metadata': filtered_metadata
|
||||||
|
}
|
||||||
|
|
||||||
|
for child in module.get_children():
|
||||||
|
dump_into_dict(child, info)
|
||||||
|
|
||||||
|
dump_into_dict(course, info)
|
||||||
|
|
||||||
|
with open(outfile, 'w') as f:
|
||||||
|
f.write(dumps(info))
|
||||||
Reference in New Issue
Block a user