Ejemplo n.º 1
0
    def form_valid(self, form):
        if (not self.request.user.has_perm('judge.spam_submission')
                and Submission.objects.filter(
                    user=self.request.profile,
                    rejudged_date__isnull=True).exclude(
                        status__in=['D', 'IE', 'CE', 'AB']).count() >=
                settings.DMOJ_SUBMISSION_LIMIT):
            return HttpResponse('<h1>You submitted too many submissions.</h1>',
                                status=429)
        if not self.object.allowed_languages.filter(
                id=form.cleaned_data['language'].id).exists():
            raise PermissionDenied()
        if not self.request.user.is_superuser and self.object.banned_users.filter(
                id=self.request.profile.id).exists():
            return generic_message(
                self.request, _('Banned from submitting'),
                _('You have been declared persona non grata for this problem. '
                  'You are permanently barred from submitting this problem.'))
        # Must check for zero and not None. None means infinite submissions remaining.
        if self.remaining_submission_count == 0:
            return generic_message(
                self.request, _('Too many submissions'),
                _('You have exceeded the submission limit for this problem.'))

        with transaction.atomic():
            self.new_submission = form.save(commit=False)

            contest_problem = self.contest_problem
            if contest_problem is not None:
                # Use the contest object from current_contest.contest because we already use it
                # in profile.update_contest().
                self.new_submission.contest_object = self.request.profile.current_contest.contest
                if self.request.profile.current_contest.live:
                    self.new_submission.locked_after = self.new_submission.contest_object.locked_after
                self.new_submission.save()
                ContestSubmission(
                    submission=self.new_submission,
                    problem=contest_problem,
                    participation=self.request.profile.current_contest,
                ).save()
            else:
                self.new_submission.save()

            source = SubmissionSource(submission=self.new_submission,
                                      source=form.cleaned_data['source'])
            source.save()

        # Save a query.
        self.new_submission.source = source
        self.new_submission.judge(force_judge=True,
                                  judge_id=form.cleaned_data['judge'])

        return super().form_valid(form)
