From f535d2866ca0107b059384205654343aed4d86be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Sun, 10 Dec 2023 22:11:44 +0100 Subject: [PATCH] Uprava razeni fotek, drobnosti --- src/database/query_builder.py | 5 ++++- src/graphql_schema/dataloaders/multi_models.py | 18 ++++++++++++------ src/graphql_schema/entities/resolvers/photo.py | 14 +++++++------- .../entities/types/mutation_input.py | 6 +++--- src/graphql_schema/entities/types/types.py | 4 ---- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/database/query_builder.py b/src/database/query_builder.py index cdc1ae1..c0e7cd1 100644 --- a/src/database/query_builder.py +++ b/src/database/query_builder.py @@ -26,7 +26,10 @@ class QueryBuilder: if only_public and hasattr(self.model, "is_public"): query = query.filter(self.model.is_public.is_(True)) elif hasattr(self.model, "created_by_id") and created_by_id: - query = query.filter(self.model.created_by_id == created_by_id) + query = query.filter(or_( + self.model.created_by_id.is_(None), + self.model.created_by_id == created_by_id + )) if order_by: query = query.order_by(*order_by) diff --git a/src/graphql_schema/dataloaders/multi_models.py b/src/graphql_schema/dataloaders/multi_models.py index 6dfc3cc..590782b 100644 --- a/src/graphql_schema/dataloaders/multi_models.py +++ b/src/graphql_schema/dataloaders/multi_models.py @@ -2,7 +2,6 @@ from strawberry.dataloader import DataLoader from database import models from graphql_schema.dataloaders.base import MultiModelsDataloader - aircrafts_from_organization_dataloader = DataLoader( load_fn=MultiModelsDataloader( models.Aircraft, @@ -43,14 +42,17 @@ public_flights_by_copilot_dataloader = DataLoader( flights_by_aircraft_dataloader = DataLoader( load_fn=MultiModelsDataloader( models.Flight, - relationship_column=models.Flight.aircraft_id + relationship_column=models.Flight.aircraft_id, + order_by=[models.Flight.takeoff_datetime.desc()] ).load, cache=False) flight_by_poi_dataloader = DataLoader( load_fn=MultiModelsDataloader( models.Flight, relationship_column=models.PointOfInterest.id, - extra_join=[models.Flight.track, models.PointOfInterest]).load, + order_by=[models.Flight.takeoff_datetime.desc()], + extra_join=[models.Flight.track, models.PointOfInterest] + ).load, cache=False ) @@ -58,7 +60,9 @@ flights_by_event_dataloader = DataLoader( load_fn=MultiModelsDataloader( models.Flight, relationship_column=models.Event.id, - extra_join=[models.Flight.event]).load, + extra_join=[models.Flight.event], + order_by=[models.Flight.takeoff_datetime.desc()] + ).load, cache=False ) @@ -67,7 +71,9 @@ public_flights_by_event_dataloader = DataLoader( models.Flight, relationship_column=models.Event.id, filters=[models.Flight.is_public.is_(True)], - extra_join=[models.Flight.event]).load, + order_by=[models.Flight.takeoff_datetime.desc()], + extra_join=[models.Flight.event] + ).load, cache=False ) @@ -138,4 +144,4 @@ photos_aircraft_dataloader = DataLoader( order_by=[models.Photo.exposed_at] ).load, cache=False -) \ No newline at end of file +) diff --git a/src/graphql_schema/entities/resolvers/photo.py b/src/graphql_schema/entities/resolvers/photo.py index 740a78b..b3db684 100644 --- a/src/graphql_schema/entities/resolvers/photo.py +++ b/src/graphql_schema/entities/resolvers/photo.py @@ -32,10 +32,14 @@ class PhotoQueryResolver(BaseQueryResolver): only_public: Optional[bool] = False, *args, **kwargs ): + query = super().get_query( user_id, object_id, order_by, - aircraft_id=kwargs.get("aircraft_id"), - point_of_interest_id=kwargs.get("point_of_interest_id") + **{ + field: kwargs[field] + for field in ("aircraft_id", "point_of_interest_id", "flight_id") + if kwargs.get(field) + } ) if kwargs.get("public"): @@ -46,7 +50,7 @@ class PhotoQueryResolver(BaseQueryResolver): if kwargs.get("copilot_id"): query = ( - query.join(models.copilot_has_photo, ) + query.join(models.copilot_has_photo) .filter(models.copilot_has_photo.c.copilot_id == kwargs['copilot_id']) ) @@ -131,10 +135,6 @@ class PhotoMutationResolver(BaseMutationResolver): extra_data={"description": ""} ) - if input.is_aircraft: - flight = (await db.scalars(select(models.Flight).filter(models.Flight.id == photo.flight_id))).one() - data['aircraft_id'] = flight.aircraft_id - if input.copilots is not None: await db.execute(delete(models.copilot_has_photo).filter_by(photo_id=id)) for copilot in input.copilots: diff --git a/src/graphql_schema/entities/types/mutation_input.py b/src/graphql_schema/entities/types/mutation_input.py index ae5413e..bca69f7 100644 --- a/src/graphql_schema/entities/types/mutation_input.py +++ b/src/graphql_schema/entities/types/mutation_input.py @@ -19,7 +19,7 @@ class CreateCopilotInput(BaseGraphqlInputType): pass -@strawberry_sqlalchemy_input(model=models.Copilot, exclude_fields=["id"]) +@strawberry_sqlalchemy_input(model=models.Copilot, exclude_fields=["id"], all_optional=True) class EditCopilotInput(BaseGraphqlInputType): pass @@ -68,12 +68,12 @@ class EditPhotoInput: name: Optional[str] = None description: Optional[str] = None point_of_interest: Optional[ComboboxInput] = None - is_aircraft: Optional[bool] = None copilots: Optional[List[ComboboxInput]] = None + aircraft_id: Optional[int] = None def to_dict(self): return { - key: getattr(self, key) for key in ('name', 'description') + key: getattr(self, key) for key in ('name', 'description', 'aircraft_id') if getattr(self, key) is not None } diff --git a/src/graphql_schema/entities/types/types.py b/src/graphql_schema/entities/types/types.py index a0b7a12..6a4efd5 100644 --- a/src/graphql_schema/entities/types/types.py +++ b/src/graphql_schema/entities/types/types.py @@ -87,7 +87,6 @@ class Photo: resolver=lambda root: poi_dataloader.load(root.point_of_interest_id) ) copilots: List[Copilot] = strawberry.field(resolver=lambda root: copilots_in_photo_dataloader.load(root.id)) - is_aircraft: bool = strawberry.field(resolver=lambda root: bool(root.aircraft_id)) flight: Flight = strawberry.field(resolver=lambda root: flight_dataloader.load(root.flight_id)) adjustment: Optional[PhotoAdjustment] = strawberry.field( resolver=lambda root: photo_adjustment_dataloader.load(root.id) @@ -163,9 +162,6 @@ class Copilot: @strawberry_sqlalchemy_type(models.Aircraft) class Aircraft: - # photo_url: Optional[str] = strawberry.field( - # resolver=lambda root: get_public_url(f"aircrafts/{root.photo_filename}") if root.photo_filename else None - # ) flights: List[Flight] = strawberry.field(resolver=lambda root: flights_by_aircraft_dataloader.load(root.id)) organization: Optional[Organization] = strawberry.field( resolver=lambda root: organizations_dataloader.load(root.organization_id)