def push_orphaned_submissions(self, orphaned_submissions): for orphaned_submission in orphaned_submissions: current_time = timezone.now() time_difference = (current_time - orphaned_submission.arrival_time).total_seconds() if time_difference > settings.ORPHANED_SUBMISSION_TIMEOUT: log.info("Found orphaned submission: queue_name: {0}, lms_header: {1}".format( orphaned_submission.queue_name, orphaned_submission.xqueue_header)) orphaned_submission.num_failures += 1 payload = {'xqueue_body': orphaned_submission.xqueue_body, 'xqueue_files': orphaned_submission.urls} orphaned_submission.grader_id = settings.XQUEUES[orphaned_submission.queue_name] orphaned_submission.push_time = timezone.now() (grading_success, grader_reply) = _http_post(orphaned_submission.grader_id, json.dumps(payload), settings.GRADING_TIMEOUT) orphaned_submission.return_time = timezone.now() if grading_success: orphaned_submission.grader_reply = grader_reply orphaned_submission.lms_ack = post_grade_to_lms(orphaned_submission.xqueue_header, grader_reply) else: log.error("Submission {} to grader {} failure: Reply: {}, ".format(orphaned_submission.id, orphaned_submission.grader_id, grader_reply)) orphaned_submission.num_failures += 1 orphaned_submission.lms_ack = post_failure_to_lms(orphaned_submission.xqueue_header) orphaned_submission.retired = True # NOTE: Retiring pushed submissions after one shot regardless of grading_success orphaned_submission.save()
def retire_submissions(self, failed_submissions, force): for failed_submission in failed_submissions: if failed_submission.num_failures >= settings.MAX_NUMBER_OF_FAILURES: log.info(" [ ] Retiring submission id=%d from queue '%s' with num_failures=%d" % (failed_submission.id, failed_submission.queue_name, failed_submission.num_failures)) if force: failed_submission.retired = True # Mark as done without contacting LMS else: failed_submission.lms_ack = post_failure_to_lms(failed_submission.xqueue_header) failed_submission.retired = failed_submission.lms_ack if not failed_submission.lms_ack: log.error(' [ ] Could not contact LMS to retire submission id=%d' % failed_submission.id) failed_submission.save()
def retire_submissions(self, failed_submissions, force): for failed_submission in failed_submissions: if failed_submission.num_failures >= settings.MAX_NUMBER_OF_FAILURES: log.info(" [ ] Retiring submission id=%d from queue '%s' with num_failures=%d" %\ (failed_submission.id, failed_submission.queue_name, failed_submission.num_failures)) if force: failed_submission.retired = True # Mark as done without contacting LMS else: failed_submission.lms_ack = post_failure_to_lms( failed_submission.xqueue_header) failed_submission.retired = failed_submission.lms_ack if not failed_submission.lms_ack: log.error( ' [ ] Could not contact LMS to retire submission id=%d' % failed_submission.id) failed_submission.save()
def push_orphaned_submissions(self, orphaned_submissions): for orphaned_submission in orphaned_submissions: current_time = timezone.now() time_difference = ( current_time - orphaned_submission.arrival_time).total_seconds() if time_difference > settings.ORPHANED_SUBMISSION_TIMEOUT: log.info( "Found orphaned submission: queue_name: {0}, lms_header: {1}" .format(orphaned_submission.queue_name, orphaned_submission.xqueue_header)) orphaned_submission.num_failures += 1 payload = { 'xqueue_body': orphaned_submission.xqueue_body, 'xqueue_files': orphaned_submission.urls } orphaned_submission.grader_id = settings.XQUEUES[ orphaned_submission.queue_name] orphaned_submission.push_time = timezone.now() (grading_success, grader_reply) = _http_post(orphaned_submission.grader_id, json.dumps(payload), settings.GRADING_TIMEOUT) orphaned_submission.return_time = timezone.now() if grading_success: orphaned_submission.grader_reply = grader_reply orphaned_submission.lms_ack = post_grade_to_lms( orphaned_submission.xqueue_header, grader_reply) else: log.error( "Submission {} to grader {} failure: Reply: {}, ". format(orphaned_submission.id, orphaned_submission.grader_id, grader_reply)) orphaned_submission.num_failures += 1 orphaned_submission.lms_ack = post_failure_to_lms( orphaned_submission.xqueue_header) orphaned_submission.retired = True # NOTE: Retiring pushed submissions after one shot regardless of grading_success orphaned_submission.save()
def handle(self, *args, **options): submissions = Submission.objects.filter(queue_name=options['queue_name'], retired=False) if options['retire_before']: retire_before = dateparse.parse_datetime(options['retire_before']) if retire_before: log.info("finding submissions submitted before {}".format(retire_before)) if not timezone.is_aware(retire_before): retire_before = timezone.make_aware(retire_before, timezone.utc) submissions = submissions.filter(arrival_time__lte=retire_before) else: raise CommandError("unable to parse datetime {}".format(options['retire_before'])) for submission in submissions: log.info("Retiring submission id={} from queue '{}' ".format(submission.id, submission.queue_name)) submission.retired = True submission.lms_ack = post_failure_to_lms(submission.xqueue_header) if not submission.lms_ack: log.error('Could not contact LMS to retire submission id={} - retired anyway'.format(submission.id)) submission.save()