Skip to content

Commit 88fc80c

Browse files
authored
Merge branch 'main' into pyup-scheduled-update-2024-04-15
2 parents eccd093 + fc0d0b5 commit 88fc80c

13 files changed

+245
-95
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ any parts of the framework not mentioned in the documentation should generally b
2626
### Removed
2727

2828
* Removed support for Python 3.7.
29+
* Removed support for Django 3.2.
2930
* Removed support for Django 4.0.
3031
* Removed support for Django 4.1.
3132
* Removed support for Django REST framework 3.13.
3233
* Removed obsolete compat `NullBooleanField` and `get_reference` definitions.
3334

3435
## [6.1.0] - 2023-08-25
3536

36-
This is the last release supporting Python 3.7, Django 4.0, Django 4.1 and Django REST framework 3.13.
37+
This is the last release supporting Python 3.7, Django 3.2, Django 4.0, Django 4.1 and Django REST framework 3.13.
3738

3839
### Added
3940

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Requirements
9393
------------
9494

9595
1. Python (3.8, 3.9, 3.10, 3.11, 3.12)
96-
2. Django (3.2, 4.2, 5.0)
96+
2. Django (4.2, 5.0)
9797
3. Django REST framework (3.14, 3.15)
9898

9999
We **highly** recommend and only officially support the latest patch release of each Python, Django and REST framework series.

docs/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ like the following:
5252
## Requirements
5353

5454
1. Python (3.8, 3.9, 3.10, 3.11, 3.12)
55-
2. Django (3.2, 4.2, 5.0)
55+
2. Django (4.2, 5.0)
5656
3. Django REST framework (3.14, 3.15)
5757

5858
We **highly** recommend and only officially support the latest patch release of each Python, Django and REST framework series.

example/tests/integration/test_includes.py

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,6 @@
44
pytestmark = pytest.mark.django_db
55

66

