Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #21513 -- Added method_decorator support for argumented decorator

Copied attributes into the decorated method and special case __name__
copy as this will not be present on a Class object. Added regression
test to decorator suite.
  • Loading branch information...
commit 14940fdd96e77778cacdf0963913a343b1f33b9a 1 parent 16d73d7
dpwrussell authored
Showing with 27 additions and 3 deletions.
  1. +6 −2 django/utils/decorators.py
  2. +21 −1 tests/decorators/tests.py
View
8 django/utils/decorators.py
@@ -39,9 +39,13 @@ def dummy(*args, **kwargs):
update_wrapper(_wrapper, func)
return _wrapper
- update_wrapper(_dec, decorator)
+
+ update_wrapper(_dec, decorator, assigned=available_attrs(decorator))
# Change the name to aid debugging.
- _dec.__name__ = 'method_decorator(%s)' % decorator.__name__
+ if hasattr(decorator, '__name__'):
+ _dec.__name__ = 'method_decorator(%s)' % decorator.__name__
+ else:
+ _dec.__name__ = 'method_decorator(%s)' % decorator.__class__.__name__
return _dec
View
22 tests/decorators/tests.py
@@ -1,4 +1,4 @@
-from functools import wraps
+from functools import wraps, update_wrapper
from unittest import TestCase
import warnings
@@ -174,6 +174,16 @@ def wrapper(*args, **kwargs):
myattr2_dec_m = method_decorator(myattr2_dec)
+class ClsDec(object):
+ def __init__(self, myattr):
+ self.myattr = myattr
+
+ def __call__(self, f):
+
+ def wrapped():
+ return f() and self.myattr
+ return update_wrapper(wrapped, f)
+
class MethodDecoratorTests(TestCase):
"""
@@ -214,6 +224,16 @@ def method(self):
self.assertEqual(Test.method.__doc__, 'A method')
self.assertEqual(Test.method.__name__, 'method')
+ # Test for argumented decorator
+ def test_argumented(self):
+ class Test(object):
+ @method_decorator(ClsDec(False))
+ def method(self):
+ return True
+
+ # t = Test()
+ self.assertEqual(Test().method(), False)
+
class XFrameOptionsDecoratorsTests(TestCase):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.