Example #1
0
def contest_rejudge(issue):
    got_verdict_submissions = issue.contestsubmission_set.filter(
        got_verdict=True)

    if not (got_verdict_submissions.count()
            and issue.contestsubmission_set.count()
            == (got_verdict_submissions.count() +
                issue.contestsubmission_set.exclude(
                    send_error__isnull=True).exclude(send_error="").count())):
        return

    old_contest_submission = got_verdict_submissions.order_by(
        "-create_time")[0]
    author = old_contest_submission.author
    field, field_get = IssueField.objects.get_or_create(name='comment')
    event = issue.create_event(field, author=author)

    file_copy = deepcopy(old_contest_submission.file)
    file_copy.pk = None
    file_copy.event = event
    file_copy.save()
    contest_submission = issue.contestsubmission_set.create(issue=issue,
                                                            author=author,
                                                            file=file_copy)
    sent = contest_submission.upload_contest(
        compiler_id=old_contest_submission.compiler_id)
    if sent:
        event.value = u"<p>{0}</p>".format(_(u'otpravleno_v_kontest'))
        if not issue.is_status_accepted():
            issue.set_status_auto_verification()
    else:
        event.value = u"<p>{1}('{0}').</p>".format(
            contest_submission.send_error, _(u'oshibka_otpravki_v_kontest'))
        issue.followers.add(User.objects.get(username='******'))

    if issue.task.rb_integrated and issue.task.course.send_rb_and_contest_together:
        for ext in settings.RB_EXTENSIONS + [
                str(ext.name)
                for ext in issue.task.course.filename_extensions.all()
        ]:
            filename, extension = os.path.splitext(file_copy.file.name)
            if ext == extension or ext == '.*':
                anyrb = AnyRB(event)
                review_request_id = anyrb.upload_review()
                if review_request_id is not None:
                    event.value += u'<p><a href="{1}/r/{0}">Review request {0}</a></p>'. \
                        format(review_request_id, settings.RB_API_URL)
                else:
                    event.value += u'<p>{0}.</p>'.format(
                        _(u'oshibka_otpravki_v_rb'))
                    issue.followers.add(
                        User.objects.get(username='******'))
                break

    event.save()
Example #2
0
    def handle(self, **options):
        start_time = time.time()
        contest_marks_len = 0
        contest_submissions = ContestSubmission.objects \
            .filter(Q(got_verdict=False) & (Q(send_error__isnull=True) | Q(send_error=""))) \
            .exclude(run_id__exact="") \
            .exclude(run_id__isnull=True)
        for contest_submission in contest_submissions:
            try:
                issue = contest_submission.issue
                task = issue.task
                lang = UserProfile.objects.get(
                    user=contest_submission.author).language
                translation.activate(lang)

                comment = contest_submission.check_submission()
                if contest_submission.got_verdict:
                    if contest_submission.verdict == 'ok' and \
                            not task.course.send_rb_and_contest_together and \
                            task.rb_integrated:
                        anyrb = AnyRB(contest_submission.file.event)
                        review_request_id = anyrb.upload_review()
                        if review_request_id is not None:
                            comment += '\n' + u'<a href="{1}/r/{0}">Review request {0}</a>'. \
                                format(review_request_id, settings.RB_API_URL)
                        else:
                            comment += '\n' + _(u'oshibka_otpravki_v_rb')
                    if contest_submission.verdict == 'ok' and \
                            task.accepted_after_contest_ok and \
                            not issue.is_status_accepted():
                        if task.deadline_time and task.deadline_time < timezone.now() and \
                                task.course.issue_status_system.has_accepted_after_deadline():
                            issue.set_status_accepted_after_deadline()
                            if not issue.task.score_after_deadline:
                                comment += '\n' + _(u'bally_ne_uchityvautsia')
                        else:
                            issue.set_status_accepted()

                    if contest_submission.verdict == 'ok':
                        if issue.task.course.take_mark_from_contest:
                            contest_submission.get_contest_mark()
                            contest_marks_len += 1

                    comment_verdict(issue, contest_submission.verdict == 'ok',
                                    comment)
                translation.deactivate()
            except Exception as e:
                logger.exception(e)

        # for contest_id, students_info in contest_marks.iteritems():
        #     set_contest_marks(contest_id, students_info)

        # logging to cron log
        print "Command check_contest check {0} submissions ({1} - with marks) took {2} seconds" \
            .format(len(contest_submissions), contest_marks_len, time.time() - start_time)
