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())
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)
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())
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'], [])
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)
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)
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)
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)
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)
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))
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())