Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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},
    )
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
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})