Skip to content

Commit

Permalink
[Fixes GeoNode#8534] Include links inside resources API v2 response[F…
Browse files Browse the repository at this point in the history
…ixes
  • Loading branch information
marthamareal committed Dec 21, 2021
1 parent f322c87 commit 644125a
Showing 1 changed file with 42 additions and 13 deletions.
55 changes: 42 additions & 13 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 644125a

Please sign in to comment.