Commit 53c57645 authored by Thomas Sorrel's avatar Thomas Sorrel Committed by Baptiste Mispelon
Browse files

Fixed #16727 -- Added protocol-relative URL support to contenttypes.views.shortcut.

parent 7bbb6958
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ def shortcut(request, content_type_id, object_id):
    # if necessary.

    # If the object actually defines a domain, we're done.
    if absurl.startswith('http://') or absurl.startswith('https://'):
    if absurl.startswith(('http://', 'https://', '//')):
        return http.HttpResponseRedirect(absurl)

    # Otherwise, we need to introspect the object's relationships for a
+3 −0
Original line number Diff line number Diff line
@@ -1147,6 +1147,9 @@ Miscellaneous
  ``django.utils.translation.trans_real.get_supported_language_variant()``
  now no longer have a ``supported`` argument.

* The ``shortcut`` view in ``django.contrib.contenttypes.views`` now supports
  protocol-relative URLs (e.g. ``//example.com``).

.. _deprecated-features-1.7:

Features deprecated in 1.7
+21 −0
Original line number Diff line number Diff line
@@ -36,6 +36,27 @@
            "date_created": "3000-01-01 21:22:23"
        }
    },
    {
        "pk": 1,
        "model": "contenttypes_tests.schemeincludedurl",
        "fields": {
            "url": "http://test_scheme_included_http/"
        }
    },
    {
        "pk": 2,
        "model": "contenttypes_tests.schemeincludedurl",
        "fields": {
            "url": "https://test_scheme_included_https/"
        }
    },
    {
        "pk": 3,
        "model": "contenttypes_tests.schemeincludedurl",
        "fields": {
            "url": "//test_default_scheme_kept/"
        }
    },
    {
        "pk": 1,
        "model": "sites.site",
+11 −0
Original line number Diff line number Diff line
@@ -24,3 +24,14 @@ class Article(models.Model):

    def __str__(self):
        return self.title


@python_2_unicode_compatible
class SchemeIncludedURL(models.Model):
    url = models.URLField(max_length=100)

    def __str__(self):
        return self.url

    def get_absolute_url(self):
        return self.url
+14 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ from django.test import TestCase
from django.test.utils import override_settings
from django.utils.encoding import force_str

from .models import Author, Article
from .models import Author, Article, SchemeIncludedURL


class ContentTypesViewsTests(TestCase):
@@ -27,6 +27,19 @@ class ContentTypesViewsTests(TestCase):
            self.assertRedirects(response, 'http://testserver%s' % obj.get_absolute_url(),
                                 status_code=302, target_status_code=404)

    def test_shortcut_with_absolute_url_including_scheme(self):
        """
        Can view a shortcut when object's get_absolute_url returns a full URL
        the tested URLs are in fixtures/testdata.json :
        "http://...", "https://..." and "//..."
        """
        for obj in SchemeIncludedURL.objects.all():
            short_url = '/shortcut/%s/%s/' % (ContentType.objects.get_for_model(SchemeIncludedURL).id, obj.pk)
            response = self.client.get(short_url)
            self.assertRedirects(response, obj.get_absolute_url(),
                                 status_code=302,
                                 fetch_redirect_response=False)

    def test_shortcut_no_absolute_url(self):
        "Shortcuts for an object that has no get_absolute_url method raises 404"
        for obj in Article.objects.all():