def test_get_one_group(self):
     testassignment1 = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testassignment2 = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup1 = mommy.make('core.AssignmentGroup',
                             parentnode=testassignment1)
     testgroup2 = mommy.make('core.AssignmentGroup',
                             parentnode=testassignment2)
     relatedstudent = mommy.make('core.RelatedStudent')
     mommy.make('core.Candidate',
                assignment_group=testgroup1,
                relatedstudent=relatedstudent)
     mommy.make('core.Candidate',
                assignment_group=testgroup2,
                relatedstudent=relatedstudent)
     feedbackset = group_mommy.feedbackset_first_attempt_unpublished(
         group=testgroup1)
     group_mommy.feedbackset_first_attempt_unpublished(group=testgroup2)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup1,
         requestuser=relatedstudent.user,
         devilryrole='student')
     timelinebuilder = FeedbackFeedTimelineBuilder(
         feedbacksets=feedbackset_queryset, group=testgroup1)
     self.assertEquals(1, len(timelinebuilder.feedbacksets))
     self.assertEquals(feedbackset, timelinebuilder.feedbacksets[0])
     self.assertEquals(2, group_models.FeedbackSet.objects.count())
    def test_num_queries(self):
        # Must be refactored
        # Test that the number of queries performed is manageable
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testassignment = testgroup.assignment
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(group=testgroup)
        candidate = mommy.make('core.Candidate', assignment_group=testgroup)
        mommy.make('core.Candidate', assignment_group=testgroup, _quantity=100)
        mommy.make('core.Examiner', assignmentgroup=testgroup, _quantity=100)
        testcomment = mommy.make('devilry_group.GroupComment',
                                 feedback_set=testfeedbackset,
                                 user=candidate.relatedstudent.user)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment,
                   _quantity=100)

        with self.assertNumQueries(6):
            feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
            sidebarbuilder = FeedbackFeedSidebarBuilder(
                assignment=testassignment,
                group=testgroup,
                feedbacksets=feedbackset_queryset)
            sidebarbuilder.build()
            sidebarbuilder.get_as_list()
        self.assertEqual(1, group_models.FeedbackSet.objects.count())
