Refs #18974 -- Removed @models.permalink() decorator per deprecation timeline.
This commit is contained in:
parent
5e31be1b96
commit
4502489a46
|
@ -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__ = aggregates_all + fields_all + indexes_all
|
||||||
__all__ += [
|
__all__ += [
|
||||||
'ObjectDoesNotExist', 'signals',
|
'ObjectDoesNotExist', 'signals',
|
||||||
|
@ -72,5 +42,5 @@ __all__ += [
|
||||||
'Prefetch', 'Q', 'QuerySet', 'prefetch_related_objects', 'DEFERRED', 'Model',
|
'Prefetch', 'Q', 'QuerySet', 'prefetch_related_objects', 'DEFERRED', 'Model',
|
||||||
'FilteredRelation',
|
'FilteredRelation',
|
||||||
'ForeignKey', 'ForeignObject', 'OneToOneField', 'ManyToManyField',
|
'ForeignKey', 'ForeignObject', 'OneToOneField', 'ManyToManyField',
|
||||||
'ManyToOneRel', 'ManyToManyRel', 'OneToOneRel', 'permalink',
|
'ManyToOneRel', 'ManyToManyRel', 'OneToOneRel',
|
||||||
]
|
]
|
||||||
|
|
|
@ -249,3 +249,5 @@ how to remove usage of these features.
|
||||||
|
|
||||||
* The ``authenticate()`` method of authentication backends requires ``request``
|
* The ``authenticate()`` method of authentication backends requires ``request``
|
||||||
as the first positional argument.
|
as the first positional argument.
|
||||||
|
|
||||||
|
* The ``django.db.models.permalink()`` decorator is removed.
|
||||||
|
|
|
@ -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])
|
|
|
@ -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')
|
|
|
@ -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'),
|
|
||||||
]
|
|
|
@ -1,5 +0,0 @@
|
||||||
from django.http import HttpResponse
|
|
||||||
|
|
||||||
|
|
||||||
def empty_view(request, *args, **kwargs):
|
|
||||||
return HttpResponse('')
|
|
Loading…
Reference in New Issue