@@ -254,27 +254,6 @@ class CustomResponseXMLFactory(ResponseXMLFactory):
|
||||
return ResponseXMLFactory.textline_input_xml(**kwargs)
|
||||
|
||||
|
||||
class SymbolicResponseXMLFactory(ResponseXMLFactory):
|
||||
""" Factory for creating <symbolicresponse> XML trees """
|
||||
|
||||
def create_response_element(self, **kwargs):
|
||||
cfn = kwargs.get('cfn', None)
|
||||
answer = kwargs.get('answer', None)
|
||||
options = kwargs.get('options', None)
|
||||
|
||||
response_element = etree.Element("symbolicresponse")
|
||||
if cfn:
|
||||
response_element.set('cfn', str(cfn))
|
||||
if answer:
|
||||
response_element.set('answer', str(answer))
|
||||
if options:
|
||||
response_element.set('options', str(options))
|
||||
return response_element
|
||||
|
||||
def create_input_element(self, **kwargs):
|
||||
return ResponseXMLFactory.textline_input_xml(**kwargs)
|
||||
|
||||
|
||||
class SchematicResponseXMLFactory(ResponseXMLFactory):
|
||||
""" Factory for creating <schematicresponse> XML trees """
|
||||
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
"""
|
||||
A script to walk a course xml tree, generate a dictionary of all the metadata,
|
||||
and print it out as a json dict.
|
||||
"""
|
||||
import sys
|
||||
import json
|
||||
|
||||
from collections import OrderedDict
|
||||
from path import path
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from xmodule.modulestore.xml import XMLModuleStore
|
||||
from xmodule.x_module import policy_key
|
||||
|
||||
|
||||
def import_course(course_dir, verbose=True):
|
||||
course_dir = path(course_dir)
|
||||
data_dir = course_dir.dirname()
|
||||
course_dirs = [course_dir.basename()]
|
||||
|
||||
# No default class--want to complain if it doesn't find plugins for any
|
||||
# module.
|
||||
modulestore = XMLModuleStore(
|
||||
data_dir,
|
||||
default_class=None,
|
||||
course_dirs=course_dirs
|
||||
)
|
||||
|
||||
def str_of_err(tpl):
|
||||
(msg, exc_str) = tpl
|
||||
return '{msg}\n{exc}'.format(msg=msg, exc=exc_str)
|
||||
|
||||
courses = modulestore.get_courses()
|
||||
|
||||
n = len(courses)
|
||||
if n != 1:
|
||||
sys.stderr.write('ERROR: Expect exactly 1 course. Loaded {n}: {lst}\n'.format(
|
||||
n=n, lst=courses))
|
||||
return None
|
||||
|
||||
course = courses[0]
|
||||
errors = modulestore.get_course_errors(course.id)
|
||||
if len(errors) != 0:
|
||||
sys.stderr.write('ERRORs during import: {0}\n'.format('\n'.join(map(str_of_err, errors))))
|
||||
|
||||
return course
|
||||
|
||||
|
||||
def node_metadata(node):
|
||||
# make a copy
|
||||
to_export = ('format', 'display_name',
|
||||
'graceperiod', 'showanswer', 'rerandomize',
|
||||
'start', 'due', 'graded', 'hide_from_toc',
|
||||
'ispublic', 'xqa_key')
|
||||
|
||||
orig = own_metadata(node)
|
||||
d = {k: orig[k] for k in to_export if k in orig}
|
||||
return d
|
||||
|
||||
|
||||
def get_metadata(course):
|
||||
d = OrderedDict({})
|
||||
queue = [course]
|
||||
while len(queue) > 0:
|
||||
node = queue.pop()
|
||||
d[policy_key(node.location)] = node_metadata(node)
|
||||
# want to print first children first, so put them at the end
|
||||
# (we're popping from the end)
|
||||
queue.extend(reversed(node.get_children()))
|
||||
return d
|
||||
|
||||
|
||||
def print_metadata(course_dir, output):
|
||||
course = import_course(course_dir)
|
||||
if course:
|
||||
meta = get_metadata(course)
|
||||
result = json.dumps(meta, indent=4)
|
||||
if output:
|
||||
with file(output, 'w') as f:
|
||||
f.write(result)
|
||||
else:
|
||||
print result
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = """Imports specified course.xml and prints its
|
||||
metadata as a json dict.
|
||||
|
||||
Usage: metadata_to_json PATH-TO-COURSE-DIR OUTPUT-PATH
|
||||
|
||||
if OUTPUT-PATH isn't given, print to stdout.
|
||||
"""
|
||||
|
||||
def handle(self, *args, **options):
|
||||
n = len(args)
|
||||
if n < 1 or n > 2:
|
||||
print Command.help
|
||||
return
|
||||
|
||||
output_path = args[1] if n > 1 else None
|
||||
print_metadata(args[0], output_path)
|
||||
@@ -1,32 +0,0 @@
|
||||
from django.utils.translation import ugettext as _
|
||||
import django.core.urlresolvers as urlresolvers
|
||||
import sys
|
||||
import inspect
|
||||
|
||||
# This method is used to pluralize the words "discussion" and "comment"
|
||||
# which is why you need to tack on an "s" for the case of 0 or two or more.
|
||||
|
||||
|
||||
def pluralize(content, text):
|
||||
num, word = text.split(' ')
|
||||
num = int(num or '0')
|
||||
if num >= 2 or num == 0:
|
||||
return word + 's'
|
||||
else:
|
||||
return word
|
||||
|
||||
|
||||
def url_for_user(content, user_id):
|
||||
return urlresolvers.reverse('django_comment_client.forum.views.user_profile', args=[content['course_id'], user_id])
|
||||
|
||||
|
||||
def close_thread_text(content):
|
||||
if content.get('closed'):
|
||||
return _('Re-open thread')
|
||||
else:
|
||||
return _('Close thread')
|
||||
|
||||
current_module = sys.modules[__name__]
|
||||
all_functions = inspect.getmembers(current_module, inspect.isfunction)
|
||||
|
||||
mustache_helpers = {k: v for k, v in all_functions if not k.startswith('_')}
|
||||
@@ -1,27 +0,0 @@
|
||||
from django.test import TestCase
|
||||
import django_comment_client.mustache_helpers as mustache_helpers
|
||||
|
||||
|
||||
class PluralizeTest(TestCase):
|
||||
def setUp(self):
|
||||
super(PluralizeTest, self).setUp()
|
||||
self.text1 = '0 goat'
|
||||
self.text2 = '1 goat'
|
||||
self.text3 = '7 goat'
|
||||
self.content = 'unused argument'
|
||||
|
||||
def test_pluralize(self):
|
||||
self.assertEqual(mustache_helpers.pluralize(self.content, self.text1), 'goats')
|
||||
self.assertEqual(mustache_helpers.pluralize(self.content, self.text2), 'goat')
|
||||
self.assertEqual(mustache_helpers.pluralize(self.content, self.text3), 'goats')
|
||||
|
||||
|
||||
class CloseThreadTextTest(TestCase):
|
||||
def setUp(self):
|
||||
super(CloseThreadTextTest, self).setUp()
|
||||
self.contentClosed = {'closed': True}
|
||||
self.contentOpen = {'closed': False}
|
||||
|
||||
def test_close_thread_text(self):
|
||||
self.assertEqual(mustache_helpers.close_thread_text(self.contentClosed), 'Re-open thread')
|
||||
self.assertEqual(mustache_helpers.close_thread_text(self.contentOpen), 'Close thread')
|
||||
Reference in New Issue
Block a user