diff --git a/geonode/catalogue/tests.py b/geonode/catalogue/tests.py index e98290a15b6..a87245b2a22 100644 --- a/geonode/catalogue/tests.py +++ b/geonode/catalogue/tests.py @@ -21,6 +21,8 @@ from django.db.models import Q from django.test import RequestFactory +from django.http.response import Http404 +from django.core.exceptions import PermissionDenied from geonode.layers.models import Dataset from geonode.catalogue import get_catalogue from django.contrib.auth import get_user_model @@ -28,13 +30,14 @@ from geonode.tests.base import GeoNodeBaseTestSupport from geonode.catalogue.models import catalogue_post_save -from geonode.catalogue.views import csw_global_dispatch +from geonode.catalogue.views import csw_global_dispatch, resolve_uuid from geonode.layers.populate_datasets_data import create_dataset_data from geonode.base.populate_test_data import ( all_public, create_models, - remove_models) + remove_models, + create_single_dataset) logger = logging.getLogger(__name__) @@ -144,3 +147,46 @@ def __request_factory_multiple(): request = factory.get(url) request.user = get_user_model().objects.first() return request + + +class UUIDResolverTest(GeoNodeBaseTestSupport): + + def setUp(self): + self.dataset = create_single_dataset(name='test_uuid_resolver_dataset') + + def tearDown(self): + Dataset.objects.filter(name='test_uuid_resolver_dataset').delete() + + def test_uuid_resolver_existing_dataset(self): + user = get_user_model().objects.first() + self.dataset.set_default_permissions(owner=user) + request = RequestFactory().get(f"http://localhost:8000/catalogue/uuid/{self.dataset.uuid}") + request.user = user + response = resolve_uuid(request, self.dataset.uuid) + self.assertEqual(302, response.status_code) + self.assertEqual(f"/catalogue/#/dataset/{self.dataset.pk}", + response.headers["Location"]) + + def test_uuid_resolver_non_existing_dataset(self): + user = get_user_model().objects.first() + self.dataset.set_default_permissions(owner=user) + request = RequestFactory().get("http://localhost:8000/catalogue/uuid/asdfasdf") + request.user = user + with self.assertRaises(Http404) as context: + resolve_uuid(request, "asdfasdf") + self.assertTrue("No ResourceBase matches the given query." in str(context.exception)) + + def test_uuid_resolver_missing_permissions(self): + self.dataset.set_permissions({ + "groups": { + "registered-members": [ + "base.view_resourcebase", + "base.download_resourcebase" + ] + } + }) + request = RequestFactory().get(f"http://localhost:8000/catalogue/uuid/{self.dataset.uuid}") + request.user = AnonymousUser() + with self.assertRaises(PermissionDenied) as context: + resolve_uuid(request, self.dataset.uuid) + self.assertTrue("Permission Denied" in str(context.exception)) diff --git a/geonode/catalogue/urls.py b/geonode/catalogue/urls.py index 7ea79e56a27..c26ecb4f3b1 100644 --- a/geonode/catalogue/urls.py +++ b/geonode/catalogue/urls.py @@ -18,6 +18,7 @@ ######################################################################### from django.conf.urls import url +from django.urls import path from . import views urlpatterns = [ @@ -26,5 +27,6 @@ url(r'^csw_to_extra_format/(?P[^/]*)/(?P[^/]*).txt$', views.csw_render_extra_format_txt, name="csw_render_extra_format_txt"), url(r'^csw_to_extra_format/(?P[^/]*)/(?P[^/]*).html$', - views.csw_render_extra_format_html, name="csw_render_extra_format_html") + views.csw_render_extra_format_html, name="csw_render_extra_format_html"), + path(r'uuid/', views.resolve_uuid, name="resolve_uuid") ] diff --git a/geonode/catalogue/views.py b/geonode/catalogue/views.py index 021063e0bc3..6b1adc5e7c0 100644 --- a/geonode/catalogue/views.py +++ b/geonode/catalogue/views.py @@ -20,7 +20,7 @@ import logging from django.conf import settings from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import render +from django.shortcuts import render, redirect from django.contrib.auth import get_user_model from django.views.decorators.csrf import csrf_exempt from pycsw import server @@ -31,6 +31,7 @@ from geonode.base.auth import get_or_create_token from geonode.base.models import ContactRole, SpatialRepresentationType from geonode.groups.models import GroupProfile +from geonode.utils import resolve_object from django.db import connection from django.core.exceptions import ObjectDoesNotExist @@ -330,3 +331,8 @@ def csw_render_extra_format_html(request, layeruuid, resname): extra_res_md['poc_email'] = pocp.email return render(request, "geonode_metadata_full.html", context={"resource": resource, "extra_res_md": extra_res_md}) + + +def resolve_uuid(request, uuid): + resource = resolve_object(request, ResourceBase, {"uuid": uuid}) + return redirect(resource)