From 7a87893b962d155f5e9d06bd0001a7f994419a2d Mon Sep 17 00:00:00 2001 From: Chris Guethle Date: Thu, 24 Oct 2013 09:40:43 -0500 Subject: [PATCH 001/156] reworked APIException, pushing some of the status_code and detail management up. Also, makes the APIException useful in isolation (defaults to status code 500) --- rest_framework/exceptions.py | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py index 425a72149..2bd21de3b 100644 --- a/rest_framework/exceptions.py +++ b/rest_framework/exceptions.py @@ -13,47 +13,40 @@ class APIException(Exception): Base class for REST framework exceptions. Subclasses should provide `.status_code` and `.detail` properties. """ - pass + status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + default_detail = "" + + def __init__(self, detail=None, status_code=None): + self.status_code = status_code or self.status_code + self.detail = detail or self.default_detail class ParseError(APIException): status_code = status.HTTP_400_BAD_REQUEST default_detail = 'Malformed request.' - def __init__(self, detail=None): - self.detail = detail or self.default_detail - class AuthenticationFailed(APIException): status_code = status.HTTP_401_UNAUTHORIZED default_detail = 'Incorrect authentication credentials.' - def __init__(self, detail=None): - self.detail = detail or self.default_detail - class NotAuthenticated(APIException): status_code = status.HTTP_401_UNAUTHORIZED default_detail = 'Authentication credentials were not provided.' - def __init__(self, detail=None): - self.detail = detail or self.default_detail - class PermissionDenied(APIException): status_code = status.HTTP_403_FORBIDDEN default_detail = 'You do not have permission to perform this action.' - def __init__(self, detail=None): - self.detail = detail or self.default_detail - class MethodNotAllowed(APIException): status_code = status.HTTP_405_METHOD_NOT_ALLOWED default_detail = "Method '%s' not allowed." def __init__(self, method, detail=None): - self.detail = (detail or self.default_detail) % method + super(MethodNotAllowed, self).__init__((detail or self.default_detail) % method) class NotAcceptable(APIException): @@ -61,7 +54,7 @@ class NotAcceptable(APIException): default_detail = "Could not satisfy the request's Accept header" def __init__(self, detail=None, available_renderers=None): - self.detail = detail or self.default_detail + super(NotAcceptable, self).__init__(detail) self.available_renderers = available_renderers @@ -70,19 +63,19 @@ class UnsupportedMediaType(APIException): default_detail = "Unsupported media type '%s' in request." def __init__(self, media_type, detail=None): - self.detail = (detail or self.default_detail) % media_type + super(UnsupportedMediaType, self).__init__((detail or self.default_detail) % media_type) class Throttled(APIException): status_code = status.HTTP_429_TOO_MANY_REQUESTS - default_detail = "Request was throttled." + default_detail = 'Request was throttled.' extra_detail = "Expected available in %d second%s." def __init__(self, wait=None, detail=None): + super(Throttled, self).__init__(detail) + import math self.wait = wait and math.ceil(wait) or None if wait is not None: - format = detail or self.default_detail + self.extra_detail - self.detail = format % (self.wait, self.wait != 1 and 's' or '') - else: - self.detail = detail or self.default_detail + format = self.detail + self.extra_detail + self.detail = format % (self.wait, self.wait != 1 and 's' or '') \ No newline at end of file From 80e9f0d64b0ace50d413eaccbf28a3b4ded75ed3 Mon Sep 17 00:00:00 2001 From: Yin Jifeng Date: Mon, 23 Dec 2013 11:02:07 +0800 Subject: [PATCH 002/156] fix url double quoted in Django 1.6 get_full_path returns unicode, so we use build_absolute_uri which returns iri_to_uri'ed one --- rest_framework/templatetags/rest_framework.py | 2 +- rest_framework/tests/test_templatetags.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 rest_framework/tests/test_templatetags.py diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index e9c1cdd54..5c267ab36 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -144,7 +144,7 @@ def add_query_param(request, key, val): """ Add a query parameter to the current request url, and return the new url. """ - return replace_query_param(request.get_full_path(), key, val) + return replace_query_param(request.build_absolute_uri(), key, val) @register.filter diff --git a/rest_framework/tests/test_templatetags.py b/rest_framework/tests/test_templatetags.py new file mode 100644 index 000000000..cbac768a3 --- /dev/null +++ b/rest_framework/tests/test_templatetags.py @@ -0,0 +1,18 @@ +# encoding: utf-8 +from __future__ import unicode_literals +from django.test import TestCase +from rest_framework.test import APIRequestFactory +from rest_framework.templatetags.rest_framework import add_query_param + +factory = APIRequestFactory() + + +class TemplateTagTests(TestCase): + + def test_add_query_param_with_non_latin_charactor(self): + request = factory.get("/?q=查询") + json_url = add_query_param(request, "format", "json") + self.assertIn(json_url, [ + "http://testserver/?format=json&q=%E6%9F%A5%E8%AF%A2", + "http://testserver/?q=%E6%9F%A5%E8%AF%A2&format=json", + ]) From 3f5e3c28f5a4f8b12f5f3ae6c7b571d08be2bf7e Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 23 Dec 2013 11:55:25 +0000 Subject: [PATCH 003/156] Updated tests to pass in python 3 --- rest_framework/templatetags/rest_framework.py | 5 ++++- rest_framework/tests/test_templatetags.py | 11 ++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index 5c267ab36..83c046f99 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals, absolute_import from django import template from django.core.urlresolvers import reverse, NoReverseMatch from django.http import QueryDict +from django.utils.encoding import iri_to_uri from django.utils.html import escape from django.utils.safestring import SafeData, mark_safe from rest_framework.compat import urlparse, force_text, six, smart_urlquote @@ -144,7 +145,9 @@ def add_query_param(request, key, val): """ Add a query parameter to the current request url, and return the new url. """ - return replace_query_param(request.build_absolute_uri(), key, val) + iri = request.get_full_path() + uri = iri_to_uri(iri) + return replace_query_param(uri, key, val) @register.filter diff --git a/rest_framework/tests/test_templatetags.py b/rest_framework/tests/test_templatetags.py index cbac768a3..7ac90ae60 100644 --- a/rest_framework/tests/test_templatetags.py +++ b/rest_framework/tests/test_templatetags.py @@ -10,9 +10,10 @@ factory = APIRequestFactory() class TemplateTagTests(TestCase): def test_add_query_param_with_non_latin_charactor(self): - request = factory.get("/?q=查询") + # Ensure we don't double-escape non-latin characters + # that are present in the querystring. + # https://github.com/tomchristie/django-rest-framework/pull/1314 + request = factory.get("/", {'q': '查询'}) json_url = add_query_param(request, "format", "json") - self.assertIn(json_url, [ - "http://testserver/?format=json&q=%E6%9F%A5%E8%AF%A2", - "http://testserver/?q=%E6%9F%A5%E8%AF%A2&format=json", - ]) + self.assertIn("q=%E6%9F%A5%E8%AF%A2", json_url) + self.assertIn("format=json") From bed2f08c24a13831590ae5fc8cefbb1bca300a96 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 23 Dec 2013 11:57:25 +0000 Subject: [PATCH 004/156] Updated release notes --- docs/topics/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index d1ace1164..b09bd0bea 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -46,6 +46,7 @@ You can determine your currently installed version using `pip freeze`: * Fix compatiblity with newer versions of `django-oauth-plus`. * Bugfix: Refine behavior that calls model manager `all()` across nested serializer relationships, preventing erronous behavior with some non-ORM objects, and preventing unneccessary queryset re-evaluations. * Bugfix: Allow defaults on BooleanFields to be properly honored when values are not supplied. +* Bugfix: Prevent double-escaping of non-latin1 URL query params when appending `format=json` params. ### 2.3.10 From feddd16c54c99977bd5503fd09232828c280fc10 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 23 Dec 2013 12:04:17 +0000 Subject: [PATCH 005/156] Tweak test style --- rest_framework/tests/test_templatetags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_framework/tests/test_templatetags.py b/rest_framework/tests/test_templatetags.py index 7ac90ae60..609a9e089 100644 --- a/rest_framework/tests/test_templatetags.py +++ b/rest_framework/tests/test_templatetags.py @@ -12,8 +12,8 @@ class TemplateTagTests(TestCase): def test_add_query_param_with_non_latin_charactor(self): # Ensure we don't double-escape non-latin characters # that are present in the querystring. - # https://github.com/tomchristie/django-rest-framework/pull/1314 + # See #1314. request = factory.get("/", {'q': '查询'}) json_url = add_query_param(request, "format", "json") self.assertIn("q=%E6%9F%A5%E8%AF%A2", json_url) - self.assertIn("format=json") + self.assertIn("format=json", json_url) From d24ea39a4e4131486d45492339dcbbfefb6a933b Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 23 Dec 2013 14:29:22 +0000 Subject: [PATCH 006/156] Added note on view_name in hyperlinked relationships. Closes #1221 --- docs/api-guide/relations.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/api-guide/relations.md b/docs/api-guide/relations.md index 1b089c541..4bee75af7 100644 --- a/docs/api-guide/relations.md +++ b/docs/api-guide/relations.md @@ -134,7 +134,7 @@ By default this field is read-write, although you can change this behavior using **Arguments**: -* `view_name` - The view name that should be used as the target of the relationship. **required**. +* `view_name` - The view name that should be used as the target of the relationship. If you're using [the standard router classes][routers] this wil be a string with the format `-detail`. **required**. * `many` - If applied to a to-many relationship, you should set this argument to `True`. * `required` - If set to `False`, the field will accept values of `None` or the empty-string for nullable relationships. * `queryset` - By default `ModelSerializer` classes will use the default queryset for the relationship. `Serializer` classes must either set a queryset explicitly, or set `read_only=True`. @@ -202,7 +202,7 @@ This field is always read-only. **Arguments**: -* `view_name` - The view name that should be used as the target of the relationship. **required**. +* `view_name` - The view name that should be used as the target of the relationship. If you're using [the standard router classes][routers] this wil be a string with the format `-detail`. **required**. * `lookup_field` - The field on the target that should be used for the lookup. Should correspond to a URL keyword argument on the referenced view. Default is `'pk'`. * `format` - If using format suffixes, hyperlinked fields will use the same format suffix for the target unless overridden by using the `format` argument. @@ -454,6 +454,7 @@ The [drf-nested-routers package][drf-nested-routers] provides routers and relati [cite]: http://lwn.net/Articles/193245/ [reverse-relationships]: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward +[routers]: http://django-rest-framework.org/api-guide/routers#defaultrouter [generic-relations]: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1 [2.2-announcement]: ../topics/2.2-announcement.md [drf-nested-routers]: https://github.com/alanjds/drf-nested-routers From 75e872473197f9b810c9daf348cb452faadac476 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 23 Dec 2013 14:38:51 +0000 Subject: [PATCH 007/156] Fuller notes on the 'base_name' argument. Closes #1160. --- docs/api-guide/routers.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/api-guide/routers.md b/docs/api-guide/routers.md index 895589db9..7efc140a5 100644 --- a/docs/api-guide/routers.md +++ b/docs/api-guide/routers.md @@ -37,6 +37,18 @@ The example above would generate the following URL patterns: * URL pattern: `^accounts/$` Name: `'account-list'` * URL pattern: `^accounts/{pk}/$` Name: `'account-detail'` +--- + +**Note**: The `base_name` argument is used to specify the initial part of the view name pattern. In the example above, that's the `user` or `account` part. + +Typically you won't *need* to specify the `base-name` argument, but if you have a viewset where you've defined a custom `get_queryset` method, then the viewset may not have any `.model` or `.queryset` attribute set. If you try to register that viewset you'll see an error like this: + + 'base_name' argument not specified, and could not automatically determine the name from the viewset, as it does not have a '.model' or '.queryset' attribute. + +This means you'll need to explicitly set the `base_name` argument when registering the viewset, as it could not be automatically determined from the model name. + +--- + ### Extra link and actions Any methods on the viewset decorated with `@link` or `@action` will also be routed. From 25bd6d1d4b7a85279047ab8e35f6faee0bc10a1a Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Mon, 23 Dec 2013 22:27:40 -0600 Subject: [PATCH 008/156] can't save genericrelations via nested serializers in django 1.6 --- rest_framework/tests/test_genericrelations.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/rest_framework/tests/test_genericrelations.py b/rest_framework/tests/test_genericrelations.py index c38bfb9f3..2d3413444 100644 --- a/rest_framework/tests/test_genericrelations.py +++ b/rest_framework/tests/test_genericrelations.py @@ -69,6 +69,35 @@ class TestGenericRelations(TestCase): } self.assertEqual(serializer.data, expected) + def test_generic_nested_relation(self): + """ + Test saving a GenericRelation field via a nested serializer. + """ + + class TagSerializer(serializers.ModelSerializer): + class Meta: + model = Tag + exclude = ('content_type', 'object_id') + + class BookmarkSerializer(serializers.ModelSerializer): + tags = TagSerializer() + + class Meta: + model = Bookmark + exclude = ('id',) + + data = { + 'url': 'https://docs.djangoproject.com/', + 'tags': [ + {'tag': 'contenttypes'}, + {'tag': 'genericrelations'}, + ] + } + serializer = BookmarkSerializer(data=data) + self.assertTrue(serializer.is_valid()) + serializer.save() + self.assertEqual(serializer.object.tags.count(), 2) + def test_generic_fk(self): """ Test a relationship that spans a GenericForeignKey field. From d30ce2575c6b3901f15eb96eeaf66cc65e1d298b Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Mon, 23 Dec 2013 22:31:31 -0600 Subject: [PATCH 009/156] fix for genericrelation saving --- rest_framework/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8351b3df6..c0c810ab9 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -894,7 +894,7 @@ class ModelSerializer(Serializer): m2m_data[field_name] = attrs.pop(field_name) # Forward m2m relations - for field in meta.many_to_many: + for field in meta.many_to_many + meta.virtual_fields: if field.name in attrs: m2m_data[field.name] = attrs.pop(field.name) From 1f3f2741f519967aa236cd861a79c2c459063197 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 2 Jan 2014 09:28:34 +0000 Subject: [PATCH 010/156] Happy new year --- README.md | 2 +- docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 684868006..8c6822312 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ Send a description of the issue via email to [rest-framework-security@googlegrou # License -Copyright (c) 2011-2013, Tom Christie +Copyright (c) 2011-2014, Tom Christie All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/docs/index.md b/docs/index.md index 04804fa79..7688d4281 100644 --- a/docs/index.md +++ b/docs/index.md @@ -219,7 +219,7 @@ Send a description of the issue via email to [rest-framework-security@googlegrou ## License -Copyright (c) 2011-2013, Tom Christie +Copyright (c) 2011-2014, Tom Christie All rights reserved. Redistribution and use in source and binary forms, with or without From 0672d6de6e47ba0269a58ad0da3cc7ff4c82908e Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Thu, 2 Jan 2014 16:46:57 -0500 Subject: [PATCH 011/156] Fix bugfix note This fixes a bugfix note that was added because of #1293, which pointed out that a change in a bugfix [1] broke backwards compatibility. The bugfix did not work as expected because a variable was quoted when it should not have been. This removes the quotes around the variable, which brings back the expected functionality. --- docs/topics/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index b09bd0bea..ca966d20e 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -98,7 +98,7 @@ You can determine your currently installed version using `pip freeze`: class DisablePaginationMixin(object): def get_paginate_by(self, queryset=None): - if self.request.QUERY_PARAMS['self.paginate_by_param'] == '0': + if self.request.QUERY_PARAMS[self.paginate_by_param] == '0': return None return super(DisablePaginationMixin, self).get_paginate_by(queryset) From e032bad1a7c1f9ad2d9c591617ea92b2e802d7e5 Mon Sep 17 00:00:00 2001 From: Paul Melnikow Date: Thu, 2 Jan 2014 16:54:06 -0500 Subject: [PATCH 012/156] FIx link to tox --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e0544a479..a7aa6fc40 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ To run the tests, clone the repository, and then: # Run the tests rest_framework/runtests/runtests.py -You can also use the excellent `[tox][tox]` testing tool to run the tests against all supported versions of Python and Django. Install `tox` globally, and then simply run: +You can also use the excellent [`tox`][tox] testing tool to run the tests against all supported versions of Python and Django. Install `tox` globally, and then simply run: tox From e020c51b44b9acecdb01cc90f2d6da977ba5ea0f Mon Sep 17 00:00:00 2001 From: Steven Cummings Date: Thu, 2 Jan 2014 17:18:08 -0600 Subject: [PATCH 013/156] FIX BaseSerializer.from_native has an altered signature * base classes define it with one parameter * BaseSerializer currently defines a second parameter, which we make optional here for method-dispatch passivity --- rest_framework/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index c0c810ab9..b22ca5783 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -331,7 +331,7 @@ class BaseSerializer(WritableField): return ret - def from_native(self, data, files): + def from_native(self, data, files=None): """ Deserialize primitives -> objects. """ From 3050f0e82a60a12dc35ef7947c2f47de12387919 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 3 Jan 2014 13:06:41 +0000 Subject: [PATCH 014/156] Frontpage tweaks --- README.md | 6 +++--- docs/img/logo.png | Bin 0 -> 45955 bytes docs/index.md | 26 +++++++++++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 docs/img/logo.png diff --git a/README.md b/README.md index 8c6822312..403f9c0af 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# Django REST framework - -**Awesome web-browseable Web APIs.** + [![build-status-image]][travis] +**Awesome web-browseable Web APIs.** + **Note**: Full documentation for the project is available at [http://django-rest-framework.org][docs]. # Overview diff --git a/docs/img/logo.png b/docs/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0cf800d316496efbd89f55365bacad00f0ef96 GIT binary patch literal 45955 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 + -# Django REST framework +--- -**Awesome web-browsable Web APIs.** +

