From 22050fb292e2b483b78c8567124d8c2a1509e2f9 Mon Sep 17 00:00:00 2001 From: Adam Cox Date: Sat, 27 Jul 2024 14:20:08 -0500 Subject: [PATCH 1/3] initial (rough) addition of layers endpoint to replace /mrm --- ohmg/core/api.py | 8 +++++++- ohmg/core/schemas.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/ohmg/core/api.py b/ohmg/core/api.py index 84736de7..2dbc8d51 100644 --- a/ohmg/core/api.py +++ b/ohmg/core/api.py @@ -20,9 +20,10 @@ SessionSchema, AnnotationSetSchema, PlaceSchema, + LayerSchema, ) from ohmg.loc_insurancemaps.models import Volume -from ohmg.georeference.models import SessionBase, AnnotationSet +from ohmg.georeference.models import SessionBase, AnnotationSet, Layer from ohmg.places.models import Place logger = logging.getLogger(__name__) @@ -175,3 +176,8 @@ def get_places_geojson(request): geojson['features'].append(feature) return geojson + +@api.get('layers/', response=List[LayerSchema], url_name="layers") +def layer(request): + + return Layer.objects.all() diff --git a/ohmg/core/schemas.py b/ohmg/core/schemas.py index c45118fb..448fc844 100644 --- a/ohmg/core/schemas.py +++ b/ohmg/core/schemas.py @@ -1,5 +1,6 @@ from datetime import datetime from typing import List, Optional, Any, Union +from django.conf import settings from django.urls import reverse from ninja import ( Field, @@ -143,6 +144,10 @@ class LayerSchema(Schema): slug: str detail_url: str thumb_url: str = '' + geotiff_url: Optional[str] + image_url: Optional[str] + mask: Optional[dict] + gcps_geojson: Optional[dict] @staticmethod def resolve_thumb_url(obj): @@ -153,6 +158,37 @@ def resolve_thumb_url(obj): def resolve_detail_url(obj): return reverse("resource_detail", args=(obj.pk, )) + @staticmethod + def resolve_mask(obj): + if obj.vrs and obj.vrs.multimask and obj.slug in obj.vrs.multimask: + return obj.vrs.multimask[obj.slug] + else: + return None + + @staticmethod + def resolve_image_url(obj): + base = settings.SITEURL.rstrip("/") + doc = obj.get_document() + if doc and doc.file: + return base + doc.file.url + else: + return None + + @staticmethod + def resolve_geotiff_url(obj): + base = settings.SITEURL.rstrip("/") + if obj.file: + return base + obj.file.url + else: + return None + + @staticmethod + def resolve_gcps_geojson(obj): + doc = obj.get_document() + if doc: + return doc.gcps_geojson + else: + return None class SessionSchema(Schema): From 2a3923c4b1f298f217b0dd242f009c805cbdb53a Mon Sep 17 00:00:00 2001 From: Adam Cox Date: Sat, 27 Jul 2024 19:33:10 +0000 Subject: [PATCH 2/3] paginate and prefetch --- ohmg/core/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ohmg/core/api.py b/ohmg/core/api.py index 2dbc8d51..1b705695 100644 --- a/ohmg/core/api.py +++ b/ohmg/core/api.py @@ -178,6 +178,7 @@ def get_places_geojson(request): return geojson @api.get('layers/', response=List[LayerSchema], url_name="layers") +@paginate def layer(request): - return Layer.objects.all() + return Layer.objects.prefetch_related("vrs") From cde07e10185a2c82cc6d135a2578626cc6ffcc87 Mon Sep 17 00:00:00 2001 From: Adam Cox Date: Sat, 27 Jul 2024 20:48:58 +0000 Subject: [PATCH 3/3] implement mapid as filter for layers endpoint --- ohmg/core/api.py | 9 ++++++--- ohmg/core/schemas.py | 6 ++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ohmg/core/api.py b/ohmg/core/api.py index 1b705695..091db66f 100644 --- a/ohmg/core/api.py +++ b/ohmg/core/api.py @@ -178,7 +178,10 @@ def get_places_geojson(request): return geojson @api.get('layers/', response=List[LayerSchema], url_name="layers") -@paginate -def layer(request): +def layer(request, map: str): + + vol = Volume.objects.get(pk=map).serialize() + layer_ids = [i['slug'] for i in vol['items']['layers']] + layers = Layer.objects.filter(slug__in=layer_ids).prefetch_related('vrs') - return Layer.objects.prefetch_related("vrs") + return layers diff --git a/ohmg/core/schemas.py b/ohmg/core/schemas.py index 448fc844..079a6f37 100644 --- a/ohmg/core/schemas.py +++ b/ohmg/core/schemas.py @@ -167,18 +167,16 @@ def resolve_mask(obj): @staticmethod def resolve_image_url(obj): - base = settings.SITEURL.rstrip("/") doc = obj.get_document() if doc and doc.file: - return base + doc.file.url + return doc.file.url else: return None @staticmethod def resolve_geotiff_url(obj): - base = settings.SITEURL.rstrip("/") if obj.file: - return base + obj.file.url + return obj.file.url else: return None