Пример #1
0
    def test_from_json_broken(self):
        # Missing field
        jsonified = {
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'id'"):
            UserPartition.from_json(jsonified)

        # Missing scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'scheme'"):
            UserPartition.from_json(jsonified)

        # Invalid scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "no_such_scheme",
        }
        with self.assertRaisesRegexp(UserPartitionError, "Unrecognized scheme"):
            UserPartition.from_json(jsonified)

        # Wrong version (it's over 9000!)
        # Wrong version (it's over 9000!)
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 9001,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegexp(TypeError, "has unexpected version"):
            UserPartition.from_json(jsonified)

        # Has extra key - should not be a problem
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "mock",
            "programmer": "Cale",
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertNotIn("programmer", user_partition.to_json())
Пример #2
0
    def test_from_json_broken(self):
        # Missing field
        jsonified = {
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'id'"):
            UserPartition.from_json(jsonified)

        # Missing scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'scheme'"):
            UserPartition.from_json(jsonified)

        # Invalid scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "no_such_scheme",
        }
        with self.assertRaisesRegexp(UserPartitionError, "Unrecognized scheme"):
            UserPartition.from_json(jsonified)

        # Wrong version (it's over 9000!)
        # Wrong version (it's over 9000!)
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 9001,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegexp(TypeError, "has unexpected version"):
            UserPartition.from_json(jsonified)

        # Has extra key - should not be a problem
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "mock",
            "programmer": "Cale",
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertNotIn("programmer", user_partition.to_json())
 def get_user_partition(self):
     """
     Get user partition for saving in course.
     """
     try:
         return UserPartition.from_json(self.configuration)
     except ReadOnlyUserPartitionError:
         raise GroupConfigurationsValidationError(_("unable to load this type of group configuration"))
 def get_user_partition(self):
     """
     Get user partition for saving in course.
     """
     try:
         return UserPartition.from_json(self.configuration)
     except ReadOnlyUserPartitionError:
         raise GroupConfigurationsValidationError(_("unable to load this type of group configuration"))
Пример #5
0
    def test_version_upgrade_2_to_3(self):
        # Test that version 3 user partition raises error if 'scheme' field is
        # not provided (same behavior as version 2)
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 2,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'scheme'"):
            UserPartition.from_json(jsonified)

        # Test that version 3 partitions have a scheme specified
        # and a field 'parameters' (optional while setting user partition but
        # always present in response)
        jsonified = {
            "id": self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 2,
            "scheme": self.TEST_SCHEME_NAME,
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.scheme.name, self.TEST_SCHEME_NAME)
        self.assertEqual(user_partition.parameters, {})
        self.assertTrue(user_partition.active)

        # now test that parameters dict is present in response with same value
        # as provided
        jsonified = {
            "id": self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "parameters": self.TEST_PARAMETERS,
            "version": 3,
            "scheme": self.TEST_SCHEME_NAME,
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.parameters, self.TEST_PARAMETERS)
        self.assertTrue(user_partition.active)
Пример #6
0
    def test_version_upgrade_2_to_3(self):
        # Test that version 3 user partition raises error if 'scheme' field is
        # not provided (same behavior as version 2)
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 2,
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'scheme'"):
            UserPartition.from_json(jsonified)

        # Test that version 3 partitions have a scheme specified
        # and a field 'parameters' (optional while setting user partition but
        # always present in response)
        jsonified = {
            "id": self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": 2,
            "scheme": self.TEST_SCHEME_NAME,
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.scheme.name, self.TEST_SCHEME_NAME)
        self.assertEqual(user_partition.parameters, {})
        self.assertTrue(user_partition.active)

        # now test that parameters dict is present in response with same value
        # as provided
        jsonified = {
            "id": self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "parameters": self.TEST_PARAMETERS,
            "version": 3,
            "scheme": self.TEST_SCHEME_NAME,
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.parameters, self.TEST_PARAMETERS)
        self.assertTrue(user_partition.active)
