Nastrel vycitani GPX

This commit is contained in:
Michal Kváček
2023-08-28 06:32:40 +02:00
parent b70223896c
commit 947e7ee0f4
+39 -8
View File
@@ -3,6 +3,7 @@ from datetime import timedelta
from typing import List, Optional, Annotated, TYPE_CHECKING, Tuple from typing import List, Optional, Annotated, TYPE_CHECKING, Tuple
import strawberry import strawberry
from fastapi import HTTPException from fastapi import HTTPException
from lxml import etree
from sqlalchemy import select, insert, delete from sqlalchemy import select, insert, delete
from starlette.status import HTTP_401_UNAUTHORIZED from starlette.status import HTTP_401_UNAUTHORIZED
from strawberry.file_uploads import Upload from strawberry.file_uploads import Upload
@@ -42,14 +43,25 @@ class WeatherInfo:
pass pass
@strawberry.type
class Point:
lat: float
lng: float
@strawberry.type
class GPXTrack:
points: List[Point]
speed: List[float]
elevation: List[float]
terrain_elevation: List[float]
@strawberry_sqlalchemy_type(models.Flight) @strawberry_sqlalchemy_type(models.Flight)
class Flight: class Flight:
async def load_takeoff_airport(root): async def load_takeoff_airport(root):
return await airport_dataloader.load(root.takeoff_airport_id) return await airport_dataloader.load(root.takeoff_airport_id)
async def load_track(root):
return await flight_track_dataloader.load(root.id)
async def load_landing_airport(root): async def load_landing_airport(root):
return await airport_dataloader.load(root.landing_airport_id) return await airport_dataloader.load(root.landing_airport_id)
@@ -78,6 +90,27 @@ class Flight:
return 0 return 0
async def load_track(root):
return await flight_track_dataloader.load(root.id)
async def load_gpx_track(root):
if not root.gpx_track_filename:
return None
path = "/app/uploads/tracks"
tree = etree.parse(f"{path}/{root.gpx_track_filename}")
points = tree.findall("//trk")
speed = tree.xpath("//extensions/speed")
elevation = tree.xpath('//ele')
print(tree.getroot().find("trk"), list(points), speed, elevation)
return GPXTrack(
points=[Point(lat=50.123, lng=14.324243)],
speed=[],
elevation=[],
terrain_elevation=[]
)
def load_gpx_track_url(root): def load_gpx_track_url(root):
if not root.gpx_track_filename: if not root.gpx_track_filename:
return None return None
@@ -99,6 +132,7 @@ class Flight:
landing_weather_info: Optional[WeatherInfo] = strawberry.field(resolver=load_landing_weather_info) landing_weather_info: Optional[WeatherInfo] = strawberry.field(resolver=load_landing_weather_info)
photos: List[Photo] = strawberry.field(resolver=load_photos) photos: List[Photo] = strawberry.field(resolver=load_photos)
gpx_track_url: Optional[str] = strawberry.field(resolver=load_gpx_track_url) gpx_track_url: Optional[str] = strawberry.field(resolver=load_gpx_track_url)
gpx_track: Optional[GPXTrack] = strawberry.field(resolver=load_gpx_track)
def get_base_query(user_id: Optional[int], username: Optional[str] = None, is_auth: bool = False): def get_base_query(user_id: Optional[int], username: Optional[str] = None, is_auth: bool = False):
@@ -167,15 +201,12 @@ class CreateFlightMutation:
takeoff_airport, landing_airport = await get_airports(db, input.takeoff_airport.id, input.landing_airport.id) takeoff_airport, landing_airport = await get_airports(db, input.takeoff_airport.id, input.landing_airport.id)
aircraft_id = await handle_aircraft_save(db, info.context.user_id, input.aircraft) aircraft_id = await handle_aircraft_save(db, info.context.user_id, input.aircraft)
weather_takeoff,weather_landing = await asyncio.gather( weather_takeoff, weather_landing = await asyncio.gather(
handle_weather_info(db, data['takeoff_datetime'], takeoff_airport), handle_weather_info(db, data['takeoff_datetime'], takeoff_airport),
handle_weather_info(db, data['landing_datetime'], landing_airport) handle_weather_info(db, data['landing_datetime'], landing_airport)
) )
await db.flush() await db.flush()
print("XXXXXXXXXXXXX", weather_takeoff, weather_takeoff.id)
flight = await models.Flight.create(db, data={ flight = await models.Flight.create(db, data={
**data, **data,
"takeoff_weather_info_id": weather_takeoff.id, "takeoff_weather_info_id": weather_takeoff.id,
@@ -192,7 +223,7 @@ class CreateFlightMutation:
class EditFlightMutation: class EditFlightMutation:
@strawberry_sqlalchemy_input(models.Flight, exclude_fields=[ @strawberry_sqlalchemy_input(models.Flight, exclude_fields=[
"id", "aircraft_id", "deleted", "landing_airport_id", "takeoff_airport_id" "id", "aircraft_id", "deleted", "landing_airport_id", "takeoff_airport_id"
"takeoff_weather_info_id", "landing_weather_info_id", "gpx_track_filename" "takeoff_weather_info_id", "landing_weather_info_id", "gpx_track_filename"
], all_optional=True) ], all_optional=True)
class EditFlightInput: class EditFlightInput:
gpx_track: Optional[Upload] = None # TODO: poresit validaci uploadovaneho souboru! gpx_track: Optional[Upload] = None # TODO: poresit validaci uploadovaneho souboru!