Skip to content

Commit

Permalink
[Fixes #10374] UUID resolver endpoint (#10375)
Browse files Browse the repository at this point in the history
  • Loading branch information
autermann authored Dec 16, 2022
1 parent 309cd88 commit d45c601
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 4 deletions.
50 changes: 48 additions & 2 deletions geonode/catalogue/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,23 @@

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
from django.contrib.auth.models import AnonymousUser
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__)

Expand Down Expand Up @@ -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))
4 changes: 3 additions & 1 deletion geonode/catalogue/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#########################################################################

from django.conf.urls import url
from django.urls import path
from . import views

urlpatterns = [
Expand All @@ -26,5 +27,6 @@
url(r'^csw_to_extra_format/(?P<layeruuid>[^/]*)/(?P<resname>[^/]*).txt$',
views.csw_render_extra_format_txt, name="csw_render_extra_format_txt"),
url(r'^csw_to_extra_format/(?P<layeruuid>[^/]*)/(?P<resname>[^/]*).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/<uuid:uuid>', views.resolve_uuid, name="resolve_uuid")
]
8 changes: 7 additions & 1 deletion geonode/catalogue/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

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

0 comments on commit d45c601

Please sign in to comment.