Пример #7
0
 def test_version_upgrade(self):
     # Version 1 partitions did not have a scheme specified
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": 1,
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.scheme.name, "random")
Пример #8
0
 def test_version_upgrade(self):
     # Version 1 partitions did not have a scheme specified
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": 1,
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.scheme.name, "random")  # pylint: disable=no-member
Пример #9
0
    def test_from_json_broken(self):
        groups = [Group(0, 'Group 1'), Group(1, 'Group 2')]
        upid = 1
        upname = "Test Partition"
        updesc = "For Testing Purposes"

        # Missing field
        jsonified = {
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'id'"):
            user_partition = UserPartition.from_json(jsonified)

        # Wrong version (it's over 9000!)
        jsonified = {
            'id': upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": 9001
        }
        with self.assertRaisesRegexp(TypeError, "has unexpected version"):
            user_partition = UserPartition.from_json(jsonified)

        # Has extra key - should not be a problem
        jsonified = {
            'id': upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION,
            "programmer": "Cale"
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertNotIn("programmer", user_partition.to_json())
Пример #10
0
    def test_from_json_broken(self):
        groups = [Group(0, 'Group 1'), Group(1, 'Group 2')]
        upid = 1
        upname = "Test Partition"
        updesc = "For Testing Purposes"

        # Missing field
        jsonified = {
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION
        }
        with self.assertRaisesRegexp(TypeError, "missing value key 'id'"):
            user_partition = UserPartition.from_json(jsonified)

        # Wrong version (it's over 9000!)
        jsonified = {
            'id': upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": 9001
        }
        with self.assertRaisesRegexp(TypeError, "has unexpected version"):
            user_partition = UserPartition.from_json(jsonified)

        # Has extra key - should not be a problem
        jsonified = {
            'id': upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION,
            "programmer": "Cale"
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertNotIn("programmer", user_partition.to_json())
Пример #11
0
 def test_version_upgrade(self):
     # Test that version 1 partitions did not have a scheme specified
     # and have empty parameters
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": 1,
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.scheme.name, "random")
     self.assertEqual(user_partition.parameters, {})
     self.assertTrue(user_partition.active)
Пример #12
0
 def test_version_upgrade(self):
     # Test that version 1 partitions did not have a scheme specified
     # and have empty parameters
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": 1,
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.scheme.name, "random")  # pylint: disable=no-member
     self.assertEqual(user_partition.parameters, {})
     self.assertTrue(user_partition.active)
Пример #13
0
def group_configurations_list_handler(request, course_key_string):
    """
    A RESTful handler for Group Configurations

    GET
        html: return Group Configurations list page (Backbone application)
    POST
        json: create new group configuration
    """
    course_key = CourseKey.from_string(course_key_string)
    course = _get_course_module(course_key, request.user)
    store = modulestore()

    if 'text/html' in request.META.get('HTTP_ACCEPT', 'text/html'):
        group_configuration_url = reverse_course_url('group_configurations_list_handler', course_key)
        split_test_enabled = SPLIT_TEST_COMPONENT_TYPE in course.advanced_modules

        return render_to_response('group_configurations.html', {
            'context_course': course,
            'group_configuration_url': group_configuration_url,
            'configurations': [u.to_json() for u in course.user_partitions] if split_test_enabled else None,
        })
    elif "application/json" in request.META.get('HTTP_ACCEPT') and request.method == 'POST':
        # create a new group configuration for the course
        try:
            configuration = GroupConfiguration.parse(request.body)
            GroupConfiguration.validate(configuration)
        except GroupConfigurationsValidationError as err:
            return JsonResponse({"error": err.message}, status=400)

        if not configuration.get("id"):
            configuration["id"] = random.randint(100, 10**12)

        # Assign ids to every group in configuration.
        for index, group in enumerate(configuration.get('groups', [])):
            group["id"] = index

        course.user_partitions.append(UserPartition.from_json(configuration))
        store.update_item(course, request.user.id)
        response = JsonResponse(configuration, status=201)

        response["Location"] = reverse_course_url(
            'group_configurations_detail_handler',
            course.id,
            kwargs={'group_configuration_id': configuration["id"]}
        )
        return response
    else:
        return HttpResponse(status=406)
Пример #14
0
 def test_forward_compatibility(self):
     # If the user partition version is updated in a release,
     # then the release is rolled back, courses might contain
     # version numbers greater than the currently deployed
     # version number.
     newer_version_json = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": UserPartition.VERSION + 1,
         "scheme": "mock",
         "additional_new_field": "foo",
     }
     partition = UserPartition.from_json(newer_version_json)
     self.assertEqual(partition.id, self.TEST_ID)
     self.assertEqual(partition.name, self.TEST_NAME)
Пример #15
0
 def test_forward_compatibility(self):
     # If the user partition version is updated in a release,
     # then the release is rolled back, courses might contain
     # version numbers greater than the currently deployed
     # version number.
     newer_version_json = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": UserPartition.VERSION + 1,
         "scheme": "mock",
         "additional_new_field": "foo",
     }
     partition = UserPartition.from_json(newer_version_json)
     self.assertEqual(partition.id, self.TEST_ID)
     self.assertEqual(partition.name, self.TEST_NAME)
Пример #16
0
 def test_from_json(self):
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": UserPartition.VERSION,
         "scheme": "mock",
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.id, self.TEST_ID)
     self.assertEqual(user_partition.name, self.TEST_NAME)
     self.assertEqual(user_partition.description, self.TEST_DESCRIPTION)
     for act_group in user_partition.groups:
         self.assertIn(act_group.id, [0, 1])
         exp_group = self.TEST_GROUPS[act_group.id]
         self.assertEqual(exp_group.id, act_group.id)
         self.assertEqual(exp_group.name, act_group.name)
