Пример #1
0
def task_new(request, competition, data, ctask_id=None):
    if ctask_id:
        ctask = get_object_or_404(
                CompetitionTask.objects.select_related('task'),
                id=ctask_id, competition_id=competition.id)
        edit = True
    else:
        ctask = None
        edit = False

    POST = request.POST if request.method == 'POST' else None
    form = CompetitionTaskForm(POST, instance=ctask, competition=competition,
            user=request.user)

    if request.method == 'POST' and form.is_valid():
        ctask = form.save(commit=False)
        if not edit:
            ctask.competition = competition
            ctask.chain = None
            ctask.chain_position = -1
            ctask.max_submissions = competition.default_max_submissions

        _create_or_update_task(ctask, request.user, competition,
                ctask.chain, ctask.chain_position, ctask._text,
                ctask._comment)

        ctask.save()

        if ctask.chain:
            chain_ctasks = CompetitionTask.objects.filter(chain=ctask.chain) \
                    .select_related('comment').only('id', 'comment')
            update_chain_comments_cache(ctask.chain, chain_ctasks)
            update_chain_cache_is_verified(competition, ctask.chain)
            ctask.chain.save()

        target = request.POST.get('next', 'stay')
        if target == 'next':
            return (comp_url(competition, 'task/new'), )
        if target == 'tasks':
            return (comp_url(competition, 'chain/tasks'), )
        return (ctask.get_edit_url(), )  # stay

    data['is_solution_hidden'] = \
            ctask and ctask.task.author_id != request.user.id
    data['form'] = form
    data['ctask'] = ctask
    return data
Пример #2
0
    def test_update_chain_comments_cache(self):
        ctasks = []
        ctasks.append(create_ctask(self.admin, self.competition, self.chain,
                "42", 1, "nothing important here"))
        ctasks.append(create_ctask(self.admin, self.competition, self.chain,
                "42", 1,
                "first nothing important\n"
                "IMPORTANT: but then something important"))
        ctasks.append(create_ctask(self.admin, self.competition, self.chain,
                "42", 1,
                "again first nothing important\n"
                "IMPORTANT: bla bla\n"
                "bla bla"))
        ctasks.append(create_ctask(self.alice, self.competition, self.chain,
                "42", 1,
                "nothing important"))
        ctasks.append(create_ctask(self.alice, self.competition, self.chain,
                "42", 1,
                "nothing important\n"
                "IMPORTANT: bla bla\n"
                "bla bla"))
        update_chain_comments_cache(self.chain, ctasks)
        num_important, num_important_my = parse_chain_comments_cache(
            self.chain, self.admin)
        self.assertEqual(num_important, 3)
        self.assertEqual(num_important_my, 2)

        num_important, num_important_my = parse_chain_comments_cache(
            self.chain, self.alice)
        self.assertEqual(num_important, 3)
        self.assertEqual(num_important_my, 1)

        num_important, num_important_my = parse_chain_comments_cache(
            self.chain, self.bob)
        self.assertEqual(num_important, 3)
        self.assertEqual(num_important_my, 0)
Пример #3
0
def chain_new(request, competition, data, chain_id=None):
    if chain_id:
        chain = get_object_or_404(
                Chain, id=chain_id, competition_id=competition.id)
        edit = True
    else:
        chain = None
        edit = False

    # CompetitionTaskFormSet = modelformset_factory(CompetitionTask,
    #         formset=BaseCompetitionTaskFormSet,
    #         fields=('descriptor', 'score'), extra=3)
    evaluator = get_evaluator(competition.evaluator_version)
    class CompetitionTaskFormLambda(CompetitionTaskForm):
        def __init__(self, *args, **kwargs):
            super(CompetitionTaskFormLambda, self).__init__(evaluator=evaluator,
                    fixed_score=competition.fixed_task_score, user=request.user,
                    *args, **kwargs)

    # TODO: Set min_num and max_num after migrating to Django 1.7.
    CompetitionTaskFormSet = modelformset_factory(CompetitionTask,
            form=CompetitionTaskFormLambda, formset=BaseCompetitionTaskFormSet,
            extra=5, can_order=True, can_delete=True)

    POST = request.POST if request.method == 'POST' else None
    chain_form = ChainForm(data=POST, instance=chain)
    queryset = CompetitionTask.objects.filter(chain_id=chain_id) \
            .select_related('task__content', 'comment') \
            .order_by('chain_position', 'id')
    was_order_fixed = fix_ctask_order(competition, chain, list(queryset))
    formset = CompetitionTaskFormSet(data=POST, queryset=queryset)

    if request.method == 'POST':
        if chain_form.is_valid() and formset.is_valid():
            chain = chain_form.save(commit=False)
            if not edit:
                chain.competition = competition
                chain.save()  # Save to get an ID.

            instances = formset.save(commit=False)
            for form in formset.ordered_forms:
                _index = form.cleaned_data['ORDER']
                if _index:
                    form.instance._index = _index
            for index, instance in enumerate(instances):
                instance.competition = competition
                instance.chain = chain
                instance.chain_position = getattr(instance, '_index', index)
                instance.max_submissions = competition.default_max_submissions

                _create_or_update_task(instance, request.user, competition,
                        chain, index, instance._text, instance._comment)

                instance.save()

            chain_ctasks = CompetitionTask.objects.filter(chain=chain) \
                    .select_related('comment').only('id', 'comment')
            update_chain_comments_cache(chain, chain_ctasks)
            chain.save()

            # Problems with existing formset... ahh, just refresh
            return (chain.get_absolute_url(), )
    
    data.update({
        'chain_form': chain_form,
        'formset': formset,
        'was_order_fixed': was_order_fixed,
    })
    return data