diff --git a/lms/djangoapps/teams/serializers.py b/lms/djangoapps/teams/serializers.py index dae2578bd2..f51ad9e61c 100644 --- a/lms/djangoapps/teams/serializers.py +++ b/lms/djangoapps/teams/serializers.py @@ -90,6 +90,18 @@ class CourseTeamCreationSerializer(serializers.ModelSerializer): ) +class CourseTeamSerializerWithoutMembership(CourseTeamSerializer): + """The same as the `CourseTeamSerializer`, but elides the membership field. + + Intended to be used as a sub-serializer for serializing team + memberships, since the membership field is redundant in that case. + """ + + def __init__(self, *args, **kwargs): + super(CourseTeamSerializerWithoutMembership, self).__init__(*args, **kwargs) + del self.fields['membership'] + + class MembershipSerializer(serializers.ModelSerializer): """Serializes CourseTeamMemberships with information about both teams and users.""" profile_configuration = deepcopy(settings.ACCOUNT_VISIBILITY_CONFIGURATION) @@ -112,8 +124,7 @@ class MembershipSerializer(serializers.ModelSerializer): view_name='teams_detail', read_only=True, ), - expanded_serializer=CourseTeamSerializer(read_only=True), - exclude_expand_fields={'user'}, + expanded_serializer=CourseTeamSerializerWithoutMembership(read_only=True), ) class Meta(object): diff --git a/lms/djangoapps/teams/tests/test_serializers.py b/lms/djangoapps/teams/tests/test_serializers.py index df2dffdf22..123b2f793b 100644 --- a/lms/djangoapps/teams/tests/test_serializers.py +++ b/lms/djangoapps/teams/tests/test_serializers.py @@ -70,10 +70,7 @@ class MembershipSerializerTestCase(SerializerTestCase): 'has_image': False } }) - self.assertEqual(data['team']['membership'][0]['user'], { - 'url': 'http://testserver/api/user/v1/accounts/' + username, - 'username': username - }) + self.assertNotIn('membership', data['team']) class BaseTopicSerializerTestCase(SerializerTestCase): diff --git a/openedx/core/lib/api/fields.py b/openedx/core/lib/api/fields.py index e46bd9dea3..0a1d609997 100644 --- a/openedx/core/lib/api/fields.py +++ b/openedx/core/lib/api/fields.py @@ -10,21 +10,18 @@ class ExpandableField(Field): Kwargs: collapsed_serializer (Serializer): the serializer to use for a non-expanded representation. expanded_serializer (Serializer): the serializer to use for an expanded representation. - exclude_expand_fields (set(str)): a set of fields which will not be expanded by sub-serializers. """ def __init__(self, **kwargs): """Sets up the ExpandableField with the collapsed and expanded versions of the serializer.""" assert 'collapsed_serializer' in kwargs and 'expanded_serializer' in kwargs self.collapsed = kwargs.pop('collapsed_serializer') self.expanded = kwargs.pop('expanded_serializer') - self.exclude_expand_fields = kwargs.pop('exclude_expand_fields', set()) super(ExpandableField, self).__init__(**kwargs) def field_to_native(self, obj, field_name): """Converts obj to a native representation, using the expanded serializer if the context requires it.""" if 'expand' in self.context and field_name in self.context['expand']: self.expanded.initialize(self, field_name) - self.expanded.context['expand'] = list(set(self.expanded.context['expand']) - self.exclude_expand_fields) return self.expanded.field_to_native(obj, field_name) else: self.collapsed.initialize(self, field_name)