+ +

+ + Django REST framework is a powerful and flexible toolkit that makes it easy to build Web APIs. @@ -20,13 +26,16 @@ Some reasons you might want to use REST framework: * [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources. * Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers]. * [Extensive documentation][index], and [great community support][group]. +* Used and trusted by large companies such as [Mozilla][mozilla] and [Eventbrite][eventbrite]. -There is a live example API for testing purposes, [available here][sandbox]. - -**Below**: *Screenshot from the browsable API* +--- ![Screenshot][image] +**Above**: *Screenshot from the browsable API* + +---- + ## Requirements REST framework requires the following: @@ -140,6 +149,8 @@ The tutorial will walk you through the building blocks that make up REST framewo * [5 - Relationships & hyperlinked APIs][tut-5] * [6 - Viewsets & routers][tut-6] +There is a live example API of the finished tutorial API for testing purposes, [available here][sandbox]. + ## API Guide The API guide is your complete reference manual to all the functionality provided by REST framework. @@ -244,7 +255,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [travis]: http://travis-ci.org/tomchristie/django-rest-framework?branch=master [travis-build-image]: https://secure.travis-ci.org/tomchristie/django-rest-framework.png?branch=master -[urlobject]: https://github.com/zacharyvoase/urlobject +[mozilla]: http://www.mozilla.org/en-US/about/ +[eventbrite]: https://www.eventbrite.co.uk/about/ [markdown]: http://pypi.python.org/pypi/Markdown/ [yaml]: http://pypi.python.org/pypi/PyYAML [defusedxml]: https://pypi.python.org/pypi/defusedxml From 442916b9649baaf305ff094fe05f026ad04c7818 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 3 Jan 2014 13:24:52 +0000 Subject: [PATCH 015/156] Link to BrightAPI, and remove ad except from frontpage --- docs/template.html | 23 ++--------------------- mkdocs.py | 6 ++++++ 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/docs/template.html b/docs/template.html index c065237a5..a397d067b 100644 --- a/docs/template.html +++ b/docs/template.html @@ -170,31 +170,12 @@ + - - diff --git a/mkdocs.py b/mkdocs.py index 09c9dcc67..92679a21e 100755 --- a/mkdocs.py +++ b/mkdocs.py @@ -161,6 +161,12 @@ for (dirpath, dirnames, filenames) in os.walk(docs_dir): output = output.replace('{{ page_id }}', filename[:-3]) output = output.replace('{{ canonical_url }}', canonical_url) + if filename =='index.md': + output = output.replace('{{ ad_block }}', """