Exemple #3
0
    def test_num_queries(self):
        # Must be refactored
        # Test that the number of queries performed is manageable
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset1 = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                is_last_in_group=None)
        testfeedbackset2 = devilry_group_mommy_factories.feedbackset_new_attempt_unpublished(
            group=testgroup,
            deadline_datetime=timezone.now() + timezone.timedelta(days=3)
        )

        testcomment = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset1)
        testcomment1 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset2)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment1)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment1)

        with self.assertNumQueries(4):
            feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
            sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
            sidebarbuilder.build()
            sidebarbuilder.get_as_list()
    def test_num_queries(self):
        # Must be refactored
        # Test that the number of queries performed is manageable
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testassignment = testgroup.assignment
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(group=testgroup)
        candidate = mommy.make('core.Candidate', assignment_group=testgroup)
        mommy.make('core.Candidate', assignment_group=testgroup, _quantity=100)
        mommy.make('core.Examiner', assignmentgroup=testgroup, _quantity=100)
        testcomment = mommy.make('devilry_group.GroupComment',
                                 feedback_set=testfeedbackset,
                                 user=candidate.relatedstudent.user)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment,
                   _quantity=100)

        with self.assertNumQueries(6):
            feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
            sidebarbuilder = FeedbackFeedSidebarBuilder(
                assignment=testassignment,
                group=testgroup,
                feedbacksets=feedbackset_queryset)
            sidebarbuilder.build()
            sidebarbuilder.get_as_list()
        self.assertEquals(1, group_models.FeedbackSet.objects.count())
 def test_feedbackset_published_grading_points_same_as_first_updated_grading_points(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     testfeedbackset = group_mommy.feedbackset_first_attempt_published(group=testgroup)
     first_grading_points_update = mommy.make('devilry_group.FeedbackSetGradingUpdateHistory',
                                              old_grading_points=testfeedbackset.grading_points,
                                              feedback_set=testfeedbackset)
     last_grading_points_update = mommy.make('devilry_group.FeedbackSetGradingUpdateHistory',
                                             old_grading_points=0,
                                             feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 1)
     self.assertEqual(timeline_list[0]['feedbackset_events'][0]['type'], 'grade')
     self.assertEqual(timeline_list[0]['feedbackset_events'][0]['grade_points'],
                          first_grading_points_update.old_grading_points)
     self.assertNotEqual(timeline_list[0]['feedbackset_events'][0]['grade_points'],
                       last_grading_points_update.old_grading_points)
 def test_timeline_examiner_can_see_comment_visible_examiners_and_admins(
         self):
     # Student can only see what's visible to everyone(VISIBILITY_VISIBLE_TO_EVERYONE)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     testexaminer = mommy.make('core.Examiner',
                               assignmentgroup=testgroup,
                               relatedexaminer__user=mommy.make(
                                   settings.AUTH_USER_MODEL))
     testfeedbackset = group_mommy.feedbackset_first_attempt_unpublished(
         group=testgroup)
     mommy.make('devilry_group.GroupComment',
                visibility=group_models.GroupComment.
                VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS,
                feedback_set=testfeedbackset)
     test_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testexaminer.relatedexaminer.user,
         devilryrole='examiner')
     timelinebuilder = FeedbackFeedTimelineBuilder(
         feedbacksets=test_queryset, group=testgroup)
     timelinebuilder.build()
     self.assertEquals(
         1, len(timelinebuilder.feedbacksets[0].groupcomment_set.all()))
     self.assertEquals(2, len(timelinebuilder.timeline))
     self.assertEquals(1, group_models.FeedbackSet.objects.count())
 def test_merged_feedbackset_only_internal_notes_visible(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     merged_feedbackset = mommy.make(
         'devilry_group.FeedbackSet',
         group=testgroup,
         feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make(
         'devilry_group.GroupComment',
         feedback_set=merged_feedbackset,
         visibility=GroupComment.VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS)
     feedbackset = group_mommy.make_first_feedbackset_in_group(
         group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 2)
     self.assertEqual(timeline_list[0]['feedbackset'], merged_feedbackset)
     self.assertEqual(timeline_list[1]['feedbackset'], feedbackset)
 def test_feedback_set_merge_type_ordered_before_not_merge_type_feedback_set(
         self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     now = timezone.now()
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end',
         first_deadline=now)
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     testfeedbackset = mommy.make(
         'devilry_group.FeedbackSet',
         deadline_datetime=now,
         group=testgroup,
         feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEquals(len(timeline_list), 2)
     self.assertEqual(timeline_list[1]['feedbackset'], testfeedbackset)
 def test_merged_feedbackset_only_with_grading_visible(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     merged_feedbackset = mommy.make(
         'devilry_group.FeedbackSet',
         grading_published_datetime=timezone.now(),
         group=testgroup,
         feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     feedbackset = group_mommy.make_first_feedbackset_in_group(
         group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 2)
     self.assertEqual(timeline_list[0]['feedbackset'], merged_feedbackset)
     self.assertEqual(timeline_list[1]['feedbackset'], feedbackset)
Exemple #10
0
    def test_items_in_builder_student(self):
        # Test that private comments are not fetched for student
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                deadline_datetime=timezone.now() - timezone.timedelta(days=1))

        # testcomment 1
        testcomment1 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment1')
        mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile1')
        mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile2')
        mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile3')

        # testcomment 2
        testcomment2 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment2')
        mommy.make('devilry_comment.CommentFile', comment=testcomment2, filename='testfile1')

        # testcomment with visibility set to private
        private_comment = mommy.make('devilry_group.GroupComment',
                                     feedback_set=testfeedbackset,
                                     visibility=group_models.GroupComment.VISIBILITY_PRIVATE)
        mommy.make('devilry_comment.CommentFile', comment=private_comment, filename='private file')

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'student')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()
        sidebarlist = sidebarbuilder.get_as_list()

        # Get comments and loop through and check private_comments' published_datetime is not in any of the comment
        # dictionaries
        feedbackset_comments = sidebarlist[0]['comments']
        self.assertEquals(len(feedbackset_comments), 2)
        for comment_dict in feedbackset_comments:
            self.assertNotEquals(private_comment.published_datetime, comment_dict['groupcomment'].published_datetime)
 def test_feedbackset_mergetype_is_excluded_if_not_published_and_no_comments_visible_to_everyone(
         self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     testfeedbackset = mommy.make(
         'devilry_group.FeedbackSet',
         group=testgroup,
         feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make(
         'devilry_group.GroupComment',
         visibility=GroupComment.VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEquals(
         len(timeline_list),
         1)  # Auto created first feedbackset for assignment group.
     self.assertNotEqual(timeline_list[0]['feedbackset'], testfeedbackset)
 def test_get_num_elements_in_timeline(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     now = timezone.now()
     group_mommy.feedbackset_first_attempt_published(
         group=testgroup,
         created_datetime=now - timezone.timedelta(days=20),
         grading_published_datetime=now - timezone.timedelta(days=19))
     group_mommy.feedbackset_new_attempt_published(
         group=testgroup,
         created_datetime=now - timezone.timedelta(days=18),
         deadline_datetime=now - timezone.timedelta(days=17),
         grading_published_datetime=now - timezone.timedelta(days=16))
     group_mommy.feedbackset_new_attempt_published(
         group=testgroup,
         created_datetime=now - timezone.timedelta(days=15),
         deadline_datetime=now - timezone.timedelta(days=14),
         grading_published_datetime=now - timezone.timedelta(days=13))
     group_mommy.feedbackset_new_attempt_published(
         group=testgroup,
         created_datetime=now - timezone.timedelta(days=12),
         deadline_datetime=now - timezone.timedelta(days=11),
         grading_published_datetime=now - timezone.timedelta(days=10))
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup, requestuser=testuser, devilryrole='unused')
     timelinebuilder = FeedbackFeedTimelineBuilder(
         feedbacksets=feedbackset_queryset, group=testgroup)
     timelinebuilder.build()
     self.assertEquals(11, len(timelinebuilder.timeline))
     self.assertEquals(4, group_models.FeedbackSet.objects.count())
Exemple #13
0
    def test_feedbackset_ordering_get_as_list(self):
        # Must be refactored
        # Tests the ordering of FeedbackFeedSidebarBuilder
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                deadline_datetime=timezone.now() - timezone.timedelta(days=1),
                is_last_in_group=None)
        testfeedbackset1 = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                deadline_datetime=timezone.now() + timezone.timedelta(days=2))

        testcomment = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment)

        testcomment1 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset1)
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment1)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()

        sidebarlist = sidebarbuilder.get_as_list()
        self.assertTrue(
                sidebarlist[0]['feedbackset'].current_deadline() < sidebarlist[1]['feedbackset'].current_deadline())
    def get_context_data(self, **kwargs):
        """
        Sets the context data needed to render elements in the template.

        Args:
            **kwargs (dict): Parameters to get_context_data.

        Returns:
             dict: The context data dictionary.
        """
        context = super(FeedbackFeedBaseView, self).get_context_data(**kwargs)
        assignment = self.__get_assignment()
        group = self.assignment_group

        # Build the timeline for the feedbackfeed
        builder_queryset = builder_base.get_feedbackfeed_builder_queryset(
                group,
                self.request.user,
                self.get_devilryrole())

        built_timeline = self.__build_timeline(assignment, builder_queryset)
        last_feedbackset = group.cached_data.last_feedbackset
        context['devilry_ui_role'] = self.get_devilryrole()
        context['group'] = group
        context['num_students_in_group'] = group.candidates.count()
        context['subject'] = assignment.period.subject
        context['period'] = assignment.period
        context['assignment'] = assignment
        context['last_deadline'] = last_feedbackset.deadline_datetime
        context['last_feedbackset'] = last_feedbackset
        context['current_date'] = timezone.now()
        context['last_deadline_as_string'] = datetimeutils\
            .datetime_to_url_string(last_feedbackset.deadline_datetime)
        context['listbuilder_list'] = feedbackfeed_timeline.TimeLineListBuilderList.from_built_timeline(
            built_timeline,
            group=group,
            devilryrole=self.get_devilryrole(),
            assignment=assignment,
            requestuser=self.request.user
        )
        context['assignment_uses_hard_deadlines'] = assignment.deadline_handling_is_hard()
        context['assignment_uses_hard_deadlines_info_text'] = self.get_hard_deadline_info_text()
        context['students_can_create_groups'] = assignment.students_can_create_groups_now
        context['comment_form_disabled'] = self.__get_form_disabled()
        context['comment_form_disabled_message'] = self.__get_form_disabled_message()

        # Build the sidebar using the fetched data from timelinebuilder
        if self.get_available_commentfile_count_for_user() > 0:
            built_sidebar = self.__build_sidebar(assignment, builder_queryset)
            context['sidebarbuilder_list'] = feedbackfeed_sidebar.SidebarListBuilderList.from_built_sidebar(
                built_sidebar,
                group=group,
                devilryrole=self.get_devilryrole(),
                assignment=context['assignment']
            )
        else:
            context['sidebarbuilder_list'] = None

        return context
    def get_context_data(self, **kwargs):
        """
        Sets the context data needed to render elements in the template.

        Args:
            **kwargs (dict): Parameters to get_context_data.

        Returns:
             dict: The context data dictionary.
        """
        context = super(FeedbackFeedBaseView, self).get_context_data(**kwargs)
        assignment = self.__get_assignment()
        group = self.assignment_group

        # Build the timeline for the feedbackfeed
        builder_queryset = builder_base.get_feedbackfeed_builder_queryset(
                group,
                self.request.user,
                self.get_devilryrole())

        built_timeline = self.__build_timeline(assignment, builder_queryset)
        last_feedbackset = group.cached_data.last_feedbackset
        context['devilry_ui_role'] = self.get_devilryrole()
        context['group'] = group
        context['num_students_in_group'] = group.candidates.count()
        context['subject'] = assignment.period.subject
        context['period'] = assignment.period
        context['assignment'] = assignment
        context['last_deadline'] = last_feedbackset.deadline_datetime
        context['last_feedbackset'] = last_feedbackset
        context['current_date'] = timezone.now()
        context['last_deadline_as_string'] = datetimeutils\
            .datetime_to_url_string(last_feedbackset.deadline_datetime)
        context['listbuilder_list'] = feedbackfeed_timeline.TimeLineListBuilderList.from_built_timeline(
            built_timeline,
            group=group,
            devilryrole=self.get_devilryrole(),
            assignment=assignment,
            requestuser=self.request.user
        )
        context['assignment_uses_hard_deadlines'] = assignment.deadline_handling_is_hard()
        context['assignment_uses_hard_deadlines_info_text'] = self.get_hard_deadline_info_text()
        context['students_can_create_groups'] = assignment.students_can_create_groups_now
        context['comment_form_disabled'] = self.__get_form_disabled()
        context['comment_form_disabled_message'] = self.__get_form_disabled_message()

        # Build the sidebar using the fetched data from timelinebuilder
        if self.get_available_commentfile_count_for_user() > 0:
            built_sidebar = self.__build_sidebar(assignment, builder_queryset)
            context['sidebarbuilder_list'] = feedbackfeed_sidebar.SidebarListBuilderList.from_built_sidebar(
                built_sidebar,
                group=group,
                devilryrole=self.get_devilryrole(),
                assignment=context['assignment']
            )
        else:
            context['sidebarbuilder_list'] = None

        return context
 def __build_timeline(self, group, user, assignment):
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=group, requestuser=user, devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=assignment,
         feedbacksets=feedbackset_queryset,
         group=group)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     return timeline_list
 def __build_timeline(self, group, user, assignment):
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=group,
         requestuser=user,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=assignment,
         feedbacksets=feedbackset_queryset,
         group=group
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     return timeline_list
 def test_get_last_deadline_one_feedbackset(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     group_mommy.feedbackset_first_attempt_unpublished(group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup, requestuser=testuser, devilryrole='unused')
     timelinebuilder = FeedbackFeedTimelineBuilder(
         feedbacksets=feedbackset_queryset, group=testgroup)
     timelinebuilder.build()
     self.assertEquals(1, len(timelinebuilder.feedbacksets))
     self.assertEquals(testassignment.first_deadline,
                       timelinebuilder.get_last_deadline())
    def get_context_data(self, **kwargs):
        """
        Sets the context data needed to render elements in the template.

        Args:
            **kwargs (dict): Parameters to get_context_data.

        Returns:
             dict: The context data dictionary.
        """
        context = super(FeedbackFeedBaseView, self).get_context_data(**kwargs)
        context['devilry_ui_role'] = self.get_devilryrole()
        context['subject'] = self.request.cradmin_role.assignment.period.subject
        context['assignment'] = self.request.cradmin_role.assignment
        context['period'] = self.request.cradmin_role.assignment.period

        # Build the timeline for the feedbackfeed
        builder_queryset = builder_base.get_feedbackfeed_builder_queryset(
                self.request.cradmin_role,
                self.request.user,
                self.get_devilryrole())
        built_timeline = self.__build_timeline(builder_queryset)
        context['last_deadline'] = built_timeline.get_last_deadline()
        context['timeline'] = built_timeline.timeline
        context['feedbacksets'] = built_timeline.feedbacksets
        context['last_feedbackset'] = built_timeline.get_last_feedbackset()
        context['current_date'] = datetime.datetime.now()
        context['listbuilder_list'] = feedbackfeed_timeline.TimelineListBuilderList.from_built_timeline(
            built_timeline,
            group=self.request.cradmin_role,
            devilryrole=self.get_devilryrole(),
            assignment=context['assignment']
        )

        # Build the sidebar using the fetched data from timelinebuilder
        if self.get_available_commentfile_count_for_user() > 0:
            built_sidebar = self.__build_sidebar(builder_queryset)
            context['sidebarbuilder_list'] = feedbackfeed_sidebar.SidebarListBuilderList.from_built_sidebar(
                built_sidebar,
                group=self.request.cradmin_role,
                devilryrole=self.get_devilryrole(),
                assignment=context['assignment']
            )
        else:
            context['sidebarbuilder_list'] = None

        return context
 def test_one_feedbackset_unpublished_event(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     group_mommy.feedbackset_first_attempt_unpublished(group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 1)
     self.assertEqual(timeline_list[0]['feedbackset_events'], [])
Exemple #21
0
    def get_context_data(self, **kwargs):
        """
        Sets the context data needed to render elements in the template.

        Args:
            **kwargs (dict): Parameters to get_context_data.

        Returns:
             dict: The context data dictionary.
        """
        context = super(FeedbackFeedBaseView, self).get_context_data(**kwargs)
        context['devilry_ui_role'] = self.get_devilryrole()
        context['subject'] = self.request.cradmin_role.assignment.period.subject
        context['assignment'] = self.request.cradmin_role.assignment
        context['period'] = self.request.cradmin_role.assignment.period

        # Build the timeline for the feedbackfeed
        builder_queryset = builder_base.get_feedbackfeed_builder_queryset(
                self.request.cradmin_role,
                self.request.user,
                self.get_devilryrole())
        built_timeline = self.__build_timeline(builder_queryset)
        context['last_deadline'] = built_timeline.get_last_deadline()
        context['timeline'] = built_timeline.timeline
        context['feedbacksets'] = built_timeline.feedbacksets
        context['last_feedbackset'] = built_timeline.get_last_feedbackset()
        context['current_date'] = datetime.datetime.now()
        context['listbuilder_list'] = feedbackfeed_timeline.TimelineListBuilderList.from_built_timeline(
            built_timeline,
            group=self.request.cradmin_role,
            devilryrole=self.get_devilryrole(),
            assignment=context['assignment']
        )

        # Build the sidebar using the fetched data from timelinebuilder
        built_sidebar = self.__build_sidebar(builder_queryset)
        context['sidebarbuilder_list'] = feedbackfeed_sidebar.SidebarListBuilderList.from_built_sidebar(
            built_sidebar,
            group=self.request.cradmin_role,
            devilryrole=self.get_devilryrole(),
            assignment=context['assignment']
        )
        return context
 def test_one_feedbackset_unpublished_event(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     group_mommy.feedbackset_first_attempt_unpublished(group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEquals(len(timeline_list), 1)
     self.assertEquals(timeline_list[0]['feedbackset_events'], [])
 def test_merged_feedbackset_without_with_grading_or_public_commnet_visible(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     merged_feedbackset = mommy.make('devilry_group.FeedbackSet',
                                     group=testgroup,
                                     feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     feedbackset = group_mommy.make_first_feedbackset_in_group(group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup, requestuser=testuser, devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 1)
     self.assertEqual(timeline_list[0]['feedbackset'], feedbackset)
Exemple #24
0
    def test_feedbackset_numbering(self):
        # Test that the numbering of the feedbacksets are in ascending order.
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                is_last_in_group=None)
        devilry_group_mommy_factories.feedbackset_new_attempt_unpublished(
            group=testgroup,
            deadline_datetime=timezone.now() + timezone.timedelta(days=3)
        )

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()
        sidebarlist = sidebarbuilder.get_as_list()

        # Loop through and check the numbering.
        for numbering, feedbackset_dict in enumerate(sidebarlist):
            self.assertEquals(numbering+1, feedbackset_dict['feedbackset_num'])
 def test_feedbackset_mergetype_added_if_not_published_but_has_comments_visible_to_everyone(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     testfeedbackset = mommy.make('devilry_group.FeedbackSet',
                group=testgroup, feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 2)
 def test_feedbackset_mergetype_is_excluded_if_not_published_and_no_comments_visible_to_everyone(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     testfeedbackset = mommy.make('devilry_group.FeedbackSet',
                                  group=testgroup, feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', visibility=GroupComment.VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 1) # Auto created first feedbackset for assignment group.
     self.assertNotEqual(timeline_list[0]['feedbackset'], testfeedbackset)
Exemple #27
0
    def test_items_in_builder_examiner(self):
        # Test that examiner can see private comment
        testuser_examiner = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                deadline_datetime=timezone.now() - timezone.timedelta(days=1))

        testcomment = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment1')
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment,
                   filename='testfile1')
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment,
                   filename='testfile2')
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment,
                   filename='testfile3')
        testcomment2 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment2')
        mommy.make('devilry_comment.CommentFile',
                   comment=testcomment2,
                   filename='testfile1')
        private_comment = mommy.make('devilry_group.GroupComment',
                                     feedback_set=testfeedbackset,
                                     visibility=group_models.GroupComment.VISIBILITY_PRIVATE,
                                     user=testuser_examiner)
        mommy.make('devilry_comment.CommentFile',
                   comment=private_comment,
                   filename='private file')

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser_examiner, 'examiner')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()
        sidebarlist = sidebarbuilder.get_as_list()

        comments = sidebarlist[0]['comments']
        self.assertEquals(len(comments), 3)
        self.assertEquals(
                private_comment.published_datetime, comments[2]['groupcomment'].published_datetime)
Exemple #28
0
    def test_no_comments_if_no_files(self):
        # Test that the feedbacksets appears, but no comments if there are no files attached.
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset1 = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                is_last_in_group=None)
        testfeedbackset2 = devilry_group_mommy_factories.feedbackset_new_attempt_unpublished(
            group=testgroup,
            deadline_datetime=timezone.now() + timezone.timedelta(days=3)
        )
        mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset1)
        mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset2)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()
        sidebarlist = sidebarbuilder.get_as_list()

        self.assertEquals(len(sidebarlist), 2)
        self.assertEquals(len(sidebarlist[0]['comments']), 0)
        self.assertEquals(len(sidebarlist[1]['comments']), 0)
 def test_get_last_feedbackset(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     now = timezone.now()
     group_mommy.feedbackset_first_attempt_published(
         group=testgroup,
         grading_published_datetime=now - timezone.timedelta(days=10))
     testfeedbackset_last = group_mommy.feedbackset_new_attempt_published(
         group=testgroup,
         deadline_datetime=now - timezone.timedelta(days=9),
         grading_published_datetime=now - timezone.timedelta(days=8))
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup, requestuser=testuser, devilryrole='unused')
     timelinebuilder = FeedbackFeedTimelineBuilder(
         feedbacksets=feedbackset_queryset, group=testgroup)
     timelinebuilder.build()
     self.assertEquals(testfeedbackset_last,
                       timelinebuilder.get_last_feedbackset())
     self.assertEquals(2, group_models.FeedbackSet.objects.count())
 def test_merged_feedbackset_only_internal_notes_not_visible(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     merged_feedbackset = mommy.make('devilry_group.FeedbackSet',
                                     group=testgroup,
                                     feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', feedback_set=merged_feedbackset,
                visibility=GroupComment.VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS)
     feedbackset = group_mommy.make_first_feedbackset_in_group(group=testgroup)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup, requestuser=testuser, devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 1)
     self.assertEqual(timeline_list[0]['feedbackset'], feedbackset)
 def test_num_queries(self):
     testassignment1 = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_start')
     testgroup1 = mommy.make('core.AssignmentGroup',
                             parentnode=testassignment1)
     candidate = mommy.make('core.Candidate', assignment_group=testgroup1)
     mommy.make('core.Candidate',
                assignment_group=testgroup1,
                _quantity=100)
     mommy.make('core.Examiner', assignmentgroup=testgroup1, _quantity=100)
     testfeedbackset = group_mommy.feedbackset_first_attempt_unpublished(
         group=testgroup1)
     mommy.make('devilry_group.GroupComment',
                feedback_set=testfeedbackset,
                _quantity=100)
     with self.assertNumQueries(8):
         feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
             group=testgroup1,
             requestuser=candidate.relatedstudent.user,
             devilryrole='student')
         timelinebuilder = FeedbackFeedTimelineBuilder(
             feedbacksets=feedbackset_queryset, group=testgroup1)
         timelinebuilder.get_as_list()
 def test_feedbackset_mergetype_added_if_not_published_but_has_comments_visible_to_everyone(
         self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     testfeedbackset = mommy.make(
         'devilry_group.FeedbackSet',
         group=testgroup,
         feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEquals(len(timeline_list), 2)
 def test_feedback_set_merge_type_ordered_before_not_merge_type_feedback_set(self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     now = timezone.now()
     testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_end', first_deadline=now)
     testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
     testfeedbackset = mommy.make('devilry_group.FeedbackSet',
                                  deadline_datetime=now,
                                  group=testgroup, feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT)
     mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole
     )
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup
     )
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEqual(len(timeline_list), 2)
     self.assertEqual(timeline_list[1]['feedbackset'], testfeedbackset)
Exemple #34
0
    def test_files_for_comments(self):
        # Test the correct number of files for each comment and that it's the correct files.
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testgroup = mommy.make('core.AssignmentGroup')
        testfeedbackset = devilry_group_mommy_factories.feedbackset_first_attempt_published(
                group=testgroup,
                deadline_datetime=timezone.now() - timezone.timedelta(days=1))

        # testcomment 1 with 3 CommentFiles
        testcomment1 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment1')
        testfile1 = mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile1')
        testfile2 = mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile2')
        testfile3 = mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile3')

        # testcomment 2 with 1 CommentFile
        testcomment2 = mommy.make('devilry_group.GroupComment', feedback_set=testfeedbackset, text='comment2')
        testfile4 = mommy.make('devilry_comment.CommentFile', comment=testcomment2, filename='testfile1')

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(testgroup, testuser, 'unused')
        sidebarbuilder = FeedbackFeedSidebarBuilder(feedbacksets=feedbackset_queryset)
        sidebarbuilder.build()
        sidebarlist = sidebarbuilder.get_as_list()

        # Test the number of files per GroupComment
        comments = sidebarlist[0]['comments']
        self.assertEquals(len(comments[0]['files']), 3)
        self.assertEquals(len(comments[1]['files']), 1)

        # Test CommentFiles for testcomment1
        testcomment1_files = comments[0]['files']
        self.assertEquals(testcomment1_files[0].filename, testfile1.filename)
        self.assertEquals(testcomment1_files[1].filename, testfile2.filename)
        self.assertEquals(testcomment1_files[2].filename, testfile3.filename)

        # Test CommentFiles for testcomment2
        testcomment2_files = comments[1]['files']
        self.assertEquals(testcomment2_files[0].filename, testfile4.filename)
 def test_feedbackset_published_grading_points_same_as_first_updated_grading_points(
         self):
     testuser = mommy.make(settings.AUTH_USER_MODEL)
     testassignment = mommy.make_recipe(
         'devilry.apps.core.assignment_activeperiod_end')
     testgroup = mommy.make('core.AssignmentGroup',
                            parentnode=testassignment)
     testfeedbackset = group_mommy.feedbackset_first_attempt_published(
         group=testgroup)
     first_grading_points_update = mommy.make(
         'devilry_group.FeedbackSetGradingUpdateHistory',
         old_grading_points=testfeedbackset.grading_points,
         feedback_set=testfeedbackset)
     last_grading_points_update = mommy.make(
         'devilry_group.FeedbackSetGradingUpdateHistory',
         old_grading_points=0,
         feedback_set=testfeedbackset)
     feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
         group=testgroup,
         requestuser=testuser,
         devilryrole=self.devilryrole)
     timeline_builder = FeedbackFeedTimelineBuilder(
         assignment=testassignment,
         feedbacksets=feedbackset_queryset,
         group=testgroup)
     timeline_builder.build()
     timeline_list = timeline_builder.get_as_list()
     self.assertEquals(len(timeline_list), 1)
     self.assertEquals(timeline_list[0]['feedbackset_events'][0]['type'],
                       'grade')
     self.assertEquals(
         timeline_list[0]['feedbackset_events'][0]['grade_points'],
         first_grading_points_update.old_grading_points)
     self.assertNotEquals(
         timeline_list[0]['feedbackset_events'][0]['grade_points'],
         last_grading_points_update.old_grading_points)
