def render_vote_page(request, evaluation, preview, for_rendering_in_modal=False): form_groups = get_vote_page_form_groups(request, evaluation, preview) assert preview or not all(form.is_valid() for form_group in form_groups.values() for form in form_group) evaluation_form_group = form_groups.pop(evaluation.general_contribution, default=[]) contributor_form_groups = [( contribution.contributor, contribution.label, form_group, any(form.errors for form in form_group), textanswers_visible_to(contribution), ) for contribution, form_group in form_groups.items()] evaluation_form_group_top = [ questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_above_contributors ] evaluation_form_group_bottom = [ questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_below_contributors ] if not contributor_form_groups: evaluation_form_group_top += evaluation_form_group_bottom evaluation_form_group_bottom = [] template_data = dict( errors_exist=any( any(form.errors for form in form_group) for form_group in [ *(form_groups.values()), evaluation_form_group_top, evaluation_form_group_bottom ]), evaluation_form_group_top=evaluation_form_group_top, evaluation_form_group_bottom=evaluation_form_group_bottom, contributor_form_groups=contributor_form_groups, evaluation=evaluation, small_evaluation_size_warning=evaluation.num_participants <= settings.SMALL_COURSE_SIZE, preview=preview, success_magic_string=SUCCESS_MAGIC_STRING, success_redirect_url=reverse("student:index"), for_rendering_in_modal=for_rendering_in_modal, general_contribution_textanswers_visible_to=textanswers_visible_to( evaluation.general_contribution), text_answer_warnings=TextAnswerWarning.objects.all(), ) return render(request, "student_vote.html", template_data)
def test_correct_contributors_and_delegate_count_are_shown_in_textanswer_visibility_info(self): textanswers = [ self.general_contribution_textanswer, self.responsible1_textanswer, self.responsible2_textanswer, self.contributor_own_textanswer, self.contributor_general_textanswer ] visible_to = [textanswers_visible_to(textanswer.contribution) for textanswer in textanswers] users_seeing_contribution = [(set(), set()) for _ in range(len(textanswers))] for user in UserProfile.objects.all(): represented_users = [user] + list(user.represented_users.all()) for i in range(len(textanswers)): if can_textanswer_be_seen_by(user, represented_users, textanswers[i], 'full'): if can_textanswer_be_seen_by(user, [user], textanswers[i], 'full'): users_seeing_contribution[i][0].add(user) else: users_seeing_contribution[i][1].add(user) for i in range(len(textanswers)): self.assertCountEqual(visible_to[i][0], users_seeing_contribution[i][0]) expected_delegate_counts = [ 2, # delegate1, delegate2 2, # delegate1, contributor_general 0, 1, # delegate1 1, # delegate2 ] for i in range(len(textanswers)): self.assertTrue(visible_to[i][1] == len(users_seeing_contribution[i][1]) == expected_delegate_counts[i])
def test_contributors_and_delegate_count_in_textanswer_visibility_info(self): textanswers = [ self.general_contribution_textanswer, self.responsible1_textanswer, self.responsible2_textanswer, self.contributor_own_textanswer, self.contributor_general_textanswer ] visible_to = [textanswers_visible_to(textanswer.contribution) for textanswer in textanswers] users_seeing_contribution = [(set(), set()) for _ in range(len(textanswers))] for user in UserProfile.objects.all(): represented_users = [user] + list(user.represented_users.all()) for i, textanswer in enumerate(textanswers): if can_textanswer_be_seen_by(user, represented_users, textanswer, 'full'): if can_textanswer_be_seen_by(user, [user], textanswer, 'full'): users_seeing_contribution[i][0].add(user) else: users_seeing_contribution[i][1].add(user) for i in range(len(textanswers)): self.assertCountEqual(visible_to[i][0], users_seeing_contribution[i][0]) expected_delegate_counts = [ 2, # delegate1, delegate2 2, # delegate1, contributor_general 0, 1, # delegate1 1, # delegate2 ] for i in range(len(textanswers)): self.assertTrue(visible_to[i][1] == len(users_seeing_contribution[i][1]) == expected_delegate_counts[i])
def get_valid_form_groups_or_render_vote_page(request, evaluation, preview, for_rendering_in_modal=False): contributions_to_vote_on = evaluation.contributions.all() # prevent a user from voting on themselves if not preview: contributions_to_vote_on = contributions_to_vote_on.exclude(contributor=request.user) form_groups = OrderedDict() for contribution in contributions_to_vote_on: questionnaires = contribution.questionnaires.all() if not questionnaires.exists(): continue form_groups[contribution] = [QuestionnaireVotingForm(request.POST or None, contribution=contribution, questionnaire=questionnaire) for questionnaire in questionnaires] if all(all(form.is_valid() for form in form_group) for form_group in form_groups.values()): assert not preview return form_groups, None evaluation_form_group = form_groups.pop(evaluation.general_contribution) contributor_form_groups = [(contribution.contributor, contribution.label, form_group, any(form.errors for form in form_group), textanswers_visible_to(contribution)) for contribution, form_group in form_groups.items()] evaluation_form_group_top = [questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_above_contributors] evaluation_form_group_bottom = [questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_below_contributors] if not contributor_form_groups: evaluation_form_group_top += evaluation_form_group_bottom evaluation_form_group_bottom = [] template_data = dict( errors_exist=any(any(form.errors for form in form_group) for form_group in form_groups.values()), evaluation_form_group_top=evaluation_form_group_top, evaluation_form_group_bottom=evaluation_form_group_bottom, contributor_form_groups=contributor_form_groups, evaluation=evaluation, small_evaluation_size_warning=evaluation.num_participants <= settings.SMALL_COURSE_SIZE, preview=preview, vote_end_datetime=evaluation.vote_end_datetime, hours_left_for_evaluation=evaluation.time_left_for_evaluation.seconds // 3600, minutes_left_for_evaluation=(evaluation.time_left_for_evaluation.seconds // 60) % 60, success_magic_string=SUCCESS_MAGIC_STRING, success_redirect_url=reverse('student:index'), evaluation_ends_soon=evaluation.evaluation_ends_soon(), for_rendering_in_modal=for_rendering_in_modal, general_contribution_textanswers_visible_to=textanswers_visible_to(evaluation.general_contribution), ) return None, render(request, "student_vote.html", template_data)
def get_valid_form_groups_or_render_vote_page(request, evaluation, preview, for_rendering_in_modal=False): contributions_to_vote_on = evaluation.contributions.all() # prevent a user from voting on themselves if not preview: contributions_to_vote_on = contributions_to_vote_on.exclude(contributor=request.user) form_groups = OrderedDict() for contribution in contributions_to_vote_on: questionnaires = contribution.questionnaires.all() if not questionnaires.exists(): continue form_groups[contribution] = [QuestionnaireVotingForm(request.POST or None, contribution=contribution, questionnaire=questionnaire) for questionnaire in questionnaires] if all(all(form.is_valid() for form in form_group) for form_group in form_groups.values()): assert not preview return form_groups, None evaluation_form_group = form_groups.pop(evaluation.general_contribution) contributor_form_groups = [(contribution.contributor, contribution.label, form_group, any(form.errors for form in form_group), textanswers_visible_to(contribution)) for contribution, form_group in form_groups.items()] evaluation_form_group_top = [questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_above_contributors] evaluation_form_group_bottom = [questions_form for questions_form in evaluation_form_group if questions_form.questionnaire.is_below_contributors] if not contributor_form_groups: evaluation_form_group_top += evaluation_form_group_bottom evaluation_form_group_bottom = [] template_data = dict( errors_exist=any(any(form.errors for form in form_group) for form_group in [*(form_groups.values()), evaluation_form_group_top, evaluation_form_group_bottom]), evaluation_form_group_top=evaluation_form_group_top, evaluation_form_group_bottom=evaluation_form_group_bottom, contributor_form_groups=contributor_form_groups, evaluation=evaluation, small_evaluation_size_warning=evaluation.num_participants <= settings.SMALL_COURSE_SIZE, preview=preview, success_magic_string=SUCCESS_MAGIC_STRING, success_redirect_url=reverse('student:index'), for_rendering_in_modal=for_rendering_in_modal, general_contribution_textanswers_visible_to=textanswers_visible_to(evaluation.general_contribution), text_answer_warnings=TextAnswerWarning.objects.all(), ) return None, render(request, "student_vote.html", template_data)
def test_text_answer_visible_to_non_contributing_responsible(self): self.assertIn( self.responsible_without_contribution, textanswers_visible_to( self.general_contribution_textanswer.contribution)[0], )
def test_text_answer_visible_to_non_contributing_responsible(self): self.assertIn(self.responsible_without_contribution, textanswers_visible_to(self.general_contribution_textanswer.contribution)[0])