Skip to content

Commit

Permalink
Splitting seralizers into read and write ones
Browse files Browse the repository at this point in the history
  • Loading branch information
fao89 committed May 25, 2020
1 parent a14d2e4 commit 8cbb17e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 11 deletions.
1 change: 1 addition & 0 deletions CHANGES/6775.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed a bug that prevented write_only fields from being present in the API docs and bindings
52 changes: 41 additions & 11 deletions pulpcore/app/openapigenerator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from drf_yasg.generators import OpenAPISchemaGenerator
from drf_yasg.inspectors import SwaggerAutoSchema
from drf_yasg.openapi import Parameter
from drf_yasg.utils import filter_none, force_real_str
from drf_yasg.utils import filter_none, force_real_str, get_serializer_ref_name, no_body
from rest_framework import serializers

from pulpcore.app.models import Export, Import, RepositoryVersion
Expand Down Expand Up @@ -459,18 +459,48 @@ def get_tags(self, operation_keys):

return tags

def serializer_to_schema(self, serializer):
def get_default_response_serializer(self):
"""
Convert a serializer to an OpenAPI Schema.
Patch: https://github.com/axnsan12/drf-yasg/issues/70#issuecomment-485050813
Return the default response serializer for this endpoint.
Reference: https://github.com/axnsan12/drf-yasg/issues/70#issuecomment-485050813
"""
body_override = self._get_request_body_override()
if body_override and body_override is not no_body:
return body_override

return self._convert_serializer_to_read_only()

if self.method.lower() == "get":
new_fields = OrderedDict()
for field_name, field in serializer.fields.items():
if not field.write_only: # Removing write_only fields
new_fields[field_name] = field
def _convert_serializer_to_read_only(self):
"""
Convert a serializer into Read only serializer.
serializer.fields = new_fields
Reference: https://github.com/axnsan12/drf-yasg/issues/70#issuecomment-485050813
"""
original_serializer = super().get_view_serializer()
if not original_serializer:
return
serializer_meta = getattr(original_serializer, "Meta", BlankMeta)
read_ref_name = f"{get_serializer_ref_name(original_serializer)}Read"
read_fields = OrderedDict()
for field_name, field in original_serializer.fields.items():
if not field.write_only:
read_fields[field_name] = field

class ReadOnlySerializer(original_serializer.__class__):
class Meta(serializer_meta):
ref_name = read_ref_name

read_serializer = ReadOnlySerializer(data=original_serializer.data)
read_serializer.fields = read_fields
return read_serializer


class BlankMeta:
"""
Creates a blank Meta for serializers
Reference: https://github.com/axnsan12/drf-yasg/issues/70#issuecomment-485050813
"""

return super().serializer_to_schema(serializer)
pass

0 comments on commit 8cbb17e

Please sign in to comment.