def test_unipolarized_yesno(self): counts = (57, 43) question_yesno = baker.make(Question, questionnaire=self.questionnaire, type=Question.POSITIVE_YES_NO) answer_counters = [ baker.make(RatingAnswerCounter, question=question_yesno, contribution=self.general_contribution, answer=1, count=counts[0]), baker.make(RatingAnswerCounter, question=question_yesno, contribution=self.general_contribution, answer=5, count=counts[1]) ] result = RatingResult(question_yesno, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.57) self.assertEqual(distribution[1], 0) self.assertEqual(distribution[2], 0) self.assertEqual(distribution[3], 0) self.assertAlmostEqual(distribution[4], 0.43)
def test_unipolarized_unipolar(self): answer_counters = make_rating_answer_counters( self.question_likert, self.general_contribution, [5, 3, 1, 1, 0]) result = RatingResult(self.question_likert, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.5) self.assertAlmostEqual(distribution[1], 0.3) self.assertAlmostEqual(distribution[2], 0.1) self.assertAlmostEqual(distribution[3], 0.1) self.assertAlmostEqual(distribution[4], 0.0)
def test_unipolarized_bipolar(self): answer_counters = make_rating_answer_counters( self.question_bipolar, self.general_contribution, [0, 1, 4, 8, 2, 2, 3]) result = RatingResult(self.question_bipolar, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.4) self.assertAlmostEqual(distribution[1], 0.2) self.assertAlmostEqual(distribution[2], 0.15) self.assertAlmostEqual(distribution[3], 0.1) self.assertAlmostEqual(distribution[4], 0.15)
def test_unipolarized_yesno(self): question_yesno = baker.make(Question, questionnaire=self.questionnaire, type=Question.POSITIVE_YES_NO) answer_counters = make_rating_answer_counters( question_yesno, self.general_contribution, [57, 43]) result = RatingResult(question_yesno, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.57) self.assertEqual(distribution[1], 0) self.assertEqual(distribution[2], 0) self.assertEqual(distribution[3], 0) self.assertAlmostEqual(distribution[4], 0.43)
def test_unipolarized_bipolar(self): counts = (0, 1, 4, 8, 2, 2, 3) answer_counters = [ baker.make(RatingAnswerCounter, question=self.question_bipolar, contribution=self.general_contribution, answer=answer, count=count) for answer, count in enumerate(counts, start=-3) ] result = RatingResult(self.question_bipolar, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.4) self.assertAlmostEqual(distribution[1], 0.2) self.assertAlmostEqual(distribution[2], 0.15) self.assertAlmostEqual(distribution[3], 0.1) self.assertAlmostEqual(distribution[4], 0.15)
def test_unipolarized_unipolar(self): counts = (5, 3, 1, 1, 0) answer_counters = [ baker.make(RatingAnswerCounter, question=self.question_likert, contribution=self.general_contribution, answer=answer, count=count) for answer, count in enumerate(counts, start=1) ] result = RatingResult(self.question_likert, answer_counters) distribution = unipolarized_distribution(result) self.assertAlmostEqual(distribution[0], 0.5) self.assertAlmostEqual(distribution[1], 0.3) self.assertAlmostEqual(distribution[2], 0.1) self.assertAlmostEqual(distribution[3], 0.1) self.assertAlmostEqual(distribution[4], 0.0)
def course_detail(request, semester_id, course_id): semester = get_object_or_404(Semester, id=semester_id) course = get_object_or_404(semester.course_set, id=course_id, semester=semester) if not course.can_user_see_results_page(request.user): raise PermissionDenied sections = calculate_results(course) if request.user.is_reviewer: public_view = request.GET.get( 'public_view' ) != 'false' # if parameter is not given, show public view. else: public_view = request.GET.get( 'public_view' ) == 'true' # if parameter is not given, show own view. # If grades are not published, there is no public view if not course.has_enough_voters_to_publish_grades: public_view = False represented_users = list(request.user.represented_users.all()) represented_users.append(request.user) show_grades = course.can_user_see_grades(request.user) # remove text answers and grades if the user may not see them for section in sections: results = [] for result in section.results: if isinstance(result, TextResult): answers = [ answer for answer in result.answers if user_can_see_text_answer( request.user, represented_users, answer, public_view) ] if answers: results.append( TextResult(question=result.question, answers=answers)) elif isinstance(result, RatingResult) and not show_grades: results.append( RatingResult(question=result.question, total_count=result.total_count, average=None, counts=None, warning=result.warning)) elif isinstance(result, YesNoResult) and not show_grades: results.append( YesNoResult(question=result.question, total_count=result.total_count, average=None, counts=None, warning=result.warning, approval_count=None)) else: results.append(result) section.results[:] = results # filter empty headings for section in sections: filtered_results = [] for index in range(len(section.results)): result = section.results[index] # filter out if there are no more questions or the next question is also a heading question if isinstance(result, HeadingResult): if index == len(section.results) - 1 or isinstance( section.results[index + 1], HeadingResult): continue filtered_results.append(result) section.results[:] = filtered_results # remove empty sections sections = [section for section in sections if section.results] # group by contributor course_sections_top = [] course_sections_bottom = [] contributor_sections = OrderedDict() for section in sections: if section.contributor is None: if section.questionnaire.is_below_contributors: course_sections_bottom.append(section) else: course_sections_top.append(section) else: contributor_sections.setdefault(section.contributor, { 'total_votes': 0, 'sections': [] })['sections'].append(section) for result in section.results: if isinstance(result, TextResult): contributor_sections[ section.contributor]['total_votes'] += 1 elif isinstance(result, RatingResult) or isinstance( result, YesNoResult): # Only count rating results if we show the grades. if show_grades: contributor_sections[section.contributor][ 'total_votes'] += result.total_count course.distribution = calculate_average_distribution( course) if show_grades else None course.avg_grade = distribution_to_grade(course.distribution) template_data = dict(course=course, course_sections_top=course_sections_top, course_sections_bottom=course_sections_bottom, contributor_sections=contributor_sections, reviewer=request.user.is_reviewer, contributor=course.is_user_contributor_or_delegate( request.user), can_download_grades=request.user.can_download_grades, public_view=public_view) return render(request, "results_course_detail.html", template_data)