diff --git a/kobo/apps/audit_log/serializers.py b/kobo/apps/audit_log/serializers.py index 78940fd34f..55a02a4e76 100644 --- a/kobo/apps/audit_log/serializers.py +++ b/kobo/apps/audit_log/serializers.py @@ -1,7 +1,7 @@ from django.contrib.auth import get_user_model from rest_framework import serializers -from kpi.fields.username_hyperlinked import UsernameHyperlinkField +from kpi.fields import RelativePrefixHyperlinkedRelatedField from .models import AuditLog @@ -49,8 +49,13 @@ def get_username(self, audit_log): class AccessLogSerializer(serializers.Serializer): - - user = UsernameHyperlinkField(source='user__username') + user = RelativePrefixHyperlinkedRelatedField( + view_name='user-kpi-detail', + lookup_field='user__username', + lookup_url_kwarg='username', + read_only=True, + source='user__username', + ) date_created = serializers.SerializerMethodField() username = serializers.CharField(source='user__username') metadata = serializers.JSONField() diff --git a/kpi/fields/relative_prefix_hyperlinked_related.py b/kpi/fields/relative_prefix_hyperlinked_related.py index 85f9501855..02ee240f60 100644 --- a/kpi/fields/relative_prefix_hyperlinked_related.py +++ b/kpi/fields/relative_prefix_hyperlinked_related.py @@ -7,6 +7,21 @@ class RelativePrefixHyperlinkedRelatedField(HyperlinkedRelatedField): + def get_url(self, obj, view_name, request, format): + # mostly copied from HyperLinkedRelatedField + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + # special logic: if obj is a string, just use the value + # this allows us to pass dictionaries to the serializer + # as well as model instances + if isinstance(obj, str): + lookup_value = obj + else: + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + def to_internal_value(self, data): try: http_prefix = data.startswith(('http:', 'https:')) diff --git a/kpi/fields/username_hyperlinked.py b/kpi/fields/username_hyperlinked.py deleted file mode 100644 index 3dd73b4097..0000000000 --- a/kpi/fields/username_hyperlinked.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.contrib.auth import get_user_model -from rest_framework import serializers - - -class UsernameHyperlinkField(serializers.HyperlinkedRelatedField): - """ - Special hyperlinked field to handle a dict rather than a User object - """ - - queryset = get_user_model().objects.all() - view_name = 'user-kpi-detail' - - def get_url(self, obj, view_name, request, format): - return self.reverse( - view_name, kwargs={'username': obj}, request=request, format=format - )