Skip to content

Commit 40c1676

Browse files
committed
Fixed #80 -- serializer SlugRelatedFields used too broad a query.
1 parent e1ad061 commit 40c1676

2 files changed

Lines changed: 22 additions & 11 deletions

File tree

api/serializers.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
from api import utils
1313

1414

15+
class OwnerSlugRelatedField(serializers.SlugRelatedField):
16+
"""Filter queries by owner as well as slug_field."""
17+
18+
def from_native(self, data):
19+
"""Fetch model object from its 'native' representation.
20+
TODO: request.user is not going to work in a team environment...
21+
"""
22+
self.queryset = self.queryset.filter(owner=self.context['request'].user)
23+
return serializers.SlugRelatedField.from_native(self, data)
24+
25+
1526
class UserSerializer(serializers.ModelSerializer):
1627
"""Serialize a :class:`~api.models.User` model."""
1728

@@ -57,7 +68,7 @@ class FlavorSerializer(serializers.ModelSerializer):
5768
"""Serialize a :class:`~api.models.Flavor` model."""
5869

5970
owner = serializers.Field(source='owner.username')
60-
provider = serializers.SlugRelatedField(slug_field='id')
71+
provider = OwnerSlugRelatedField(slug_field='id')
6172

6273
class Meta:
6374
"""Metadata options for a :class:`FlavorSerializer`."""
@@ -69,7 +80,7 @@ class ConfigSerializer(serializers.ModelSerializer):
6980
"""Serialize a :class:`~api.models.Config` model."""
7081

7182
owner = serializers.Field(source='owner.username')
72-
formation = serializers.SlugRelatedField(slug_field='id')
83+
formation = OwnerSlugRelatedField(slug_field='id')
7384
values = serializers.ModelField(
7485
model_field=models.Config()._meta.get_field('values'), required=False)
7586

@@ -83,7 +94,7 @@ class BuildSerializer(serializers.ModelSerializer):
8394
"""Serialize a :class:`~api.models.Build` model."""
8495

8596
owner = serializers.Field(source='owner.username')
86-
formation = serializers.SlugRelatedField(slug_field='id')
97+
formation = OwnerSlugRelatedField(slug_field='id')
8798

8899
class Meta:
89100
"""Metadata options for a :class:`BuildSerializer`."""
@@ -95,7 +106,7 @@ class ReleaseSerializer(serializers.ModelSerializer):
95106
"""Serialize a :class:`~api.models.Release` model."""
96107

97108
owner = serializers.Field(source='owner.username')
98-
formation = serializers.SlugRelatedField(slug_field='id')
109+
formation = OwnerSlugRelatedField(slug_field='id')
99110
config = serializers.SlugRelatedField(slug_field='uuid')
100111
build = serializers.SlugRelatedField(slug_field='uuid', required=False)
101112

@@ -121,8 +132,8 @@ class LayerSerializer(serializers.ModelSerializer):
121132
"""Serialize a :class:`~api.models.Layer` model."""
122133

123134
owner = serializers.Field(source='owner.username')
124-
formation = serializers.SlugRelatedField(slug_field='id')
125-
flavor = serializers.SlugRelatedField(slug_field='id')
135+
formation = OwnerSlugRelatedField(slug_field='id')
136+
flavor = OwnerSlugRelatedField(slug_field='id')
126137

127138
class Meta:
128139
"""Metadata options for a :class:`LayerSerializer`."""
@@ -143,8 +154,8 @@ class NodeSerializer(serializers.ModelSerializer):
143154
"""Serialize a :class:`~api.models.Node` model."""
144155

145156
owner = serializers.Field(source='owner.username')
146-
formation = serializers.SlugRelatedField(slug_field='id')
147-
layer = serializers.SlugRelatedField(slug_field='id')
157+
formation = OwnerSlugRelatedField(slug_field='id')
158+
layer = OwnerSlugRelatedField(slug_field='id')
148159

149160
class Meta:
150161
"""Metadata options for a :class:`NodeSerializer`."""
@@ -156,8 +167,8 @@ class ContainerSerializer(serializers.ModelSerializer):
156167
"""Serialize a :class:`~api.models.Container` model."""
157168

158169
owner = serializers.Field(source='owner.username')
159-
formation = serializers.SlugRelatedField(slug_field='id')
160-
node = serializers.SlugRelatedField(slug_field='id')
170+
formation = OwnerSlugRelatedField(slug_field='id')
171+
node = OwnerSlugRelatedField(slug_field='id')
161172

162173
class Meta:
163174
"""Metadata options for a :class:`ContainerSerializer`."""

api/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def create(self, request, **kwargs):
142142

143143

144144
class FormationViewSet(OwnerViewSet):
145-
"""RESTful views for :class:`~api.models.Formtion`."""
145+
"""RESTful views for :class:`~api.models.Formation`."""
146146

147147
model = models.Formation
148148
serializer_class = serializers.FormationSerializer

0 commit comments

Comments
 (0)