From cf33008571b42d8d3009b5e2c5495d9f7d657384 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 14:05:52 +0100 Subject: [PATCH 1/8] Release notes etc --- docs/api-guide/filtering.md | 4 +++ docs/img/filter-controls.png | Bin 0 -> 47904 bytes docs/index.md | 11 ++++--- docs/topics/3.3-announcement.md | 52 ++++++++++++++++++++++++++++++++ rest_framework/pagination.py | 52 -------------------------------- rest_framework/settings.py | 5 --- 6 files changed, 62 insertions(+), 62 deletions(-) create mode 100644 docs/img/filter-controls.png create mode 100644 docs/topics/3.3-announcement.md diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index 2771e6196..de3c2d020 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -83,6 +83,10 @@ We can override `.get_queryset()` to deal with URLs such as `http://example.com/ As well as being able to override the default queryset, REST framework also includes support for generic filtering backends that allow you to easily construct complex searches and filters. +Generic filters can also present themselves as HTML controls in the browsable API and admin API. + +![Filter Example](../img/filter-controls.png) + ## Setting filter backends The default filter backends may be set globally, using the `DEFAULT_FILTER_BACKENDS` setting. For example. diff --git a/docs/img/filter-controls.png b/docs/img/filter-controls.png new file mode 100644 index 0000000000000000000000000000000000000000..4a41cf04f416933ccac4bbeb9db4965dd9be6418 GIT binary patch literal 47904 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 D<@Pzy literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index bf849bd7b..676ad5204 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,9 +12,7 @@ --- -**Note**: This is the documentation for the **version 3.2** of REST framework. Documentation for [version 2.4](http://tomchristie.github.io/rest-framework-2-docs/) is also available. - -For more details see the 3.2 [announcement][3.2-announcement] and [release notes][release-notes]. +**Note**: This is the documentation for the **version 3** of REST framework. Documentation for [version 2](http://tomchristie.github.io/rest-framework-2-docs/) is also available. --- @@ -31,7 +29,7 @@ For more details see the 3.2 [announcement][3.2-announcement] and [release notes Django REST Framework

-Django REST framework is a powerful and flexible toolkit that makes it easy to build Web APIs. +Django REST framework is a powerful and flexible toolkit for building Web APIs. Some reasons you might want to use REST framework: @@ -52,13 +50,14 @@ Some reasons you might want to use REST framework: REST framework requires the following: -* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4, 3.5) +* Python (2.7, 3.2, 3.3, 3.4, 3.5) * Django (1.7+, 1.8, 1.9) The following packages are optional: * [Markdown][markdown] (2.1.0+) - Markdown support for the browsable API. * [django-filter][django-filter] (0.9.2+) - Filtering support. +* [django-crispy-forms][django-crispy-forms] - Improved HTML display for filtering. * [django-guardian][django-guardian] (1.1.1+) - Object level permissions support. ## Installation @@ -203,6 +202,7 @@ General guides to using REST framework. * [3.0 Announcement][3.0-announcement] * [3.1 Announcement][3.1-announcement] * [3.2 Announcement][3.2-announcement] +* [3.3 Announcement][3.3-announcement] * [Kickstarter Announcement][kickstarter-announcement] * [Release Notes][release-notes] @@ -317,6 +317,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [3.0-announcement]: topics/3.0-announcement.md [3.1-announcement]: topics/3.1-announcement.md [3.2-announcement]: topics/3.2-announcement.md +[3.3-announcement]: topics/3.3-announcement.md [kickstarter-announcement]: topics/kickstarter-announcement.md [release-notes]: topics/release-notes.md diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md new file mode 100644 index 000000000..0f9223769 --- /dev/null +++ b/docs/topics/3.3-announcement.md @@ -0,0 +1,52 @@ +# Django REST framework 3.3 + +The 3.3 release marks the final work in the Kickstarter funded series. We'd like to offer a final resounding **thank you** to all our wonderful sponsors and supporters. + +The amount of work that has been achieved as a direct result of the funding is immense. We've added a huge amounts of new functionality, resolved nearly 2,000 tickets, and redesigned & refined large parts of the project. + +In order to continue + +--- + +## Release notes + +Significant new functionality in the 3.3 release includes: + +* Filters presented as HTML controls in the browsable API. +* A [forms API][forms-api], allowing serializers to be rendered as HTML forms. +* Django 1.9 support. +* A [`JSONField` serializer field][jsonfield], corresponding to Django 1.9's Postgres `JSONField` model field. +* Browsable API support [via AJAX][ajax-form], rather than server side request overloading. + +![Filter Controls](../img/filter-controls.png) + +*Example of the new filter controls* + +## Supported versions + +This release drops support for Django 1.5 and 1.6. Django 1.7, 1.8 or 1.9 are now required. + +This brings our supported versions into line with Django's [currently supported versions][django-supported-versions] + +## Deprecations + +The AJAX based support for the browsable API means that there are a number of internal cleanups in the `request` class. For the vast majority of developers this should largely remain transparent: + +* To support form based `PUT` and `DELETE`, or to support form content types such as JSON, you should now use the [AJAX forms][ajax-forms] javascript library. This replaces the previous 'method and content type overloading' that required significant internal complexity to the request class. +* The `accept` query parameter is no longer supported by the default content negotiation class. If you require it then you'll need to [use a custom content negotiation class](browser-enchancements.md#url-based-accept-headers). +* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware](browser-enchancements.md#http-header-based-method-overriding). + +The following pagination view attributes and settings have been moved into attributes on the pagination class since 3.1. Their usage was formerly deprecated, and has now been removed entirely, in line with the deprecation policy. + +* `view.paginate_by` - Use `paginator.page_size` instead. +* `view.page_query_param` - Use `paginator.page_query_param` instead. +* `view.paginate_by_param` - Use `paginator.page_size_query_param` instead. +* `view.max_paginate_by` - Use `paginator.max_page_size` instead. +* `settings.PAGINATE_BY` - Use `paginator.page_size` instead. +* `settings.PAGINATE_BY_PARAM` - Use `paginator.page_size_query_param` instead. +* `settings.MAX_PAGINATE_BY` - Use `paginator.max_page_size` instead. + +[forms-api]: html-and-forms.md +[ajax-form]: https://github.com/tomchristie/ajax-form +[jsonfield]: ../api-guide/serializer-fields.md#jsonfield +[django-supported-versions]: https://www.djangoproject.com/download/#supported-versions \ No newline at end of file diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 45b5b29c5..8644bd881 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -186,63 +186,11 @@ class PageNumberPagination(BasePagination): invalid_page_message = _('Invalid page "{page_number}": {message}.') - def _handle_backwards_compat(self, view): - """ - Prior to version 3.1, pagination was handled in the view, and the - attributes were set there. The attributes should now be set on - the pagination class. The old style continues to work but is deprecated - and will be fully removed in version 3.3. - """ - assert not ( - getattr(view, 'pagination_serializer_class', None) or - getattr(api_settings, 'DEFAULT_PAGINATION_SERIALIZER_CLASS', None) - ), ( - "The pagination_serializer_class attribute and " - "DEFAULT_PAGINATION_SERIALIZER_CLASS setting have been removed as " - "part of the 3.1 pagination API improvement. See the pagination " - "documentation for details on the new API." - ) - - for (settings_key, attr_name) in ( - ('PAGINATE_BY', 'page_size'), - ('PAGINATE_BY_PARAM', 'page_size_query_param'), - ('MAX_PAGINATE_BY', 'max_page_size') - ): - value = getattr(api_settings, settings_key, None) - if value is not None: - setattr(self, attr_name, value) - warnings.warn( - "The `%s` settings key is deprecated. " - "Use the `%s` attribute on the pagination class instead." % ( - settings_key, attr_name - ), - DeprecationWarning, - ) - - for (view_attr, attr_name) in ( - ('paginate_by', 'page_size'), - ('page_query_param', 'page_query_param'), - ('paginate_by_param', 'page_size_query_param'), - ('max_paginate_by', 'max_page_size') - ): - value = getattr(view, view_attr, None) - if value is not None: - setattr(self, attr_name, value) - warnings.warn( - "The `%s` view attribute is deprecated. " - "Use the `%s` attribute on the pagination class instead." % ( - view_attr, attr_name - ), - DeprecationWarning, - ) - def paginate_queryset(self, queryset, request, view=None): """ Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ - self._handle_backwards_compat(view) - page_size = self.get_page_size(request) if not page_size: return None diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9d834c125..adf737126 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -111,11 +111,6 @@ DEFAULTS = { 'COMPACT_JSON': True, 'COERCE_DECIMAL_TO_STRING': True, 'UPLOADED_FILES_USE_URL': True, - - # Pending deprecation: - 'PAGINATE_BY': None, - 'PAGINATE_BY_PARAM': None, - 'MAX_PAGINATE_BY': None } From 07b23c868584e3fa25b5d220b028ad7ab8700b0b Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 14:06:55 +0100 Subject: [PATCH 2/8] Add version 3.3 to the docs index --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 082bd4b36..bf92e82d7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,5 +57,6 @@ pages: - '3.0 Announcement': 'topics/3.0-announcement.md' - '3.1 Announcement': 'topics/3.1-announcement.md' - '3.2 Announcement': 'topics/3.2-announcement.md' + - '3.3 Announcement': 'topics/3.3-announcement.md' - 'Kickstarter Announcement': 'topics/kickstarter-announcement.md' - 'Release Notes': 'topics/release-notes.md' From ae852b2be4adfbc6fb881a70270d29fdefe54a42 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 14:08:19 +0100 Subject: [PATCH 3/8] Tweak links --- docs/topics/3.3-announcement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md index 0f9223769..cef446c38 100644 --- a/docs/topics/3.3-announcement.md +++ b/docs/topics/3.3-announcement.md @@ -48,5 +48,5 @@ The following pagination view attributes and settings have been moved into attri [forms-api]: html-and-forms.md [ajax-form]: https://github.com/tomchristie/ajax-form -[jsonfield]: ../api-guide/serializer-fields.md#jsonfield +[jsonfield]: ../../api-guide/fields.md#jsonfield [django-supported-versions]: https://www.djangoproject.com/download/#supported-versions \ No newline at end of file From 4e7cc68ec93d1de2323324476a065330e8cb0cf9 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 14:42:35 +0100 Subject: [PATCH 4/8] Link tweaks --- docs/topics/3.3-announcement.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md index cef446c38..66633a228 100644 --- a/docs/topics/3.3-announcement.md +++ b/docs/topics/3.3-announcement.md @@ -33,8 +33,8 @@ This brings our supported versions into line with Django's [currently supported The AJAX based support for the browsable API means that there are a number of internal cleanups in the `request` class. For the vast majority of developers this should largely remain transparent: * To support form based `PUT` and `DELETE`, or to support form content types such as JSON, you should now use the [AJAX forms][ajax-forms] javascript library. This replaces the previous 'method and content type overloading' that required significant internal complexity to the request class. -* The `accept` query parameter is no longer supported by the default content negotiation class. If you require it then you'll need to [use a custom content negotiation class](browser-enchancements.md#url-based-accept-headers). -* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware](browser-enchancements.md#http-header-based-method-overriding). +* The `accept` query parameter is no longer supported by the default content negotiation class. If you require it then you'll need to [use a custom content negotiation class](browser-enhancements.md#url-based-accept-headers). +* The custom `HTTP_X_HTTP_METHOD_OVERRIDE` header is no longer supported by default. If you require it then you'll need to [use custom middleware](browser-enhancements.md#http-header-based-method-overriding). The following pagination view attributes and settings have been moved into attributes on the pagination class since 3.1. Their usage was formerly deprecated, and has now been removed entirely, in line with the deprecation policy. @@ -48,5 +48,5 @@ The following pagination view attributes and settings have been moved into attri [forms-api]: html-and-forms.md [ajax-form]: https://github.com/tomchristie/ajax-form -[jsonfield]: ../../api-guide/fields.md#jsonfield +[jsonfield]: ../../api-guide/fields#jsonfield [django-supported-versions]: https://www.djangoproject.com/download/#supported-versions \ No newline at end of file From 7bfc420dc9da9569b99bdf7256feebc1cb5350d5 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 15:11:10 +0100 Subject: [PATCH 5/8] Add release notes, drop deprecated test --- docs/topics/3.3-announcement.md | 4 ++++ docs/topics/release-notes.md | 28 ++++++++++++++++++++++---- tests/test_pagination.py | 35 --------------------------------- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md index 66633a228..ae5071828 100644 --- a/docs/topics/3.3-announcement.md +++ b/docs/topics/3.3-announcement.md @@ -22,6 +22,8 @@ Significant new functionality in the 3.3 release includes: *Example of the new filter controls* +--- + ## Supported versions This release drops support for Django 1.5 and 1.6. Django 1.7, 1.8 or 1.9 are now required. @@ -46,6 +48,8 @@ The following pagination view attributes and settings have been moved into attri * `settings.PAGINATE_BY_PARAM` - Use `paginator.page_size_query_param` instead. * `settings.MAX_PAGINATE_BY` - Use `paginator.max_page_size` instead. +The `ModelSerializer` and `HyperlinkedModelSerializer` classes should now include either a `fields` or `exclude` option, although the `fields = '__all__'` shortcut may be used. Failing to include either of these two options is currently pending deprecation, and will be removed entirely in the 3.5 release. This behavior brings `ModelSerializer` more closely in line with Django's `ModelForm` behavior. + [forms-api]: html-and-forms.md [ajax-form]: https://github.com/tomchristie/ajax-form [jsonfield]: ../../api-guide/fields#jsonfield diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index cb4a17ef7..12d497e09 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -42,9 +42,18 @@ You can determine your currently installed version using `pip freeze`: ### 3.3.0 -**Date**: NOT YET RELEASED +**Date**: [27th October 2015][3.3.0-milestone] -* Removed support for Django Versions 1.5 & 1.6 ([#3421][gh3421], [#3429][gh3429]) +* HTML controls for filters. ([#3315][gh3315]) +* Forms API. ([#3475][gh3475]) +* AJAX browsable API. ([#3410][gh3410]) +* Added JSONField. ([#3454][gh3454]) +* Correctly map `to_field` when creating `ModelSerializer` relational fields. ([#3526][gh3526]) +* Map appropriate model `error_messages` on `ModelSerializer` uniqueness constraints. ([#3435][gh3435]) +* Include `max_length` constraint for `ModelSerializer` fields mapped from TextField. ([#3509][gh3509]) +* Added support for Django 1.9. ([#3450][gh3450], [#3525][gh3525]) +* Removed support for Django 1.5 & 1.6. ([#3421][gh3421], [#3429][gh3429]) +* Removed 'south' migrations. ([#3495][gh3495]) ## 3.2.x series @@ -543,5 +552,16 @@ For older release notes, [please see the version 2.x documentation][old-release- [gh3415]: https://github.com/tomchristie/django-rest-framework/issues/3415 -[gh3421]: https://github.com/tomchristie/django-rest-framework/pulls/3421 -[gh3429]: https://github.com/tomchristie/django-rest-framework/pull/3429 +[gh3315]: https://github.com/tomchristie/django-rest-framework/issues/3315 +[gh3410]: https://github.com/tomchristie/django-rest-framework/issues/3410 +[gh3435]: https://github.com/tomchristie/django-rest-framework/issues/3435 +[gh3450]: https://github.com/tomchristie/django-rest-framework/issues/3450 +[gh3454]: https://github.com/tomchristie/django-rest-framework/issues/3454 +[gh3475]: https://github.com/tomchristie/django-rest-framework/issues/3475 +[gh3495]: https://github.com/tomchristie/django-rest-framework/issues/3495 +[gh3509]: https://github.com/tomchristie/django-rest-framework/issues/3509 +[gh3421]: https://github.com/tomchristie/django-rest-framework/issues/3421 +[gh3525]: https://github.com/tomchristie/django-rest-framework/issues/3525 +[gh3526]: https://github.com/tomchristie/django-rest-framework/issues/3526 +[gh3429]: https://github.com/tomchristie/django-rest-framework/issues/3429 + diff --git a/tests/test_pagination.py b/tests/test_pagination.py index 63fdbecae..2e6085672 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -147,41 +147,6 @@ class TestPaginationDisabledIntegration: assert response.data == list(range(1, 101)) -class TestDeprecatedStylePagination: - """ - Integration tests for deprecated style of setting pagination - attributes on the view. - """ - - def setup(self): - class PassThroughSerializer(serializers.BaseSerializer): - def to_representation(self, item): - return item - - class ExampleView(generics.ListAPIView): - serializer_class = PassThroughSerializer - queryset = range(1, 101) - pagination_class = pagination.PageNumberPagination - paginate_by = 20 - page_query_param = 'page_number' - - self.view = ExampleView.as_view() - - def test_paginate_by_attribute_on_view(self): - request = factory.get('/?page_number=2') - response = self.view(request) - assert response.status_code == status.HTTP_200_OK - assert response.data == { - 'results': [ - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 - ], - 'previous': 'http://testserver/', - 'next': 'http://testserver/?page_number=3', - 'count': 100 - } - - class TestPageNumberPagination: """ Unit tests for `pagination.PageNumberPagination`. From ff285cfe66d980e095b12dd47c44c45db1846d37 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 15:15:55 +0100 Subject: [PATCH 6/8] TODO placeholder in release announcement --- docs/topics/3.3-announcement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md index ae5071828..c69b87660 100644 --- a/docs/topics/3.3-announcement.md +++ b/docs/topics/3.3-announcement.md @@ -4,7 +4,7 @@ The 3.3 release marks the final work in the Kickstarter funded series. We'd like The amount of work that has been achieved as a direct result of the funding is immense. We've added a huge amounts of new functionality, resolved nearly 2,000 tickets, and redesigned & refined large parts of the project. -In order to continue +In order to continue **TODO** --- From 0fb1ebcfcf98a9284baf3b5b840c36aeccefa6c7 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 23 Oct 2015 16:07:48 +0100 Subject: [PATCH 7/8] Remove unused import --- docs/topics/3.3-announcement.md | 4 +++- rest_framework/pagination.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/topics/3.3-announcement.md b/docs/topics/3.3-announcement.md index c69b87660..d08049ae0 100644 --- a/docs/topics/3.3-announcement.md +++ b/docs/topics/3.3-announcement.md @@ -4,7 +4,9 @@ The 3.3 release marks the final work in the Kickstarter funded series. We'd like The amount of work that has been achieved as a direct result of the funding is immense. We've added a huge amounts of new functionality, resolved nearly 2,000 tickets, and redesigned & refined large parts of the project. -In order to continue **TODO** +In order to continue driving REST framework forward, we're introducing [monthly paid plans](https://fund.django-rest-framework.org/topics/funding). These plans include various sponsorship rewards, and will ensure that the project remains sustainable and well supported. + +We strongly believe that collaboratively funded software development yields outstanding results for a relatively low investment-per-head. If you or your company use REST framework commercially, then we would strongly urge you to participate in this latest funding drive, and help us continue to build an increasingly polished & professional product. --- diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 8644bd881..fc7b90967 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -5,7 +5,6 @@ be used for paginated responses. """ from __future__ import unicode_literals -import warnings from base64 import b64decode, b64encode from collections import OrderedDict, namedtuple From b2fb0deb349160016b8c3f35701654363c260139 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 23 Oct 2015 16:15:44 +0100 Subject: [PATCH 8/8] Add latest item to the release notes --- docs/topics/release-notes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index 12d497e09..b03470e66 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -49,6 +49,7 @@ You can determine your currently installed version using `pip freeze`: * AJAX browsable API. ([#3410][gh3410]) * Added JSONField. ([#3454][gh3454]) * Correctly map `to_field` when creating `ModelSerializer` relational fields. ([#3526][gh3526]) +* Include keyword arguments when mapping `FilePathField` to a serializer field. ([#3536][gh3536]) * Map appropriate model `error_messages` on `ModelSerializer` uniqueness constraints. ([#3435][gh3435]) * Include `max_length` constraint for `ModelSerializer` fields mapped from TextField. ([#3509][gh3509]) * Added support for Django 1.9. ([#3450][gh3450], [#3525][gh3525]) @@ -564,4 +565,5 @@ For older release notes, [please see the version 2.x documentation][old-release- [gh3525]: https://github.com/tomchristie/django-rest-framework/issues/3525 [gh3526]: https://github.com/tomchristie/django-rest-framework/issues/3526 [gh3429]: https://github.com/tomchristie/django-rest-framework/issues/3429 +[gh3536]: https://github.com/tomchristie/django-rest-framework/issues/3536