Skip to content
This repository has been archived by the owner on Oct 28, 2019. It is now read-only.

Commit

Permalink
Set the href_writable on RepositoryRelatedFields
Browse files Browse the repository at this point in the history
The parent repo will now be determined by the url instead of by
request parameters.

closes #2985
https://pulp.plan.io/issues/2985
  • Loading branch information
werwty committed Sep 14, 2017
1 parent 8082cd8 commit 5c7aed9
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 21 deletions.
10 changes: 6 additions & 4 deletions platform/pulpcore/app/serializers/__init__.py
Expand Up @@ -5,12 +5,14 @@
ModelSerializer, MasterModelSerializer, DetailIdentityField, DetailRelatedField,
DetailNestedHyperlinkedRelatedField, DetailNestedHyperlinkedIdentityField, viewset_for_model,
DetailWritableNestedUrlRelatedField)
from pulpcore.app.serializers.fields import (ContentRelatedField, RepositoryRelatedField, # noqa
FileField)
from pulpcore.app.serializers.fields import (ContentRelatedField, FileField, # noqa
HrefWritableRepositoryRelatedField)
from pulpcore.app.serializers.consumer import ConsumerSerializer # noqa
from pulpcore.app.serializers.content import ContentSerializer, ArtifactSerializer # noqa
from pulpcore.app.serializers.progress import ProgressReportSerializer # noqa
from pulpcore.app.serializers.repository import (DistributionSerializer, ImporterSerializer, PublisherSerializer, # noqa
RepositorySerializer, RepositoryContentSerializer) # noqa
from pulpcore.app.serializers.repository import (DistributionSerializer, # noqa
ImporterSerializer,
PublisherSerializer, RepositorySerializer,
RepositoryContentSerializer)
from pulpcore.app.serializers.task import TaskSerializer, WorkerSerializer # noqa
from pulpcore.app.serializers.user import UserSerializer # noqa
13 changes: 3 additions & 10 deletions platform/pulpcore/app/serializers/base.py
Expand Up @@ -320,18 +320,11 @@ class DetailNestedHyperlinkedIdentityField(_DetailFieldMixin, NestedHyperlinkedI
pass


class WritableNestedUrlRelatedField(NestedHyperlinkedRelatedField):
class DetailWritableNestedUrlRelatedField(_DetailFieldMixin, NestedHyperlinkedRelatedField):
"""
This field supports a special attribute, `href_writable`. Fields that carry this flag represent
a nested parent, which is the model determined by the url parameters instead of request body
parameters.
read_only should be passed as a kwarg to this field.
"""
def __init__(self, *args, **kwargs):
# rest_framework.fields.Field.__init__ sets self.read_only, so we have to inject this kwarg.
kwargs['read_only'] = True
self.href_writable = True
super().__init__(*args, **kwargs)


class DetailWritableNestedUrlRelatedField(_DetailFieldMixin, WritableNestedUrlRelatedField):
pass
href_writable = True
8 changes: 5 additions & 3 deletions platform/pulpcore/app/serializers/fields.py
Expand Up @@ -16,13 +16,15 @@ class ContentRelatedField(DetailRelatedField):
queryset = models.Content.objects.all()


class RepositoryRelatedField(serializers.HyperlinkedRelatedField):
class HrefWritableRepositoryRelatedField(serializers.HyperlinkedRelatedField):
"""
A serializer field with the correct view_name and lookup_field to link to a repository.
A serializer field for a repository that is the parent in a nested relationship.
It has the href_writable field set so the repository is determined by url parameters.
read_only should passed as a kwarg to this field.
"""
view_name = 'repositories-detail'
lookup_field = 'name'
queryset = models.Repository.objects.all()
href_writable = True


class FileField(serializers.CharField):
Expand Down
14 changes: 10 additions & 4 deletions platform/pulpcore/app/serializers/repository.py
Expand Up @@ -5,7 +5,8 @@

from pulpcore.app import models
from pulpcore.app.serializers import (MasterModelSerializer, ModelSerializer,
RepositoryRelatedField, GenericKeyValueRelatedField,
HrefWritableRepositoryRelatedField,
GenericKeyValueRelatedField,
DetailWritableNestedUrlRelatedField,
ContentRelatedField,
FileField,
Expand Down Expand Up @@ -136,7 +137,7 @@ class ImporterSerializer(MasterModelSerializer, NestedHyperlinkedModelSerializer
read_only=True
)

repository = RepositoryRelatedField()
repository = HrefWritableRepositoryRelatedField(read_only=True)

class Meta:
abstract = True
Expand All @@ -163,7 +164,7 @@ class PublisherSerializer(MasterModelSerializer, NestedHyperlinkedModelSerialize
help_text=_('Timestamp of the most recent update of the publisher configuration.'),
read_only=True
)
repository = RepositoryRelatedField()
repository = HrefWritableRepositoryRelatedField(read_only=True)

auto_publish = serializers.BooleanField(
help_text=_('An indicaton that the automatic publish may happen when'
Expand Down Expand Up @@ -217,6 +218,7 @@ class DistributionSerializer(ModelSerializer):
publisher = DetailWritableNestedUrlRelatedField(
parent_lookup_kwargs={'repository_name': 'repository__name'},
lookup_field='name',
read_only=True
)

class Meta:
Expand All @@ -230,7 +232,11 @@ class RepositoryContentSerializer(serializers.ModelSerializer):
# RepositoryContentSerizlizer should not have it's own _href, so it subclasses
# rest_framework.serializers.ModelSerializer instead of pulpcore.app.serializers.ModelSerializer
content = ContentRelatedField()
repository = RepositoryRelatedField()
repository = serializers.HyperlinkedRelatedField(
view_name='repositories-detail',
lookup_field='name',
queryset=models.Repository.objects.all()
)

class Meta:
model = models.RepositoryContent
Expand Down

0 comments on commit 5c7aed9

Please sign in to comment.