diff --git a/src/c3nav/mapdata/api.py b/src/c3nav/mapdata/api.py index 3eb5a0f3..9fc57882 100644 --- a/src/c3nav/mapdata/api.py +++ b/src/c3nav/mapdata/api.py @@ -348,6 +348,21 @@ class LocationViewSetBase(RetrieveModelMixin, GenericViewSet): editor_url=can_access_editor(request) )) + @action(detail=True, methods=['get']) + @api_etag(base_mapdata_check=True) + def geometry(self, request, **kwargs): + location = self.get_object() + + if location is None: + raise NotFound + + if isinstance(location, LocationRedirect): + return redirect('../' + str(location.target.pk) + '/geometry/') + + return Response(location.get_geometry( + detailed_geometry=MapdataViewSet.can_access_geometry(request, location), + )) + class LocationViewSet(LocationViewSetBase): """ diff --git a/src/c3nav/mapdata/models/base.py b/src/c3nav/mapdata/models/base.py index b341ce03..144e6723 100644 --- a/src/c3nav/mapdata/models/base.py +++ b/src/c3nav/mapdata/models/base.py @@ -42,6 +42,9 @@ class SerializableMixin(models.Model): ] } + def get_geometry(self, detailed_geometry=True): + return None + @property def title(self): return self._meta.verbose_name + ' ' + str(self.id) diff --git a/src/c3nav/mapdata/models/geometry/base.py b/src/c3nav/mapdata/models/geometry/base.py index 26738d9c..9204c35e 100644 --- a/src/c3nav/mapdata/models/geometry/base.py +++ b/src/c3nav/mapdata/models/geometry/base.py @@ -88,12 +88,14 @@ class GeometryMixin(SerializableMixin): def details_display(self, detailed_geometry=True, **kwargs): result = super().details_display(**kwargs) - if detailed_geometry: - result['geometry'] = format_geojson(smart_mapping(self.geometry), round=False) - else: - result['geometry'] = format_geojson(smart_mapping(box(*self.geometry.bounds)), round=False) + result['geometry'] = self.get_geometry(detailed_geometry=detailed_geometry) return result + def get_geometry(self, detailed_geometry=True): + if detailed_geometry: + return format_geojson(smart_mapping(self.geometry), round=False) + return format_geojson(smart_mapping(box(*self.geometry.bounds)), round=False) + def get_shadow_geojson(self): pass