Пример #17
0
 def test_from_json(self):
     jsonified = {
         "id": self.TEST_ID,
         "name": self.TEST_NAME,
         "description": self.TEST_DESCRIPTION,
         "groups": [group.to_json() for group in self.TEST_GROUPS],
         "version": UserPartition.VERSION,
         "scheme": "mock",
     }
     user_partition = UserPartition.from_json(jsonified)
     self.assertEqual(user_partition.id, self.TEST_ID)  # pylint: disable=no-member
     self.assertEqual(user_partition.name, self.TEST_NAME)  # pylint: disable=no-member
     self.assertEqual(user_partition.description, self.TEST_DESCRIPTION)  # pylint: disable=no-member
     for act_group in user_partition.groups:  # pylint: disable=no-member
         self.assertIn(act_group.id, [0, 1])
         exp_group = self.TEST_GROUPS[act_group.id]
         self.assertEqual(exp_group.id, act_group.id)
         self.assertEqual(exp_group.name, act_group.name)
Пример #18
0
    def test_from_json(self):
        jsonified = {
            "id": self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "mock",
        }
        user_partition = UserPartition.from_json(jsonified)
        assert user_partition.id == self.TEST_ID
        assert user_partition.name == self.TEST_NAME
        assert user_partition.description == self.TEST_DESCRIPTION
        assert user_partition.parameters == self.TEST_PARAMETERS

        for act_group in user_partition.groups:
            assert act_group.id in [0, 1]
            exp_group = self.TEST_GROUPS[act_group.id]
            assert exp_group.id == act_group.id
            assert exp_group.name == act_group.name
Пример #19
0
    def test_from_json(self):
        groups = [Group(0, 'Group 1'), Group(1, 'Group 2')]
        upid = 1
        upname = "Test Partition"
        updesc = "For Testing Purposes"

        jsonified = {
            "id": upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.id, upid)
        self.assertEqual(user_partition.name, upname)
        self.assertEqual(user_partition.description, updesc)
        for act_group in user_partition.groups:
            self.assertIn(act_group.id, [0, 1])
            exp_group = groups[act_group.id]
            self.assertEqual(exp_group.id, act_group.id)
            self.assertEqual(exp_group.name, act_group.name)
Пример #20
0
    def test_from_json(self):
        groups = [Group(0, 'Group 1'), Group(1, 'Group 2')]
        upid = 1
        upname = "Test Partition"
        updesc = "For Testing Purposes"

        jsonified = {
            "id": upid,
            "name": upname,
            "description": updesc,
            "groups": [group.to_json() for group in groups],
            "version": UserPartition.VERSION
        }
        user_partition = UserPartition.from_json(jsonified)
        self.assertEqual(user_partition.id, upid)
        self.assertEqual(user_partition.name, upname)
        self.assertEqual(user_partition.description, updesc)
        for act_group in user_partition.groups:
            self.assertIn(act_group.id, [0, 1])
            exp_group = groups[act_group.id]
            self.assertEqual(exp_group.id, act_group.id)
            self.assertEqual(exp_group.name, act_group.name)
Пример #21
0
 def from_json(self, values):
     return [UserPartition.from_json(v) for v in values]
Пример #22
0
 def from_json(self, values):  # lint-amnesty, pylint: disable=arguments-differ
     return [UserPartition.from_json(v) for v in values]
Пример #23
0
 def test_from_json_not_supported(self):
     user_partition_json = create_enrollment_track_partition(
         self.course).to_json()
     with pytest.raises(ReadOnlyUserPartitionError):
         UserPartition.from_json(user_partition_json)
 def test_from_json_not_supported(self):
     user_partition_json = create_enrollment_track_partition(self.course).to_json()
     with self.assertRaises(ReadOnlyUserPartitionError):
         UserPartition.from_json(user_partition_json)
Пример #25
0
    def test_from_json_broken(self):
        # Missing field
        jsonified = {
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegex(TypeError, "missing value key 'id'"):
            UserPartition.from_json(jsonified)

        # Missing scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
        }
        with self.assertRaisesRegex(TypeError, "missing value key 'scheme'"):
            UserPartition.from_json(jsonified)

        # Invalid scheme
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "no_such_scheme",
        }
        with self.assertRaisesRegex(UserPartitionError, "Unrecognized scheme"):
            UserPartition.from_json(jsonified)

        # Wrong version
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": -1,
            "scheme": self.TEST_SCHEME_NAME,
        }
        with self.assertRaisesRegex(TypeError, "has unexpected version"):
            UserPartition.from_json(jsonified)

        # Has extra key - should not be a problem
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "parameters": self.TEST_PARAMETERS,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "mock",
            "programmer": "Cale",
        }
        user_partition = UserPartition.from_json(jsonified)
        assert 'programmer' not in user_partition.to_json()

        # No error on missing parameters key (which is optional)
        jsonified = {
            'id': self.TEST_ID,
            "name": self.TEST_NAME,
            "description": self.TEST_DESCRIPTION,
            "groups": [group.to_json() for group in self.TEST_GROUPS],
            "version": UserPartition.VERSION,
            "scheme": "mock",
        }
        user_partition = UserPartition.from_json(jsonified)
        assert user_partition.parameters == {}
Пример #26
0
 def get_user_partition(self):
     """
     Get user partition for saving in course.
     """
     return UserPartition.from_json(self.configuration)
Пример #27
0
 def from_json(self, values):
     return [UserPartition.from_json(v) for v in values]
Пример #28
0
 def get_user_partition(self):
     """
     Get user partition for saving in course.
     """
     return UserPartition.from_json(self.configuration)