Example #3
0
    def handle(self, **options):
        start_time = time.time()
        contest_marks_len = 0
        contest_submissions = ContestSubmission.objects \
            .filter(Q(got_verdict=False) & (Q(send_error__isnull=True) | Q(send_error=""))) \
            .exclude(run_id__exact="") \
            .exclude(run_id__isnull=True)
        for contest_submission in contest_submissions:
            try:
                issue = contest_submission.issue
                task = issue.task
                lang = UserProfile.objects.get(user=contest_submission.author).language
                translation.activate(lang)

                comment = contest_submission.check_submission()
                if contest_submission.got_verdict:
                    if contest_submission.verdict == 'ok' and \
                            not task.course.send_rb_and_contest_together and \
                            task.rb_integrated:
                        anyrb = AnyRB(contest_submission.file.event)
                        review_request_id = anyrb.upload_review()
                        if review_request_id is not None:
                            comment += '\n' + u'<a href="{1}/r/{0}">Review request {0}</a>'. \
                                format(review_request_id, settings.RB_API_URL)
                        else:
                            comment += '\n' + _(u'oshibka_otpravki_v_rb')
                    if contest_submission.verdict == 'ok' and \
                            task.accepted_after_contest_ok and \
                            not issue.is_status_accepted():
                        if task.deadline_time and task.deadline_time < timezone.now() and \
                                task.course.issue_status_system.has_accepted_after_deadline():
                            issue.set_status_accepted_after_deadline()
                            if not issue.task.score_after_deadline:
                                comment += '\n' + _(u'bally_ne_uchityvautsia')
                        else:
                            issue.set_status_accepted()

                    if contest_submission.verdict == 'ok':
                        if issue.task.course.take_mark_from_contest:
                            contest_submission.get_contest_mark()
                            contest_marks_len += 1

                    comment_verdict(issue, contest_submission.verdict == 'ok', comment)
                translation.deactivate()
            except Exception as e:
                logger.exception(e)

        # for contest_id, students_info in contest_marks.iteritems():
        #     set_contest_marks(contest_id, students_info)

        # logging to cron log
        print "Command check_contest check {0} submissions ({1} - with marks) took {2} seconds" \
            .format(len(contest_submissions), contest_marks_len, time.time() - start_time)
Example #4
0
def contest_rejudge(issue):
    got_verdict_submissions = issue.contestsubmission_set.filter(got_verdict=True)

    if not (got_verdict_submissions.count()
            and issue.contestsubmission_set.count()
            == (
                got_verdict_submissions.count()
                + issue.contestsubmission_set.exclude(send_error__isnull=True).exclude(send_error="").count())
            ):
        return

    old_contest_submission = got_verdict_submissions.order_by("-create_time")[0]
    author = old_contest_submission.author
    field, field_get = IssueField.objects.get_or_create(name='comment')
    event = issue.create_event(field, author=author)

    file_copy = deepcopy(old_contest_submission.file)
    file_copy.pk = None
    file_copy.event = event
    file_copy.save()
    contest_submission = issue.contestsubmission_set.create(issue=issue,
                                                            author=author,
                                                            file=file_copy)
    sent = contest_submission.upload_contest(compiler_id=old_contest_submission.compiler_id)
    if sent:
        event.value = u"<p>{0}</p>".format(_(u'otpravleno_v_kontest'))
        if not issue.is_status_accepted():
            issue.set_status_auto_verification()
    else:
        event.value = u"<p>{1}('{0}').</p>".format(
            contest_submission.send_error, _(u'oshibka_otpravki_v_kontest'))
        issue.followers.add(User.objects.get(username='******'))

    if issue.task.rb_integrated and issue.task.course.send_rb_and_contest_together:
        for ext in settings.RB_EXTENSIONS + [str(ext.name) for ext in issue.task.course.filename_extensions.all()]:
            filename, extension = os.path.splitext(file_copy.file.name)
            if ext == extension or ext == '.*':
                anyrb = AnyRB(event)
                review_request_id = anyrb.upload_review()
                if review_request_id is not None:
                    event.value += u'<p><a href="{1}/r/{0}">Review request {0}</a></p>'. \
                        format(review_request_id, settings.RB_API_URL)
                else:
                    event.value += u'<p>{0}.</p>'.format(_(u'oshibka_otpravki_v_rb'))
                    issue.followers.add(User.objects.get(username='******'))
                break

    event.save()
