Skip to content

Commit a4f4dd0

Browse files
authored
Merge branch 'encode:master' into jsonencoder_ipaddress
2 parents afdcf5c + ccfe0a9 commit a4f4dd0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1113
-1687
lines changed

.github/ISSUE_TEMPLATE/1-issue.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ about: Please only raise an issue if you've been advised to do so after discussi
55

66
## Checklist
77

8+
<!--
9+
Note: REST framework is considered feature-complete. New functionality should be implemented outside the core REST framework. For details, please check the docs: https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages
10+
-->
11+
812
- [ ] Raised initially as discussion #...
9-
- [ ] This cannot be dealt with as a third party library. (We prefer new functionality to be [in the form of third party libraries](https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages) where possible.)
13+
- [ ] This is not a feature request suitable for implementation outside this project. Please elaborate what it is:
14+
- [ ] compatibility fix for new Django/Python version ...
15+
- [ ] other type of bug fix
16+
- [ ] other type of improvement that does not touch existing code or change existing behavior (e.g. wrapper for new Django field)
1017
- [ ] I have reduced the issue to the simplest possible case.

.github/workflows/main.yml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ jobs:
1414
strategy:
1515
matrix:
1616
python-version:
17-
- '3.6'
18-
- '3.7'
1917
- '3.8'
2018
- '3.9'
2119
- '3.10'
@@ -37,18 +35,9 @@ jobs:
3735
- name: Install dependencies
3836
run: python -m pip install --upgrade codecov tox
3937

40-
- name: Install tox-py
41-
if: ${{ matrix.python-version == '3.6' }}
42-
run: python -m pip install --upgrade tox-py
43-
4438
- name: Run tox targets for ${{ matrix.python-version }}
45-
if: ${{ matrix.python-version != '3.6' }}
4639
run: tox run -f py$(echo ${{ matrix.python-version }} | tr -d .)
4740

48-
- name: Run tox targets for ${{ matrix.python-version }}
49-
if: ${{ matrix.python-version == '3.6' }}
50-
run: tox --py current
51-
5241
- name: Run extra tox targets
5342
if: ${{ matrix.python-version == '3.9' }}
5443
run: |

PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*Note*: Before submitting this pull request, please review our [contributing guidelines](https://www.django-rest-framework.org/community/contributing/#pull-requests).
1+
*Note*: Before submitting a code change, please review our [contributing guidelines](https://www.django-rest-framework.org/community/contributing/#pull-requests).
22

33
## Description
44

README.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ The initial aim is to provide a single full-time position on REST framework.
2828
[![][cryptapi-img]][cryptapi-url]
2929
[![][fezto-img]][fezto-url]
3030
[![][svix-img]][svix-url]
31+
[![][zuplo-img]][zuplo-url]
3132

32-
Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], and [Svix][svix-url].
33+
Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], [Svix][svix-url], and [Zuplo][zuplo-url].
3334

3435
---
3536

@@ -45,8 +46,6 @@ Some reasons you might want to use REST framework:
4546
* Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers].
4647
* [Extensive documentation][docs], and [great community support][group].
4748

48-
There is a live example API for testing purposes, [available here][sandbox].
49-
5049
**Below**: *Screenshot from the browsable API*
5150

5251
![Screenshot][image]
@@ -55,8 +54,8 @@ There is a live example API for testing purposes, [available here][sandbox].
5554

5655
# Requirements
5756

58-
* Python 3.6+
59-
* Django 5.0, 4.2, 4.1, 4.0, 3.2, 3.1, 3.0
57+
* Python 3.8+
58+
* Django 5.0, 4.2
6059

