Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
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)