Skip to content

Commit

Permalink
[Backport 3.3.x][Fixes #8534] Include links inside resources API v2 r…
Browse files Browse the repository at this point in the history
…esponse (#8536)

* [Fixes #8534] Include links inside resources API v2 response[Fixes

* - add test

* - update test
  • Loading branch information
marthamareal committed Dec 22, 2021
1 parent f322c87 commit 9c24afc
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 14 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
9 changes: 8 additions & 1 deletion geonode/base/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

from geonode import geoserver
from geonode.layers.models import Layer
from geonode.utils import check_ogc_backend
from geonode.utils import check_ogc_backend, set_resource_default_links
from geonode.favorite.models import Favorite
from geonode.documents.models import Document
from geonode.base.utils import build_absolute_uri
Expand Down Expand Up @@ -275,6 +275,13 @@ def test_base_resources(self):
self.assertTrue(self.client.login(username='norman', password='norman'))
response = self.client.get(f"{url}/{resource.id}/", format='json')
self.assertFalse('change_resourcebase' in list(response.data['resource']['perms']))
# response has links property
# create link
if check_ogc_backend(geoserver.BACKEND_PACKAGE):
layer = Layer.objects.first()
set_resource_default_links(layer, layer)
response = self.client.get(f"{url}/{layer.id}/", format='json')
self.assertTrue('links' in response.data['resource'].keys())

def test_delete_user_with_resource(self):
owner, created = get_user_model().objects.get_or_create(username='delet-owner')
Expand Down

0 comments on commit 9c24afc

Please sign in to comment.