diff --git a/mayan/apps/rest_api/fields.py b/mayan/apps/rest_api/fields.py index 537bf945ff..0ba8c3437a 100644 --- a/mayan/apps/rest_api/fields.py +++ b/mayan/apps/rest_api/fields.py @@ -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 + )