Commit fcaf3e63 by Chris Dodge

give some debug message regarding why export might fail

parent edc62ff6
...@@ -3,6 +3,7 @@ import json ...@@ -3,6 +3,7 @@ import json
import os import os
import tarfile import tarfile
import shutil import shutil
import cgi
from tempfile import mkdtemp from tempfile import mkdtemp
from path import path from path import path
...@@ -27,7 +28,7 @@ from xmodule.modulestore import Location ...@@ -27,7 +28,7 @@ from xmodule.modulestore import Location
from xmodule.contentstore.content import StaticContent from xmodule.contentstore.content import StaticContent
from xmodule.util.date_utils import get_default_time_display from xmodule.util.date_utils import get_default_time_display
from xmodule.modulestore import InvalidLocationError from xmodule.modulestore import InvalidLocationError
from xmodule.exceptions import NotFoundError from xmodule.exceptions import NotFoundError, SerializationError
from .access import get_location_and_verify_access from .access import get_location_and_verify_access
from util.json_request import JsonResponse from util.json_request import JsonResponse
...@@ -336,16 +337,34 @@ def generate_export_course(request, org, course, name): ...@@ -336,16 +337,34 @@ def generate_export_course(request, org, course, name):
the course the course
""" """
location = get_location_and_verify_access(request, org, course, name) location = get_location_and_verify_access(request, org, course, name)
course_module = modulestore().get_item(location)
loc = Location(location) loc = Location(location)
export_file = NamedTemporaryFile(prefix=name + '.', suffix=".tar.gz") export_file = NamedTemporaryFile(prefix=name + '.', suffix=".tar.gz")
root_dir = path(mkdtemp()) root_dir = path(mkdtemp())
# export out to a tempdir try:
logging.debug('root = {0}'.format(root_dir))
export_to_xml(modulestore('direct'), contentstore(), loc, root_dir, name, modulestore()) export_to_xml(modulestore('direct'), contentstore(), loc, root_dir, name, modulestore())
except SerializationError, e:
failed_item = modulestore().get_item(e.location)
parent_locs = modulestore().get_parent_locations(failed_item.location, None)
if len(parent_locs) > 0:
parent = modulestore().get_item(parent_locs[0])
parent_info = "Parent Display Name: {0}<br />Parent Identifier: {1}".format(parent.display_name, parent.location.name)
else:
parent_info = ''
return render_to_response('export.html', {
'context_course': course_module,
'successful_import_redirect_url': '',
'err_msg': "A courseware module has failed to convert to XML. Details: <br />Module Type: {0}<br />Display Name: {1}<br />Identifier: {2}<br />{3}".
format(failed_item.location.category, failed_item.display_name, failed_item.location.name, parent_info)
})
except Exception, e:
return render_to_response('export.html', {
'context_course': course_module,
'successful_import_redirect_url': '',
'err_msg': str(e)
})
logging.debug('tar file being generated at {0}'.format(export_file.name)) logging.debug('tar file being generated at {0}'.format(export_file.name))
tar_file = tarfile.open(name=export_file.name, mode='w:gz') tar_file = tarfile.open(name=export_file.name, mode='w:gz')
......
...@@ -6,6 +6,24 @@ ...@@ -6,6 +6,24 @@
<%block name="title">${_("Course Export")}</%block> <%block name="title">${_("Course Export")}</%block>
<%block name="bodyclass">is-signedin course tools export</%block> <%block name="bodyclass">is-signedin course tools export</%block>
<%block name="jsextra">
% if err_msg:
<script type='text/javascript'>
$(document).ready(function() {
var defaultTitle = gettext('There has been an error with your export.');
var msg = "${err_msg}";
dialog = new CMS.Views.Alert.Confirmation({
title: defaultTitle,
message: msg,
intent: "error",
closeIcon: false
});
dialog.show();
})
</script>
%endif
</%block>
<%block name="content"> <%block name="content">
<div class="wrapper-mast wrapper"> <div class="wrapper-mast wrapper">
<header class="mast has-subtitle"> <header class="mast has-subtitle">
...@@ -18,6 +36,7 @@ ...@@ -18,6 +36,7 @@
<div class="main-wrapper"> <div class="main-wrapper">
<div class="inner-wrapper"> <div class="inner-wrapper">
<article class="export-overview"> <article class="export-overview">
<div class="description"> <div class="description">
<h2>${_("About Exporting Courses")}</h2> <h2>${_("About Exporting Courses")}</h2>
......
...@@ -13,6 +13,7 @@ class ProcessingError(Exception): ...@@ -13,6 +13,7 @@ class ProcessingError(Exception):
''' '''
pass pass
class InvalidVersionError(Exception): class InvalidVersionError(Exception):
""" """
Tried to save an item with a location that a store cannot support (e.g., draft version Tried to save an item with a location that a store cannot support (e.g., draft version
...@@ -21,3 +22,12 @@ class InvalidVersionError(Exception): ...@@ -21,3 +22,12 @@ class InvalidVersionError(Exception):
def __init__(self, location): def __init__(self, location):
super(InvalidVersionError, self).__init__() super(InvalidVersionError, self).__init__()
self.location = location self.location = location
class SerializationError(Exception):
"""
Thrown when a module cannot be exported to XML
"""
def __init__(self, location, msg):
super(SerializationError, self).__init__(msg)
self.location = location
...@@ -4,6 +4,7 @@ from xmodule.xml_module import XmlDescriptor ...@@ -4,6 +4,7 @@ from xmodule.xml_module import XmlDescriptor
import logging import logging
import sys import sys
from xblock.core import String, Scope from xblock.core import String, Scope
from exceptions import SerializationError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -27,11 +28,11 @@ class RawDescriptor(XmlDescriptor, XMLEditingDescriptor): ...@@ -27,11 +28,11 @@ class RawDescriptor(XmlDescriptor, XMLEditingDescriptor):
# re-raise # re-raise
lines = self.data.split('\n') lines = self.data.split('\n')
line, offset = err.position line, offset = err.position
msg = ("Unable to create xml for problem {loc}. " msg = ("Unable to create xml for module {loc}. "
"Context: '{context}'".format( "Context: '{context}'".format(
context=lines[line - 1][offset - 40:offset + 40], context=lines[line - 1][offset - 40:offset + 40],
loc=self.location)) loc=self.location))
raise Exception, msg, sys.exc_info()[2] raise SerializationError(self.location, msg)
class EmptyDataRawDescriptor(XmlDescriptor, XMLEditingDescriptor): class EmptyDataRawDescriptor(XmlDescriptor, XMLEditingDescriptor):
......
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