The team behind REST framework is launching a new API service.

+

If you want to be first in line when we start issuing invitations, please sign up here.

""") + else: + output = output.replace('{{ ad_block }}', '') + if prev_url: output = output.replace('{{ prev_url }}', prev_url) output = output.replace('{{ prev_url_disabled }}', '') From e3ae33017d86bed7fdbf6c76e0129f9361cab04d Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 6 Jan 2014 15:01:45 +0000 Subject: [PATCH 016/156] Added "nofollow" against docs link. --- rest_framework/templates/rest_framework/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html index 495163b64..ba45b9bcb 100644 --- a/rest_framework/templates/rest_framework/base.html +++ b/rest_framework/templates/rest_framework/base.html @@ -33,7 +33,7 @@ @@ -176,9 +176,9 @@ - - - + + + diff --git a/docs/topics/2.2-announcement.md b/docs/topics/2.2-announcement.md index 0f980e1cb..a997c7829 100644 --- a/docs/topics/2.2-announcement.md +++ b/docs/topics/2.2-announcement.md @@ -151,7 +151,7 @@ From version 2.2 onwards, serializers with hyperlinked relationships *always* re [porting-python-3]: https://docs.djangoproject.com/en/dev/topics/python3/ [python-compat]: https://docs.djangoproject.com/en/dev/releases/1.5/#python-compatibility [django-deprecation-policy]: https://docs.djangoproject.com/en/dev/internals/release-process/#internal-release-deprecation-policy -[credits]: http://django-rest-framework.org/topics/credits +[credits]: http://www.django-rest-framework.org/topics/credits [mailing-list]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework [django-rest-framework-docs]: https://github.com/marcgibbons/django-rest-framework-docs [marcgibbons]: https://github.com/marcgibbons/ diff --git a/mkdocs.py b/mkdocs.py index 92679a21e..f973096f3 100755 --- a/mkdocs.py +++ b/mkdocs.py @@ -18,7 +18,7 @@ if local: suffix = '.html' index = 'index.html' else: - base_url = 'http://django-rest-framework.org' + base_url = 'http://www.django-rest-framework.org' suffix = '' index = '' diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html index ba45b9bcb..d19d5a2be 100644 --- a/rest_framework/templates/rest_framework/base.html +++ b/rest_framework/templates/rest_framework/base.html @@ -33,7 +33,7 @@

@@ -7,9 +7,15 @@