Commit 0a98fc29 by Sef Kloninger

dump_course_structure cmd: "flat" structure, csv

parent 92ee7957
""" """
A Django command that dumps the structure of a course as a JSON object. A Django command that dumps the structure of a course as a JSON object or CSV list.
The resulting JSON object has one entry for each module in the course: The resulting JSON object has one entry for each module in the course:
...@@ -17,6 +17,8 @@ The resulting JSON object has one entry for each module in the course: ...@@ -17,6 +17,8 @@ The resulting JSON object has one entry for each module in the course:
""" """
import json import json
import csv
import StringIO
from optparse import make_option from optparse import make_option
from textwrap import dedent from textwrap import dedent
...@@ -41,6 +43,16 @@ class Command(BaseCommand): ...@@ -41,6 +43,16 @@ class Command(BaseCommand):
action='store', action='store',
default='default', default='default',
help='Name of the modulestore'), help='Name of the modulestore'),
make_option('--flat',
action='store_true',
dest='flat',
default=False,
help='Show "flattened" course content with order and levels'),
make_option('--csv',
action='store_true',
dest='csv',
default=False,
help='output in CSV format (default is JSON)'),
) )
def handle(self, *args, **options): def handle(self, *args, **options):
...@@ -64,12 +76,20 @@ class Command(BaseCommand): ...@@ -64,12 +76,20 @@ class Command(BaseCommand):
# Convert course data to dictionary and dump it as JSON to stdout # Convert course data to dictionary and dump it as JSON to stdout
info = dump_module(course) if options['flat']:
info = dump_module_by_position(course_id, course)
else:
info = dump_module_by_module(course)
if options['csv']:
csvout = StringIO.StringIO()
writer = csv.writer(csvout, dialect='excel')
writer.writerows(info)
return csvout.getvalue()
else:
return json.dumps(info, indent=2, sort_keys=True) return json.dumps(info, indent=2, sort_keys=True)
def dump_module_by_module(module, destination=None):
def dump_module(module, destination=None):
""" """
Add the module and all its children to the destination dictionary in Add the module and all its children to the destination dictionary in
as a flat structure. as a flat structure.
...@@ -87,6 +107,51 @@ def dump_module(module, destination=None): ...@@ -87,6 +107,51 @@ def dump_module(module, destination=None):
} }
for child in module.get_children(): for child in module.get_children():
dump_module(child, destination) dump_module_by_module(child, destination)
return destination
def dump_module_by_position(course_id, module, level=0,
destination=None, prefix=None, parent=None):
"""
Add a module and all of its children to the end of the list.
Keep a running tally of position in the list and indent level.
"""
pos = 0
if destination:
pos = destination[-1][1] + 1 # pos is the 2nd col
if level == 0:
display_name_long = ""
elif level == 1:
display_name_long = module.display_name
else:
display_name_long = prefix + "," + module.display_name
if destination == None:
destination = [ ('course_id',
'position',
'level',
'module_id',
'type',
'displayname',
'path',
'parent') ]
destination.append( (course_id,
pos,
level,
module.id,
module.location.category,
module.display_name,
display_name_long,
parent) )
for child in module.get_children():
dump_module_by_position(course_id,
child,
level=level+1,
destination=destination,
prefix=display_name_long,
parent=module.id)
return destination return destination
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment