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()
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
    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()