Example #5
0
 def handle(self, **options):
     for issue in Issue.objects.filter(status=Issue.STATUS_AUTO_VERIFICATION):
         try:
             run_id = issue.get_byname('run_id')
             events = issue.event_set.all().reverse()
             for event_id,event in enumerate(events):
                 if event.value == run_id:
                     got_verdict, verdict, comment = check_submission(issue)
                     if got_verdict:
                         if verdict and not issue.task.course.send_rb_and_contest_together and issue.task.course.rb_integrated:
                             anyrb = AnyRB(events[event_id-1])
                             review_request_id = anyrb.upload_review()
                             if review_request_id is not None:
                                 comment += '\n' + \
                                           u'<a href="{1}/r/{0}">Review request {0}</a>'. \
                                           format(review_request_id,settings.RB_API_URL)
                             else:
                                 comment += u'Ошибка отправки в Review Board.'
                         comment_verdict(issue, verdict, comment)
         except Exception as e:
             logger.exception(e)
Example #6
0
    def set_field(self, field, value, author=None):
        event = self.create_event(field, author)
        name = field.name

        if name == 'responsible_name':
            new_responsible = value

            if self.responsible != new_responsible:
                new_followers = list(self.followers.all().exclude(id=new_responsible.id))
                if self.responsible:
                    new_followers.append(self.responsible)
                self.responsible = new_responsible
                self.followers = new_followers

            value = value.last_name + ' ' + value.first_name

        elif name == 'followers_names':
            if self.responsible and str(self.responsible.id) in value:
                value.remove(str(self.responsible.id))
            self.followers = list(value)

            value = []
            for follower in self.followers.all():
                value.append(follower.last_name + ' ' + follower.first_name)

            value = ', '.join(value)

        elif name == 'comment':
            if value:
                sent = True
                for file_id, file in enumerate(value['files']):
                    file.name = unidecode(file.name)
                    uploaded_file = File(file=file, event=event)
                    uploaded_file.save()
                    if self.task.course.contest_integrated:
                        for ext in settings.CONTEST_EXTENSIONS:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension:
                                sent, message = upload_contest(event, ext, uploaded_file, compiler_id=value['compilers'][file_id])
                                if sent:
                                    value['comment'] += u"Отправлено на проверку в Я.Контест"
                                    if self.status != self.STATUS_ACCEPTED:
                                        self.set_byname('status', self.STATUS_AUTO_VERIFICATION)
                                else:
                                    value['comment'] += u"Ошибка отправки в Я.Контест ('{0}').".format(message)
                                    self.followers.add(User.objects.get(username='******'))
                                break

                    if self.task.course.rb_integrated and (self.task.course.send_rb_and_contest_together or not self.task.course.contest_integrated):
                        for ext in settings.RB_EXTENSIONS:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension:
                                anyrb = AnyRB(event)
                                review_request_id = anyrb.upload_review()
                                if review_request_id is not None:
                                    value['comment'] += '\n' + \
                                              u'<a href="{1}/r/{0}">Review request {0}</a>'. \
                                              format(review_request_id,settings.RB_API_URL)
                                else:
                                    value['comment'] += '\n' + u'Ошибка отправки в Review Board.'
                                    self.followers.add(User.objects.get(username='******'))
                                break

                if not value['files'] and not value['comment']:
                    event.delete()
                    return
                else:
                    self.update_time = datetime.now()
                    value = value['comment']

                if self.status != self.STATUS_AUTO_VERIFICATION and self.status != self.STATUS_ACCEPTED:
                    if author == self.student and self.status != self.STATUS_NEED_INFO and sent:
                        self.set_byname('status', self.STATUS_VERIFICATION)
                    if author == self.responsible:
                        self.status = self.STATUS_REWORK

        elif name == 'status':
            try:
                review_id = self.get_byname('review_id')
                if review_id != '':
                    if value == self.STATUS_ACCEPTED:
                        update_status_review_request(review_id,'submitted')
                    elif self.status == self.STATUS_ACCEPTED:
                        update_status_review_request(review_id,'pending')
            except:
                pass

            self.status = value
            value = self.get_status()

        elif name == 'mark':
            if not value:
                value = 0
            value = normalize_decimal(value)
            value = str(value)
            if self.status != self.STATUS_ACCEPTED and self.status != self.STATUS_NEW:
                self.set_byname('status', 'rework')

        self.save()

        if not value:
            value = ''

        course = self.task.course
        group = course.get_user_group(self.student)
        default_teacher = course.get_default_teacher(group)
        if default_teacher and (not self.get_byname('responsible_name')):
            self.set_byname('responsible_name', default_teacher)

        event.value = value
        event.save()
        event.pull_plugins()


        pass
