From 90ed2c1ef7c652ce0a98075c422d25a632d62507 Mon Sep 17 00:00:00 2001 From: Craig Johnson Date: Mon, 13 Aug 2018 15:02:17 +0530 Subject: [PATCH 01/50] Small grammar correction in quickstart. (#6121) Just felt the sentence could use some improving. --- docs/tutorial/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/quickstart.md b/docs/tutorial/quickstart.md index 466baeebc..13152edae 100644 --- a/docs/tutorial/quickstart.md +++ b/docs/tutorial/quickstart.md @@ -56,7 +56,7 @@ We'll also create an initial user named `admin` with a password of `password123` python manage.py createsuperuser --email admin@example.com --username admin -Once you've set up a database and initial user created and ready to go, open up the app's directory and we'll get coding... +Once you've set up a database and the initial user is created and ready to go, open up the app's directory and we'll get coding... ## Serializers From c4b068cfd3885a5a34a26fca293987b861526a66 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Fri, 24 Aug 2018 15:57:45 -0700 Subject: [PATCH 02/50] Fix dist build (#6139) * Use tox-venv to reduce warnings in output * Remove .egg-info/ to allow wheel installation tox now invokes pip as a python module instead of through its entry point. "python -m" adds the current directory to the PYTHONPATH, picking up the .egg-info/ metadata directory, tricking pip into thinking that the package is already installed (and thus not installing the wheel). Deleting the metadata directory fixes this. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76adf1a60..b8c5b385c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,7 @@ matrix: env: TOXENV=dist script: - python setup.py bdist_wheel + - rm -r djangorestframework.egg-info # see #6139 - tox --installpkg ./dist/djangorestframework-*.whl - tox # test sdist @@ -44,7 +45,7 @@ matrix: - env: DJANGO=2.1 install: - - pip install tox tox-travis + - pip install tox tox-venv tox-travis script: - tox From 468cdd16edabbb327c7dde877f3b0a18bea082b9 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 28 Aug 2018 00:51:28 -0700 Subject: [PATCH 03/50] Remove unnecessary models.py file (#6142) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since Django 1.7, an empty models.py file is not required. See https://docs.djangoproject.com/en/dev/releases/1.7/#app-loading-refactor > It is possible to omit models.py entirely if an application doesn’t > have any models. --- rest_framework/models.py | 1 - 1 file changed, 1 deletion(-) delete mode 100644 rest_framework/models.py diff --git a/rest_framework/models.py b/rest_framework/models.py deleted file mode 100644 index 5b53a5264..000000000 --- a/rest_framework/models.py +++ /dev/null @@ -1 +0,0 @@ -# Just to keep things like ./manage.py test happy From 2c992f09dada037904efe076029cd7355118d37f Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 4 Sep 2018 18:33:42 +0000 Subject: [PATCH 04/50] Mention Django 2.1 compat where missing (#6158) --- README.md | 2 +- docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eebcfe13f..b9c5d449d 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ There is a live example API for testing purposes, [available here][sandbox]. # Requirements * Python (2.7, 3.4, 3.5, 3.6) -* Django (1.11, 2.0) +* Django (1.11, 2.0, 2.1) # Installation diff --git a/docs/index.md b/docs/index.md index f709502d7..a3ae88ede 100644 --- a/docs/index.md +++ b/docs/index.md @@ -84,7 +84,7 @@ continued development by **[signing up for a paid plan][funding]**. REST framework requires the following: * Python (2.7, 3.4, 3.5, 3.6) -* Django (1.11, 2.0) +* Django (1.11, 2.0, 2.1) The following packages are optional: From bcc565f387842aba8157d0457de31ae864aed65f Mon Sep 17 00:00:00 2001 From: oliver Date: Thu, 6 Sep 2018 15:25:20 +0900 Subject: [PATCH 05/50] Clean up unnecessary if statement (#6163) --- rest_framework/pagination.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 1c57f17d3..c3494e3c5 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -544,12 +544,11 @@ class CursorPagination(BasePagination): has_following_position = False following_position = None - # If we have a reverse queryset, then the query ordering was in reverse - # so we need to reverse the items again before returning them to the user. if reverse: + # If we have a reverse queryset, then the query ordering was in reverse + # so we need to reverse the items again before returning them to the user. self.page = list(reversed(self.page)) - if reverse: # Determine next and previous positions for reverse cursors. self.has_next = (current_position is not None) or (offset > 0) self.has_previous = has_following_position From bc573d8096f97608c7fd3a8d80a5a96fa8742ed7 Mon Sep 17 00:00:00 2001 From: Timothy Allen Date: Thu, 6 Sep 2018 06:01:57 -0400 Subject: [PATCH 06/50] Add drf-renderer-xlsx package. (#6147) * Add drf-renderer-xlsx package. * Gah, tabs creeped in; never leave your default editor environment. :) --- docs/api-guide/renderers.md | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index d547a7bbf..d720dffc5 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -457,6 +457,43 @@ Modify your REST framework settings. [MessagePack][messagepack] is a fast, efficient binary serialization format. [Juan Riaza][juanriaza] maintains the [djangorestframework-msgpack][djangorestframework-msgpack] package which provides MessagePack renderer and parser support for REST framework. +## XLSX (Binary Spreadsheet Endpoints) + +XLSX is the world's most popular binary spreadsheet format. [Tim Allen][flipperpa] of [The Wharton School][wharton] maintains [drf-renderer-xlsx][drf-renderer-xlsx], which renders an endpoint as an XLSX spreadsheet using OpenPyXL, and allows the client to download it. Spreadsheets can be styled on a per-view basis. + +#### Installation & configuration + +Install using pip. + + $ pip install drf-renderer-xlsx + +Modify your REST framework settings. + + REST_FRAMEWORK = { + ... + + 'DEFAULT_RENDERER_CLASSES': ( + 'rest_framework.renderers.JSONRenderer', + 'rest_framework.renderers.BrowsableAPIRenderer', + 'drf_renderer_xlsx.renderers.XLSXRenderer', + ), + } + +To avoid having a file streamed without a filename (which the browser will often default to the filename "download", with no extension), we need to use a mixin to override the `Content-Disposition` header. If no filename is provided, it will default to `export.xlsx`. For example: + + from rest_framework.viewsets import ReadOnlyModelViewSet + from drf_renderer_xlsx.mixins import XLSXFileMixin + from drf_renderer_xlsx.renderers import XLSXRenderer + + from .models import MyExampleModel + from .serializers import MyExampleSerializer + + class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet): + queryset = MyExampleModel.objects.all() + serializer_class = MyExampleSerializer + renderer_classes = (XLSXRenderer,) + filename = 'my_export.xlsx' + ## CSV Comma-separated values are a plain-text tabular data format, that can be easily imported into spreadsheet applications. [Mjumbe Poe][mjumbewu] maintains the [djangorestframework-csv][djangorestframework-csv] package which provides CSV renderer support for REST framework. @@ -497,6 +534,9 @@ Comma-separated values are a plain-text tabular data format, that can be easily [messagepack]: https://msgpack.org/ [juanriaza]: https://github.com/juanriaza [mjumbewu]: https://github.com/mjumbewu +[flipperpa]: https://githuc.com/flipperpa +[wharton]: https://github.com/wharton +[drf-renderer-xlsx]: https://github.com/wharton/drf-renderer-xlsx [vbabiy]: https://github.com/vbabiy [rest-framework-yaml]: https://jpadilla.github.io/django-rest-framework-yaml/ [rest-framework-xml]: https://jpadilla.github.io/django-rest-framework-xml/ From 69f605f30e271b5ca8efbf0638143fdf88877969 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Thu, 6 Sep 2018 18:16:06 -0700 Subject: [PATCH 07/50] Fix validate_my_field signature --- docs/api-guide/serializers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index 07921f2d9..7cf7a6974 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -1030,7 +1030,7 @@ Similar to Django forms, you can extend and reuse serializers through inheritanc class MyBaseSerializer(Serializer): my_field = serializers.CharField() - def validate_my_field(self): + def validate_my_field(self, value): ... class MySerializer(MyBaseSerializer): From 4d57d46bf89f54f276909219ee06f0a2bf112f9f Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sun, 9 Sep 2018 03:53:41 -0700 Subject: [PATCH 08/50] Prefer io.BytesIO over six; available on all supported Pythons (#6168) On all supported Pythons, the io.BytesIO is always a stream implementation using an in-memory bytes buffer. Makes code slightly more forward compatible by reducing use of the six module and promotes more forward compatible practices in the docs. --- docs/api-guide/serializers.md | 4 ++-- docs/tutorial/1-serialization.md | 4 ++-- rest_framework/request.py | 3 ++- tests/test_parsers.py | 7 ++++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index 7cf7a6974..19501718e 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -57,10 +57,10 @@ At this point we've translated the model instance into Python native datatypes. Deserialization is similar. First we parse a stream into Python native datatypes... - from django.utils.six import BytesIO + import io from rest_framework.parsers import JSONParser - stream = BytesIO(json) + stream = io.BytesIO(json) data = JSONParser().parse(stream) ...then we restore those native datatypes into a dictionary of validated data. diff --git a/docs/tutorial/1-serialization.md b/docs/tutorial/1-serialization.md index aa94eeb0e..630c3da0a 100644 --- a/docs/tutorial/1-serialization.md +++ b/docs/tutorial/1-serialization.md @@ -154,9 +154,9 @@ At this point we've translated the model instance into Python native datatypes. Deserialization is similar. First we parse a stream into Python native datatypes... - from django.utils.six import BytesIO + import io - stream = BytesIO(content) + stream = io.BytesIO(content) data = JSONParser().parse(stream) ...then we restore those native datatypes into a fully populated object instance. diff --git a/rest_framework/request.py b/rest_framework/request.py index 9d4f73d30..a6d92e2bd 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -10,6 +10,7 @@ The wrapped request then offers a richer API, in particular : """ from __future__ import unicode_literals +import io import sys from contextlib import contextmanager @@ -301,7 +302,7 @@ class Request(object): elif not self._request._read_started: self._stream = self._request else: - self._stream = six.BytesIO(self.body) + self._stream = io.BytesIO(self.body) def _supports_form_parsing(self): """ diff --git a/tests/test_parsers.py b/tests/test_parsers.py index d1287ecd6..e793948e3 100644 --- a/tests/test_parsers.py +++ b/tests/test_parsers.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import io import math import pytest @@ -10,7 +11,7 @@ from django.core.files.uploadhandler import ( ) from django.http.request import RawPostDataException from django.test import TestCase -from django.utils.six import BytesIO, StringIO +from django.utils.six import StringIO from rest_framework.exceptions import ParseError from rest_framework.parsers import ( @@ -43,7 +44,7 @@ class TestFileUploadParser(TestCase): def setUp(self): class MockRequest(object): pass - self.stream = BytesIO( + self.stream = io.BytesIO( "Test text file".encode('utf-8') ) request = MockRequest() @@ -131,7 +132,7 @@ class TestFileUploadParser(TestCase): class TestJSONParser(TestCase): def bytes(self, value): - return BytesIO(value.encode('utf-8')) + return io.BytesIO(value.encode('utf-8')) def test_float_strictness(self): parser = JSONParser() From 612a7b989f94aaedf12a7bfc3362a2d43537aca4 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Tue, 11 Sep 2018 07:12:32 +0300 Subject: [PATCH 09/50] Fix Python 3.8 compatibility (#6154) --- rest_framework/compat.py | 7 +++++++ rest_framework/serializers.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 28e1f1f59..2f4729214 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -10,6 +10,13 @@ from django.core import validators from django.utils import six from django.views.generic import View +try: + # Python 3 (required for 3.8+) + from collections.abc import Mapping # noqa +except ImportError: + # Python 2.7 + from collections import Mapping # noqa + try: from django.urls import ( # noqa URLPattern, diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index fb4b8d393..110ffbfa9 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -15,7 +15,7 @@ from __future__ import unicode_literals import copy import inspect import traceback -from collections import Mapping, OrderedDict +from collections import OrderedDict from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ValidationError as DjangoValidationError @@ -27,7 +27,7 @@ from django.utils import six, timezone from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ -from rest_framework.compat import postgres_fields, unicode_to_repr +from rest_framework.compat import Mapping, postgres_fields, unicode_to_repr from rest_framework.exceptions import ErrorDetail, ValidationError from rest_framework.fields import get_error_detail, set_value from rest_framework.settings import api_settings From 7f77340b331e68357535a83e90eb0f8e1002b943 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Mon, 10 Sep 2018 21:44:23 -0700 Subject: [PATCH 10/50] Add Python 3.7 support (#6141) --- .travis.yml | 6 +++++- README.md | 18 +++++++++--------- docs/index.md | 2 +- tests/test_model_serializer.py | 5 +++++ tox.ini | 6 +++--- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index b8c5b385c..2620e079d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,11 @@ matrix: - { python: "3.6", env: DJANGO=1.11 } - { python: "3.6", env: DJANGO=2.0 } - { python: "3.6", env: DJANGO=2.1 } + + - { python: "3.7", env: DJANGO=2.0, dist: xenial, sudo: true } + - { python: "3.7", env: DJANGO=2.1, dist: xenial, sudo: true } + - { python: "3.7", env: DJANGO=master, dist: xenial, sudo: true } + - { python: "3.6", env: TOXENV=base } - { python: "2.7", env: TOXENV=lint } - { python: "2.7", env: TOXENV=docs } @@ -42,7 +47,6 @@ matrix: allow_failures: - env: DJANGO=master - - env: DJANGO=2.1 install: - pip install tox tox-venv tox-travis diff --git a/README.md b/README.md index b9c5d449d..06e43ae3a 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ There is a live example API for testing purposes, [available here][sandbox]. # Requirements -* Python (2.7, 3.4, 3.5, 3.6) +* Python (2.7, 3.4, 3.5, 3.6, 3.7) * Django (1.11, 2.0, 2.1) # Installation @@ -142,14 +142,14 @@ You can now open the API in your browser at `http://127.0.0.1:8000/`, and view y You can also interact with the API using command line tools such as [`curl`](https://curl.haxx.se/). For example, to list the users endpoint: $ curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ - [ - { - "url": "http://127.0.0.1:8000/users/1/", - "username": "admin", - "email": "admin@example.com", - "is_staff": true, - } - ] + [ + { + "url": "http://127.0.0.1:8000/users/1/", + "username": "admin", + "email": "admin@example.com", + "is_staff": true, + } + ] Or to create a new user: diff --git a/docs/index.md b/docs/index.md index a3ae88ede..9c34133cd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -83,7 +83,7 @@ continued development by **[signing up for a paid plan][funding]**. REST framework requires the following: -* Python (2.7, 3.4, 3.5, 3.6) +* Python (2.7, 3.4, 3.5, 3.6, 3.7) * Django (1.11, 2.0, 2.1) The following packages are optional: diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 7e801badb..1bd1fd053 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -9,6 +9,7 @@ from __future__ import unicode_literals import datetime import decimal +import sys from collections import OrderedDict import pytest @@ -381,6 +382,10 @@ class TestDurationFieldMapping(TestCase): TestSerializer(): id = IntegerField(label='ID', read_only=True) duration_field = DurationField(max_value=datetime.timedelta(3), min_value=datetime.timedelta(1)) + """) if sys.version_info < (3, 7) else dedent(""" + TestSerializer(): + id = IntegerField(label='ID', read_only=True) + duration_field = DurationField(max_value=datetime.timedelta(days=3), min_value=datetime.timedelta(days=1)) """) self.assertEqual(unicode_repr(TestSerializer()), expected) diff --git a/tox.ini b/tox.ini index 59aa38623..968ec1ef1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,9 @@ [tox] envlist = {py27,py34,py35,py36}-django111, - {py34,py35,py36}-django20, - {py35,py36}-django21 - {py35,py36}-djangomaster, + {py34,py35,py36,py37}-django20, + {py35,py36,py37}-django21 + {py35,py36,py37}-djangomaster, base,dist,lint,docs, [travis:env] From 4033f0c6b3b432e203d37788ea68143fb6681da9 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 11 Sep 2018 11:40:47 +0100 Subject: [PATCH 11/50] Add Load Impact to premium sponsors (#6176) --- README.md | 8 ++++---- docs/img/premium/load-impact-readme.png | Bin 0 -> 23967 bytes docs/index.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 docs/img/premium/load-impact-readme.png diff --git a/README.md b/README.md index 06e43ae3a..817d0d939 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,11 @@ The initial aim is to provide a single full-time position on REST framework. [![][rover-img]][rover-url] [![][sentry-img]][sentry-url] [![][stream-img]][stream-url] -[![][machinalis-img]][machinalis-url] [![][rollbar-img]][rollbar-url] [![][cadre-img]][cadre-url] +[![][load-impact-img]][load-impact-url] -Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover][rover-url], [Sentry][sentry-url], [Stream][stream-url], [Machinalis][machinalis-url], [Rollbar][rollbar-url], and [Cadre][cadre-url]. +Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover][rover-url], [Sentry][sentry-url], [Stream][stream-url], [Rollbar][rollbar-url], [Cadre][cadre-url], and [Load Impact][load-impact-url]. --- @@ -191,16 +191,16 @@ Send a description of the issue via email to [rest-framework-security@googlegrou [rover-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/rover-readme.png [sentry-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/sentry-readme.png [stream-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/stream-readme.png -[machinalis-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/machinalis-readme.png [rollbar-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/rollbar-readme.png [cadre-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cadre-readme.png +[load-impact-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/load-imapct-readme.png [rover-url]: http://jobs.rover.com/ [sentry-url]: https://getsentry.com/welcome/ [stream-url]: https://getstream.io/try-the-api/?utm_source=drf&utm_medium=banner&utm_campaign=drf -[machinalis-url]: https://hello.machinalis.co.uk/ [rollbar-url]: https://rollbar.com/ [cadre-url]: https://cadre.com/ +[load-imapct-url]: https://loadimpact.com/?utm_campaign=Sponsorship%20links&utm_source=drf&utm_medium=drf [oauth1-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth [oauth2-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit diff --git a/docs/img/premium/load-impact-readme.png b/docs/img/premium/load-impact-readme.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc6b9069ef63a6feb3fd88d94ee0275e45b7ccd GIT binary patch literal 23967 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 9c34133cd..1599a9bef 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,13 +69,13 @@ continued development by **[signing up for a paid plan][funding]**.
  • Rover.com
  • Sentry
  • Stream
  • -
  • Machinalis
  • Rollbar
  • Cadre
  • +
  • Load Impact
  • -*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), [Machinalis](https://hello.machinalis.co.uk/), [Rollbar](https://rollbar.com), and [Cadre](https://cadre.com).* +*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf), [Rollbar](https://rollbar.com), [Cadre](https://cadre.com), and [Load Impact](https://loadimpact.com/?utm_campaign=Sponsorship%20links&utm_source=drf&utm_medium=drf).* --- From 9140629c45a866fffa64805dfc1bd7467a6a2448 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 11 Sep 2018 11:41:49 +0100 Subject: [PATCH 12/50] Fix Load Impact URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 817d0d939..f84f1110a 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ Send a description of the issue via email to [rest-framework-security@googlegrou [stream-url]: https://getstream.io/try-the-api/?utm_source=drf&utm_medium=banner&utm_campaign=drf [rollbar-url]: https://rollbar.com/ [cadre-url]: https://cadre.com/ -[load-imapct-url]: https://loadimpact.com/?utm_campaign=Sponsorship%20links&utm_source=drf&utm_medium=drf +[load-impact-url]: https://loadimpact.com/?utm_campaign=Sponsorship%20links&utm_source=drf&utm_medium=drf [oauth1-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth [oauth2-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit From 4e093b0e25bd0f4635b0dd03a4c9bfd9f082f8cf Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 11 Sep 2018 11:53:03 +0100 Subject: [PATCH 13/50] Add Load Impact to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f84f1110a..b54d1a200 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ Send a description of the issue via email to [rest-framework-security@googlegrou [stream-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/stream-readme.png [rollbar-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/rollbar-readme.png [cadre-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/cadre-readme.png -[load-impact-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/load-imapct-readme.png +[load-impact-img]: https://raw.githubusercontent.com/encode/django-rest-framework/master/docs/img/premium/load-impact-readme.png [rover-url]: http://jobs.rover.com/ [sentry-url]: https://getsentry.com/welcome/ From 5f1f2b100353970ac0dec672154fedd3df9d0a9f Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 11 Sep 2018 12:55:53 +0100 Subject: [PATCH 14/50] Higher res. load impact logo --- docs/img/premium/load-impact-readme.png | Bin 23967 -> 22333 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/premium/load-impact-readme.png b/docs/img/premium/load-impact-readme.png index 5dc6b9069ef63a6feb3fd88d94ee0275e45b7ccd..c46d36adaf85dfa0950c26b6a2fbbac4b5a1d1e5 100644 GIT binary patch delta 21400 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 delta 23047 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 a`2PXp+me-MpuKqj0000 Date: Thu, 13 Sep 2018 09:25:03 -0700 Subject: [PATCH 15/50] Allow nullable BooleanField in Django 2.1 (#6183) * Add tests for BooleanField when nullable * Allow nullable BooleanField in Django 2.1 * Drop 'BooleanField.allow_null' check * Remove conflicting false/null values --- rest_framework/fields.py | 11 ++++++----- tests/test_fields.py | 12 +++++++++++- tests/test_model_serializer.py | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 3278cf51c..3378de368 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -674,10 +674,7 @@ class BooleanField(Field): '0', 0, 0.0, False } - - def __init__(self, **kwargs): - assert 'allow_null' not in kwargs, '`allow_null` is not a valid option. Use `NullBooleanField` instead.' - super(BooleanField, self).__init__(**kwargs) + NULL_VALUES = {'null', 'Null', 'NULL', '', None} def to_internal_value(self, data): try: @@ -685,6 +682,8 @@ class BooleanField(Field): return True elif data in self.FALSE_VALUES: return False + elif data in self.NULL_VALUES and self.allow_null: + return None except TypeError: # Input is an unhashable type pass self.fail('invalid', input=data) @@ -694,6 +693,8 @@ class BooleanField(Field): return True elif value in self.FALSE_VALUES: return False + if value in self.NULL_VALUES and self.allow_null: + return None return bool(value) @@ -718,7 +719,7 @@ class NullBooleanField(Field): '0', 0, 0.0, False } - NULL_VALUES = {'n', 'N', 'null', 'Null', 'NULL', '', None} + NULL_VALUES = {'null', 'Null', 'NULL', '', None} def __init__(self, **kwargs): assert 'allow_null' not in kwargs, '`allow_null` is not a valid option.' diff --git a/tests/test_fields.py b/tests/test_fields.py index aa3391a72..1b8f596e2 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -657,7 +657,7 @@ class TestBooleanField(FieldValues): class TestNullBooleanField(TestBooleanField): """ - Valid and invalid values for `BooleanField`. + Valid and invalid values for `NullBooleanField`. """ valid_inputs = { 'true': True, @@ -682,6 +682,16 @@ class TestNullBooleanField(TestBooleanField): field = serializers.NullBooleanField() +class TestNullableBooleanField(TestNullBooleanField): + """ + Valid and invalid values for `BooleanField` when `allow_null=True`. + """ + + @property + def field(self): + return serializers.BooleanField(allow_null=True) + + # String types... class TestCharField(FieldValues): diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 1bd1fd053..e9ed9957f 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -12,6 +12,7 @@ import decimal import sys from collections import OrderedDict +import django import pytest from django.core.exceptions import ImproperlyConfigured from django.core.validators import ( @@ -220,6 +221,25 @@ class TestRegularFieldMappings(TestCase): ) self.assertEqual(unicode_repr(TestSerializer()), expected) + # merge this into test_regular_fields / RegularFieldsModel when + # Django 2.1 is the minimum supported version + @pytest.mark.skipif(django.VERSION < (2, 1), reason='Django version < 2.1') + def test_nullable_boolean_field(self): + class NullableBooleanModel(models.Model): + field = models.BooleanField(null=True, default=False) + + class NullableBooleanSerializer(serializers.ModelSerializer): + class Meta: + model = NullableBooleanModel + fields = ['field'] + + expected = dedent(""" + NullableBooleanSerializer(): + field = BooleanField(allow_null=True, required=False) + """) + + self.assertEqual(unicode_repr(NullableBooleanSerializer()), expected) + def test_method_field(self): """ Properties and methods on the model should be allowed as `Meta.fields` From ed6340ee7619d7e8c3419ffacb973f7ca0c329d3 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Mon, 17 Sep 2018 01:39:59 -0700 Subject: [PATCH 16/50] Remove unnecessary use of compat shim six.binary_type (#6189) The type bytes is available on all supported Pythons. On Python 2.7, it is an alias for str, same as six.binary_type. Makes the code more forward compatible with Python 3. --- rest_framework/compat.py | 2 +- rest_framework/fields.py | 2 +- rest_framework/utils/encoders.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 2f4729214..d6559d5f5 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -96,7 +96,7 @@ def unicode_to_repr(value): def unicode_http_header(value): # Coerce HTTP header value to unicode. - if isinstance(value, six.binary_type): + if isinstance(value, bytes): return value.decode('iso-8859-1') return value diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 3378de368..61f3451b0 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1780,7 +1780,7 @@ class JSONField(Field): def to_internal_value(self, data): try: if self.binary or getattr(data, 'is_json_string', False): - if isinstance(data, six.binary_type): + if isinstance(data, bytes): data = data.decode('utf-8') return json.loads(data) else: diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py index fe8f76dd5..d8f4aeb4e 100644 --- a/rest_framework/utils/encoders.py +++ b/rest_framework/utils/encoders.py @@ -47,7 +47,7 @@ class JSONEncoder(json.JSONEncoder): return six.text_type(obj) elif isinstance(obj, QuerySet): return tuple(obj) - elif isinstance(obj, six.binary_type): + elif isinstance(obj, bytes): # Best-effort for binary blobs. See #4187. return obj.decode('utf-8') elif hasattr(obj, 'tolist'): From 5174a26ec9d50c7b1e934ee2613de4ae2e2c8c6a Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Mon, 17 Sep 2018 01:41:55 -0700 Subject: [PATCH 17/50] Simplify job matrix on Travis (#6174) * Move to explicit Travis matrix * Cleanup Python 3.6 matrix --- .travis.yml | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2620e079d..a0d72e3d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,26 +1,25 @@ language: python cache: pip -python: - - "2.7" - - "3.4" - - "3.5" - sudo: false -env: - - DJANGO=1.11 - - DJANGO=2.0 - - DJANGO=2.1 - - DJANGO=master - matrix: fast_finish: true include: - - { python: "3.6", env: DJANGO=master } + - { python: "2.7", env: DJANGO=1.11 } + + - { python: "3.4", env: DJANGO=1.11 } + - { python: "3.4", env: DJANGO=2.0 } + + - { python: "3.5", env: DJANGO=1.11 } + - { python: "3.5", env: DJANGO=2.0 } + - { python: "3.5", env: DJANGO=2.1 } + - { python: "3.5", env: DJANGO=master } + - { python: "3.6", env: DJANGO=1.11 } - { python: "3.6", env: DJANGO=2.0 } - { python: "3.6", env: DJANGO=2.1 } + - { python: "3.6", env: DJANGO=master } - { python: "3.7", env: DJANGO=2.0, dist: xenial, sudo: true } - { python: "3.7", env: DJANGO=2.1, dist: xenial, sudo: true } @@ -38,13 +37,6 @@ matrix: - tox --installpkg ./dist/djangorestframework-*.whl - tox # test sdist - exclude: - - { python: "2.7", env: DJANGO=master } - - { python: "2.7", env: DJANGO=2.0 } - - { python: "2.7", env: DJANGO=2.1 } - - { python: "3.4", env: DJANGO=master } - - { python: "3.4", env: DJANGO=2.1 } - allow_failures: - env: DJANGO=master From b090ae9d30f26117f474479b853289a46c6ca615 Mon Sep 17 00:00:00 2001 From: Melissa Lewis Date: Tue, 18 Sep 2018 15:32:32 -0700 Subject: [PATCH 18/50] Fix docs typos (#6195) --- docs/api-guide/schemas.md | 4 ++-- docs/topics/documenting-your-api.md | 6 +++--- docs/topics/html-and-forms.md | 2 +- docs/topics/internationalization.md | 2 +- docs/topics/writable-nested-serializers.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index 6ad259588..8144f3eee 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -146,7 +146,7 @@ example above. Automatic schema generation is provided by the `SchemaGenerator` class. -`SchemaGenerator` processes a list of routed URL pattterns and compiles the +`SchemaGenerator` processes a list of routed URL patterns and compiles the appropriately structured Core API Document. Basic usage is just to provide the title for your schema and call @@ -818,7 +818,7 @@ A short description of the meaning and intended usage of the input field. ## drf-yasg - Yet Another Swagger Generator -[drf-yasg][drf-yasg] generates [OpenAPI][open-api] documents suitable for code generation - nested schemas, +[drf-yasg][drf-yasg] generates [OpenAPI][open-api] documents suitable for code generation - nested schemas, named models, response bodies, enum/pattern/min/max validators, form parameters, etc. diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index d57f9d6e4..71db39930 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -16,11 +16,11 @@ The built-in API documentation includes: ### Installation -The `coreapi` library is required as a dependancy for the API docs. Make sure +The `coreapi` library is required as a dependency for the API docs. Make sure to install the latest version. The `pygments` and `markdown` libraries are optional but recommended. -To install the API documentation, you'll need to include it in your projects URLconf: +To install the API documentation, you'll need to include it in your project's URLconf: from rest_framework.documentation import include_docs_urls @@ -39,7 +39,7 @@ This will include two different views: **Note**: By default `include_docs_urls` configures the underlying `SchemaView` to generate _public_ schemas. This means that views will not be instantiated with a `request` instance. i.e. Inside the view `self.request` will be `None`. -To be compatible with this behaviour methods (such as `get_serializer` or `get_serializer_class` etc.) which inspect `self.request` or, particularly, `self.request.user` may need to be adjusted to handle this case. +To be compatible with this behaviour, methods (such as `get_serializer` or `get_serializer_class` etc.) which inspect `self.request` or, particularly, `self.request.user` may need to be adjusted to handle this case. You may ensure views are given a `request` instance by calling `include_docs_urls` with `public=False`: diff --git a/docs/topics/html-and-forms.md b/docs/topics/html-and-forms.md index 0b4afca12..18774926b 100644 --- a/docs/topics/html-and-forms.md +++ b/docs/topics/html-and-forms.md @@ -4,7 +4,7 @@ REST framework is suitable for returning both API style responses, and regular H ## Rendering HTML -In order to return HTML responses you'll need to either `TemplateHTMLRenderer`, or `StaticHTMLRenderer`. +In order to return HTML responses you'll need to use either `TemplateHTMLRenderer`, or `StaticHTMLRenderer`. The `TemplateHTMLRenderer` class expects the response to contain a dictionary of context data, and renders an HTML page based on a template that must be specified either in the view or on the response. diff --git a/docs/topics/internationalization.md b/docs/topics/internationalization.md index ed8b85836..7cfc6e247 100644 --- a/docs/topics/internationalization.md +++ b/docs/topics/internationalization.md @@ -43,7 +43,7 @@ REST framework includes these built-in translations both for standard exception Note that the translations only apply to the error strings themselves. The format of error messages, and the keys of field names will remain the same. An example `400 Bad Request` response body might look like this: - {"detail": {"username": ["Esse campo deve ser unico."]}} + {"detail": {"username": ["Esse campo deve ser Ăşnico."]}} If you want to use different string for parts of the response such as `detail` and `non_field_errors` then you can modify this behavior by using a [custom exception handler][custom-exception-handler]. diff --git a/docs/topics/writable-nested-serializers.md b/docs/topics/writable-nested-serializers.md index a39feb18c..9ba719f4e 100644 --- a/docs/topics/writable-nested-serializers.md +++ b/docs/topics/writable-nested-serializers.md @@ -27,7 +27,7 @@ Nested data structures are easy enough to work with if they're read-only - simpl Some example output from our serializer. { - 'title': 'Leaving party preperations', + 'title': 'Leaving party preparations', 'items': [ {'text': 'Compile playlist', 'is_completed': True}, {'text': 'Send invites', 'is_completed': False}, From d976ac56b0b108a65eeb67eb812e700df4addc72 Mon Sep 17 00:00:00 2001 From: Anish Shrestha Date: Fri, 21 Sep 2018 12:40:32 +0545 Subject: [PATCH 19/50] Fix spelling error (#6198) --- docs/api-guide/requests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/requests.md b/docs/api-guide/requests.md index 83a38d1c3..35b976c66 100644 --- a/docs/api-guide/requests.md +++ b/docs/api-guide/requests.md @@ -90,7 +90,7 @@ You won't typically need to access this property. --- -**Note:** You may see a `WrappedAttributeError` raised when calling the `.user` or `.auth` properties. These errors originate from an authenticator as a standard `AttributeError`, however it's necessary that they be re-raised as a different exception type in order to prevent them from being suppressed by the outer property access. Python will not recognize that the `AttributeError` orginates from the authenticator and will instaed assume that the request object does not have a `.user` or `.auth` property. The authenticator will need to be fixed. +**Note:** You may see a `WrappedAttributeError` raised when calling the `.user` or `.auth` properties. These errors originate from an authenticator as a standard `AttributeError`, however it's necessary that they be re-raised as a different exception type in order to prevent them from being suppressed by the outer property access. Python will not recognize that the `AttributeError` orginates from the authenticator and will instead assume that the request object does not have a `.user` or `.auth` property. The authenticator will need to be fixed. --- From 2e8ccfd883ea2c4e304a03b3585e1fa7f9fe3d0a Mon Sep 17 00:00:00 2001 From: Anish Shrestha Date: Wed, 26 Sep 2018 00:56:13 +0545 Subject: [PATCH 20/50] Fix typo in docs (#6212) --- docs/api-guide/viewsets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/viewsets.md b/docs/api-guide/viewsets.md index d98f518b3..819b6cec3 100644 --- a/docs/api-guide/viewsets.md +++ b/docs/api-guide/viewsets.md @@ -158,7 +158,7 @@ A more complete example of extra actions: @action(detail=False) def recent_users(self, request): - recent_users = User.objects.all().order('-last_login') + recent_users = User.objects.all().order_by('-last_login') page = self.paginate_queryset(recent_users) if page is not None: From d1514d1f9c4ead98a4a5d2ff817951e03ca0808d Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 1 Oct 2018 17:12:03 +0100 Subject: [PATCH 21/50] Update codecov.yml (#6224) --- codecov.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/codecov.yml b/codecov.yml index edccd5c35..db6f6873f 100644 --- a/codecov.yml +++ b/codecov.yml @@ -4,5 +4,4 @@ coverage: patch: true changes: true -comment: - layout: "diff" +comment: off From 878f9d2783838801adcd9f551d6f229839d885a3 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 2 Oct 2018 01:28:58 -0500 Subject: [PATCH 22/50] Prefer https:// for URLs when available throughout project (#6208) --- ISSUE_TEMPLATE.md | 2 +- LICENSE.md | 2 +- README.md | 28 +++++++++---------- docs/api-guide/format-suffixes.md | 2 +- docs/api-guide/metadata.md | 2 +- docs/api-guide/pagination.md | 2 +- docs/api-guide/relations.md | 2 +- docs/api-guide/renderers.md | 4 +-- docs/api-guide/routers.md | 2 +- docs/api-guide/schemas.md | 6 ++-- docs/api-guide/validators.md | 2 +- docs/api-guide/viewsets.md | 2 +- docs/community/3.0-announcement.md | 2 +- docs/community/3.2-announcement.md | 2 +- docs/community/3.4-announcement.md | 6 ++-- docs/community/funding.md | 10 +++---- docs/community/kickstarter-announcement.md | 6 ++-- docs/community/mozilla-grant.md | 4 +-- docs/community/project-management.md | 10 +++---- docs/community/tutorials-and-resources.md | 4 +-- docs/topics/api-clients.md | 4 +-- docs/topics/browser-enhancements.md | 2 +- docs/topics/documenting-your-api.md | 2 +- docs/topics/rest-hypermedia-hateoas.md | 2 +- .../7-schemas-and-client-libraries.md | 6 ++-- docs_theme/404.html | 2 +- docs_theme/css/bootstrap-responsive.css | 2 +- docs_theme/css/bootstrap.css | 2 +- docs_theme/nav.html | 2 +- mkdocs.yml | 2 +- rest_framework/pagination.py | 2 +- rest_framework/settings.py | 2 +- .../templates/rest_framework/admin.html | 2 +- .../templates/rest_framework/base.html | 2 +- setup.py | 2 +- 35 files changed, 68 insertions(+), 68 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 55b3e531b..8f2391d29 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -3,7 +3,7 @@ - [ ] I have verified that that issue exists against the `master` branch of Django REST framework. - [ ] I have searched for similar issues in both open and closed tickets and cannot find a duplicate. - [ ] This is not a usage question. (Those should be directed to the [discussion group](https://groups.google.com/forum/#!forum/django-rest-framework) instead.) -- [ ] This cannot be dealt with as a third party library. (We prefer new functionality to be [in the form of third party libraries](http://www.django-rest-framework.org/topics/third-party-resources/#about-third-party-packages) where possible.) +- [ ] 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/topics/third-party-resources/#about-third-party-packages) where possible.) - [ ] I have reduced the issue to the simplest possible case. - [ ] I have included a failing test as a pull request. (If you are unable to do so we can still accept the issue.) diff --git a/LICENSE.md b/LICENSE.md index 03213cbd6..3dea39c36 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -Copyright © 2011-present, [Encode OSS Ltd](http://www.encode.io/). +Copyright © 2011-present, [Encode OSS Ltd](https://www.encode.io/). All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index b54d1a200..919f85d00 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **Awesome web-browsable Web APIs.** -Full documentation for the project is available at [http://www.django-rest-framework.org][docs]. +Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. --- @@ -163,7 +163,7 @@ Or to create a new user: # Documentation & Support -Full documentation for the project is available at [http://www.django-rest-framework.org][docs]. +Full documentation for the project is available at [https://www.django-rest-framework.org/][docs]. For questions and support, use the [REST framework discussion group][group], or `#restframework` on freenode IRC. @@ -202,17 +202,17 @@ Send a description of the issue via email to [rest-framework-security@googlegrou [cadre-url]: https://cadre.com/ [load-impact-url]: https://loadimpact.com/?utm_campaign=Sponsorship%20links&utm_source=drf&utm_medium=drf -[oauth1-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth -[oauth2-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit -[serializer-section]: http://www.django-rest-framework.org/api-guide/serializers/#serializers -[modelserializer-section]: http://www.django-rest-framework.org/api-guide/serializers/#modelserializer -[functionview-section]: http://www.django-rest-framework.org/api-guide/views/#function-based-views -[generic-views]: http://www.django-rest-framework.org/api-guide/generic-views/ -[viewsets]: http://www.django-rest-framework.org/api-guide/viewsets/ -[routers]: http://www.django-rest-framework.org/api-guide/routers/ -[serializers]: http://www.django-rest-framework.org/api-guide/serializers/ -[authentication]: http://www.django-rest-framework.org/api-guide/authentication/ -[image]: http://www.django-rest-framework.org/img/quickstart.png +[oauth1-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth +[oauth2-section]: https://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit +[serializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#serializers +[modelserializer-section]: https://www.django-rest-framework.org/api-guide/serializers/#modelserializer +[functionview-section]: https://www.django-rest-framework.org/api-guide/views/#function-based-views +[generic-views]: https://www.django-rest-framework.org/api-guide/generic-views/ +[viewsets]: https://www.django-rest-framework.org/api-guide/viewsets/ +[routers]: https://www.django-rest-framework.org/api-guide/routers/ +[serializers]: https://www.django-rest-framework.org/api-guide/serializers/ +[authentication]: https://www.django-rest-framework.org/api-guide/authentication/ +[image]: https://www.django-rest-framework.org/img/quickstart.png -[docs]: http://www.django-rest-framework.org/ +[docs]: https://www.django-rest-framework.org/ [security-mail]: mailto:rest-framework-security@googlegroups.com diff --git a/docs/api-guide/format-suffixes.md b/docs/api-guide/format-suffixes.md index 05dde47f2..629f003f3 100644 --- a/docs/api-guide/format-suffixes.md +++ b/docs/api-guide/format-suffixes.md @@ -90,4 +90,4 @@ It is actually a misconception. For example, take the following quote from Roy The quote does not mention Accept headers, but it does make it clear that format suffixes should be considered an acceptable pattern. [cite]: http://tech.groups.yahoo.com/group/rest-discuss/message/5857 -[cite2]: http://tech.groups.yahoo.com/group/rest-discuss/message/14844 +[cite2]: https://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/14844 diff --git a/docs/api-guide/metadata.md b/docs/api-guide/metadata.md index affeea61c..a3ba9ac20 100644 --- a/docs/api-guide/metadata.md +++ b/docs/api-guide/metadata.md @@ -117,5 +117,5 @@ If you wish to do so, it also provides an exporter that can export those schema [cite]: https://tools.ietf.org/html/rfc7231#section-4.3.7 [no-options]: https://www.mnot.net/blog/2012/10/29/NO_OPTIONS -[json-schema]: http://json-schema.org/ +[json-schema]: https://json-schema.org/ [drf-schema-adapter]: https://github.com/drf-forms/drf-schema-adapter diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index c1e487c67..97590a785 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -319,5 +319,5 @@ The [`django-rest-framework-link-header-pagination` package][drf-link-header-pag [paginate-by-max-mixin]: https://chibisov.github.io/drf-extensions/docs/#paginatebymaxmixin [drf-proxy-pagination]: https://github.com/tuffnatty/drf-proxy-pagination [drf-link-header-pagination]: https://github.com/tbeadle/django-rest-framework-link-header-pagination -[disqus-cursor-api]: http://cra.mr/2011/03/08/building-cursors-for-the-disqus-api +[disqus-cursor-api]: https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api [float_cursor_pagination_example]: https://gist.github.com/keturn/8bc88525a183fd41c73ffb729b8865be#file-fpcursorpagination-py diff --git a/docs/api-guide/relations.md b/docs/api-guide/relations.md index 02ecf5b12..6a865b7d1 100644 --- a/docs/api-guide/relations.md +++ b/docs/api-guide/relations.md @@ -594,7 +594,7 @@ The [rest-framework-generic-relations][drf-nested-relations] library provides re [cite]: https://lwn.net/Articles/193245/ [reverse-relationships]: https://docs.djangoproject.com/en/stable/topics/db/queries/#following-relationships-backward -[routers]: http://www.django-rest-framework.org/api-guide/routers#defaultrouter +[routers]: https://www.django-rest-framework.org/api-guide/routers#defaultrouter [generic-relations]: https://docs.djangoproject.com/en/stable/ref/contrib/contenttypes/#id1 [drf-nested-routers]: https://github.com/alanjds/drf-nested-routers [drf-nested-relations]: https://github.com/Ian-Foote/rest-framework-generic-relations diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index d720dffc5..a43f4be8a 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -521,13 +521,13 @@ Comma-separated values are a plain-text tabular data format, that can be easily [browser-accept-headers]: http://www.gethifi.com/blog/browser-rest-http-accept-headers [testing]: testing.md [HATEOAS]: http://timelessrepo.com/haters-gonna-hateoas -[quote]: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven +[quote]: https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven [application/vnd.github+json]: https://developer.github.com/v3/media/ [application/vnd.collection+json]: http://www.amundsen.com/media-types/collection/ [django-error-views]: https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views [rest-framework-jsonp]: https://jpadilla.github.io/django-rest-framework-jsonp/ [cors]: https://www.w3.org/TR/cors/ -[cors-docs]: http://www.django-rest-framework.org/topics/ajax-csrf-cors/ +[cors-docs]: https://www.django-rest-framework.org/topics/ajax-csrf-cors/ [jsonp-security]: https://stackoverflow.com/questions/613962/is-jsonp-safe-to-use [rest-framework-yaml]: https://jpadilla.github.io/django-rest-framework-yaml/ [rest-framework-xml]: https://jpadilla.github.io/django-rest-framework-xml/ diff --git a/docs/api-guide/routers.md b/docs/api-guide/routers.md index d3ebd6866..09c6c39cb 100644 --- a/docs/api-guide/routers.md +++ b/docs/api-guide/routers.md @@ -325,7 +325,7 @@ The [wq.db package][wq.db] provides an advanced [ModelRouter][wq.db-router] clas The [`DRF-extensions` package][drf-extensions] provides [routers][drf-extensions-routers] for creating [nested viewsets][drf-extensions-nested-viewsets], [collection level controllers][drf-extensions-collection-level-controllers] with [customizable endpoint names][drf-extensions-customizable-endpoint-names]. -[cite]: http://guides.rubyonrails.org/routing.html +[cite]: https://guides.rubyonrails.org/routing.html [route-decorators]: viewsets.md#marking-extra-actions-for-routing [drf-nested-routers]: https://github.com/alanjds/drf-nested-routers [wq.db]: https://wq.io/wq.db diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index 8144f3eee..b1b6ae63e 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -829,12 +829,12 @@ in [OpenAPI][open-api] format. [cite]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api -[coreapi]: http://www.coreapi.org/ -[corejson]: http://www.coreapi.org/specification/encoding/#core-json-encoding +[coreapi]: https://www.coreapi.org/ +[corejson]: https://www.coreapi.org/specification/encoding/#core-json-encoding [drf-yasg]: https://github.com/axnsan12/drf-yasg/ [open-api]: https://openapis.org/ [drf-openapi]: https://github.com/limdauto/drf_openapi -[json-hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html +[json-hyperschema]: https://json-schema.org/latest/json-schema-hypermedia.html [api-blueprint]: https://apiblueprint.org/ [static-files]: https://docs.djangoproject.com/en/stable/howto/static-files/ [named-arguments]: https://docs.djangoproject.com/en/stable/topics/http/urls/#named-groups diff --git a/docs/api-guide/validators.md b/docs/api-guide/validators.md index 925f67206..3b50442cc 100644 --- a/docs/api-guide/validators.md +++ b/docs/api-guide/validators.md @@ -275,7 +275,7 @@ A validator may be any callable that raises a `serializers.ValidationError` on f You can specify custom field-level validation by adding `.validate_` methods to your `Serializer` subclass. This is documented in the -[Serializer docs](http://www.django-rest-framework.org/api-guide/serializers/#field-level-validation) +[Serializer docs](https://www.django-rest-framework.org/api-guide/serializers/#field-level-validation) ## Class-based diff --git a/docs/api-guide/viewsets.md b/docs/api-guide/viewsets.md index 819b6cec3..b912e0dac 100644 --- a/docs/api-guide/viewsets.md +++ b/docs/api-guide/viewsets.md @@ -314,5 +314,5 @@ To create a base viewset class that provides `create`, `list` and `retrieve` ope By creating your own base `ViewSet` classes, you can provide common behavior that can be reused in multiple viewsets across your API. -[cite]: http://guides.rubyonrails.org/routing.html +[cite]: https://guides.rubyonrails.org/routing.html [routers]: routers.md diff --git a/docs/community/3.0-announcement.md b/docs/community/3.0-announcement.md index 66a035380..83aec9e60 100644 --- a/docs/community/3.0-announcement.md +++ b/docs/community/3.0-announcement.md @@ -960,6 +960,6 @@ The 3.2 release is planned to introduce an alternative admin-style interface to You can follow development on the GitHub site, where we use [milestones to indicate planning timescales](https://github.com/encode/django-rest-framework/milestones). [kickstarter]: https://www.kickstarter.com/projects/tomchristie/django-rest-framework-3 -[sponsors]: http://www.django-rest-framework.org/topics/kickstarter-announcement/#sponsors +[sponsors]: https://www.django-rest-framework.org/topics/kickstarter-announcement/#sponsors [mixins.py]: https://github.com/encode/django-rest-framework/blob/master/rest_framework/mixins.py [django-localization]: https://docs.djangoproject.com/en/stable/topics/i18n/translation/#localization-how-to-create-language-files diff --git a/docs/community/3.2-announcement.md b/docs/community/3.2-announcement.md index c022231a0..a6db0e54b 100644 --- a/docs/community/3.2-announcement.md +++ b/docs/community/3.2-announcement.md @@ -10,7 +10,7 @@ We've also fixed a huge number of issues, and made numerous cleanups and improve Over the course of the 3.1.x series we've [resolved nearly 600 tickets](https://github.com/encode/django-rest-framework/issues?utf8=%E2%9C%93&q=closed%3A%3E2015-03-05) on our GitHub issue tracker. This means we're currently running at a rate of **closing around 100 issues or pull requests per month**. -None of this would have been possible without the support of our wonderful Kickstarter backers. If you're looking for a job in Django development we'd strongly recommend taking [a look through our sponsors](http://www.django-rest-framework.org/topics/kickstarter-announcement/#sponsors) and finding out who's hiring. +None of this would have been possible without the support of our wonderful Kickstarter backers. If you're looking for a job in Django development we'd strongly recommend taking [a look through our sponsors](https://www.django-rest-framework.org/topics/kickstarter-announcement/#sponsors) and finding out who's hiring. ## AdminRenderer diff --git a/docs/community/3.4-announcement.md b/docs/community/3.4-announcement.md index 73ec3f2a2..44270fd85 100644 --- a/docs/community/3.4-announcement.md +++ b/docs/community/3.4-announcement.md @@ -178,12 +178,12 @@ The full set of itemized release notes [are available here][release-notes]. [sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors [moss]: mozilla-grant.md [funding]: funding.md -[core-api]: http://www.coreapi.org/ +[core-api]: https://www.coreapi.org/ [command-line-client]: api-clients#command-line-client [client-library]: api-clients#python-client-library -[core-json]: http://www.coreapi.org/specification/encoding/#core-json-encoding +[core-json]: https://www.coreapi.org/specification/encoding/#core-json-encoding [swagger]: https://openapis.org/specification -[hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html +[hyperschema]: https://json-schema.org/latest/json-schema-hypermedia.html [api-blueprint]: https://apiblueprint.org/ [tut-7]: ../tutorial/7-schemas-and-client-libraries/ [schema-generation]: ../api-guide/schemas/ diff --git a/docs/community/funding.md b/docs/community/funding.md index 0faf2164b..8f0e02515 100644 --- a/docs/community/funding.md +++ b/docs/community/funding.md @@ -123,10 +123,10 @@ REST framework continues to be open-source and permissively licensed, but we fir ## What funding has enabled so far -* The [3.4](http://www.django-rest-framework.org/topics/3.4-announcement/) and [3.5](http://www.django-rest-framework.org/topics/3.5-announcement/) releases, including schema generation for both Swagger and RAML, a Python client library, a Command Line client, and addressing of a large number of outstanding issues. -* The [3.6](http://www.django-rest-framework.org/topics/3.6-announcement/) release, including JavaScript client library, and API documentation, complete with auto-generated code samples. -* The [3.7 release](http://www.django-rest-framework.org/topics/3.7-announcement/), made possible due to our collaborative funding model, focuses on improvements to schema generation and the interactive API documentation. -* The recent [3.8 release](http://www.django-rest-framework.org/topics/3.8-announcement/). +* The [3.4](https://www.django-rest-framework.org/topics/3.4-announcement/) and [3.5](https://www.django-rest-framework.org/topics/3.5-announcement/) releases, including schema generation for both Swagger and RAML, a Python client library, a Command Line client, and addressing of a large number of outstanding issues. +* The [3.6](https://www.django-rest-framework.org/topics/3.6-announcement/) release, including JavaScript client library, and API documentation, complete with auto-generated code samples. +* The [3.7 release](https://www.django-rest-framework.org/topics/3.7-announcement/), made possible due to our collaborative funding model, focuses on improvements to schema generation and the interactive API documentation. +* The recent [3.8 release](https://www.django-rest-framework.org/topics/3.8-announcement/). * Tom Christie, the creator of Django REST framework, working on the project full-time. * Around 80-90 issues and pull requests closed per month since Tom Christie started working on the project full-time. * A community & operations manager position part-time for 4 months, helping mature the business and grow sponsorship. @@ -341,7 +341,7 @@ For further enquires please contact diff --git a/docs/community/kickstarter-announcement.md b/docs/community/kickstarter-announcement.md index e2a283e29..0e5d95b2c 100644 --- a/docs/community/kickstarter-announcement.md +++ b/docs/community/kickstarter-announcement.md @@ -78,7 +78,7 @@ Our gold sponsors include companies large and small. Many thanks for their signi
  • Mirus Research
  • Hipo
  • Byte
  • -
  • Lightning Kite
  • +
  • Lightning Kite
  • Opbeat
  • Koordinates
  • Pulsecode Inc.
  • @@ -116,7 +116,7 @@ The serious financial contribution that our silver sponsors have made is very mu
  • Garfo
  • Shippo
  • Gizmag
  • -
  • Tivix
  • +
  • Tivix
  • Safari
  • Bright Loop
  • ABA Systems
  • @@ -131,7 +131,7 @@ The serious financial contribution that our silver sponsors have made is very mu
  • Fluxility
  • Teonite
  • TrackMaven
  • -
  • Phurba
  • +
  • Phurba
  • Nephila
  • Aditium
  • OpenEye Scientific Software
  • diff --git a/docs/community/mozilla-grant.md b/docs/community/mozilla-grant.md index 4d9b1d438..5248f5cc0 100644 --- a/docs/community/mozilla-grant.md +++ b/docs/community/mozilla-grant.md @@ -4,7 +4,7 @@ We have recently been [awarded a Mozilla grant](https://blog.mozilla.org/blog/20 Additionally, we will be building on the realtime support that Django Channels provides, supporting and documenting how to build realtime APIs with REST framework. Again, this will include supporting work in the associated client libraries, making it easier to build richly interactive applications. -The [Core API](http://www.coreapi.org) project will provide the foundations for our client library support, and will allow us to support interaction using a wide range of schemas and hypermedia formats. It's worth noting that these client libraries won't be tightly coupled to solely REST framework APIs either, and will be able to interact with *any* API that exposes a supported schema or hypermedia format. +The [Core API](https://www.coreapi.org/) project will provide the foundations for our client library support, and will allow us to support interaction using a wide range of schemas and hypermedia formats. It's worth noting that these client libraries won't be tightly coupled to solely REST framework APIs either, and will be able to interact with *any* API that exposes a supported schema or hypermedia format. Specifically, the work includes: @@ -34,7 +34,7 @@ In order to ensure that I can be fully focused on trying to secure a sustainable & well-funded open source business I will be leaving my current role at [DabApps](https://www.dabapps.com/) at the end of May 2016. -I have formed a UK limited company, [Encode](http://www.encode.io), which will +I have formed a UK limited company, [Encode](https://www.encode.io/), which will act as the business entity behind REST framework. I will be issuing monthly reports from Encode on progress both towards the Mozilla grant, and for development time funded via the [REST framework paid plans](funding.md). diff --git a/docs/community/project-management.md b/docs/community/project-management.md index c7f064e13..21f93b380 100644 --- a/docs/community/project-management.md +++ b/docs/community/project-management.md @@ -39,7 +39,7 @@ The following template should be used for the description of the issue, and serv This issue is for determining the maintenance team for the *** period. - Please see the [Project management](http://www.django-rest-framework.org/topics/project-management/) section of our documentation for more details. + Please see the [Project management](https://www.django-rest-framework.org/topics/project-management/) section of our documentation for more details. --- @@ -59,7 +59,7 @@ The following template should be used for the description of the issue, and serv If you wish to be considered for this or a future date, please comment against this or subsequent issues. - To modify this process for future maintenance cycles make a pull request to the [project management](http://www.django-rest-framework.org/topics/project-management/) documentation. + To modify this process for future maintenance cycles make a pull request to the [project management](https://www.django-rest-framework.org/topics/project-management/) documentation. #### Responsibilities of team members @@ -99,7 +99,7 @@ The following template should be used for the description of the issue, and serv During development cycle: - - [ ] Upload the new content to be translated to [transifex](http://www.django-rest-framework.org/topics/project-management/#translations). + - [ ] Upload the new content to be translated to [transifex](https://www.django-rest-framework.org/topics/project-management/#translations). Checklist: @@ -110,7 +110,7 @@ The following template should be used for the description of the issue, and serv - [ ] `setup.py` Python & Django version trove classifiers - [ ] `README` Python & Django versions - [ ] `docs` Python & Django versions - - [ ] Update the translations from [transifex](http://www.django-rest-framework.org/topics/project-management/#translations). + - [ ] Update the translations from [transifex](https://www.django-rest-framework.org/topics/project-management/#translations). - [ ] Ensure the pull request increments the version to `*.*.*` in [`restframework/__init__.py`](https://github.com/encode/django-rest-framework/blob/master/rest_framework/__init__.py). - [ ] Confirm with @tomchristie that release is finalized and ready to go. - [ ] Ensure that release date is included in pull request. @@ -122,7 +122,7 @@ The following template should be used for the description of the issue, and serv - [ ] Make a release announcement on twitter. - [ ] Close the milestone on GitHub. - To modify this process for future releases make a pull request to the [project management](http://www.django-rest-framework.org/topics/project-management/) documentation. + To modify this process for future releases make a pull request to the [project management](https://www.django-rest-framework.org/topics/project-management/) documentation. When pushing the release to PyPI ensure that your environment has been installed from our development `requirement.txt`, so that documentation and PyPI installs are consistently being built against a pinned set of packages. diff --git a/docs/community/tutorials-and-resources.md b/docs/community/tutorials-and-resources.md index 8c30bbeaa..a03d63a3c 100644 --- a/docs/community/tutorials-and-resources.md +++ b/docs/community/tutorials-and-resources.md @@ -85,8 +85,8 @@ Want your Django REST Framework talk/tutorial/article to be added to our website [beginners-guide-to-the-django-rest-framework]: https://code.tutsplus.com/tutorials/beginners-guide-to-the-django-rest-framework--cms-19786 -[getting-started-with-django-rest-framework-and-angularjs]: http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html -[end-to-end-web-app-with-django-rest-framework-angularjs]: http://mourafiq.com/2013/07/01/end-to-end-web-app-with-django-angular-1.html +[getting-started-with-django-rest-framework-and-angularjs]: https://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html +[end-to-end-web-app-with-django-rest-framework-angularjs]: https://mourafiq.com/2013/07/01/end-to-end-web-app-with-django-angular-1.html [start-your-api-django-rest-framework-part-1]: https://godjango.com/41-start-your-api-django-rest-framework-part-1/ [permissions-authentication-django-rest-framework-part-2]: https://godjango.com/43-permissions-authentication-django-rest-framework-part-2/ [viewsets-and-routers-django-rest-framework-part-3]: https://godjango.com/45-viewsets-and-routers-django-rest-framework-part-3/ diff --git a/docs/topics/api-clients.md b/docs/topics/api-clients.md index ec0b4272c..3fd560634 100644 --- a/docs/topics/api-clients.md +++ b/docs/topics/api-clients.md @@ -521,7 +521,7 @@ You'll either want to include the API schema in your codebase directly, by copyi }) [heroku-api]: https://devcenter.heroku.com/categories/platform-api -[heroku-example]: http://www.coreapi.org/tools-and-resources/example-services/#heroku-json-hyper-schema -[core-api]: http://www.coreapi.org/ +[heroku-example]: https://www.coreapi.org/tools-and-resources/example-services/#heroku-json-hyper-schema +[core-api]: https://www.coreapi.org/ [schema-generation]: ../api-guide/schemas.md [transport-adaptors]: http://docs.python-requests.org/en/master/user/advanced/#transport-adapters diff --git a/docs/topics/browser-enhancements.md b/docs/topics/browser-enhancements.md index 32eab43a8..0e79a66e1 100644 --- a/docs/topics/browser-enhancements.md +++ b/docs/topics/browser-enhancements.md @@ -82,6 +82,6 @@ as well as how to support content types other than form-encoded data. [cite]: https://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260 [ajax-form]: https://github.com/encode/ajax-form -[rails]: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work +[rails]: https://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work [html5]: https://www.w3.org/TR/html5-diff/#changes-2010-06-24 [put_delete]: http://amundsen.com/examples/put-delete-forms/ diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index 71db39930..f57b51ee0 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -313,7 +313,7 @@ In this approach, rather than documenting the available API endpoints up front, To implement a hypermedia API you'll need to decide on an appropriate media type for the API, and implement a custom renderer and parser for that media type. The [REST, Hypermedia & HATEOAS][hypermedia-docs] section of the documentation includes pointers to background reading, as well as links to various hypermedia formats. -[cite]: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven +[cite]: https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven [drf-yasg]: https://github.com/axnsan12/drf-yasg/ [image-drf-yasg]: ../img/drf-yasg.png [drf-openapi]: https://github.com/limdauto/drf_openapi/ diff --git a/docs/topics/rest-hypermedia-hateoas.md b/docs/topics/rest-hypermedia-hateoas.md index aa889f62b..d48319a26 100644 --- a/docs/topics/rest-hypermedia-hateoas.md +++ b/docs/topics/rest-hypermedia-hateoas.md @@ -36,7 +36,7 @@ What REST framework doesn't do is give you machine readable hypermedia formats s [cite]: https://vimeo.com/channels/restfest/page:2 [dissertation]: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm -[hypertext-driven]: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven +[hypertext-driven]: https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven [restful-web-apis]: http://restfulwebapis.org/ [building-hypermedia-apis]: https://www.amazon.com/Building-Hypermedia-APIs-HTML5-Node/dp/1449306578 [designing-hypermedia-apis]: http://designinghypermediaapis.com/ diff --git a/docs/tutorial/7-schemas-and-client-libraries.md b/docs/tutorial/7-schemas-and-client-libraries.md index f8060ac29..412759834 100644 --- a/docs/tutorial/7-schemas-and-client-libraries.md +++ b/docs/tutorial/7-schemas-and-client-libraries.md @@ -89,7 +89,7 @@ Now check that it is available on the command line... Command line client for interacting with CoreAPI services. - Visit http://www.coreapi.org for more information. + Visit https://www.coreapi.org/ for more information. Options: --version Display the package version number. @@ -220,8 +220,8 @@ We've reached the end of our tutorial. If you want to get more involved in the **Now go build awesome things.** -[coreapi]: http://www.coreapi.org -[corejson]: http://www.coreapi.org/specification/encoding/#core-json-encoding +[coreapi]: https://www.coreapi.org/ +[corejson]: https://www.coreapi.org/specification/encoding/#core-json-encoding [openapi]: https://openapis.org/ [repo]: https://github.com/encode/rest-framework-tutorial [sandbox]: https://restframework.herokuapp.com/ diff --git a/docs_theme/404.html b/docs_theme/404.html index 078b9f5ae..a89c0a418 100644 --- a/docs_theme/404.html +++ b/docs_theme/404.html @@ -4,6 +4,6 @@

    404

    Page not found

    -

    Try the homepage, or search the documentation.

    +

    Try the homepage, or search the documentation.

    {% endblock %} diff --git a/docs_theme/css/bootstrap-responsive.css b/docs_theme/css/bootstrap-responsive.css index a8caf451d..ec0b51947 100755 --- a/docs_theme/css/bootstrap-responsive.css +++ b/docs_theme/css/bootstrap-responsive.css @@ -3,7 +3,7 @@ * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ diff --git a/docs_theme/css/bootstrap.css b/docs_theme/css/bootstrap.css index 53df68595..a48bbbecf 100755 --- a/docs_theme/css/bootstrap.css +++ b/docs_theme/css/bootstrap.css @@ -3,7 +3,7 @@ * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ diff --git a/docs_theme/nav.html b/docs_theme/nav.html index 914d80a27..f093178d3 100644 --- a/docs_theme/nav.html +++ b/docs_theme/nav.html @@ -14,7 +14,7 @@ - Django REST framework + Django REST framework