From 4502489a466b89cccd9d2c1b8d21b2f153d71b4b Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Sat, 2 Sep 2017 20:47:47 -0400 Subject: [PATCH] Refs #18974 -- Removed @models.permalink() decorator per deprecation timeline. --- django/db/models/__init__.py | 32 +------------------------------ docs/releases/2.1.txt | 2 ++ tests/model_permalink/__init__.py | 0 tests/model_permalink/models.py | 30 ----------------------------- tests/model_permalink/tests.py | 25 ------------------------ tests/model_permalink/urls.py | 7 ------- tests/model_permalink/views.py | 5 ----- 7 files changed, 3 insertions(+), 98 deletions(-) delete mode 100644 tests/model_permalink/__init__.py delete mode 100644 tests/model_permalink/models.py delete mode 100644 tests/model_permalink/tests.py delete mode 100644 tests/model_permalink/urls.py delete mode 100644 tests/model_permalink/views.py diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py index 628f92db3c9..27c67c7fc40 100644 --- a/django/db/models/__init__.py +++ b/django/db/models/__init__.py @@ -30,36 +30,6 @@ from django.db.models.fields.related import ( # isort:skip ) -def permalink(func): - """ - Decorator that calls urls.reverse() to return a URL using parameters - returned by the decorated function "func". - - "func" should be a function that returns a tuple in one of the - following formats: - (viewname, viewargs) - (viewname, viewargs, viewkwargs) - """ - import warnings - from functools import wraps - - from django.urls import reverse - from django.utils.deprecation import RemovedInDjango21Warning - - warnings.warn( - 'permalink() is deprecated in favor of calling django.urls.reverse() ' - 'in the decorated method.', - RemovedInDjango21Warning, - stacklevel=2, - ) - - @wraps(func) - def inner(*args, **kwargs): - bits = func(*args, **kwargs) - return reverse(bits[0], None, *bits[1:3]) - return inner - - __all__ = aggregates_all + fields_all + indexes_all __all__ += [ 'ObjectDoesNotExist', 'signals', @@ -72,5 +42,5 @@ __all__ += [ 'Prefetch', 'Q', 'QuerySet', 'prefetch_related_objects', 'DEFERRED', 'Model', 'FilteredRelation', 'ForeignKey', 'ForeignObject', 'OneToOneField', 'ManyToManyField', - 'ManyToOneRel', 'ManyToManyRel', 'OneToOneRel', 'permalink', + 'ManyToOneRel', 'ManyToManyRel', 'OneToOneRel', ] diff --git a/docs/releases/2.1.txt b/docs/releases/2.1.txt index 085ad3aa7ef..5effa6eba98 100644 --- a/docs/releases/2.1.txt +++ b/docs/releases/2.1.txt @@ -249,3 +249,5 @@ how to remove usage of these features. * The ``authenticate()`` method of authentication backends requires ``request`` as the first positional argument. + +* The ``django.db.models.permalink()`` decorator is removed. diff --git a/tests/model_permalink/__init__.py b/tests/model_permalink/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/model_permalink/models.py b/tests/model_permalink/models.py deleted file mode 100644 index 9074837a8b5..00000000000 --- a/tests/model_permalink/models.py +++ /dev/null @@ -1,30 +0,0 @@ -import warnings - -from django.db import models -from django.utils.deprecation import RemovedInDjango21Warning - - -def set_attr(name, value): - def wrapper(function): - setattr(function, name, value) - return function - return wrapper - - -with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=RemovedInDjango21Warning) - - class Guitarist(models.Model): - name = models.CharField(max_length=50) - slug = models.CharField(max_length=50) - - @models.permalink - def url(self): - "Returns the URL for this guitarist." - return ('guitarist_detail', [self.slug]) - - @models.permalink - @set_attr('attribute', 'value') - def url_with_attribute(self): - "Returns the URL for this guitarist and holds an attribute" - return ('guitarist_detail', [self.slug]) diff --git a/tests/model_permalink/tests.py b/tests/model_permalink/tests.py deleted file mode 100644 index 3bc59d930fe..00000000000 --- a/tests/model_permalink/tests.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.test import SimpleTestCase, override_settings - -from .models import Guitarist - - -@override_settings(ROOT_URLCONF='model_permalink.urls') -class PermalinkTests(SimpleTestCase): - - def test_permalink(self): - g = Guitarist(name='Adrien Moignard', slug='adrienmoignard') - self.assertEqual(g.url(), '/guitarists/adrienmoignard/') - - def test_wrapped_docstring(self): - "Methods using the @permalink decorator retain their docstring." - g = Guitarist(name='Adrien Moignard', slug='adrienmoignard') - self.assertEqual(g.url.__doc__, "Returns the URL for this guitarist.") - - def test_wrapped_attribute(self): - """ - Methods using the @permalink decorator can have attached attributes - from other decorators - """ - g = Guitarist(name='Adrien Moignard', slug='adrienmoignard') - self.assertTrue(hasattr(g.url_with_attribute, 'attribute')) - self.assertEqual(g.url_with_attribute.attribute, 'value') diff --git a/tests/model_permalink/urls.py b/tests/model_permalink/urls.py deleted file mode 100644 index be973aada5a..00000000000 --- a/tests/model_permalink/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.conf.urls import url - -from . import views - -urlpatterns = [ - url(r'^guitarists/(\w{1,50})/$', views.empty_view, name='guitarist_detail'), -] diff --git a/tests/model_permalink/views.py b/tests/model_permalink/views.py deleted file mode 100644 index 50e23d1782a..00000000000 --- a/tests/model_permalink/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpResponse - - -def empty_view(request, *args, **kwargs): - return HttpResponse('')