Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions recipe/3ae4482-fix-related-links.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
diff --git a/flask_rest_jsonapi/resource.py b/flask_rest_jsonapi/resource.py
index 5e417fc..34608b1 100644
--- a/flask_rest_jsonapi/resource.py
+++ b/flask_rest_jsonapi/resource.py
@@ -302,23 +302,14 @@ class ResourceRelationship(with_metaclass(ResourceMeta, Resource)):
self.before_get(args, kwargs)

relationship_field, model_relationship_field, related_type_, related_id_field = self._get_relationship_data()
- related_view = self.schema._declared_fields[relationship_field].related_view
- related_view_kwargs = self.schema._declared_fields[relationship_field].related_view_kwargs

obj, data = self._data_layer.get_relationship(model_relationship_field,
related_type_,
related_id_field,
kwargs)

- for key, value in copy(related_view_kwargs).items():
- if isinstance(value, str) and value.startswith('<') and value.endswith('>'):
- tmp_obj = obj
- for field in value[1:-1].split('.'):
- tmp_obj = getattr(tmp_obj, field)
- related_view_kwargs[key] = tmp_obj
-
result = {'links': {'self': request.path,
- 'related': url_for(related_view, **related_view_kwargs)},
+ 'related': self.schema._declared_fields[relationship_field].get_related_url(obj)},
'data': data}

qs = QSManager(request.args, self.schema)
diff --git a/tests/test_sqlalchemy_data_layer.py b/tests/test_sqlalchemy_data_layer.py
index e2f1b3f..dbddd1b 100644
--- a/tests/test_sqlalchemy_data_layer.py
+++ b/tests/test_sqlalchemy_data_layer.py
@@ -2,12 +2,11 @@

from six.moves.urllib.parse import urlencode
import pytest
-import json

from sqlalchemy import create_engine, Column, Integer, DateTime, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
-from flask import Blueprint, make_response
+from flask import Blueprint, make_response, json
from marshmallow_jsonapi.flask import Schema, Relationship
from marshmallow_jsonapi import fields
from marshmallow import ValidationError
@@ -138,6 +137,8 @@ def computer_schema():
id = fields.Str(dump_only=True)
serial = fields.Str(required=True)
owner = Relationship(attribute='person',
+ default=None,
+ missing=None,
related_view='api.person_detail',
related_view_kwargs={'person_id': '<person.person_id>'},
schema='PersonSchema',
@@ -602,9 +603,20 @@ def test_get_relationship_single_empty(session, client, register_routes, compute
with client:
response = client.get('/computers/' + str(computer.id) + '/relationships/owner',
content_type='application/vnd.api+json')
+ response_json = json.loads(response.get_data())
+ assert None is response_json['data']
assert response.status_code == 200


+def test_issue_49(session, client, register_routes, person, person_2):
+ with client:
+ for p in [person, person_2]:
+ response = client.get('/persons/' + str(p.person_id) + '/relationships/computers?include=computers',
+ content_type='application/vnd.api+json')
+ assert response.status_code == 200
+ assert (json.loads(response.get_data()))['links']['related'] == '/persons/' + str(p.person_id) + '/computers'
+
+
def test_post_relationship(client, register_routes, computer, person):
payload = {
'data': [
@@ -691,7 +703,7 @@ def test_delete_relationship(session, client, register_routes, computer, person)

def test_delete_relationship_single(session, client, register_routes, computer, person):
session_ = session
- computer.owner = person
+ computer.person = person
session_.commit()

payload = {
4 changes: 3 additions & 1 deletion recipe/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ source:
fn: {{ name }}-{{ version }}.tar.gz
url: https://github.com/miLibris/{{ name }}/archive/{{ version }}.tar.gz
sha256: {{ sha256 }}
patches:
- 3ae4482-fix-related-links.patch

build:
number: 0
number: 1
script: python setup.py install --single-version-externally-managed --record record.txt

requirements:
Expand Down