Example #7
0
    def set_field(self, field, value, author=None, from_contest=False):
        event = self.create_event(field, author)
        name = field.name
        course = self.task.course

        delete_event = False

        if name == 'responsible_name':
            new_responsible = value

            if self.responsible != new_responsible:
                new_followers = list(
                    self.followers.all().exclude(id=new_responsible.id))
                if self.responsible:
                    new_followers.append(self.responsible)
                self.responsible = new_responsible
                self.followers = new_followers
            else:
                delete_event = True

            value = get_user_fullname(value)

        elif name == 'followers_names':
            if self.responsible and str(self.responsible.id) in value:
                value.remove(str(self.responsible.id))
            new_followers = User.objects.filter(id__in=value)

            if list(new_followers) == list(self.followers.all()):
                delete_event = True
            else:
                deleted_followers = [
                    get_user_fullname(follower)
                    for follower in set(self.followers.all()).difference(
                        set(new_followers))
                ]
                add_followers = [
                    get_user_fullname(follower)
                    for follower in new_followers.all()
                ]
                self.followers = value
                value = ', '.join(add_followers) + '\n' + ', '.join(
                    deleted_followers)

        elif name == 'comment':
            if value:
                sent = True
                for file_id, file in enumerate(value['files']):
                    file.name = unidecode(file.name)
                    uploaded_file = File(file=file, event=event)
                    uploaded_file.save()
                    if self.task.contest_integrated:
                        for ext in settings.CONTEST_EXTENSIONS:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension:
                                contest_submission = self.contestsubmission_set.create(
                                    issue=self,
                                    author=author,
                                    file=uploaded_file)
                                sent = contest_submission.upload_contest(
                                    ext,
                                    compiler_id=value['compilers'][file_id])
                                if sent:
                                    value['comment'] += u"<p>{0}</p>".format(
                                        _(u'otpravleno_v_kontest'))
                                    if not self.is_status_accepted():
                                        self.set_status_auto_verification()
                                else:
                                    value[
                                        'comment'] += u"<p>{0}('{1}')</p>".format(
                                            _(u'oshibka_otpravki_v_kontest'),
                                            contest_submission.send_error)
                                    self.followers.add(
                                        User.objects.get(
                                            username='******'))
                                break

                    if self.task.rb_integrated \
                            and (course.send_rb_and_contest_together or not self.task.contest_integrated):
                        for ext in settings.RB_EXTENSIONS + [
                                str(ext.name)
                                for ext in course.filename_extensions.all()
                        ]:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension or ext == '.*':
                                anyrb = AnyRB(event)
                                review_request_id = anyrb.upload_review()
                                if review_request_id is not None:
                                    value['comment'] += u'<p><a href="{1}/r/{0}">Review request {0}</a></p>'. \
                                        format(review_request_id, settings.RB_API_URL)
                                else:
                                    value['comment'] += u'<p>{0}</p>'.format(
                                        _(u'oshibka_otpravki_v_rb'))
                                    self.followers.add(
                                        User.objects.get(
                                            username='******'))
                                break

                if not value['files'] and not value['comment']:
                    event.delete()
                    return
                else:
                    self.update_time = timezone.now()
                    value = u'<div class="issue-page-comment not-sanitize">' + value[
                        'comment'] + u'</div>'

                if not self.is_status_auto_verification(
                ) and not self.is_status_accepted():
                    if author == self.student and not self.is_status_need_info(
                    ) and sent:
                        self.set_status_verification()
                    if author == self.responsible:
                        if self.is_status_need_info():
                            status_field = IssueField.objects.get(
                                name='status')
                            status_events = Event.objects \
                                .filter(issue_id=self.id, field=status_field) \
                                .exclude(author__isnull=True) \
                                .order_by('-timestamp')

                            if status_events:
                                status_prev = self.task.course.issue_status_system.statuses \
                                    .filter(name=status_events[0].value)
                                if status_prev:
                                    self.set_field(status_field,
                                                   status_prev[0])
                                else:
                                    self.set_status_rework()
                        else:
                            self.set_status_rework()

        elif name == 'status':
            try:
                review_id = self.get_byname('review_id')
                if review_id != '':
                    if value.tag in [
                            IssueStatus.STATUS_ACCEPTED,
                            IssueStatus.STATUS_ACCEPTED_AFTER_DEADLINE
                    ]:
                        update_status_review_request(review_id, 'submitted')
                    elif self.is_status_accepted():
                        update_status_review_request(review_id, 'pending')
            except:  # noqa
                pass

            if self.status_field != value:
                if self.task.parent_task is not None:
                    parent_task_issue, created = Issue.objects.get_or_create(
                        student=self.student, task=self.task.parent_task)
                    if not self.task.score_after_deadline:
                        if self.is_status_accepted_after_deadline():
                            parent_task_issue.mark += self.mark
                        elif value.tag == IssueStatus.STATUS_ACCEPTED_AFTER_DEADLINE:
                            parent_task_issue.mark -= self.mark
                    parent_task_issue.set_status_seminar()
                self.status_field = value
            else:
                delete_event = True

            value = self.status_field.get_name()

        elif name == 'mark':
            if not value:
                value = 0
            value = min(normalize_decimal(value), self.task.score_max)
            if self.mark != float(value):
                if self.task.parent_task and \
                        (self.task.score_after_deadline or
                         not (not self.task.score_after_deadline and self.is_status_accepted_after_deadline())):
                    parent_task_issue, created = Issue.objects.get_or_create(
                        student=self.student, task=self.task.parent_task)
                    parent_task_issue.mark += float(value) - self.mark
                    parent_task_issue.set_status_seminar()

                self.mark = float(value)
            else:
                delete_event = True

            value = str(value)
            if not from_contest and not self.is_status_accepted(
            ) and not self.is_status_new():
                self.set_status_rework()

        self.save()

        if not value:
            value = ''

        if not delete_event:
            event.value = value
            event.save()
            event.pull_plugins()
        else:
            event.delete()

        return
