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