Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Django Upgrade] [ ENG-3948] Fix Draft Registration Serializer DRF Issues #10034

Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/base/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

def get_resource_object_member(error_key, context):
from api.base.serializers import RelationshipField
field = context['view'].serializer_class._declared_fields.get(error_key, None)
cslzchen marked this conversation as resolved.
Show resolved Hide resolved
field = context['view'].get_serializer_class()._declared_fields.get(error_key, None)
if field:
return 'relationships' if isinstance(field, RelationshipField) else 'attributes'
# If field cannot be found (where read/write operations have different serializers,
Expand Down
22 changes: 20 additions & 2 deletions api/draft_registrations/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,19 @@
NodeContributorsSerializer,
NodeContributorsCreateSerializer,
NodeContributorDetailSerializer,
RegistrationSchemaRelationshipField,
)

from api.taxonomies.serializers import TaxonomizableSerializerMixin
from osf.exceptions import DraftRegistrationStateError
from osf.models import Node
from website import settings


class NodeRelationshipField(RelationshipField):

def to_internal_value(self, node_id):
node = self.context['view'].get_node(node_id=node_id) if node_id else None
return {'branched_from': node}
return {'branched_from': Node.load(node_id)}
cslzchen marked this conversation as resolved.
Show resolved Hide resolved


class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, TaxonomizableSerializerMixin):
Expand All @@ -46,6 +48,13 @@ class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, Taxonomizab
tags = ValuesListField(attr_name='name', child=ser.CharField(), required=False)
node_license = NodeLicenseSerializer(required=False, source='license')

registration_schema = RegistrationSchemaRelationshipField(
related_view='schemas:registration-schema-detail',
related_view_kwargs={'schema_id': '<registration_schema._id>'},
required=True,
read_only=False,
)
cslzchen marked this conversation as resolved.
Show resolved Hide resolved

links = LinksField({
'self': 'get_absolute_url',
})
Expand Down Expand Up @@ -142,6 +151,7 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist
Overrides DraftRegistrationLegacySerializer to make id required.
registration_supplement, node, cannot be changed after draft has been created.
"""
id = IDField(source='_id', required=True)
cslzchen marked this conversation as resolved.
Show resolved Hide resolved

links = LinksField({
'self': 'get_self_url',
Expand All @@ -156,6 +166,13 @@ def get_self_url(self, obj):
},
)

registration_schema = RegistrationSchemaRelationshipField(
related_view='schemas:registration-schema-detail',
related_view_kwargs={'schema_id': '<registration_schema._id>'},
required=False,
read_only=False,
)
cslzchen marked this conversation as resolved.
Show resolved Hide resolved

def update(self, draft, validated_data):
draft = super(DraftRegistrationDetailSerializer, self).update(draft, validated_data)
user = self.context['request'].user
Expand Down Expand Up @@ -234,3 +251,4 @@ class DraftRegistrationContributorDetailSerializer(NodeContributorDetailSerializ
"""
id = IDField(required=True, source='_id')
index = ser.IntegerField(required=False, read_only=False, source='_order')

14 changes: 3 additions & 11 deletions api/files/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,14 @@

from rest_framework import generics
from rest_framework import permissions as drf_permissions
from rest_framework.exceptions import NotFound, PermissionDenied, ValidationError
from rest_framework.exceptions import NotFound, ValidationError

from framework.auth.oauth_scopes import CoreScopes

from osf.models import (
Guid,
BaseFileNode,
FileVersion,
QuickFilesNode,
)

from api.base.exceptions import Gone
Expand All @@ -29,7 +28,7 @@
from api.files.permissions import CheckedOutOrAdmin
from api.files.permissions import FileMetadataRecordPermission
from api.files.serializers import FileSerializer
from api.files.serializers import FileDetailSerializer, QuickFilesDetailSerializer
from api.files.serializers import FileDetailSerializer
from api.files.serializers import FileMetadataRecordSerializer
from api.files.serializers import FileVersionSerializer
from osf.utils.permissions import ADMIN
Expand Down Expand Up @@ -86,14 +85,7 @@ class FileDetail(JSONAPIBaseView, generics.RetrieveUpdateAPIView, FileMixin):
view_name = 'file-detail'

def get_serializer_class(self):
try:
target = self.get_target()
except (NotFound, Gone, PermissionDenied):
return FileDetailSerializer
else:
if isinstance(target, QuickFilesNode):
return QuickFilesDetailSerializer
return FileDetailSerializer
return FileDetailSerializer
cslzchen marked this conversation as resolved.
Show resolved Hide resolved

def get_target(self):
return self.get_file().target
Expand Down