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 django.utils.translation import get_language
from ninja.decorators import decorate_view 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.access import AccessPermission
from c3nav.mapdata.models.geometry.base import GeometryMixin from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.locations import SpecificLocation 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) 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, 'c:anywhere')
return (value, ) 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.auth import auth_permission_responses, auth_responses, validate_responses
from c3nav.api.exceptions import API404, APIPermissionDenied, APIRequestValidationFailed from c3nav.api.exceptions import API404, APIPermissionDenied, APIRequestValidationFailed
from c3nav.api.utils import NonEmptyStr 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 import Source
from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position
from c3nav.mapdata.schemas.filters import BySearchableFilter, RemoveGeometryFilter 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): class LocationListFilters(BySearchableFilter, RemoveGeometryFilter):
pass pass
@ -63,7 +59,7 @@ def _location_list(request, detailed: bool, filters: LocationListFilters):
locations = visible_locations_for_request(request).values() locations = visible_locations_for_request(request).values()
result = [obj.serialize(detailed=detailed, search=filters.searchable, 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) simple_geometry=True)
for obj in locations] for obj in locations]
return result return result
@ -103,7 +99,7 @@ def _location_retrieve(request, location, detailed: bool, geometry: bool, show_r
return location.serialize( return location.serialize(
detailed=detailed, detailed=detailed,
geometry=geometry and can_access_geometry(request), geometry=geometry and can_access_geometry(request, location),
simple_geometry=True 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 return redirect('../' + str(location.target.slug) + '/details/') # todo: use reverse, make pk+slug work
result = location.details_display( result = location.details_display(
detailed_geometry=can_access_geometry(request), detailed_geometry=can_access_geometry(request, location),
editor_url=can_access_editor(request) editor_url=can_access_editor(request)
) )
from pprint import pprint from pprint import pprint
@ -139,7 +135,7 @@ def _location_geometry(request, location):
id=location.pk, id=location.pk,
level=getattr(location, 'level_id', None), level=getattr(location, 'level_id', None),
geometry=location.get_geometry( geometry=location.get_geometry(
detailed_geometry=can_access_geometry(request) detailed_geometry=can_access_geometry(request, location)
) )
) )