def remove_textanswers_that_the_user_must_not_see(evaluation_result, user, represented_users, view): for questionnaire_result in evaluation_result.questionnaire_results: for question_result in questionnaire_result.question_results: if isinstance(question_result, TextResult): question_result.answers = [ answer for answer in question_result.answers if can_textanswer_be_seen_by(user, represented_users, answer, view) ] if isinstance( question_result, RatingResult) and question_result.additional_text_result: question_result.additional_text_result.answers = [ answer for answer in question_result.additional_text_result.answers if can_textanswer_be_seen_by(user, represented_users, answer, view) ] # remove empty TextResults cleaned_results = [] for result in questionnaire_result.question_results: if isinstance(result, TextResult): if result.answers: cleaned_results.append(result) elif isinstance(result, HeadingResult): cleaned_results.append(result) else: if result.additional_text_result and not result.additional_text_result.answers: result.additional_text_result = None cleaned_results.append(result) questionnaire_result.question_results = cleaned_results
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 remove_textanswers_that_the_user_must_not_see(evaluation_result, user, represented_users, view): for questionnaire_result in evaluation_result.questionnaire_results: for question_result in questionnaire_result.question_results: if isinstance(question_result, TextResult): question_result.answers = [ answer for answer in question_result.answers if can_textanswer_be_seen_by(user, represented_users, answer, view) ] # remove empty TextResults questionnaire_result.question_results = [ result for result in questionnaire_result.question_results if not isinstance(result, TextResult) or len(result.answers) > 0 ]
def evaluation_detail(request, semester_id, evaluation_id): semester = get_object_or_404(Semester, id=semester_id) evaluation = get_object_or_404(semester.evaluations, id=evaluation_id, course__semester=semester) if not evaluation.can_results_page_be_seen_by(request.user): raise PermissionDenied evaluation_result = collect_results(evaluation) if request.user.is_reviewer: view = request.GET.get('view', 'public') # if parameter is not given, show public view. else: view = request.GET.get('view', 'full') # if parameter is not given, show own view. if view not in ['public', 'full', 'export']: view = 'public' view_as_user = request.user if view == 'export' and request.user.is_staff: view_as_user = UserProfile.objects.get(id=int(request.GET.get('contributor_id', request.user.id))) represented_users = [view_as_user] if view != 'export': represented_users += list(view_as_user.represented_users.all()) # redirect to non-public view if there is none because the results have not been published if not evaluation.can_publish_rating_results and view == 'public': view = 'full' # remove text answers if the user may not see them for questionnaire_result in evaluation_result.questionnaire_results: for question_result in questionnaire_result.question_results: if isinstance(question_result, TextResult): question_result.answers = [answer for answer in question_result.answers if can_textanswer_be_seen_by(view_as_user, represented_users, answer, view)] # remove empty TextResults questionnaire_result.question_results = [result for result in questionnaire_result.question_results if not isinstance(result, TextResult) or len(result.answers) > 0] # filter empty headings for questionnaire_result in evaluation_result.questionnaire_results: filtered_question_results = [] for index, question_result in enumerate(questionnaire_result.question_results): # filter out if there are no more questions or the next question is also a heading question if isinstance(question_result, HeadingResult): if index == len(questionnaire_result.question_results) - 1 or isinstance(questionnaire_result.question_results[index + 1], HeadingResult): continue filtered_question_results.append(question_result) questionnaire_result.question_results = filtered_question_results # remove empty questionnaire_results and contribution_results for contribution_result in evaluation_result.contribution_results: contribution_result.questionnaire_results = [questionnaire_result for questionnaire_result in contribution_result.questionnaire_results if questionnaire_result.question_results] evaluation_result.contribution_results = [contribution_result for contribution_result in evaluation_result.contribution_results if contribution_result.questionnaire_results] add_warnings(evaluation, evaluation_result) # split evaluation_result into different lists general_questionnaire_results_top = [] general_questionnaire_results_bottom = [] contributor_contribution_results = [] for contribution_result in evaluation_result.contribution_results: if contribution_result.contributor is None: for questionnaire_result in contribution_result.questionnaire_results: if questionnaire_result.questionnaire.is_below_contributors: general_questionnaire_results_bottom.append(questionnaire_result) else: general_questionnaire_results_top.append(questionnaire_result) elif view != 'export' or view_as_user.id == contribution_result.contributor.id: contributor_contribution_results.append(contribution_result) if not contributor_contribution_results: general_questionnaire_results_top += general_questionnaire_results_bottom general_questionnaire_results_bottom = [] course_evaluations = [] if evaluation.course.evaluations.count() > 1: course_evaluations = [evaluation for evaluation in evaluation.course.evaluations.filter(state="published") if evaluation.can_be_seen_by(request.user)] if request.user.is_reviewer: course_evaluations += evaluation.course.evaluations.filter(state__in=['in_evaluation', 'evaluated', 'reviewed']) course_evaluations = get_evaluations_with_course_result_attributes(course_evaluations) for course_evaluation in course_evaluations: if course_evaluation.is_single_result: course_evaluation.single_result_rating_result = get_single_result_rating_result(course_evaluation) else: course_evaluation.distribution = calculate_average_distribution(course_evaluation) course_evaluation.avg_grade = distribution_to_grade(course_evaluation.distribution) other_contributors = [] if view == 'export': other_contributors = [contribution_result.contributor for contribution_result in evaluation_result.contribution_results if contribution_result.contributor not in [None, view_as_user]] # if the evaluation is not published, the rendered results are not cached, so we need to attach distribution # information for rendering the distribution bar if evaluation.state != 'published': evaluation = get_evaluations_with_prefetched_data([evaluation])[0] template_data = dict( evaluation=evaluation, course=evaluation.course, course_evaluations=course_evaluations, general_questionnaire_results_top=general_questionnaire_results_top, general_questionnaire_results_bottom=general_questionnaire_results_bottom, contributor_contribution_results=contributor_contribution_results, is_reviewer=view_as_user.is_reviewer, is_contributor=evaluation.is_user_contributor(view_as_user), is_responsible_or_contributor_or_delegate=evaluation.is_user_responsible_or_contributor_or_delegate(view_as_user), can_download_grades=view_as_user.can_download_grades, view=view, view_as_user=view_as_user, other_contributors=other_contributors, ) return render(request, "results_evaluation_detail.html", template_data)
def evaluation_detail(request, semester_id, evaluation_id): semester = get_object_or_404(Semester, id=semester_id) evaluation = get_object_or_404(semester.evaluations, id=evaluation_id, course__semester=semester) if not evaluation.can_results_page_be_seen_by(request.user): raise PermissionDenied evaluation_result = collect_results(evaluation) if request.user.is_reviewer: view = request.GET.get( 'view', 'public') # if parameter is not given, show public view. else: view = request.GET.get( 'view', 'full') # if parameter is not given, show own view. if view not in ['public', 'full', 'export']: view = 'public' view_as_user = request.user if view == 'export' and request.user.is_staff: view_as_user = UserProfile.objects.get( id=int(request.GET.get('contributor_id', request.user.id))) represented_users = [view_as_user] if view != 'export': represented_users += list(view_as_user.represented_users.all()) # redirect to non-public view if there is none because the results have not been published if not evaluation.can_publish_rating_results and view == 'public': view = 'full' # remove text answers if the user may not see them for questionnaire_result in evaluation_result.questionnaire_results: for question_result in questionnaire_result.question_results: if isinstance(question_result, TextResult): question_result.answers = [ answer for answer in question_result.answers if can_textanswer_be_seen_by( view_as_user, represented_users, answer, view) ] # remove empty TextResults questionnaire_result.question_results = [ result for result in questionnaire_result.question_results if not isinstance(result, TextResult) or len(result.answers) > 0 ] # filter empty headings for questionnaire_result in evaluation_result.questionnaire_results: filtered_question_results = [] for index, question_result in enumerate( questionnaire_result.question_results): # filter out if there are no more questions or the next question is also a heading question if isinstance(question_result, HeadingResult): if index == len(questionnaire_result.question_results ) - 1 or isinstance( questionnaire_result.question_results[index + 1], HeadingResult): continue filtered_question_results.append(question_result) questionnaire_result.question_results = filtered_question_results # remove empty questionnaire_results and contribution_results for contribution_result in evaluation_result.contribution_results: contribution_result.questionnaire_results = [ questionnaire_result for questionnaire_result in contribution_result.questionnaire_results if questionnaire_result.question_results ] evaluation_result.contribution_results = [ contribution_result for contribution_result in evaluation_result.contribution_results if contribution_result.questionnaire_results ] add_warnings(evaluation, evaluation_result) # split evaluation_result into different lists general_questionnaire_results_top = [] general_questionnaire_results_bottom = [] contributor_contribution_results = [] for contribution_result in evaluation_result.contribution_results: if contribution_result.contributor is None: for questionnaire_result in contribution_result.questionnaire_results: if questionnaire_result.questionnaire.is_below_contributors: general_questionnaire_results_bottom.append( questionnaire_result) else: general_questionnaire_results_top.append( questionnaire_result) elif view != 'export' or view_as_user.id == contribution_result.contributor.id: contributor_contribution_results.append(contribution_result) if not contributor_contribution_results: general_questionnaire_results_top += general_questionnaire_results_bottom general_questionnaire_results_bottom = [] course_evaluations = [] if evaluation.course.evaluations.count() > 1: course_evaluations = [ evaluation for evaluation in evaluation.course.evaluations.filter( state="published") if evaluation.can_be_seen_by(request.user) ] if request.user.is_reviewer: course_evaluations += evaluation.course.evaluations.filter( state__in=['in_evaluation', 'evaluated', 'reviewed']) course_evaluations = get_evaluations_with_course_result_attributes( course_evaluations) for course_evaluation in course_evaluations: if course_evaluation.is_single_result: course_evaluation.single_result_rating_result = get_single_result_rating_result( course_evaluation) else: course_evaluation.distribution = calculate_average_distribution( course_evaluation) course_evaluation.avg_grade = distribution_to_grade( course_evaluation.distribution) other_contributors = [] if view == 'export': other_contributors = [ contribution_result.contributor for contribution_result in evaluation_result.contribution_results if contribution_result.contributor not in [None, view_as_user] ] # if the evaluation is not published, the rendered results are not cached, so we need to attach distribution # information for rendering the distribution bar if evaluation.state != 'published': evaluation = get_evaluations_with_prefetched_data([evaluation])[0] template_data = dict( evaluation=evaluation, course=evaluation.course, course_evaluations=course_evaluations, general_questionnaire_results_top=general_questionnaire_results_top, general_questionnaire_results_bottom= general_questionnaire_results_bottom, contributor_contribution_results=contributor_contribution_results, is_reviewer=view_as_user.is_reviewer, is_contributor=evaluation.is_user_contributor(view_as_user), is_responsible_or_contributor_or_delegate=evaluation. is_user_responsible_or_contributor_or_delegate(view_as_user), can_download_grades=view_as_user.can_download_grades, view=view, view_as_user=view_as_user, other_contributors=other_contributors, ) return render(request, "results_evaluation_detail.html", template_data)