draft: crud pro planovac

This commit is contained in:
Michal Kváček
2024-03-25 19:04:24 +01:00
parent 01f8a616bf
commit 63e2eed8c2
8 changed files with 150 additions and 21 deletions
@@ -150,3 +150,12 @@ photos_aircraft_dataloader = DataLoader(
).load,
cache=False
)
flight_plan_markers_dataloader = DataLoader(
load_fn=MultiModelsDataloader(
models.FlightPlanMarker,
relationship_column=models.FlightPlanMarker.flight_plan_id,
order_by=[models.FlightPlanMarker.position, models.FlightPlanMarker.id]
).load,
cache=False
)
+4 -8
View File
@@ -6,6 +6,7 @@ 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.flight_plan import FlightPlanMutationResolver
from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput
from graphql_schema.entities.types.types import FlightPlan
@@ -21,14 +22,9 @@ class FlightPlanQueries:
@strawberry.field()
@error_logging
@allow_public
async def flight_plan(
root, info: Info,
id: Optional[int] = None,
public: Optional[bool] = False
) -> FlightPlan:
async def flight_plan(root, info: Info, id: int) -> FlightPlan:
return await BaseQueryResolver(FlightPlan, models.FlightPlan).get_one(
user_id=info.context.user_id,
only_public=public,
object_id=id
)
@@ -39,10 +35,10 @@ class FlightPlanMutation:
@error_logging
@authenticated_user_only()
async def create_flight_plan(root, info, input: CreateFlightPlanInput) -> FlightPlan:
return await BaseMutationResolver(FlightPlan, models.FlightPlan).create(info.context, data=input)
return await FlightPlanMutationResolver().create(info.context, data=input)
@strawberry.mutation
@error_logging
@authenticated_user_only()
async def edit_flight_plan(root, info, id: int, input: EditFlightPlanInput) -> FlightPlan:
return await BaseMutationResolver(FlightPlan, models.FlightPlan).update(id, input, info.context.user_id)
return await FlightPlanMutationResolver().update(id, input, info.context.user_id)
@@ -0,0 +1,30 @@
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.types import FlightPlan
class FlightPlanMutationResolver(BaseMutationResolver):
def __init__(self):
super().__init__(graphql_type=FlightPlan, model=models.FlightPlan)
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)
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
})
return flight_plan
@@ -14,11 +14,9 @@ class ComboboxInput:
name: str
@strawberry.input()
class FlightPlanMarkerInput:
name: str
gps_latitude: float
gps_longitude: float
@strawberry_sqlalchemy_input(model=models.FlightPlanMarker, exclude_fields=["id", "flight_plan_id"])
class FlightPlanMarkerInput(BaseGraphqlInputType):
position: Optional[int] = 0
@strawberry_sqlalchemy_input(model=models.Copilot, exclude_fields=["id"])
@@ -30,6 +28,11 @@ class CreateCopilotInput(BaseGraphqlInputType):
class CreateFlightPlanInput(BaseGraphqlInputType):
markers: list[FlightPlanMarkerInput]
def to_dict(self) -> dict:
data = super().to_dict()
data['markers'] = [marker.to_dict() for marker in self.markers]
return data
@strawberry_sqlalchemy_input(model=models.FlightPlan, exclude_fields=["id", "markers"], all_optional=True)
class EditFlightPlanInput(BaseGraphqlInputType):
+7 -7
View File
@@ -11,7 +11,7 @@ from graphql_schema.dataloaders.multi_models import (
photos_dataloader, flights_by_aircraft_dataloader, users_in_organization_dataloader,
aircrafts_from_organization_dataloader, user_organizations_dataloader, flights_by_event_dataloader,
flights_by_copilot_dataloader, public_flights_by_event_dataloader, public_flights_by_copilot_dataloader,
photo_copilots_dataloader, photos_aircraft_dataloader, copilots_in_photo_dataloader
photo_copilots_dataloader, photos_aircraft_dataloader, copilots_in_photo_dataloader, flight_plan_markers_dataloader
)
from graphql_schema.dataloaders.single_model import (
poi_dataloader, poi_type_dataloader, event_dataloader, aircraft_dataloader, airport_dataloader,
@@ -180,16 +180,16 @@ class Flight:
)
@strawberry.type
@strawberry_sqlalchemy_type(model=models.FlightPlanMarker)
class FlightPlanMarker:
name: str
gps_latitude: float
gps_longitude: float
pass
@strawberry_sqlalchemy_type(models.FlightPlan, exclude_fields=["markers"])
@strawberry_sqlalchemy_type(model=models.FlightPlan)
class FlightPlan:
markers: list[FlightPlanMarker] = strawberry.field()
markers: list[FlightPlanMarker] = strawberry.field(
resolver=lambda root: flight_plan_markers_dataloader.load(root.id)
)
@strawberry_sqlalchemy_type(models.Copilot)