Exemple #36
0
    def test_listbuilder_sidebar_complete_example(self):
        # Just a sanity check with a full example comprising of two FeedbackSets
        # with one GroupComment each and one CommentFile for each GroupComment.
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start')
        testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
        candidate = mommy.make('core.Candidate',
                               assignment_group=testgroup,
                               relatedstudent__user__fullname='Test User1',
                               relatedstudent__user__shortname='*****@*****.**')
        examiner = mommy.make('core.Examiner',
                              assignmentgroup=testgroup,
                              relatedexaminer_user__fullname='Test User2',
                              relatedexaminer__user__shortname='*****@*****.**')
        testfeedbackset1 = group_mommy.feedbackset_first_attempt_published(
                grading_published_datetime=(testassignment.first_deadline + timezone.timedelta(days=1)),
                grading_points=10,
                created_by=examiner.relatedexaminer.user,
                created_datetime=(testassignment.publishing_time),
                is_last_in_group=None,
                group=testgroup,
                grading_published_by=examiner.relatedexaminer.user)
        testcomment1 = mommy.make('devilry_group.GroupComment',
                                  created_datetime=testfeedbackset1.current_deadline() - timezone.timedelta(hours=1),
                                  published_datetime=testfeedbackset1.current_deadline() - timezone.timedelta(hours=1),
                                  user=candidate.relatedstudent.user,
                                  user_role='student',
                                  feedback_set=testfeedbackset1)
        commentfile1 = mommy.make('devilry_comment.CommentFile', comment=testcomment1, filename='testfile1.txt')
        commentfile1.file.save('testfile1.txt', ContentFile(''))
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() + timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() + timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset1)

        testfeedbackset2 = group_mommy.feedbackset_new_attempt_published(
                grading_published_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(days=4),
                grading_points=10,
                created_by=examiner.relatedexaminer.user,
                created_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(hours=10),
                deadline_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(days=3),
                group=testgroup,
                grading_published_by=examiner.relatedexaminer.user)
        testcomment2 = mommy.make('devilry_group.GroupComment',
                                  created_datetime=testfeedbackset2.current_deadline() - timezone.timedelta(hours=1),
                                  published_datetime=testfeedbackset2.current_deadline() - timezone.timedelta(hours=1),
                                  user=candidate.relatedstudent.user,
                                  user_role='student',
                                  feedback_set=testfeedbackset2)
        commentfile1 = mommy.make('devilry_comment.CommentFile', comment=testcomment2, filename='testfile2.txt')
        commentfile1.file.save('testfile2.txt', ContentFile(''))
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() + timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() + timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset2)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup,
            requestuser=testuser,
            devilryrole='student'
        )

        built_sidebar = feedbackfeed_sidebarbuilder.FeedbackFeedSidebarBuilder(
            feedbacksets=feedbackset_queryset,
        )
        built_sidebar.build()

        listbuilder_list = feedbackfeed_sidebar.SidebarListBuilderList.from_built_sidebar(
            built_sidebar=built_sidebar,
            group=testgroup,
            devilryrole='student',
            assignment=testassignment
        )

        # Checks the structure of the built list:
        #
        # FeedbackSetItemValue
        #     GroupCommentListBuilderList
        #     GroupCommentItemValue
        #         FileListBuilderList
        #         FileItemValue
        # FeedbackSetItemValue
        #     GroupCommentListBuilderList
        #     GroupCommentItemValue
        #         FileListBuilderList
        #         FileItemValue
        #
        self.assertTrue(isinstance(listbuilder_list.renderable_list[0],
                                   feedbackfeed_sidebar.FeedbackSetItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[1],
                                   feedbackfeed_sidebar.GroupCommentListBuilderList))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[1].renderable_list[0],
                                   feedbackfeed_sidebar.GroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[1].renderable_list[1],
                                   feedbackfeed_sidebar.FileListBuilderList))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[1].renderable_list[1].renderable_list[0],
                                   feedbackfeed_sidebar.FileItemValue))

        self.assertTrue(isinstance(listbuilder_list.renderable_list[2],
                                   feedbackfeed_sidebar.FeedbackSetItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[3],
                                   feedbackfeed_sidebar.GroupCommentListBuilderList))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[3].renderable_list[0],
                                   feedbackfeed_sidebar.GroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[3].renderable_list[1],
                                   feedbackfeed_sidebar.FileListBuilderList))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[3].renderable_list[1].renderable_list[0],
                                   feedbackfeed_sidebar.FileItemValue))
    def test_listbuilder_list_items_complete_example(self):
        """
        Test a complete example of the listbuilder with all events.
        """
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testassignment = mommy.make_recipe(
            'devilry.apps.core.assignment_activeperiod_start')
        testgroup = mommy.make('core.AssignmentGroup',
                               parentnode=testassignment)
        candidate = mommy.make(
            'core.Candidate',
            assignment_group=testgroup,
            relatedstudent__user__fullname='Test User1',
            relatedstudent__user__shortname='*****@*****.**')
        examiner = mommy.make(
            'core.Examiner',
            assignmentgroup=testgroup,
            relatedexaminer_user__fullname='Test User2',
            relatedexaminer__user__shortname='*****@*****.**')
        testfeedbackset1 = group_mommy.feedbackset_first_attempt_published(
            grading_published_datetime=(testassignment.first_deadline +
                                        timezone.timedelta(days=1)),
            grading_points=10,
            created_by=examiner.relatedexaminer.user,
            created_datetime=(testassignment.publishing_time),
            is_last_in_group=None,
            group=testgroup,
            grading_published_by=examiner.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() -
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() -
                   timezone.timedelta(hours=1),
                   user=candidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset1)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() +
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() +
                   timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset1)

        testfeedbackset2 = group_mommy.feedbackset_new_attempt_published(
            grading_published_datetime=testfeedbackset1.
            grading_published_datetime + timezone.timedelta(days=4),
            grading_points=10,
            created_by=examiner.relatedexaminer.user,
            created_datetime=testfeedbackset1.grading_published_datetime +
            timezone.timedelta(hours=10),
            deadline_datetime=testfeedbackset1.grading_published_datetime +
            timezone.timedelta(days=3),
            group=testgroup,
            grading_published_by=examiner.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() -
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() -
                   timezone.timedelta(hours=1),
                   user=candidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset2)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() +
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() +
                   timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset2)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup, requestuser=testuser, devilryrole='student')
        built_timeline = feedbackfeed_timelinebuilder.FeedbackFeedTimelineBuilder(
            feedbacksets=feedbackset_queryset, group=testgroup)

        built_timeline.build()
        listbuilder_list = listbuilder.TimelineListBuilderList.from_built_timeline(
            built_timeline,
            group=testgroup,
            devilryrole='student',
            assignment=testassignment)

        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[0],
                       listbuilder.StudentGroupCommentItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[1],
                       listbuilder.DeadlineExpiredItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[2],
                       listbuilder.ExaminerGroupCommentItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[3],
                       listbuilder.GradeItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[4],
                       listbuilder.DeadlineCreatedItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[5],
                       listbuilder.StudentGroupCommentItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[6],
                       listbuilder.DeadlineExpiredItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[7],
                       listbuilder.ExaminerGroupCommentItemValue))
        self.assertTrue(
            isinstance(listbuilder_list.renderable_list[8],
                       listbuilder.GradeItemValue))
