diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py
index 172128d907..5e7c6bceef 100644
--- a/common/lib/xmodule/xmodule/capa_module.py
+++ b/common/lib/xmodule/xmodule/capa_module.py
@@ -460,6 +460,11 @@ class ProblemBlock(
'seed': user_state.state.get('seed'),
},
seed=user_state.state.get('seed'),
+ # The main point of minimal_init=True here is to avoid invoking
+ # codejail, which makes the reports take much longer to run,
+ # and can also cause failures for CPU intensive instructor code
+ # in problems.
+ minimal_init=True,
# extract_tree=False allows us to work without a fully initialized CapaModule
# We'll still be able to find particular data in the XML when we need it
extract_tree=False,
diff --git a/common/lib/xmodule/xmodule/tests/test_capa_module.py b/common/lib/xmodule/xmodule/tests/test_capa_module.py
index a3351277b3..a176989c83 100644
--- a/common/lib/xmodule/xmodule/tests/test_capa_module.py
+++ b/common/lib/xmodule/xmodule/tests/test_capa_module.py
@@ -3179,7 +3179,14 @@ class ProblemBlockReportGenerationTest(unittest.TestCase):
scope_ids = Mock(block_type='problem')
descriptor = ProblemBlock(get_test_system(), scope_ids=scope_ids)
descriptor.runtime = Mock()
- descriptor.data = ''
+ # Put a script tag so that codejail is normally invoked, to test that we
+ # suppress that invocation when generating this report.
+ descriptor.data = '''
+
+
+ '''
return descriptor
def test_generate_report_data_not_implemented(self):
@@ -3210,3 +3217,17 @@ class ProblemBlockReportGenerationTest(unittest.TestCase):
iterator = iter([self._user_state(suffix='_dynamath')])
report_data = list(descriptor.generate_report_data(iterator))
assert 0 == len(report_data)
+
+ def test_safe_exec_not_called(self):
+ """
+ Make sure we're not calling instructor code when doing this report.
+
+ This relies on us passing minimal_init=True when making the
+ LoncapaProblem. Without that, this whole suite will break because the
+ data in the descriptor (self._get_descriptor()) will force capa to do
+ initializations that are mocked out at the moment.
+ """
+ with patch('capa.safe_exec.safe_exec') as mock_safe_exec:
+ descriptor = self._get_descriptor()
+ list(descriptor.generate_report_data(self._mock_user_state_generator(), 2))
+ assert not mock_safe_exec.called