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:
Roberto Rosario
2019-02-15 04:15:19 -04:00
parent d85e838480
commit 6eb986f7d1

View File

@@ -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
)