Example #8
0
    def set_field(self, field, value, author=None, from_contest=False):
        event = self.create_event(field, author)
        name = field.name
        course = self.task.course

        delete_event = False

        if name == 'responsible_name':
            new_responsible = value

            if self.responsible != new_responsible:
                new_followers = list(self.followers.all().exclude(id=new_responsible.id))
                if self.responsible:
                    new_followers.append(self.responsible)
                self.responsible = new_responsible
                self.followers = new_followers
            else:
                delete_event = True

            value = get_user_fullname(value)

        elif name == 'followers_names':
            if self.responsible and str(self.responsible.id) in value:
                value.remove(str(self.responsible.id))
            new_followers = User.objects.filter(id__in=value)

            if list(new_followers) == list(self.followers.all()):
                delete_event = True
            else:
                deleted_followers = [get_user_fullname(follower)
                                     for follower in set(self.followers.all()).difference(set(new_followers))]
                add_followers = [get_user_fullname(follower) for follower in new_followers.all()]
                self.followers = value
                value = ', '.join(add_followers) + '\n' + ', '.join(deleted_followers)

        elif name == 'comment':
            if value:
                sent = True
                for file_id, file in enumerate(value['files']):
                    file.name = unidecode(file.name)
                    uploaded_file = File(file=file, event=event)
                    uploaded_file.save()
                    if self.task.contest_integrated:
                        for ext in settings.CONTEST_EXTENSIONS:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension:
                                contest_submission = self.contestsubmission_set.create(
                                    issue=self, author=author, file=uploaded_file
                                )
                                sent = contest_submission.upload_contest(ext, compiler_id=value['compilers'][file_id])
                                if sent:
                                    value['comment'] += u"<p>{0}</p>".format(_(u'otpravleno_v_kontest'))
                                    if not self.is_status_accepted():
                                        self.set_status_auto_verification()
                                else:
                                    value['comment'] += u"<p>{0}('{1}')</p>".format(_(u'oshibka_otpravki_v_kontest'),
                                                                                    contest_submission.send_error)
                                    self.followers.add(User.objects.get(username='******'))
                                break

                    if self.task.rb_integrated \
                            and (course.send_rb_and_contest_together or not self.task.contest_integrated):
                        for ext in settings.RB_EXTENSIONS + [str(ext.name) for ext in course.filename_extensions.all()]:
                            filename, extension = os.path.splitext(file.name)
                            if ext == extension or ext == '.*':
                                anyrb = AnyRB(event)
                                review_request_id = anyrb.upload_review()
                                if review_request_id is not None:
                                    value['comment'] += u'<p><a href="{1}/r/{0}">Review request {0}</a></p>'. \
                                        format(review_request_id, settings.RB_API_URL)
                                else:
                                    value['comment'] += u'<p>{0}</p>'.format(_(u'oshibka_otpravki_v_rb'))
                                    self.followers.add(User.objects.get(username='******'))
                                break

                if not value['files'] and not value['comment']:
                    event.delete()
                    return
                else:
                    self.update_time = timezone.now()
                    value = u'<div class="issue-page-comment not-sanitize">' + value['comment'] + u'</div>'

                if not self.is_status_auto_verification() and not self.is_status_accepted():
                    if author == self.student and not self.is_status_need_info() and sent:
                        self.set_status_verification()
                    if author == self.responsible:
                        if self.is_status_need_info():
                            status_field = IssueField.objects.get(name='status')
                            status_events = Event.objects \
                                .filter(issue_id=self.id, field=status_field) \
                                .exclude(author__isnull=True) \
                                .order_by('-timestamp')

                            if status_events:
                                status_prev = self.task.course.issue_status_system.statuses \
                                    .filter(name=status_events[0].value)
                                if status_prev:
                                    self.set_field(status_field, status_prev[0])
                                else:
                                    self.set_status_rework()
                        else:
                            self.set_status_rework()

        elif name == 'status':
            try:
                review_id = self.get_byname('review_id')
                if review_id != '':
                    if value.tag in [IssueStatus.STATUS_ACCEPTED, IssueStatus.STATUS_ACCEPTED_AFTER_DEADLINE]:
                        update_status_review_request(review_id, 'submitted')
                    elif self.is_status_accepted():
                        update_status_review_request(review_id, 'pending')
            except:  # noqa
                pass

            if self.status_field != value:
                if self.task.parent_task is not None:
                    parent_task_issue, created = Issue.objects.get_or_create(
                        student=self.student,
                        task=self.task.parent_task
                    )
                    if not self.task.score_after_deadline:
                        if self.is_status_accepted_after_deadline():
                            parent_task_issue.mark += self.mark
                        elif value.tag == IssueStatus.STATUS_ACCEPTED_AFTER_DEADLINE:
                            parent_task_issue.mark -= self.mark
                    parent_task_issue.set_status_seminar()
                self.status_field = value
            else:
                delete_event = True

            value = self.status_field.get_name()

        elif name == 'mark':
            if not value:
                value = 0
            value = min(normalize_decimal(value), self.task.score_max)
            if self.mark != float(value):
                if self.task.parent_task and \
                        (self.task.score_after_deadline
                         or not (not self.task.score_after_deadline and self.is_status_accepted_after_deadline())):
                    parent_task_issue, created = Issue.objects.get_or_create(
                        student=self.student,
                        task=self.task.parent_task
                    )
                    parent_task_issue.mark += float(value) - self.mark
                    parent_task_issue.set_status_seminar()

                self.mark = float(value)
            else:
                delete_event = True

            value = str(value)
            if not from_contest and not self.is_status_accepted() and not self.is_status_new():
                self.set_status_rework()

        self.save()

        if not value:
            value = ''

        if not delete_event:
            event.value = value
            event.save()
            event.pull_plugins()
        else:
            event.delete()

        return