6160
We **highly recommend** and only officially support the latest patch release of
6261
each Python and Django series.
@@ -174,8 +173,6 @@ Full documentation for the project is available at [https://www.django-rest-fram
174173

175174
For questions and support, use the [REST framework discussion group][group], or `#restframework` on libera.chat IRC.
176175

177-
You may also want to [follow the author on Twitter][twitter].
178-
179176
# Security
180177

181178
Please see the [security policy][security-policy].
@@ -186,9 +183,7 @@ Please see the [security policy][security-policy].
186183
[codecov]: https://codecov.io/github/encode/django-rest-framework?branch=master
187184
[pypi-version]: https://img.shields.io/pypi/v/djangorestframework.svg
188185
[pypi]: https://pypi.org/project/djangorestframework/
189-
[twitter]: https://twitter.com/starletdreaming
190186
[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework
191-
[sandbox]: https://restframework.herokuapp.com/
192187

193188
[funding]: https://fund.django-rest-framework.org/topics/funding/
194189
[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
@@ -202,6 +197,7 @@ Please see the [security policy][security-policy].
202197
[cryptapi-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cryptapi-readme.png
203198
[fezto-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/fezto-readme.png
204199
[svix-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/svix-premium.png
200+
[zuplo-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/zuplo-readme.png
205201

206202
[sentry-url]: https://getsentry.com/welcome/
207203
[stream-url]: https://getstream.io/?utm_source=DjangoRESTFramework&utm_medium=Webpage_Logo_Ad&utm_content=Developer&utm_campaign=DjangoRESTFramework_Jan2022_HomePage
@@ -212,6 +208,7 @@ Please see the [security policy][security-policy].
212208
[cryptapi-url]: https://cryptapi.io
213209
[fezto-url]: https://www.fezto.xyz/?utm_source=DjangoRESTFramework
214210
[svix-url]: https://www.svix.com/?utm_source=django-REST&utm_medium=sponsorship
211+
[zuplo-url]: https://zuplo.link/django-gh
215212

216213
[oauth1-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth
217214
[oauth2-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit

docs/api-guide/caching.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,29 @@ class PostView(APIView):
5959
return Response(content)
6060
```
6161

62+
63+
## Using cache with @api_view decorator
64+
65+
When using @api_view decorator, the Django-provided method-based cache decorators such as [`cache_page`][page],
66+
[`vary_on_cookie`][cookie] and [`vary_on_headers`][headers] can be called directly.
67+
68+
```python
69+
from django.views.decorators.cache import cache_page
70+
from django.views.decorators.vary import vary_on_cookie
71+
72+
from rest_framework.decorators import api_view
73+
from rest_framework.response import Response
74+
75+
76+
@cache_page(60 * 15)
77+
@vary_on_cookie
78+
@api_view(["GET"])
79+
def get_user_list(request):
80+
content = {"user_feed": request.user.get_user_feed()}
81+
return Response(content)
82+
```
83+
84+
6285
**NOTE:** The [`cache_page`][page] decorator only caches the
6386
`GET` and `HEAD` responses with status 200.
6487

docs/api-guide/fields.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,6 @@ When serializing the instance, default will be used if the object attribute or d
6868

6969
Note that setting a `default` value implies that the field is not required. Including both the `default` and `required` keyword arguments is invalid and will raise an error.
7070

71-
Notes regarding default value propagation from model to serializer:
72-
73-
All the default values from model will pass as default to the serializer and the options method.
74-
75-
If the default is callable then it will be propagated to & evaluated every time in the serializer but not in options method.
76-
77-
If the value for given field is not given then default value will be present in the serializer and available in serializer's methods. Specified validation on given field will be evaluated on default value as that field will be present in the serializer.
78-
7971
### `allow_null`
8072

8173
Normally an error will be raised if `None` is passed to a serializer field. Set this keyword argument to `True` if `None` should be considered a valid value.

docs/api-guide/permissions.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,11 @@ This permission is suitable if you want to your API to allow read permissions to
173173

174174
This permission class ties into Django's standard `django.contrib.auth` [model permissions][contribauth]. This permission must only be applied to views that have a `.queryset` property or `get_queryset()` method. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned. The appropriate model is determined by checking `get_queryset().model` or `queryset.model`.
175175

176-
* `GET` requests require the user to have the `view` or `change` permission on the model
177176
* `POST` requests require the user to have the `add` permission on the model.
178177
* `PUT` and `PATCH` requests require the user to have the `change` permission on the model.
179178
* `DELETE` requests require the user to have the `delete` permission on the model.
180179

181-
The default behaviour can also be overridden to support custom model permissions.
180+
The default behavior can also be overridden to support custom model permissions. For example, you might want to include a `view` model permission for `GET` requests.
182181

183182
To use custom model permissions, override `DjangoModelPermissions` and set the `.perms_map` property. Refer to the source code for details.
184183

docs/api-guide/renderers.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ By default this will include the following keys: `view`, `request`, `response`,
283283

284284
The following is an example plaintext renderer that will return a response with the `data` parameter as the content of the response.
285285

286-
from django.utils.encoding import smart_text
286+
from django.utils.encoding import smart_str
287287
from rest_framework import renderers
288288

289289

@@ -292,7 +292,7 @@ The following is an example plaintext renderer that will return a response with
292292
format = 'txt'
293293

294294
def render(self, data, accepted_media_type=None, renderer_context=None):
295-
return smart_text(data, encoding=self.charset)
295+
return smart_str(data, encoding=self.charset)
296296

297297
## Setting the character set
298298

docs/api-guide/schemas.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ The following sections explain more.
5656

5757
### Install dependencies
5858

59-
pip install pyyaml uritemplate
59+
pip install pyyaml uritemplate inflection
6060

6161
* `pyyaml` is used to generate schema into YAML-based OpenAPI format.
6262
* `uritemplate` is used internally to get parameters in path.
63+
* `inflection` is used to pluralize operations more appropriately in the list endpoints.
6364

6465
### Generating a static schema with the `generateschema` management command
6566

docs/api-guide/serializers.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -845,8 +845,6 @@ Here's an example of how you might choose to implement multiple updates:
845845
class Meta:
846846
list_serializer_class = BookListSerializer
847847

848-
It is possible that a third party package may be included alongside the 3.1 release that provides some automatic support for multiple update operations, similar to the `allow_add_remove` behavior that was present in REST framework 2.
849-
850848
#### Customizing ListSerializer initialization
851849

852850
When a serializer with `many=True` is instantiated, we need to determine which arguments and keyword arguments should be passed to the `.__init__()` method for both the child `Serializer` class, and for the parent `ListSerializer` class.

docs/community/3.15-announcement.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ The current minimum versions of Django still is 3.0 and Python 3.6.
3131

3232
`ModelSerializer` generates validators for [UniqueConstraint](https://docs.djangoproject.com/en/4.0/ref/models/constraints/#uniqueconstraint) (both UniqueValidator and UniqueTogetherValidator)
3333

34-
## ValidationErrors improvements
35-
36-
The `ValidationError` has been aligned with Django's, currently supporting the same style (signature) and nesting.
37-
3834
## SimpleRouter non-regex matching support
3935

4036
By default the URLs created by `SimpleRouter` use regular expressions. This behavior can be modified by setting the `use_regex_path` argument to `False` when instantiating the router.
@@ -47,10 +43,6 @@ Dependency on pytz has been removed and deprecation warnings have been added, Dj
4743

4844
Searches now may contain _quoted phrases_ with spaces, each phrase is considered as a single search term, and it will raise a validation error if any null-character is provided in search. See the [Filtering API guide](../api-guide/filtering.md) for more information.
4945

50-
## Default values propagation
51-
52-
Model fields' default values are now propagated to serializer fields, for more information see the [Serializer fields API guide](../api-guide/fields.md#default).
53-
5446
## Other fixes and improvements
5547

5648
There are a number of fixes and minor improvements in this release, ranging from documentation, internal infrastructure (typing, testing, requirements, deprecation, etc.), security and overall behaviour.

docs/community/contributing.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
77
There are many ways you can contribute to Django REST framework. We'd like it to be a community-led project, so please get involved and help shape the future of the project.
88

9-
---
9+
!!! note
1010

11-
**Note**: At this point in it's lifespan we consider Django REST framework to be essentially feature-complete. We may accept pull requests that track the continued development of Django versions, but would prefer not to accept new features or code formatting changes.
12-
13-
---
11+
At this point in its lifespan we consider Django REST framework to be feature-complete. We focus on pull requests that track the continued development of Django versions, and generally do not accept new features or code formatting changes.
1412

1513
## Community
1614

@@ -36,10 +34,9 @@ Our contribution process is that the [GitHub discussions page](https://github.co
3634

3735
Some tips on good potential issue reporting:
3836

39-
* When describing issues try to phrase your ticket in terms of the *behavior* you think needs changing rather than the *code* you think need changing.
37+
* Django REST framework is considered feature-complete. Please do not file requests to change behavior, unless it is required for security reasons or to maintain compatibility with upcoming Django or Python versions.
4038
* Search the GitHub project page for related items, and make sure you're running the latest version of REST framework before reporting an issue.
41-
* Feature requests will often be closed with a recommendation that they be implemented outside of the core REST framework library. Keeping new feature requests implemented as third party libraries allows us to keep down the maintenance overhead of REST framework, so that the focus can be on continued stability, bugfixes, and great documentation. At this point in it's lifespan we consider Django REST framework to be essentially feature-complete.
42-
* Closing an issue doesn't necessarily mean the end of a discussion. If you believe your issue has been closed incorrectly, explain why and we'll consider if it needs to be reopened.
39+
* Feature requests will typically be closed with a recommendation that they be implemented outside the core REST framework library (e.g. as third-party libraries). This approach allows us to keep down the maintenance overhead of REST framework, so that the focus can be on continued stability and great documentation.
4340

4441
## Triaging issues
4542

@@ -48,8 +45,8 @@ Getting involved in triaging incoming issues is a good way to start contributing
4845
* Read through the ticket - does it make sense, is it missing any context that would help explain it better?
4946
* Is the ticket reported in the correct place, would it be better suited as a discussion on the discussion group?
5047
* If the ticket is a bug report, can you reproduce it? Are you able to write a failing test case that demonstrates the issue and that can be submitted as a pull request?
51-
* If the ticket is a feature request, do you agree with it, and could the feature request instead be implemented as a third party package?
52-
* If a ticket hasn't had much activity and it addresses something you need, then comment on the ticket and try to find out what's needed to get it moving again.
48+
* If the ticket is a feature request, could the feature request instead be implemented as a third party package?
49+
* If a ticket hasn't had much activity and addresses something you need, then comment on the ticket and try to find out what's needed to get it moving again.
5350

5451
# Development
5552

0 commit comments

Comments
 (0)