Zakladni verze planovace

This commit is contained in:
Michal Kváček
2024-04-15 18:13:37 +02:00
parent 5f0a1da052
commit cee5de003f
5 changed files with 109 additions and 54 deletions
+2 -3
View File
@@ -1,11 +1,10 @@
from typing import List, Optional
from typing import List
import strawberry
from graphql import GraphQLError
from strawberry.types import Info
from database import models
from decorators.error_logging import error_logging
from decorators.endpoints import authenticated_user_only, allow_public
from graphql_schema.entities.resolvers.base import BaseMutationResolver, BaseQueryResolver
from graphql_schema.entities.resolvers.base import BaseQueryResolver
from graphql_schema.entities.resolvers.flight_plan import FlightPlanMutationResolver
from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput
from graphql_schema.entities.types.types import FlightPlan
@@ -1,7 +1,8 @@
from sqlalchemy import delete
from database import models
from database.transaction import get_session
from graphql_schema.entities.resolvers.base import BaseMutationResolver
from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput
from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput
from graphql_schema.entities.types.types import FlightPlan
@@ -9,22 +10,44 @@ class FlightPlanMutationResolver(BaseMutationResolver):
def __init__(self):
super().__init__(graphql_type=FlightPlan, model=models.FlightPlan)
@staticmethod
async def save_markers(db, flight_plan: models.FlightPlan, markers: list):
position = 0
for marker in markers:
await models.FlightPlanMarker.create(db, data={
"position": position,
"flight_plan_id": flight_plan.id,
"type": marker.type,
"name": marker.name,
"gps_latitude": marker.gps_latitude,
"gps_longitude": marker.gps_longitude
})
position += 1
@staticmethod
async def reset_plan_markers(db, flight_plan: models.FlightPlan):
await db.execute(
delete(models.FlightPlanMarker)
.filter(models.FlightPlanMarker.flight_plan_id == flight_plan.id)
)
async def create(self, context, data: CreateFlightPlanInput) -> FlightPlan:
input_data = data.to_dict()
input_data['created_by_id'] = context.user_id
async with get_session() as db:
flight_plan = await self._do_create(db, data=input_data)
await self.save_markers(db, flight_plan, data.markers)
return flight_plan
position = 0
for marker in data.markers:
await models.FlightPlanMarker.create(db, data={
"position": position,
"flight_plan_id": flight_plan.id,
"type": marker.type,
"name": marker.name,
"gps_latitude": marker.gps_latitude,
"gps_longitude": marker.gps_longitude
})
async def update(self, id: int, data: EditFlightPlanInput, user_id: int) -> FlightPlan:
input_data = data.to_dict()
async with get_session() as db:
flight_plan = await self._do_update(db, id, input_data)
await self.reset_plan_markers(db, flight_plan)
await self.save_markers(db, flight_plan, data.markers)
return flight_plan
@@ -1,9 +1,12 @@
from __future__ import annotations
import math
from datetime import datetime
from typing import Optional, List
import strawberry
from database import models
from decorators.endpoints import authenticated_user_only
from external.gps_utils import get_bearing, get_distance
from external.gpx_parser import GPXParser
from graphql_schema.dataloaders.flight_duration import flight_duration_dataloader
from graphql_schema.dataloaders.multi_models import (
@@ -185,11 +188,40 @@ class FlightPlanMarker:
pass
@strawberry.type
class FlightPlanTrack:
bearing: int
distance: float
from_: FlightPlanMarker = strawberry.field(name="from")
to: FlightPlanMarker
@strawberry_sqlalchemy_type(model=models.FlightPlan)
class FlightPlan:
async def resolve_track(self):
markers = await self.markers()
navigation = []
for i in range(len(markers) - 1):
from_ = markers[i]
to = markers[i + 1]
point_from = (from_.gps_latitude, from_.gps_longitude)
point_to = (to.gps_latitude, to.gps_longitude)
navigation.append(FlightPlanTrack(
bearing=round(math.degrees(get_bearing(point_from, point_to)) % 360),
distance=round(get_distance(point_from, point_to), 1),
from_=from_,
to=to)
)
return navigation
markers: list[FlightPlanMarker] = strawberry.field(
resolver=lambda root: flight_plan_markers_dataloader.load(root.id)
)
track: Optional[list[FlightPlanTrack]] = strawberry.field(
resolver=resolve_track
)
@strawberry_sqlalchemy_type(models.Copilot)