示例#1
0
    def test_add_students_and_workgroups_to_context(self):
        context = {}
        workgroup_value = [
            WorkgroupDetails(id=1, users=[{'id': 1}]),
            WorkgroupDetails(id=2, users=[{'id': 2}, {'id': 3}])
        ]
        users_value = ['user_sentinel']
        self.make_patch(type(self.block), 'workgroups', mock.PropertyMock(return_value=workgroup_value))
        self.make_patch(type(self.block), 'all_users_in_workgroups', mock.PropertyMock(return_value=users_value))

        self.block._add_students_and_workgroups_to_context(context)
        self.assertEqual(context[Constants.TARGET_WORKGROUPS], workgroup_value)
        self.assertEqual(context[Constants.TARGET_STUDENTS], users_value)
        self.assertEqual(context[Constants.FILTERED_STUDENTS], set())
示例#2
0
    def test_users_in_workgroups(self, workgroup_ids, expected_user_ids):
        workgroups = {
            1: WorkgroupDetails(id=1, users=[{'id': 1}]),
            2: WorkgroupDetails(id=2, users=[{'id': 2}, {'id': 3}])
        }

        def _get_workgroup_by_id(workgroup_id):
            return workgroups.get(workgroup_id, None)

        self.block.project_details.workgroups = workgroup_ids
        self.project_api_mock.get_workgroup_by_id.side_effect = _get_workgroup_by_id

        users = self.block.all_users_in_workgroups

        self.assertEqual([user.id for user in users], expected_user_ids)
 def get_workgroup_by_id(self, group_id):
     """
     :param int group_id: Group ID
     :rtype: WorkgroupDetails
     """
     response = self.send_request(GET, (WORKGROUP_API, group_id))
     return WorkgroupDetails(**response)
 def get_workgroups_for_assignment(self, assignment_id):
     """
     :param int assignment_id: Assignment ID
     :rtype: list[WorkgroupDetails]
     """
     workgroups = self.send_request(
         GET, (GROUP_API, assignment_id, 'workgroups'),
         no_trailing_slash=True)
     return [WorkgroupDetails(**item) for item in workgroups["results"]]
    def test_is_group_member(self, user_id, group_members, is_member):
        self.user_id_mock.return_value = user_id
        with mock.patch.object(WorkgroupAwareXBlockMixin, 'workgroup',
                               mock.PropertyMock()) as patched_workgroup:
            patched_workgroup.return_value = WorkgroupDetails(
                id=0, users=[{
                    "id": u_id
                } for u_id in group_members])

            self.assertEqual(self.block.is_group_member, is_member)
示例#6
0
    def setUp(self):
        super(TestGroupProjectSubmissionXBlock, self).setUp()
        self.project_api_mock = mock.create_autospec(TypedProjectAPI)
        self.make_patch(self.block_to_test, 'project_api',
                        mock.PropertyMock(return_value=self.project_api_mock))
        user_details = mock.Mock(user_label='Test label')
        self.block_to_test.project_api.get_user_details = mock.Mock(
            spec=TypedProjectAPI.get_user_details, return_value=user_details)

        self.project_api_mock.get_latest_workgroup_submissions_by_id = mock.Mock(
            return_value={})

        self.stage_mock.available_now = True
        self.stage_mock.activity = mock.Mock()
        self.stage_mock.activity.user_id = self.user_id
        self.stage_mock.activity.workgroup = WorkgroupDetails(id=self.group_id)
        self.stage_mock.activity.course_id = self.course_id
示例#7
0
class WorkgroupAwareXBlockMixin(AuthXBlockMixin, UserAwareXBlockMixin,
                                CourseAwareXBlockMixin):
    """
    Gets current user workgroup, respecting TA review
    """
    FALLBACK_WORKGROUP = WorkgroupDetails(id=0, users=[])

    @property
    def group_id(self):
        """
        :rtype: int
        """
        return self.workgroup.id

    @property
    def is_group_member(self):
        """
        :rtype: bool
        """
        return self.user_id in [u.id for u in self.workgroup.users]

    @property
    def workgroup(self):
        """
        :rtype: WorkgroupDetails
        """
        try:
            user_prefs = self.user_preferences
            if UserAwareXBlockMixin.TA_REVIEW_KEY in user_prefs:
                self.check_ta_access(self.user_id, self.course_id)
                return self.project_api.get_workgroup_by_id(
                    user_prefs[UserAwareXBlockMixin.TA_REVIEW_KEY])
            else:
                workgroup = self.project_api.get_user_workgroup_for_course(
                    self.user_id, self.course_id)
                if workgroup is None:
                    return self.FALLBACK_WORKGROUP
                return workgroup
        except GroupworkAccessDeniedError:
            raise
        except ApiError as exception:
            log.exception(exception)
            return self.FALLBACK_WORKGROUP
