def view(self, request, contest, existing_problem=None): is_reupload = existing_problem is not None if is_reupload: # reuploading doesn't make much sense here return _("Reuploading quizzes is not supported") if request.method == "POST": form = EmptyQuizSourceForm(request.POST) else: form = EmptyQuizSourceForm() post_data = {'form': form, 'is_reupload': is_reupload} if request.method == "POST" and form.is_valid(): with transaction.atomic(): controller = self.problem_controller_class quiz = Quiz.objects.create( name=form.cleaned_data['name'], short_name=form.cleaned_data['short_name'], controller_name=controller, author=request.user, ) algorithm_tag, created = AlgorithmTag.objects.get_or_create( name='Quiz') if not created: for language_code, _ in LANGUAGES: AlgorithmTagLocalization.objects.create( algorithm_tag=algorithm_tag, language=language_code, name='Quiz', ) AlgorithmTagThrough.objects.create(problem=quiz, tag=algorithm_tag) ProblemSite.objects.create(problem=quiz, url_key=generate_key()) pi = ProblemInstance.objects.create(problem=quiz, short_name=quiz.short_name) quiz.main_problem_instance = pi quiz.save() if contest: quiz.contest = contest get_new_problem_instance(quiz, contest) messages.success(request, _("Quiz successfully added")) return safe_redirect( request, reverse('oioioiadmin:contests_probleminstance_changelist')) return TemplateResponse(request, "quizzes/emptyquiz-source.html", post_data)
def reattach_problem_confirm_view(request, problem_instance_id, contest_id): contest = get_object_or_404(Contest, id=contest_id) if not can_admin_contest(request.user, contest): raise PermissionDenied problem_instance = get_object_or_404(ProblemInstance, id=problem_instance_id) if request.method == 'POST': if request.POST.get('copy-limits', '') == 'on': pi = copy_problem_instance(problem_instance, contest) else: pi = get_new_problem_instance(problem_instance.problem, contest) messages.success(request, _(u"Problem {} added successfully.".format(pi))) return safe_redirect( request, reverse( 'oioioiadmin:contests_probleminstance_changelist', kwargs={'contest_id': contest.id}, ), ) return TemplateResponse( request, 'contests/reattach_problem_confirm.html', {'problem_instance': problem_instance, 'destination_contest': contest}, )
def update_problem_instance(env): """Updates :class:`~oioioi.contests.models.ProblemInstance` for the processed :class:`~oioioi.problems.models.Problem` (if contest and round are given creates an :class:`~oioioi.contests.models.ProblemInstance` which is a copy of problem.main_problem_instance and assigns it to Contest and Round. Used ``env`` keys: ``problem_id``: id of the processed :class:`~oioioi.problems.models.Problem` ``contest_id``: id of the :class:`~oioioi.contests.models.Contest` the problem instance should be attached to. ``round_id``: (Optional) id of the :class:`~oioioi.contests.models.Round` the problem instance should be attached to. ``is_reupload``: set on True when problem is being reuploaded """ problem = Problem.objects.get(id=env['problem_id']) if env.get('contest_id', None): if not ProblemInstance.objects.filter(contest__id=env['contest_id'], problem=problem).exists(): contest = Contest.objects.get(id=env['contest_id']) pi = get_new_problem_instance(problem, contest) if env.get('round_id', None) and not pi.round: pi.round = Round.objects.get(id=env['round_id']) pi.save() env['problem_instance_id'] = pi.id if env['is_reupload']: update_all_probleminstances_after_reupload(problem) return env
def view(self, request, contest, existing_problem=None): is_reupload = existing_problem is not None if is_reupload: # reuploading doesn't make much sense here return _("Reuploading quizzes is not supported") if request.method == "POST": form = EmptyQuizSourceForm(request.POST) else: form = EmptyQuizSourceForm() post_data = {'form': form, 'is_reupload': is_reupload} if request.method == "POST" and form.is_valid(): with transaction.atomic(): controller = 'oioioi.quizzes.controllers.QuizProblemController' quiz = Quiz.objects.create( name=form.cleaned_data['name'], short_name=form.cleaned_data['short_name'], controller_name=controller, author=request.user ) tag = Tag.objects.get_or_create(name='quiz')[0] TagThrough.objects.create( problem=quiz, tag=tag ) ProblemSite.objects.create( problem=quiz, url_key=generate_key() ) pi = ProblemInstance.objects.create( problem=quiz, short_name=quiz.short_name ) quiz.main_problem_instance = pi quiz.save() if contest: quiz.contest = contest get_new_problem_instance(quiz, contest) messages.success(request, _("Quiz successfully added")) return safe_redirect(request, reverse( 'oioioiadmin:contests_probleminstance_changelist')) return TemplateResponse(request, "quizzes/emptyquiz-source.html", post_data)
def view(self, request, contest, existing_problem=None): if not contest: messages.error(request, _("Option not available")) path = request.path if existing_problem: path += '?' + urlencode({'problem': existing_problem.id}) return safe_redirect(request, path) is_reupload = existing_problem is not None if existing_problem: url_key = existing_problem.problemsite.url_key else: # take url_key form form url_key = request.POST.get('url_key', None) if url_key is None: # take url_key from Problemset url_key = request.GET.get('url_key', None) form = ProblemsetSourceForm(url_key) post_data = {'form': form, 'is_reupload': is_reupload} if request.POST: if not Problem.objects.filter(problemsite__url_key=url_key) \ .exists(): messages.error(request, _('Given url key is invalid')) return TemplateResponse(request, "problems/problemset_source.html", post_data) problem = Problem.objects.get(problemsite__url_key=url_key) if existing_problem: assert problem == existing_problem assert 'instance_id' in request.GET pi = problem.probleminstance_set.get(contest=request.contest, id=request.GET['instance_id']) update_tests_from_main_pi(pi) # limits could be changed pi.needs_rejudge = True pi.save() messages.success(request, _("Problem successfully updated")) else: pi = get_new_problem_instance(problem) pi.contest = request.contest pi.short_name = None pi.save() messages.success(request, _("Problem successfully uploaded")) return safe_redirect(request, reverse( 'oioioiadmin:contests_probleminstance_changelist')) return TemplateResponse(request, "problems/problemset_source.html", post_data)
def view(self, request, contest, existing_problem=None): if not contest: messages.error(request, _("Option not available")) path = request.path if existing_problem: path += '?' + urlencode({'problem': existing_problem.id}) return safe_redirect(request, path) is_reupload = existing_problem is not None if existing_problem: url_key = existing_problem.problemsite.url_key else: # take url_key form form url_key = request.POST.get('url_key', None) if url_key is None: # take url_key from Problemset url_key = request.GET.get('url_key', None) form = ProblemsetSourceForm(url_key) post_data = {'form': form, 'is_reupload': is_reupload} if request.POST: if not Problem.objects.filter(problemsite__url_key=url_key) \ .exists(): messages.error(request, _('Given url key is invalid')) return TemplateResponse(request, "problems/problemset_source.html", post_data) problem = Problem.objects.get(problemsite__url_key=url_key) if existing_problem: assert problem == existing_problem assert 'instance_id' in request.GET pi = problem.probleminstance_set.get( contest=contest, id=request.GET['instance_id']) update_tests_from_main_pi(pi) # limits could be changed pi.needs_rejudge = True pi.save() messages.success(request, _("Problem successfully updated")) else: pi = get_new_problem_instance(problem, contest) messages.success(request, _("Problem successfully uploaded")) return safe_redirect( request, reverse('oioioiadmin:contests_probleminstance_changelist')) return TemplateResponse(request, "problems/problemset_source.html", post_data)
def reattach_problem_confirm_view(request, problem_instance_id, contest_id): contest = get_object_or_404(Contest, id=contest_id) if not can_admin_contest(request.user, contest): raise PermissionDenied problem_instance = get_object_or_404(ProblemInstance, id=problem_instance_id) if request.POST: pi = get_new_problem_instance(problem_instance.problem, contest) messages.success(request, _(u"Problem {} added successfully." .format(pi))) return safe_redirect(request, reverse( 'oioioiadmin:contests_probleminstance_changelist', kwargs={'contest_id': contest.id})) return TemplateResponse(request, 'contests/reattach_problem_confirm.html', {'problem_instance': problem_instance, 'destination_contest': contest})