From bbd1e28b0fd906507c0c890b6d3d5fc47351e490 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Sat, 18 May 2024 08:12:32 +0200 Subject: [PATCH] fix reverse lookup (#121) --- django_oapif/decorators.py | 7 ++++--- tests/django_oapif_tests/tests/tests.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/django_oapif/decorators.py b/django_oapif/decorators.py index 1f119af..c5e2ec9 100644 --- a/django_oapif/decorators.py +++ b/django_oapif/decorators.py @@ -104,14 +104,15 @@ class OgcAPIFeatureViewSet(OAPIFDescribeModelViewSetMixin, viewsets.ModelViewSet filter_backends = [BboxFilterBackend] - # Allowing '.' and '-' in urls - lookup_value_regex = r"[\w.-]+" + # restrict o UUIDs lookup see https://www.django-rest-framework.org/api-guide/routers/ + # lookup_value_regex = '[0-9a-f]{32}' + # lookup_value_converter = 'uuid' # Metadata metadata_class = OAPIFMetadata def get_success_headers(self, data): - location = reverse.reverse(f"{self.basename}-detail", {"lookup": data[Model._meta.pk.column]}) + location = reverse.reverse(f"{self.basename}-detail", args=[data[Model._meta.pk.column]]) headers = {"Location": location} return headers diff --git a/tests/django_oapif_tests/tests/tests.py b/tests/django_oapif_tests/tests/tests.py index 35206a4..f57bd90 100644 --- a/tests/django_oapif_tests/tests/tests.py +++ b/tests/django_oapif_tests/tests/tests.py @@ -1,4 +1,5 @@ import logging +import re from django.contrib.auth.models import User from django.core.management import call_command @@ -97,3 +98,22 @@ def test_post_geometry_less_layer(self): url = f"{collections_url}/{layer}/items" post_to_items = self.client.post(url, data, format="json") self.assertIn(post_to_items.status_code, (200, 201), (url, data, post_to_items.data)) + + def test_returned_id(self): + self.client.force_authenticate(user=self.demo_editor) + data = { + "geometry": { + "type": "Point", + "coordinates": [2508500.0, 1152000.0], + "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::2056"}}, + }, + "properties": {"field_str_0": "test123456"}, + } + + for layer in ("tests.point_2056_10fields",): + url = f"{collections_url}/{layer}/items" + post_to_items = self.client.post(url, data, format="json") + self.assertIn(post_to_items.status_code, (200, 201), (url, data, post_to_items.data)) + location = post_to_items.headers["Location"] + print(location) + self.assertTrue(re.match(r"^.*[0-9a-f\-]{36}$", location))