mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 13:54:47 +03:00
Merge 2c83fc51a6
into b683cd7afc
This commit is contained in:
commit
ea5a07d213
|
@ -35,15 +35,27 @@ class Hyperlink(six.text_type):
|
|||
A string like object that additionally has an associated name.
|
||||
We use this for hyperlinked URLs that may render as a named link
|
||||
in some contexts, or render as a plain URL in others.
|
||||
|
||||
If name is callable, it will be called when the name property is
|
||||
accessed.
|
||||
"""
|
||||
def __new__(self, url, name):
|
||||
ret = six.text_type.__new__(self, url)
|
||||
ret.name = name
|
||||
if callable(name):
|
||||
ret._name_callable = name
|
||||
else:
|
||||
ret.name = name
|
||||
return ret
|
||||
|
||||
def __getnewargs__(self):
|
||||
return(str(self), self.name,)
|
||||
|
||||
def __getattr__(self, key):
|
||||
if key == 'name' and hasattr(self, '_name_callable'):
|
||||
f = getattr(self, '_name_callable')
|
||||
return f()
|
||||
raise AttributeError
|
||||
|
||||
is_hyperlink = True
|
||||
|
||||
|
||||
|
@ -378,8 +390,8 @@ class HyperlinkedRelatedField(RelatedField):
|
|||
if url is None:
|
||||
return None
|
||||
|
||||
name = self.get_name(value)
|
||||
return Hyperlink(url, name)
|
||||
name_getter = lambda: self.get_name(value)
|
||||
return Hyperlink(url, name_getter)
|
||||
|
||||
|
||||
class HyperlinkedIdentityField(HyperlinkedRelatedField):
|
||||
|
|
|
@ -98,6 +98,11 @@ class TestHyperlinkedRelatedField(APISimpleTestCase):
|
|||
representation = self.field.to_representation(MockObject(pk=''))
|
||||
assert representation is None
|
||||
|
||||
def test_representation_does_not_call_get_name(self):
|
||||
self.field.get_name = lambda _: pytest.fail(
|
||||
"HyperlinkedRelatedField.get_name() called eagerly")
|
||||
self.field.to_representation(MockObject(pk=1))
|
||||
|
||||
|
||||
class TestHyperlinkedIdentityField(APISimpleTestCase):
|
||||
def setUp(self):
|
||||
|
@ -233,9 +238,16 @@ class TestManyRelatedField(APISimpleTestCase):
|
|||
class TestHyperlink:
|
||||
def setup(self):
|
||||
self.default_hyperlink = serializers.Hyperlink('http://example.com', 'test')
|
||||
self.callable_hyperlink = serializers.Hyperlink('http://example.com', lambda: 'called')
|
||||
|
||||
def test_can_be_pickled(self):
|
||||
import pickle
|
||||
upkled = pickle.loads(pickle.dumps(self.default_hyperlink))
|
||||
assert upkled == self.default_hyperlink
|
||||
assert upkled.name == self.default_hyperlink.name
|
||||
|
||||
def test_simple_name_property(self):
|
||||
assert 'test' == self.default_hyperlink.name
|
||||
|
||||
def test_callable_name_property(self):
|
||||
assert 'called' == self.callable_hyperlink.name
|
||||
|
|
Loading…
Reference in New Issue
Block a user