Nastrel vycitani GPX
This commit is contained in:
@@ -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!
|
||||||
|
|||||||
Reference in New Issue
Block a user