Ejemplo n.º 2
0
def problem_submit(request, problem=None, submission=None):
    if submission is not None and not request.user.has_perm('judge.resubmit_other') and \
            get_object_or_404(Submission, id=int(submission)).user.user != request.user:
        raise PermissionDenied()

    profile = request.profile
    if request.method == 'POST':
        form = ProblemSubmitForm(request.POST,
                                 instance=Submission(user=profile))
        if form.is_valid():
            limit = settings.DMOJ_SUBMISSION_LIMIT

            if (not request.user.has_perm('judge.spam_submission')
                    and Submission.objects.filter(
                        user=profile, was_rejudged=False).exclude(
                            status__in=['D', 'IE', 'CE', 'AB']).count() >=
                    limit):
                return HttpResponse(
                    '<h1>You submitted too many submissions.</h1>', status=429)
            if not form.cleaned_data['problem'].allowed_languages.filter(
                    id=form.cleaned_data['language'].id).exists():
                raise PermissionDenied()
            if not form.cleaned_data['problem'].is_accessible_by(request.user):
                user_logger.info(
                    'Naughty user %s wants to submit to %s without permission',
                    request.user.username, form.cleaned_data['problem'].code)
                return HttpResponseForbidden(
                    '<h1>Do you want me to ban you?</h1>')
            if not request.user.is_superuser and form.cleaned_data[
                    'problem'].banned_users.filter(id=profile.id).exists():
                return generic_message(
                    request, _('Banned from submitting'),
                    _('You have been declared persona non grata for this problem. '
                      'You are permanently barred from submitting this problem.'
                      ))

            with transaction.atomic():
                if profile.current_contest is not None:
                    contest_id = profile.current_contest.contest_id
                    try:
                        contest_problem = form.cleaned_data[
                            'problem'].contests.get(contest_id=contest_id)
                    except ContestProblem.DoesNotExist:
                        model = form.save()
                    else:
                        max_subs = contest_problem.max_submissions
                        if max_subs and get_contest_submission_count(
                                problem, profile,
                                profile.current_contest.virtual) >= max_subs:
                            return generic_message(
                                request, _('Too many submissions'),
                                _('You have exceeded the submission limit for this problem.'
                                  ))
                        model = form.save()
                        model.contest_object_id = contest_id

                        contest = ContestSubmission(
                            submission=model,
                            problem=contest_problem,
                            participation=profile.current_contest)
                        contest.save()
                else:
                    model = form.save()

                # Create the SubmissionSource object
                source = SubmissionSource(submission=model,
                                          source=form.cleaned_data['source'])
                source.save()
                profile.update_contest()

            # Save a query
            model.source = source
            model.judge(rejudge=False)

            return HttpResponseRedirect(
                reverse('submission_status', args=[str(model.id)]))
        else:
            form_data = form.cleaned_data
            if submission is not None:
                sub = get_object_or_404(Submission, id=int(submission))

            if 'problem' not in form_data:
                return HttpResponseBadRequest()
    else:
        initial = {'language': profile.language}
        if problem is not None:
            initial['problem'] = get_object_or_404(Problem, code=problem)
            problem_object = initial['problem']
            if not problem_object.is_accessible_by(request.user):
                raise Http404()
        if submission is not None:
            try:
                sub = get_object_or_404(Submission.objects.select_related(
                    'source', 'language'),
                                        id=int(submission))
                initial['source'] = sub.source.source
                initial['language'] = sub.language
            except ValueError:
                raise Http404()
        form = ProblemSubmitForm(initial=initial)
        form_data = initial
    if 'problem' in form_data:
        form.fields['language'].queryset = (
            form_data['problem'].usable_languages.order_by(
                'name', 'key').prefetch_related(
                    Prefetch('runtimeversion_set',
                             RuntimeVersion.objects.order_by('priority'))))
        problem_object = form_data['problem']
    if 'language' in form_data:
        form.fields['source'].widget.mode = form_data['language'].ace
    form.fields['source'].widget.theme = profile.ace_theme

    if submission is not None:
        default_lang = sub.language
    else:
        default_lang = request.profile.language

    submission_limit = submissions_left = None
    if profile.current_contest is not None:
        try:
            submission_limit = problem_object.contests.get(
                contest=profile.current_contest.contest).max_submissions
        except ContestProblem.DoesNotExist:
            pass
        else:
            if submission_limit:
                submissions_left = submission_limit - get_contest_submission_count(
                    problem, profile, profile.current_contest.virtual)
    return render(
        request, 'problem/submit.html', {
            'form':
            form,
            'title':
            _('Submit to %(problem)s') % {
                'problem': problem_object.translated_name(
                    request.LANGUAGE_CODE),
            },
            'content_title':
            mark_safe(
                escape(_('Submit to %(problem)s')) % {
                    'problem':
                    format_html(
                        '<a href="{0}">{1}</a>',
                        reverse('problem_detail', args=[problem_object.code]),
                        problem_object.translated_name(request.LANGUAGE_CODE)),
                }),
            'langs':
            Language.objects.all(),
            'no_judges':
            not form.fields['language'].queryset,
            'submission_limit':
            submission_limit,
            'submissions_left':
            submissions_left,
            'ACE_URL':
            settings.ACE_URL,
            'default_lang':
            default_lang,
        })
