diff --git a/lms/djangoapps/courseware/content_parser.py b/lms/djangoapps/courseware/content_parser.py index 624608aaa9..d1d9cf3980 100644 --- a/lms/djangoapps/courseware/content_parser.py +++ b/lms/djangoapps/courseware/content_parser.py @@ -193,50 +193,6 @@ def replace_custom_tags(tree): replace_custom_tags_dir(tree, settings.DATA_DIR+'/custom_tags') -def course_file(user, coursename=None): - ''' Given a user, return an xml tree object for the course file. - - Handles getting the right file, and processing it depending on the - groups the user is in. Does caching of the xml strings. - ''' - - if user.is_authenticated(): - # use user.profile_cache.courseware? - filename = UserProfile.objects.get(user=user).courseware - else: - filename = 'guest_course.xml' - - # if a specific course is specified, then use multicourse to get - # the right path to the course XML directory - if coursename and settings.ENABLE_MULTICOURSE: - xp = multicourse_settings.get_course_xmlpath(coursename) - filename = xp + filename # prefix the filename with the path - - groups = user_groups(user) - options = get_options(user) - - # Try the cache... - cache_key = "{0}_processed?dev_content:{1}&groups:{2}".format( - filename, - options['dev_content'], - sorted(groups)) - - if "dev" in settings.DEFAULT_GROUPS: - tree_string = None - else: - tree_string = cache.get(cache_key) - - if tree_string: - tree = etree.XML(tree_string) - else: - tree = parse_course_file(filename, options, namespace='course') - # Cache it - tree_string = etree.tostring(tree) - cache.set(cache_key, tree_string, 60) - - return tree - - def sections_dir(coursename=None): ''' Get directory where sections information is stored. ''' diff --git a/lms/djangoapps/courseware/management/commands/check_course.py b/lms/djangoapps/courseware/management/commands/check_course.py index 8af0c5d4be..afc7e47857 100644 --- a/lms/djangoapps/courseware/management/commands/check_course.py +++ b/lms/djangoapps/courseware/management/commands/check_course.py @@ -6,50 +6,36 @@ from django.core.management.base import BaseCommand from django.conf import settings from django.contrib.auth.models import User -from courseware.content_parser import course_file -import courseware.module_render import xmodule import mitxmako.middleware as middleware middleware.MakoMiddleware() +from keystore.django import keystore +from courseware.models import StudentModuleCache +from courseware.module_render import get_module -def check_names(user, course): - ''' - Complain if any problems have non alphanumeric names. - TODO (vshnayder): there are some in 6.002x that don't. Is that actually a problem? - ''' - all_ok = True - print "Confirming all problems have alphanumeric names" - for problem in course.xpath('//problem'): - filename = problem.get('filename') - if not filename.isalnum(): - print "==============> Invalid (non-alphanumeric) filename", filename - all_ok = False - return all_ok -def check_rendering(user, course): +def check_rendering(module): '''Check that all modules render''' all_ok = True print "Confirming all modules render. Nothing should print during this step. " - for module in course.xpath('//problem|//html|//video|//vertical|//sequential|/tab'): - module_class = xmodule.modx_modules[module.tag] - # TODO: Abstract this out in render_module.py - try: - module_class(etree.tostring(module), - module.get('id'), - ajax_url='', - state=None, - track_function = lambda x,y,z:None, - render_function = lambda x: {'content':'','type':'video'}) + + def _check_module(module): + try: + module.get_html() except Exception as ex: - print "==============> Error in ", etree.tostring(module) + print "==============> Error in ", module.id print "" print ex all_ok = False + for child in module.get_children(): + _check_module(child) + _check_module(module) print "Module render check finished" return all_ok -def check_sections(user, course): + +def check_sections(course): all_ok = True sections_dir = settings.DATA_DIR + "/sections" print "Checking that all sections exist and parse properly" @@ -69,11 +55,13 @@ def check_sections(user, course): all_ok = False print "checked all sections" else: - print "Skipping check of include files -- no section includes dir ("+sections_dir+")" + print "Skipping check of include files -- no section includes dir (" + sections_dir + ")" return all_ok + class Command(BaseCommand): help = "Does basic validity tests on course.xml." + def handle(self, *args, **options): all_ok = True @@ -86,22 +74,25 @@ class Command(BaseCommand): sample_user = User.objects.all()[0] - print "Attempting to load courseware" - course = course_file(sample_user) - to_run = [check_names, - # TODO (vshnayder) : make check_rendering work (use module_render.py), - # turn it on - # check_rendering, - check_sections, - ] + # TODO (cpennington): Get coursename in a legitimate way + course_location = 'i4x://edx/6002xs12/course/6.002_Spring_2012' + student_module_cache = StudentModuleCache(sample_user, keystore().get_item(course_location)) + (course, _, _, _) = get_module(sample_user, None, course_location, student_module_cache) + + to_run = [ + #TODO (vshnayder) : make check_rendering work (use module_render.py), + # turn it on + check_rendering, + check_sections, + ] for check in to_run: - all_ok = check(sample_user, course) and all_ok + all_ok = check(course) and all_ok # TODO: print "Checking course properly annotated with preprocess.py" - + if all_ok: print 'Courseware passes all checks!' - else: + else: print "Courseware fails some checks"