Exemple #38
0
    def test_listbuilder_list_items_complete_example(self):
        """
        Test a complete example of the listbuilder with all events.
        """
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start')
        testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment)
        candidate = mommy.make('core.Candidate',
                               assignment_group=testgroup,
                               relatedstudent__user__fullname='Test User1',
                               relatedstudent__user__shortname='*****@*****.**')
        examiner = mommy.make('core.Examiner',
                              assignmentgroup=testgroup,
                              relatedexaminer_user__fullname='Test User2',
                              relatedexaminer__user__shortname='*****@*****.**')
        testfeedbackset1 = group_mommy.feedbackset_first_attempt_published(
                grading_published_datetime=(testassignment.first_deadline + timezone.timedelta(days=1)),
                grading_points=10,
                created_by=examiner.relatedexaminer.user,
                created_datetime=(testassignment.publishing_time),
                is_last_in_group=None,
                group=testgroup,
                grading_published_by=examiner.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() - timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() - timezone.timedelta(hours=1),
                   user=candidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset1)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() + timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() + timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset1)

        testfeedbackset2 = group_mommy.feedbackset_new_attempt_published(
                grading_published_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(days=4),
                grading_points=10,
                created_by=examiner.relatedexaminer.user,
                created_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(hours=10),
                deadline_datetime=testfeedbackset1.grading_published_datetime + timezone.timedelta(days=3),
                group=testgroup,
                grading_published_by=examiner.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() - timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() - timezone.timedelta(hours=1),
                   user=candidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset2)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() + timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() + timezone.timedelta(hours=1),
                   user=examiner.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset2)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup,
            requestuser=testuser,
            devilryrole='student'
        )
        built_timeline = feedbackfeed_timelinebuilder.FeedbackFeedTimelineBuilder(
            feedbacksets=feedbackset_queryset,
            group=testgroup
        )

        built_timeline.build()
        listbuilder_list = listbuilder.TimelineListBuilderList.from_built_timeline(
            built_timeline,
            group=testgroup,
            devilryrole='student',
            assignment=testassignment
        )

        self.assertTrue(isinstance(listbuilder_list.renderable_list[0], listbuilder.StudentGroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[1], listbuilder.DeadlineExpiredItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[2], listbuilder.ExaminerGroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[3], listbuilder.GradeItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[4], listbuilder.DeadlineCreatedItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[5], listbuilder.StudentGroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[6], listbuilder.DeadlineExpiredItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[7], listbuilder.ExaminerGroupCommentItemValue))
        self.assertTrue(isinstance(listbuilder_list.renderable_list[8], listbuilder.GradeItemValue))
    def test_complete_timeline_events_example(self):
        testuser = mommy.make(settings.AUTH_USER_MODEL)
        testassignment = mommy.make_recipe(
            'devilry.apps.core.assignment_activeperiod_start')
        testgroup = mommy.make('core.AssignmentGroup',
                               parentnode=testassignment)
        testcandidate = mommy.make(
            'core.Candidate',
            assignment_group=testgroup,
            relatedstudent__user__fullname='Test User1',
            relatedstudent__user__shortname='*****@*****.**')
        testexaminer = mommy.make(
            'core.Examiner',
            assignmentgroup=testgroup,
            relatedexaminer_user__fullname='Test User2',
            relatedexaminer__user__shortname='*****@*****.**')

        # First feedbackset published with comments and grading
        testfeedbackset1 = group_mommy.feedbackset_first_attempt_published(
            grading_published_datetime=testassignment.first_deadline +
            timezone.timedelta(days=1),
            grading_points=10,
            created_by=testexaminer.relatedexaminer.user,
            created_datetime=testassignment.publishing_time,
            group=testgroup,
            grading_published_by=testexaminer.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() -
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() -
                   timezone.timedelta(hours=1),
                   user=testcandidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset1)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset1.current_deadline() +
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset1.current_deadline() +
                   timezone.timedelta(hours=1),
                   user=testexaminer.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset1)

        # Second feedbackset with comments and grading
        testfeedbackset2 = group_mommy.feedbackset_new_attempt_published(
            grading_published_datetime=testfeedbackset1.
            grading_published_datetime + timezone.timedelta(days=4),
            grading_points=10,
            created_datetime=testfeedbackset1.grading_published_datetime +
            timezone.timedelta(hours=10),
            deadline_datetime=testfeedbackset1.grading_published_datetime +
            timezone.timedelta(days=3),
            created_by=testexaminer.relatedexaminer.user,
            group=testgroup,
            grading_published_by=testexaminer.relatedexaminer.user)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() -
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() -
                   timezone.timedelta(hours=1),
                   user=testcandidate.relatedstudent.user,
                   user_role='student',
                   feedback_set=testfeedbackset2)
        mommy.make('devilry_group.GroupComment',
                   created_datetime=testfeedbackset2.current_deadline() +
                   timezone.timedelta(hours=1),
                   published_datetime=testfeedbackset2.current_deadline() +
                   timezone.timedelta(hours=1),
                   user=testexaminer.relatedexaminer.user,
                   user_role='examiner',
                   part_of_grading=True,
                   feedback_set=testfeedbackset2)

        feedbackset_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup, requestuser=testuser, devilryrole='student')
        built_timeline = FeedbackFeedTimelineBuilder(
            feedbacksets=feedbackset_queryset, group=testgroup)

        built_timeline.build()
        builder_list = built_timeline.get_as_list()

        self.assertEquals(builder_list[0]['type'], 'comment')
        self.assertEquals(builder_list[1]['type'], 'deadline_expired')
        self.assertEquals(builder_list[2]['type'], 'comment')
        self.assertEquals(builder_list[3]['type'], 'grade')
        self.assertEquals(builder_list[4]['type'], 'deadline_created')
        self.assertEquals(builder_list[5]['type'], 'comment')
        self.assertEquals(builder_list[6]['type'], 'deadline_expired')
        self.assertEquals(builder_list[7]['type'], 'comment')
        self.assertEquals(builder_list[8]['type'], 'grade')
        self.assertEquals(2, group_models.FeedbackSet.objects.count())
    def test_get_visibility_for_roles_not_published(self):
        # Tests a complete example comment visibility for one student and two examiners.
        testassignment = mommy.make_recipe(
            'devilry.apps.core.assignment_activeperiod_start')
        testgroup = mommy.make('core.AssignmentGroup',
                               parentnode=testassignment)

        testexaminer = mommy.make('core.Examiner',
                                  assignmentgroup=testgroup,
                                  relatedexaminer__user=mommy.make(
                                      settings.AUTH_USER_MODEL))
        testexaminer2 = mommy.make('core.Examiner',
                                   assignmentgroup=testgroup,
                                   relatedexaminer__user=mommy.make(
                                       settings.AUTH_USER_MODEL))
        testcandidate = mommy.make('core.Candidate',
                                   assignment_group=testgroup,
                                   relatedstudent__user=mommy.make(
                                       settings.AUTH_USER_MODEL))

        testfeedbackset = group_mommy.feedbackset_first_attempt_unpublished(
            group=testgroup)
        mommy.make('devilry_group.GroupComment',
                   user=testexaminer.relatedexaminer.user,
                   user_role=group_models.GroupComment.USER_ROLE_EXAMINER,
                   feedback_set=testfeedbackset)
        mommy.make('devilry_group.GroupComment',
                   user=testexaminer.relatedexaminer.user,
                   user_role=group_models.GroupComment.USER_ROLE_EXAMINER,
                   part_of_grading=True,
                   feedback_set=testfeedbackset)
        mommy.make('devilry_group.GroupComment',
                   user=testcandidate.relatedstudent.user,
                   user_role=group_models.GroupComment.USER_ROLE_STUDENT,
                   feedback_set=testfeedbackset)
        mommy.make('devilry_group.GroupComment',
                   user=testcandidate.relatedstudent.user,
                   user_role=group_models.GroupComment.USER_ROLE_STUDENT,
                   feedback_set=testfeedbackset)
        mommy.make('devilry_group.GroupComment',
                   user=testexaminer.relatedexaminer.user,
                   user_role=group_models.GroupComment.USER_ROLE_EXAMINER,
                   visibility=group_models.GroupComment.
                   VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS,
                   feedback_set=testfeedbackset)
        mommy.make('devilry_group.GroupComment',
                   user=testexaminer.relatedexaminer.user,
                   user_role=group_models.GroupComment.USER_ROLE_EXAMINER,
                   visibility=group_models.GroupComment.VISIBILITY_PRIVATE,
                   feedback_set=testfeedbackset)

        # examiner can see all comments
        testexaminer_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup,
            requestuser=testexaminer.relatedexaminer.user,
            devilryrole='unused')
        timelinebuilder_examiner = FeedbackFeedTimelineBuilder(
            feedbacksets=testexaminer_queryset, group=testgroup)
        timelinebuilder_examiner.build()
        self.assertEquals(
            6,
            len(timelinebuilder_examiner.feedbacksets[0].groupcomment_set.all(
            )))
        self.assertEquals(7, len(timelinebuilder_examiner.timeline))

        # examiner2 can see all comments, except private comments
        testexaminer2_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup,
            requestuser=testexaminer2.relatedexaminer.user,
            devilryrole='examiner')
        timelinebuilder_examiner2 = FeedbackFeedTimelineBuilder(
            feedbacksets=testexaminer2_queryset, group=testgroup)
        timelinebuilder_examiner2.build()
        self.assertEquals(
            5,
            len(timelinebuilder_examiner2.feedbacksets[0].groupcomment_set.all(
            )))
        self.assertEquals(6, len(timelinebuilder_examiner2.timeline))

        # student can only see what is visible to everyone(VISIBILITY_VISIBLE_TO_EVERYONE)
        testcandidate_queryset = builder_base.get_feedbackfeed_builder_queryset(
            group=testgroup,
            requestuser=testcandidate.relatedstudent.user,
            devilryrole='student')
        timelinebuilder_student = FeedbackFeedTimelineBuilder(
            feedbacksets=testcandidate_queryset, group=testgroup)
        timelinebuilder_student.build()
        self.assertEquals(
            3,
            len(timelinebuilder_student.feedbacksets[0].groupcomment_set.all())
        )
        self.assertEquals(4, len(timelinebuilder_student.timeline))
        self.assertEquals(1, group_models.FeedbackSet.objects.count())