From cf33008571b42d8d3009b5e2c5495d9f7d657384 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 22 Oct 2015 14:05:52 +0100 Subject: [PATCH] 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 }