示例#8
0
    def test_review_status(self, groups, questions, reviews, expected_result):
        def get_reviews(group_id, _component_id):
            return reviews.get(group_id, [])

        expected_calls = [
            mock.call(group_id, self.block.activity_content_id)
            for group_id in groups
        ]
        self.project_api_mock.get_workgroup_review_items_for_group.side_effect = get_reviews

        with patch_obj(self.block_to_test, 'review_subjects', mock.PropertyMock()) as patched_review_subjects, \
                patch_obj(self.block_to_test, 'required_questions', mock.PropertyMock()) as patched_questions:
            patched_review_subjects.return_value = [
                WorkgroupDetails(id=rev_id) for rev_id in groups
            ]
            patched_questions.return_value = [
                make_question(q_id, 'irrelevant') for q_id in questions
            ]

            self.assertEqual(self.block.review_status(), expected_result)

        self.assertEqual(
            self.project_api_mock.get_workgroup_review_items_for_group.
            mock_calls, expected_calls)
def make_workgroup(user_ids):
    return WorkgroupDetails(users=[{
        "id": user_id,
        "username": "******" + str(user_id),
        "email": "{0}@example.com".format(user_id)
    } for user_id in user_ids])
示例#10
0
def make_workgroup(workgroup_id, users=None):
    if not users:
        users = []
    return WorkgroupDetails(id=workgroup_id, users=users)
示例#11
0
        id=TestConstants.Users.USER2_ID, email="*****@*****.**",
        is_active=True, username="******", full_name="Jack"
    ),
    TestConstants.Users.USER3_ID: UserDetails(
        id=TestConstants.Users.USER3_ID, email="*****@*****.**",
        is_active=True, username="******", full_name="Jill"
    ),
}

WORKGROUP = WorkgroupDetails(**{
    "id": TestConstants.Groups.GROUP1_ID,
    "name": "Group 1",
    "project": 1,
    "groups": [],
    "users": [
        {"id": user.id, "username": user.username, "email": user.email}
        for user in KNOWN_USERS.values()
    ],
    "submissions": [],
    "workgroup_reviews": [],
    "peer_reviews": []
})

OTHER_GROUPS = {
    TestConstants.Groups.GROUP2_ID: WorkgroupDetails(id=TestConstants.Groups.GROUP2_ID, name="Group 2"),
    TestConstants.Groups.GROUP3_ID: WorkgroupDetails(id=TestConstants.Groups.GROUP3_ID, name="Group 3"),
}


def make_submission_data(doc_url, doc_filename, upload_date, user_details):
    return {
示例#12
0
    def test_ta_grading(self):
        self.__prepare_scenario_for_ta_graded_activity()
        user_id, group_id = 22, 3
        self.project_api_mock.get_user_preferences = mock.Mock(
            return_value={UserAwareXBlockMixin.TA_REVIEW_KEY: group_id})
        self.project_api_mock.get_user_roles_for_course = mock.Mock(
            return_value=set(AuthXBlockMixin.DEFAULT_TA_ROLE))
        self.project_api_mock.get_workgroup_by_id.side_effect = lambda g_id: WorkgroupDetails(
            id=g_id, users=[{
                "id": 1
            }])

        stage_element = self.get_stage(self.go_to_view(student_id=user_id))
        self.assertTrue(stage_element.has_admin_grading_notification)

        self.project_api_mock.get_workgroup_by_id.assert_called_with(group_id)

        self.assertEqual(len(stage_element.groups), 1)
        group = stage_element.groups[0]
        self.assertEqual(group.subject_id, str(group_id))

        self.select_review_subject(group)

        submissions = {
            "group_score": "100",
            "group_q1": "Y",
            "group_q2": "Awesome"
        }

        questions = stage_element.form.questions
        questions[0].control.select_option(submissions["group_score"])
        questions[1].control.select_option(submissions["group_q1"])
        questions[2].control.fill_text(submissions["group_q2"])

        self.assertTrue(stage_element.form.submit.is_displayed())
        self.assertEqual(stage_element.form.submit.text,
                         "Submit")  # first time here - should read Submit

        # mocking response after submitting
        self.project_api_mock.get_workgroup_review_items_for_group.return_value = [
            {
                "reviewer": str(user_id),
                "answer": answer,
                'question': question,
                "workgroup": stage_element.form.group_id
            } for question, answer in submissions.iteritems()
        ]

        with mock.patch.object(WorkbenchRuntime, 'publish') as patched_method:
            self.click_submit(stage_element)

            self.assertTrue(patched_method.called)
            publish_args, publish_kwargs = patched_method.call_args
            self.assertEqual(publish_kwargs, {})
            self.assertIsInstance(publish_args[0], PeerReviewStage)
            self.assertEqual(publish_args[0].id, stage_element.id)
            self.assertEqual(publish_args[1], 'progress')
            self.assertEqual(publish_args[2], {'user_id': user_id})

        self.project_api_mock.submit_workgroup_review_items.assert_called_with(
            str(user_id), stage_element.form.group_id, self.activity_id,
            submissions)
def _make_workgroup(user_ids):
    return WorkgroupDetails(users=[{'id': user_id} for user_id in user_ids])