7-
def test_included_data_on_list(multiple_entries, client):
8-
response = client.get(
9-
reverse("entry-list"), data={"include": "comments", "page[size]": 5}
10-
)
11-
included = response.json().get("included")
12-
13-
assert len(response.json()["data"]) == len(
14-
multiple_entries
15-
), "Incorrect entry count"
16-
assert [x.get("type") for x in included] == [
17-
"comments",
18-
"comments",
19-
], "List included types are incorrect"
20-
21-
comment_count = len(
22-
[resource for resource in included if resource["type"] == "comments"]
23-
)
24-
expected_comment_count = sum(entry.comments.count() for entry in multiple_entries)
25-
assert comment_count == expected_comment_count, "List comment count is incorrect"
26-
27-
28-
def test_included_data_on_list_with_one_to_one_relations(multiple_entries, client):
29-
response = client.get(
30-
reverse("entry-list"), data={"include": "authors.bio.metadata", "page[size]": 5}
31-
)
32-
included = response.json().get("included")
33-
34-
assert len(response.json()["data"]) == len(
35-
multiple_entries
36-
), "Incorrect entry count"
37-
expected_include_types = [
38-
"authorBioMetadata",
39-
"authorBioMetadata",
40-
"authorBios",
41-
"authorBios",
42-
"authors",
43-
"authors",
44-
]
45-
include_types = [x.get("type") for x in included]
46-
assert include_types == expected_include_types, "List included types are incorrect"
47-
48-
49-
def test_default_included_data_on_detail(single_entry, client):
50-
return test_included_data_on_detail(
51-
single_entry=single_entry, client=client, query=""
52-
)
53-
54-
55-
def test_included_data_on_detail(single_entry, client, query="?include=comments"):
56-
response = client.get(
57-
reverse("entry-detail", kwargs={"pk": single_entry.pk}) + query
58-
)
59-
included = response.json().get("included")
60-
61-
assert [x.get("type") for x in included] == [
62-
"comments"
63-
], "Detail included types are incorrect"
64-
65-
comment_count = len(
66-
[resource for resource in included if resource["type"] == "comments"]
67-
)
68-
expected_comment_count = single_entry.comments.count()
69-
assert comment_count == expected_comment_count, "Detail comment count is incorrect"
70-
71-
727
def test_dynamic_related_data_is_included(single_entry, entry_factory, client):
738
entry_factory()
749
response = client.get(

example/urls_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.urls import re_path
1+
from django.urls import path, re_path
22
from rest_framework import routers
33

44
from .api.resources.identity import GenericIdentity, Identity
@@ -46,8 +46,8 @@
4646

4747
urlpatterns = [
4848
# old tests
49-
re_path(
50-
r"identities/default/(?P<pk>\d+)$",
49+
path(
50+
"identities/default/<int:pk>",
5151
GenericIdentity.as_view(),
5252
name="user-default",
5353
),

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def get_package_data(package):
107107
install_requires=[
108108
"inflection>=0.5.0",
109109
"djangorestframework>=3.14",
110-
"django>=3.2",
110+
"django>=4.2",
111111
],
112112
extras_require={
113113
"django-polymorphic": ["django-polymorphic>=3.0"],

tests/conftest.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
from tests.models import (
55
BasicModel,
6+
ForeignKeySource,
67
ForeignKeyTarget,
78
ManyToManySource,
89
ManyToManyTarget,
10+
NestedRelatedSource,
911
)
1012

1113

@@ -39,6 +41,11 @@ def foreign_key_target(db):
3941
return ForeignKeyTarget.objects.create(name="Target")
4042

4143

44+
@pytest.fixture
45+
def foreign_key_source(db, foreign_key_target):
46+
return ForeignKeySource.objects.create(name="Source", target=foreign_key_target)
47+
48+
4249
@pytest.fixture
4350
def many_to_many_source(db, many_to_many_targets):
4451
source = ManyToManySource.objects.create(name="Source")
@@ -54,6 +61,34 @@ def many_to_many_targets(db):
5461
]
5562

5663

64+
@pytest.fixture
65+
def many_to_many_sources(db, many_to_many_targets):
66+
source1 = ManyToManySource.objects.create(name="Source1")
67+
source2 = ManyToManySource.objects.create(name="Source2")
68+
69+
source1.targets.add(*many_to_many_targets)
70+
source2.targets.add(*many_to_many_targets)
71+
72+
return [source1, source2]
73+
74+
75+
@pytest.fixture
76+
def nested_related_source(
77+
db,
78+
foreign_key_source,
79+
foreign_key_target,
80+
many_to_many_targets,
81+
many_to_many_sources,
82+
):
83+
source = NestedRelatedSource.objects.create(
84+
fk_source=foreign_key_source, fk_target=foreign_key_target
85+
)
86+
source.m2m_targets.add(*many_to_many_targets)
87+
source.m2m_sources.add(*many_to_many_sources)
88+
89+
return source
90+
91+
5792
@pytest.fixture
5893
def client():
5994
return APIClient()

tests/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ class ForeignKeySource(DJAModel):
4242

4343

4444
class NestedRelatedSource(DJAModel):
45-
m2m_source = models.ManyToManyField(ManyToManySource, related_name="nested_source")
45+
m2m_sources = models.ManyToManyField(ManyToManySource, related_name="nested_source")
4646
fk_source = models.ForeignKey(
4747
ForeignKeySource, related_name="nested_source", on_delete=models.CASCADE
4848
)
49-
m2m_target = models.ManyToManyField(ManyToManySource, related_name="nested_target")
49+
m2m_targets = models.ManyToManyField(ManyToManyTarget, related_name="nested_target")
5050
fk_target = models.ForeignKey(
51-
ForeignKeySource, related_name="nested_target", on_delete=models.CASCADE
51+
ForeignKeyTarget, related_name="nested_target", on_delete=models.CASCADE
5252
)

tests/serializers.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from rest_framework_json_api import serializers
2-
from rest_framework_json_api.relations import ResourceRelatedField
32
from tests.models import (
43
BasicModel,
54
ForeignKeySource,
65
ForeignKeyTarget,
76
ManyToManySource,
87
ManyToManyTarget,
8+
NestedRelatedSource,
99
)
1010

1111

@@ -15,33 +15,51 @@ class Meta:
1515
model = BasicModel
1616

1717

18+
class ForeignKeyTargetSerializer(serializers.ModelSerializer):
19+
class Meta:
20+
fields = ("name",)
21+
model = ForeignKeyTarget
22+
23+
1824
class ForeignKeySourceSerializer(serializers.ModelSerializer):
19-
target = ResourceRelatedField(queryset=ForeignKeyTarget.objects)
25+
included_serializers = {"target": ForeignKeyTargetSerializer}
2026

2127
class Meta:
2228
model = ForeignKeySource
2329
fields = ("target",)
2430

2531

32+
class ManyToManyTargetSerializer(serializers.ModelSerializer):
33+
class Meta:
34+
fields = ("name",)
35+
model = ManyToManyTarget
36+
37+
2638
class ManyToManySourceSerializer(serializers.ModelSerializer):
27-
targets = ResourceRelatedField(many=True, queryset=ManyToManyTarget.objects)
39+
included_serializers = {"targets": "tests.serializers.ManyToManyTargetSerializer"}
2840

2941
class Meta:
3042
model = ManyToManySource
3143
fields = ("targets",)
3244

3345

34-
class ManyToManyTargetSerializer(serializers.ModelSerializer):
46+
class ManyToManySourceReadOnlySerializer(serializers.ModelSerializer):
3547
class Meta:
36-
model = ManyToManyTarget
48+
model = ManyToManySource
49+
fields = ("targets",)
3750

3851

39-
class ManyToManySourceReadOnlySerializer(serializers.ModelSerializer):
40-
targets = ResourceRelatedField(many=True, read_only=True)
52+
class NestedRelatedSourceSerializer(serializers.ModelSerializer):
53+
included_serializers = {
54+
"m2m_sources": ManyToManySourceSerializer,
55+
"fk_source": ForeignKeySourceSerializer,
56+
"m2m_targets": ManyToManyTargetSerializer,
57+
"fk_target": ForeignKeyTargetSerializer,
58+
}
4159

4260
class Meta:
43-
model = ManyToManySource
44-
fields = ("targets",)
61+
model = NestedRelatedSource
62+
fields = ("m2m_sources", "fk_source", "m2m_targets", "fk_target")
4563

4664

4765
class CallableDefaultSerializer(serializers.Serializer):

tests/test_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ class Meta:
325325
{"many": True, "queryset": ManyToManyTarget.objects.all()},
326326
),
327327
(
328-
"m2m_target.sources.",
328+
"m2m_target.sources",
329329
"ManyToManySource",
330330
{"many": True, "queryset": ManyToManySource.objects.all()},
331331
),

0 commit comments

Comments
 (0)