Commit 8872fbcc by Brian Wilson

Add factory for CourseTaskLog.

Add unit tests for regrading at courseware level (task and task_queue).
parent 8660c9a7
...@@ -16,6 +16,10 @@ from xmodule.modulestore.django import modulestore ...@@ -16,6 +16,10 @@ from xmodule.modulestore.django import modulestore
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class AlreadyRunningError(Exception):
pass
def get_running_course_tasks(course_id): def get_running_course_tasks(course_id):
""" """
Returns a query of CourseTaskLog objects of running tasks for a given course. Returns a query of CourseTaskLog objects of running tasks for a given course.
...@@ -85,7 +89,7 @@ def _reserve_task(course_id, task_name, task_args, requester, student=None): ...@@ -85,7 +89,7 @@ def _reserve_task(course_id, task_name, task_args, requester, student=None):
""" """
if _task_is_running(course_id, task_name, task_args, student): if _task_is_running(course_id, task_name, task_args, student):
raise Exception("requested task is already running") raise AlreadyRunningError("requested task is already running")
# Create log entry now, so that future requests won't # Create log entry now, so that future requests won't
tasklog_args = {'course_id': course_id, tasklog_args = {'course_id': course_id,
...@@ -157,7 +161,7 @@ def _update_course_task_log(course_task_log_entry, task_result): ...@@ -157,7 +161,7 @@ def _update_course_task_log(course_task_log_entry, task_result):
total=returned_result['total'], total=returned_result['total'],
action_name=returned_result['action_name']) action_name=returned_result['action_name'])
output['message'] = message output['message'] = message
log.info("task progress: {0}".format(message)) log.info("task progress: %s", message)
else: else:
log.info("still making progress... ") log.info("still making progress... ")
output['task_progress'] = returned_result output['task_progress'] = returned_result
...@@ -165,7 +169,7 @@ def _update_course_task_log(course_task_log_entry, task_result): ...@@ -165,7 +169,7 @@ def _update_course_task_log(course_task_log_entry, task_result):
elif result_state == 'SUCCESS': elif result_state == 'SUCCESS':
output['task_progress'] = returned_result output['task_progress'] = returned_result
course_task_log_entry.task_progress = json.dumps(returned_result) course_task_log_entry.task_progress = json.dumps(returned_result)
log.info("task succeeded: {0}".format(returned_result)) log.info("task succeeded: %s", returned_result)
entry_needs_saving = True entry_needs_saving = True
elif result_state == 'FAILURE': elif result_state == 'FAILURE':
...@@ -175,13 +179,23 @@ def _update_course_task_log(course_task_log_entry, task_result): ...@@ -175,13 +179,23 @@ def _update_course_task_log(course_task_log_entry, task_result):
entry_needs_saving = True entry_needs_saving = True
task_progress = {'exception': type(exception).__name__, 'message': str(exception.message)} task_progress = {'exception': type(exception).__name__, 'message': str(exception.message)}
output['message'] = exception.message output['message'] = exception.message
log.warning("background task (%s) failed: %s %s".format(task_id, returned_result, traceback)) log.warning("background task (%s) failed: %s %s", task_id, returned_result, traceback)
if result_traceback is not None: if result_traceback is not None:
output['task_traceback'] = result_traceback output['task_traceback'] = result_traceback
task_progress['traceback'] = result_traceback task_progress['traceback'] = result_traceback
course_task_log_entry.task_progress = json.dumps(task_progress) course_task_log_entry.task_progress = json.dumps(task_progress)
output['task_progress'] = task_progress output['task_progress'] = task_progress
elif result_state == 'REVOKED':
# on revocation, the result's result doesn't contain anything
entry_needs_saving = True
message = 'Task revoked before running'
output['message'] = message
log.warning("background task (%s) revoked.", task_id)
task_progress = {'message': message}
course_task_log_entry.task_progress = json.dumps(task_progress)
output['task_progress'] = task_progress
# always update the entry if the state has changed: # always update the entry if the state has changed:
if result_state != course_task_log_entry.task_state: if result_state != course_task_log_entry.task_state:
course_task_log_entry.task_state = result_state course_task_log_entry.task_state = result_state
...@@ -308,7 +322,7 @@ def _check_arguments_for_regrading(course_id, problem_url): ...@@ -308,7 +322,7 @@ def _check_arguments_for_regrading(course_id, problem_url):
""" """
descriptor = modulestore().get_instance(course_id, problem_url) descriptor = modulestore().get_instance(course_id, problem_url)
supports_regrade = False supports_regrade = False
if hasattr(descriptor,'module_class'): if hasattr(descriptor, 'module_class'):
module_class = descriptor.module_class module_class = descriptor.module_class
if hasattr(module_class, 'regrade_problem'): if hasattr(module_class, 'regrade_problem'):
supports_regrade = True supports_regrade = True
......
...@@ -10,6 +10,8 @@ from student.tests.factories import CourseEnrollmentAllowedFactory as StudentCou ...@@ -10,6 +10,8 @@ from student.tests.factories import CourseEnrollmentAllowedFactory as StudentCou
from student.tests.factories import RegistrationFactory as StudentRegistrationFactory from student.tests.factories import RegistrationFactory as StudentRegistrationFactory
from courseware.models import StudentModule, XModuleContentField, XModuleSettingsField from courseware.models import StudentModule, XModuleContentField, XModuleSettingsField
from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField
from courseware.models import CourseTaskLog
from xmodule.modulestore import Location from xmodule.modulestore import Location
from pytz import UTC from pytz import UTC
...@@ -84,3 +86,16 @@ class StudentInfoFactory(DjangoModelFactory): ...@@ -84,3 +86,16 @@ class StudentInfoFactory(DjangoModelFactory):
field_name = 'existing_field' field_name = 'existing_field'
value = json.dumps('old_value') value = json.dumps('old_value')
student = SubFactory(UserFactory) student = SubFactory(UserFactory)
class CourseTaskLogFactory(DjangoModelFactory):
FACTORY_FOR = CourseTaskLog
task_name = 'regrade_problem'
course_id = "MITx/999/Robot_Super_Course"
student = SubFactory(UserFactory)
task_args = None
task_id = None
task_state = "QUEUED"
task_progress = None
requester = SubFactory(UserFactory)
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