route result should use more schema

This commit is contained in:
Laura Klünder 2024-12-04 15:27:06 +01:00
parent 602093d67a
commit f2f67a1cbb
5 changed files with 22 additions and 12 deletions

View file

@ -4,7 +4,7 @@ from types import NoneType
from typing import Annotated, Any, Literal, Union, ClassVar from typing import Annotated, Any, Literal, Union, ClassVar
from django.core.exceptions import FieldDoesNotExist from django.core.exceptions import FieldDoesNotExist
from django.db.models import Model, ManyToManyField from django.db.models import Model
from django.utils.functional import Promise from django.utils.functional import Promise
from ninja import Schema from ninja import Schema
from pydantic import Discriminator from pydantic import Discriminator

View file

@ -651,7 +651,6 @@ class SlimLocationMixin(BaseSchema):
groups: ClassVar[None] groups: ClassVar[None]
groups_by_category: ClassVar[None] groups_by_category: ClassVar[None]
geometry: ClassVar[None] geometry: ClassVar[None]
point: ClassVar[None]
class SlimLevelLocationSchema(SlimLocationMixin, FullLevelLocationSchema): class SlimLevelLocationSchema(SlimLocationMixin, FullLevelLocationSchema):

View file

@ -18,6 +18,8 @@ from c3nav.mapdata.api.base import api_stats_clean_location_value
from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.locations import Position from c3nav.mapdata.models.locations import Position
from c3nav.mapdata.schemas.model_base import AnyLocationID, Coordinates3D from c3nav.mapdata.schemas.model_base import AnyLocationID, Coordinates3D
from c3nav.mapdata.schemas.models import SlimLocationSchema, SpaceSchema, LevelSchema, SlimSpaceLocationSchema, \
SlimLevelLocationSchema
from c3nav.mapdata.utils.cache.stats import increment_cache_key from c3nav.mapdata.utils.cache.stats import increment_cache_key
from c3nav.mapdata.utils.locations import visible_locations_for_request from c3nav.mapdata.utils.locations import visible_locations_for_request
from c3nav.routing.exceptions import LocationUnreachable, NoRouteFound, NotYetRoutable from c3nav.routing.exceptions import LocationUnreachable, NoRouteFound, NotYetRoutable
@ -128,11 +130,17 @@ class RouteItemSchema(BaseSchema):
Annotated[None, APIField(title="null", description="no waytype (normal walking)")], Annotated[None, APIField(title="null", description="no waytype (normal walking)")],
] = APIField(None, title="waytype") ] = APIField(None, title="waytype")
space: Union[ space: Union[
Annotated[dict, APIField(title="space", descripiton="new space that is being entered")], Annotated[
SlimSpaceLocationSchema,
APIField(title="space", descripiton="new space that is being entered")
],
Annotated[None, APIField(title="null", description="staying in the same space")], Annotated[None, APIField(title="null", description="staying in the same space")],
] = APIField(None, description="new space being entered") ] = APIField(None, description="new space being entered")
level: Union[ level: Union[
Annotated[dict, APIField(title="level", descripiton="new level that is being entered")], Annotated[
SlimLevelLocationSchema,
APIField(title="level", descripiton="new level that is being entered")
],
Annotated[None, APIField(title="null", description="staying in the same level")], Annotated[None, APIField(title="null", description="staying in the same level")],
] = APIField(None, description="new level being entered") ] = APIField(None, description="new level being entered")
descriptions: list[tuple[ descriptions: list[tuple[
@ -148,8 +156,8 @@ class RouteItemSchema(BaseSchema):
class RouteSchema(BaseSchema): class RouteSchema(BaseSchema):
origin: dict # todo: improve this origin: SlimLocationSchema # todo: is this fine? works? no issues?
destination: dict # todo: improve this destination: SlimLocationSchema # todo: is this fine? works? no issues?
distance: float distance: float
duration: int duration: int
distance_str: NonEmptyStr distance_str: NonEmptyStr

View file

@ -12,10 +12,11 @@ def describe_location(location, locations):
final_location = locations.get(location.pk) final_location = locations.get(location.pk)
if final_location is not None: if final_location is not None:
location = final_location location = final_location
result = location.serialize(include_type=True, detailed=False, simple_geometry=True) # todo: oh my god this needs to be improved
if hasattr(location, 'serialize_position'): from c3nav.routing.router import BaseRouterProxy
result.update(location.serialize_position()) if isinstance(location, BaseRouterProxy):
return result location = location.src
return location
class Route: class Route:

View file

@ -27,6 +27,7 @@ from django.views.decorators.cache import cache_control, never_cache
from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.http import etag from django.views.decorators.http import etag
from django.views.i18n import LANGUAGE_QUERY_PARAMETER, set_language from django.views.i18n import LANGUAGE_QUERY_PARAMETER, set_language
from pydantic.type_adapter import TypeAdapter
from c3nav import __version__ as c3nav_version from c3nav import __version__ as c3nav_version
from c3nav.api.models import Secret from c3nav.api.models import Secret
@ -37,6 +38,7 @@ from c3nav.mapdata.models.access import AccessPermission, AccessPermissionToken
from c3nav.mapdata.models.locations import (LocationGroup, LocationRedirect, Position, SpecificLocation, from c3nav.mapdata.models.locations import (LocationGroup, LocationRedirect, Position, SpecificLocation,
get_position_secret) get_position_secret)
from c3nav.mapdata.models.report import Report, ReportUpdate from c3nav.mapdata.models.report import Report, ReportUpdate
from c3nav.mapdata.schemas.models import SlimLocationSchema
from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_location_by_slug_for_request, from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_location_by_slug_for_request,
levels_by_short_label_for_request) levels_by_short_label_for_request)
from c3nav.mapdata.utils.user import can_access_editor, get_user_data from c3nav.mapdata.utils.user import can_access_editor, get_user_data
@ -122,9 +124,9 @@ def map_index(request, mode=None, slug=None, slug2=None, details=None, options=N
state = { state = {
'routing': routing, 'routing': routing,
'origin': (origin.serialize(detailed=False, simple_geometry=True, geometry=False) 'origin': (TypeAdapter(SlimLocationSchema).validate_python(origin).model_dump()
if origin else None), if origin else None),
'destination': (destination.serialize(detailed=False, simple_geometry=True, geometry=False) 'destination': (TypeAdapter(SlimLocationSchema).validate_python(destination).model_dump()
if destination else None), if destination else None),
'sidebar': routing or destination is not None, 'sidebar': routing or destination is not None,
'details': True if details else False, 'details': True if details else False,