diff --git a/geonode/base/api/serializers.py b/geonode/base/api/serializers.py index bccbbba077f..6734418a2aa 100644 --- a/geonode/base/api/serializers.py +++ b/geonode/base/api/serializers.py @@ -21,6 +21,7 @@ from django.conf import settings from django.contrib.auth.models import Group from django.contrib.auth import get_user_model +from django.forms.models import model_to_dict from rest_framework import serializers from rest_framework_gis import fields @@ -48,6 +49,7 @@ from geonode.base.utils import build_absolute_uri from geonode.security.utils import get_resources_with_perms +from geonode.base.models import Link import logging @@ -69,6 +71,42 @@ def to_representation(self, instance): return data +class ResourceBaseToRepresentationSerializerMixin(DynamicModelSerializer): + + def to_representation(self, instance): + request = self.context.get('request') + data = super(ResourceBaseToRepresentationSerializerMixin, self).to_representation(instance) + if request: + data['perms'] = instance.get_user_perms(request.user).union( + instance.get_self_resource().get_user_perms(request.user) + ) + if not request.user.is_anonymous and getattr(settings, "FAVORITE_ENABLED", False): + favorite = Favorite.objects.filter(user=request.user, object_id=instance.pk).count() + data['favorite'] = favorite > 0 + # Adding links to resource_base api + obj_id = data.get('pk', None) + if obj_id: + dehydrated = [] + link_fields = [ + 'extension', + 'link_type', + 'name', + 'mime', + 'url' + ] + + links = Link.objects.filter( + resource_id=int(obj_id), + link_type__in=['OGC:WMS', 'OGC:WFS', 'OGC:WCS', 'image', 'metadata'] + ) + for lnk in links: + formatted_link = model_to_dict(lnk, fields=link_fields) + dehydrated.append(formatted_link) + if len(dehydrated) > 0: + data['links'] = dehydrated + return data + + class ResourceBaseTypesSerializer(DynamicEphemeralSerializer): name = serializers.CharField() count = serializers.IntegerField() @@ -243,7 +281,10 @@ def to_representation(self, value): return UserSerializer(embed=True, many=False).to_representation(value) -class ResourceBaseSerializer(BaseDynamicModelSerializer): +class ResourceBaseSerializer( + ResourceBaseToRepresentationSerializerMixin, + BaseDynamicModelSerializer +): def __init__(self, *args, **kwargs): # Instantiate the superclass normally @@ -331,18 +372,6 @@ class Meta: # users_geolimits, groups_geolimits ) - def to_representation(self, instance): - request = self.context.get('request') - data = super().to_representation(instance) - if request: - data['perms'] = instance.get_user_perms(request.user).union( - instance.get_self_resource().get_user_perms(request.user) - ) - if not request.user.is_anonymous and getattr(settings, "FAVORITE_ENABLED", False): - favorite = Favorite.objects.filter(user=request.user, object_id=instance.pk).count() - data['favorite'] = favorite > 0 - return data - class FavoriteSerializer(DynamicModelSerializer): resource = serializers.SerializerMethodField()