Example #9
0
    def _submit_review(self, request, task, svn_path):
        user = request.user

        try:
            rev_a = int(request.POST.get('rev_a'))
            rev_b = int(request.POST.get('rev_b'))
        except TypeError: #not int
            return HttpResponseForbidden()
        except ValueError: #not int
            return HttpResponseForbidden()

        if rev_a == rev_b:
            return HttpResponseForbidden()

        if rev_b < rev_a:
            rev_a, rev_b = rev_b, rev_a

        review_id = None
        try:
            issue = Issue.objects.filter(task=task, student=user).order_by('-update_time')[0]
            review_id = issue.rb_review_id
        except Issue.DoesNotExist:
            pass
        except IndexError:
            pass

        issue = Issue()
        issue.task = task
        issue.student = user
        issue.svn_commit_id = rev_b

        summary = u"[{0}][{1}] {2}".format(user.get_full_name(), task.course.get_user_group(user), task.title)

        review_group_name = settings.RB_API_DEFAULT_REVIEW_GROUP
        if task.course.name_id:
            review_group_name =  "teachers_{0}".format(task.course.name_id)
        else:
            try:
                review_group_name = "teachers_{0}".format(task.course.name)
            except Exception:
                pass

        review_group_name = review_group_name.replace(".", "_")
        review_group_name = review_group_name.replace("/", "_")
        review_group_name = review_group_name.lower()

        anyrb = AnyRB()

        description = self._get_description(request, task, svn_path, rev_a, rev_b)
        if review_id is None:
            review_id = anyrb.submit_review(user, rev_a, rev_b, summary=summary, description=description, review_group_name=", ".join((review_group_name, settings.RB_API_DEFAULT_REVIEW_GROUP)),  path=svn_path)
        else:
            anyrb.update_review(user, rev_a, rev_b, review_id, description=description, path=svn_path)

        issue.rb_review_id = review_id
        issue.save()

        context = {
            'review_url' : anyrb.get_review_url(request, review_id),
            'task' : task,
        }

        return render_to_response('submit_review_done.html', context, context_instance=RequestContext(request))