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)
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, })
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, })