Skip to content

Commit

Permalink
[Fixes #6922][REST API v2] Expose the curated thumbnail URL if it has…
Browse files Browse the repository at this point in the history
… been uploaded
  • Loading branch information
afabiani committed Feb 3, 2021
1 parent 21e465b commit fa5658c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 3 deletions.
22 changes: 20 additions & 2 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model

Expand All @@ -25,6 +26,7 @@
from dynamic_rest.serializers import DynamicEphemeralSerializer, DynamicModelSerializer
from dynamic_rest.fields.fields import DynamicRelationField, DynamicComputedField

from urllib.parse import urljoin
from avatar.templatetags.avatar_tags import avatar_url

from geonode.base.models import (
Expand Down Expand Up @@ -147,6 +149,22 @@ def get_attribute(self, instance):
return avatar_url(instance, self.avatar_size)


class ThumbnailUrlField(DynamicComputedField):

def __init__(self, **kwargs):
super(ThumbnailUrlField, self).__init__(**kwargs)

def get_attribute(self, instance):
thumbnail_url = instance.thumbnail_url
if hasattr(instance, 'curatedthumbnail'):
if hasattr(instance.curatedthumbnail.img_thumbnail, 'url'):
thumbnail_url = instance.curatedthumbnail.thumbnail_url

if thumbnail_url and 'http' not in thumbnail_url:
thumbnail_url = urljoin(settings.SITEURL, thumbnail_url)
return thumbnail_url


class UserSerializer(DynamicModelSerializer):

class Meta:
Expand Down Expand Up @@ -215,11 +233,11 @@ def __init__(self, *args, **kwargs):
self.fields['featured'] = serializers.BooleanField()
self.fields['is_published'] = serializers.BooleanField()
self.fields['is_approved'] = serializers.BooleanField()
self.fields['thumbnail_url'] = serializers.CharField()
self.fields['detail_url'] = serializers.CharField(read_only=True)
self.fields['created'] = serializers.DateTimeField(read_only=True)
self.fields['last_updated'] = serializers.DateTimeField(read_only=True)

self.fields['thumbnail_url'] = ThumbnailUrlField()
self.fields['keywords'] = DynamicRelationField(
HierarchicalKeywordSerializer, embed=False, many=True)
self.fields['regions'] = DynamicRelationField(
Expand All @@ -246,7 +264,7 @@ class Meta:
'spatial_representation_type', 'temporal_extent_start', 'temporal_extent_end',
'supplemental_information', 'data_quality_statement', 'group',
'popular_count', 'share_count', 'rating', 'featured', 'is_published', 'is_approved',
'thumbnail_url', 'detail_url', 'created', 'last_updated'
'detail_url', 'created', 'last_updated'
# TODO
# csw_typename, csw_schema, csw_mdsource, csw_insert_date, csw_type, csw_anytext, csw_wkt_geometry,
# metadata_uploaded, metadata_uploaded_preserve, metadata_xml,
Expand Down
32 changes: 31 additions & 1 deletion geonode/base/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
#
#########################################################################
import logging

from PIL import Image
from io import BytesIO
from urllib.parse import urljoin

from django.urls import reverse
from django.core.files import File
from django.conf.urls import url, include
from django.views.generic import TemplateView
from rest_framework.test import APITestCase, URLPatternsTestCase
Expand All @@ -30,6 +32,7 @@

from geonode.api.urls import router
from geonode.base.models import ResourceBase
from geonode.base.models import CuratedThumbnail

from geonode import geoserver
from geonode.utils import check_ogc_backend
Expand Down Expand Up @@ -427,3 +430,30 @@ def test_resource_types(self):
self.assertTrue('map' in response.data['resource_types'])
self.assertTrue('document' in response.data['resource_types'])
self.assertTrue('service' in response.data['resource_types'])

def test_thumbnail_urls(self):
"""
Ensure the thumbnail url reflects the current active Thumb on the resource.
"""
# Admin
self.assertTrue(self.client.login(username='admin', password='admin'))

resource = ResourceBase.objects.filter(owner__username='bobby').first()
url = reverse('base-resources-detail', kwargs={'pk': resource.pk})
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, 200)
self.assertEqual(int(response.data['resource']['pk']), int(resource.pk))
thumbnail_url = response.data['resource']['thumbnail_url']
self.assertIsNotNone(thumbnail_url)

test_image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0))
f = BytesIO(test_image.tobytes())
f.name = 'test_image.jpeg'
curated_thumbnail = CuratedThumbnail.objects.create(resource=resource, img=File(f))

url = reverse('base-resources-detail', kwargs={'pk': resource.pk})
response = self.client.get(url, format='json')
self.assertEqual(response.status_code, 200)
self.assertEqual(int(response.data['resource']['pk']), int(resource.pk))
thumbnail_url = response.data['resource']['thumbnail_url']
self.assertTrue(curated_thumbnail.thumbnail_url in thumbnail_url)

0 comments on commit fa5658c

Please sign in to comment.