implement can_access_geometry

This commit is contained in:
Laura Klünder 2023-12-04 22:27:01 +01:00
parent 1a0c4e63f5
commit b7b18cad36
2 changed files with 14 additions and 10 deletions

View file

@ -8,7 +8,7 @@ from django.utils.http import quote_etag
from django.utils.translation import get_language
from ninja.decorators import decorate_view
from c3nav.mapdata.models import AccessRestriction, LocationGroup, MapUpdate
from c3nav.mapdata.models import AccessRestriction, Building, Door, LocationGroup, MapUpdate, Space
from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.locations import SpecificLocation
@ -108,3 +108,11 @@ def api_stats_clean_location_value(value):
value = 'c:%s:%d:%d' % (value[1], int(float(value[2]) / 3) * 3, int(float(value[3]) / 3) * 3)
return (value, 'c:anywhere')
return (value, )
def can_access_geometry(request, obj):
if isinstance(obj, Space):
return obj.base_mapdata_accessible or request.user_permissions.can_access_base_mapdata
elif isinstance(obj, (Building, Door)):
return request.user_permissions.can_access_base_mapdata
return True

View file

@ -13,7 +13,7 @@ from pydantic import PositiveInt
from c3nav.api.auth import auth_permission_responses, auth_responses, validate_responses
from c3nav.api.exceptions import API404, APIPermissionDenied, APIRequestValidationFailed
from c3nav.api.utils import NonEmptyStr
from c3nav.mapdata.api.base import api_etag, api_stats
from c3nav.mapdata.api.base import api_etag, api_stats, can_access_geometry
from c3nav.mapdata.models import Source
from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position
from c3nav.mapdata.schemas.filters import BySearchableFilter, RemoveGeometryFilter
@ -47,10 +47,6 @@ class LocationEndpointParameters(Schema):
)
def can_access_geometry(request):
return True # todo: implement
class LocationListFilters(BySearchableFilter, RemoveGeometryFilter):
pass
@ -63,7 +59,7 @@ def _location_list(request, detailed: bool, filters: LocationListFilters):
locations = visible_locations_for_request(request).values()
result = [obj.serialize(detailed=detailed, search=filters.searchable,
geometry=filters.geometry and can_access_geometry(request),
geometry=filters.geometry and can_access_geometry(request, obj),
simple_geometry=True)
for obj in locations]
return result
@ -103,7 +99,7 @@ def _location_retrieve(request, location, detailed: bool, geometry: bool, show_r
return location.serialize(
detailed=detailed,
geometry=geometry and can_access_geometry(request),
geometry=geometry and can_access_geometry(request, location),
simple_geometry=True
)
@ -118,7 +114,7 @@ def _location_display(request, location):
return redirect('../' + str(location.target.slug) + '/details/') # todo: use reverse, make pk+slug work
result = location.details_display(
detailed_geometry=can_access_geometry(request),
detailed_geometry=can_access_geometry(request, location),
editor_url=can_access_editor(request)
)
from pprint import pprint
@ -139,7 +135,7 @@ def _location_geometry(request, location):
id=location.pk,
level=getattr(location, 'level_id', None),
geometry=location.get_geometry(
detailed_geometry=can_access_geometry(request)
detailed_geometry=can_access_geometry(request, location)
)
)