diff --git a/api/base/serializers.py b/api/base/serializers.py index 8f5901dfb98..a89ff204191 100644 --- a/api/base/serializers.py +++ b/api/base/serializers.py @@ -1,5 +1,6 @@ import collections import re +from urlparse import urlparse import furl from django.core.urlresolvers import resolve, reverse, NoReverseMatch @@ -10,6 +11,7 @@ from rest_framework import serializers as ser from rest_framework.fields import SkipField from rest_framework.fields import get_attribute as get_nested_attributes +from rest_framework.mixins import RetrieveModelMixin from api.base import utils from api.base.exceptions import InvalidQueryStringError @@ -713,11 +715,28 @@ def to_representation(self, value): raise SkipField related_url = url['related'] + related_path = urlparse(related_url).path related_meta = self.get_meta_information(self.related_meta, value) self_url = url['self'] self_meta = self.get_meta_information(self.self_meta, value) - return format_relationship_links(related_url, self_url, related_meta, self_meta) - + relationship = format_relationship_links(related_url, self_url, related_meta, self_meta) + if related_url and (len(related_path.split('/')) & 1) == 1: + resolved_url = resolve(related_path) + related_class = resolved_url.func.view_class + if issubclass(related_class, RetrieveModelMixin): + related_type = resolved_url.namespace + try: + # TODO: change kwargs to preprint_provider_id and registration_id + if related_type == 'preprint_providers': + related_id = resolved_url.kwargs['provider_id'] + elif related_type == 'registrations': + related_id = resolved_url.kwargs['node_id'] + else: + related_id = resolved_url.kwargs[related_type[:-1] + '_id'] + except KeyError: + return relationship + relationship['data'] = {'id': related_id, 'type': related_type} + return relationship class FileCommentRelationshipField(RelationshipField): def get_url(self, obj, view_name, request, format): diff --git a/api_tests/preprints/views/test_preprint_detail.py b/api_tests/preprints/views/test_preprint_detail.py index 0676b4be230..81882b4c062 100644 --- a/api_tests/preprints/views/test_preprint_detail.py +++ b/api_tests/preprints/views/test_preprint_detail.py @@ -68,6 +68,11 @@ def test_preprint_detail(self, app, user, preprint, url, res, data): # test contributors in preprint data assert data['relationships'].get('contributors', None) + assert data['relationships']['contributors'].get('data', None) == None + + # test node type and id in preprint data + assert data['relationships']['node']['data'].get('id', None) == preprint.node._id + assert data['relationships']['node']['data'].get('type', None) == 'nodes' # test_preprint_node_deleted_detail_failure deleted_node = ProjectFactory(creator=user, is_deleted=True) @@ -520,6 +525,11 @@ def test_admin_can_update_license(self, admin_contrib, preprint, cc0_license, ur assert res.status_code == 200 preprint.reload() + res_data = res.json['data'] + pp_license_id = preprint.license.node_license._id + assert res_data['relationships']['license']['data'].get('id', None) == pp_license_id + assert res_data['relationships']['license']['data'].get('type', None) == 'licenses' + assert preprint.license.node_license == cc0_license assert preprint.license.year == None assert preprint.license.copyright_holders == []