Add HyperlinkField for serializers
This field allow adding URLs to ModelSerializers. Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
@@ -5,6 +5,7 @@ from django.utils.six import string_types
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from rest_framework import serializers
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
|
||||
class DynamicSerializerField(serializers.ReadOnlyField):
|
||||
@@ -31,3 +32,33 @@ class DynamicSerializerField(serializers.ReadOnlyField):
|
||||
).to_representation(instance=value)
|
||||
|
||||
return _('Unable to find serializer class for: %s') % value
|
||||
|
||||
|
||||
class HyperlinkField(serializers.Field):
|
||||
lookup_field = 'pk'
|
||||
view_name = None
|
||||
|
||||
def __init__(self, view_name=None, **kwargs):
|
||||
kwargs['read_only'] = True
|
||||
|
||||
if view_name is not None:
|
||||
self.view_name = view_name
|
||||
assert self.view_name is not None, 'The `view_name` argument is required.'
|
||||
self.lookup_field = kwargs.pop('lookup_field', self.lookup_field)
|
||||
self.lookup_url_kwarg = kwargs.pop('lookup_url_kwarg', self.lookup_field)
|
||||
self.format = kwargs.pop('format', None)
|
||||
super(HyperlinkField, self).__init__(**kwargs)
|
||||
|
||||
def get_attribute(self, instance):
|
||||
# We pass the object instance onto `to_representation`,
|
||||
# not just the field attribute.
|
||||
return instance
|
||||
|
||||
def to_representation(self, value):
|
||||
kwargs = {}
|
||||
kwargs[self.lookup_url_kwarg] = getattr(value, self.lookup_field)
|
||||
|
||||
return reverse(
|
||||
kwargs=kwargs, request=self.context.get('request'),
|
||||
viewname=self.view_name
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user