Ejemplo n.º 3
0
Archivo: problem.py Proyecto: DMOJ/site
def problem_submit(request, problem=None, submission=None):
    if submission is not None and not request.user.has_perm('judge.resubmit_other') and \
                    get_object_or_404(Submission, id=int(submission)).user.user != request.user:
        raise PermissionDenied()

    profile = request.user.profile
    if request.method == 'POST':
        form = ProblemSubmitForm(request.POST, instance=Submission(user=profile))
        if form.is_valid():
            if (not request.user.has_perm('judge.spam_submission') and
                        Submission.objects.filter(user=profile, was_rejudged=False).exclude(
                            status__in=['D', 'IE', 'CE', 'AB']).count() > 2):
                return HttpResponse('<h1>You submitted too many submissions.</h1>', status=429)
            if not form.cleaned_data['problem'].allowed_languages.filter(
                    id=form.cleaned_data['language'].id).exists():
                raise PermissionDenied()
            if not form.cleaned_data['problem'].is_accessible_by(request.user):
                user_logger.info('Naughty user %s wants to submit to %s without permission',
                                 request.user.username, form.cleaned_data['problem'].code)
                return HttpResponseForbidden('<h1>Do you want me to ban you?</h1>')
            if not request.user.is_superuser and form.cleaned_data['problem'].banned_users.filter(
                    id=profile.id).exists():
                return generic_message(request, _('Banned from submitting'),
                                       _('You have been declared persona non grata for this problem. '
                                         'You are permanently barred from submitting this problem.'))

            with transaction.atomic():
                if profile.current_contest is not None:
                    try:
                        contest_problem = form.cleaned_data['problem'].contests.get(contest=profile.current_contest.contest)
                    except ContestProblem.DoesNotExist:
                        model = form.save()
                    else:
                        max_subs = contest_problem.max_submissions
                        if max_subs and get_contest_submission_count(problem, profile) >= max_subs:
                            return generic_message(request, _('Too many submissions'),
                                                    _('You have exceeded the submission limit for this problem.'))
                        model = form.save()
                        contest = ContestSubmission(submission=model, problem=contest_problem,
                                                    participation=profile.current_contest)
                        contest.save()
                else:
                    model = form.save()

                # Create the SubmissionSource object
                source = SubmissionSource(submission=model, source=form.cleaned_data['source'])
                source.save()
                profile.update_contest()

            # Save a query
            model.source = source
            model.judge(rejudge=False)

            return HttpResponseRedirect(reverse('submission_status', args=[str(model.id)]))
        else:
            form_data = form.cleaned_data
            if submission is not None:
                sub = get_object_or_404(Submission, id=int(submission))
    else:
        initial = {'language': profile.language}
        if problem is not None:
            initial['problem'] = get_object_or_404(Problem, code=problem)
            problem_object = initial['problem']
            if not problem_object.is_accessible_by(request.user):
                raise Http404()
        if submission is not None:
            try:
                sub = get_object_or_404(Submission.objects.select_related('source', 'language'), id=int(submission))
                initial['source'] = sub.source.source
                initial['language'] = sub.language
            except ValueError:
                raise Http404()
        form = ProblemSubmitForm(initial=initial)
        form_data = initial
    if 'problem' in form_data:
        form.fields['language'].queryset = (form_data['problem'].usable_languages.order_by('name', 'key')
            .prefetch_related(Prefetch('runtimeversion_set', RuntimeVersion.objects.order_by('priority'))))
        problem_object = form_data['problem']
    if 'language' in form_data:
        form.fields['source'].widget.mode = form_data['language'].ace
    form.fields['source'].widget.theme = profile.ace_theme

    if submission is not None:
        default_lang = sub.language
    else:
        default_lang = request.user.profile.language

    submission_limit = submissions_left = None
    if profile.current_contest is not None:
        try:
            submission_limit = problem_object.contests.get(contest=profile.current_contest.contest).max_submissions
        except ContestProblem.DoesNotExist:
            pass
        else:
            if submission_limit:
                submissions_left = submission_limit - get_contest_submission_count(problem, profile)
    return render(request, 'problem/submit.html', {
        'form': form,
        'title': _('Submit to %(problem)s') % {
            'problem': problem_object.translated_name(request.LANGUAGE_CODE),
        },
        'content_title': mark_safe(escape(_('Submit to %(problem)s')) % {
            'problem': format_html('<a href="{0}">{1}</a>',
                                   reverse('problem_detail', args=[problem_object.code]),
                                   problem_object.translated_name(request.LANGUAGE_CODE))
        }),
        'langs': Language.objects.all(),
        'no_judges': not form.fields['language'].queryset,
        'submission_limit': submission_limit,
        'submissions_left': submissions_left,
        'ACE_URL': ACE_URL,

        'default_lang': default_lang,
    })