lepsi podpora strankovani, bugfixing, vyhledavani

This commit is contained in:
Michal Kváček
2026-01-06 22:03:49 +01:00
parent d794208193
commit 888351baac
9 changed files with 42 additions and 21 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
fastapi==0.115.7 fastapi==0.115.7
fastapi-jwt[authlib]==0.3.0 fastapi-jwt[authlib]==0.3.0
bcrypt bcrypt==4.2.1
fastapi-mail==1.4.2 fastapi-mail==1.4.2
strawberry-graphql[fastapi]==0.258.0 strawberry-graphql[fastapi]==0.258.0
-1
View File
@@ -1,7 +1,6 @@
import re import re
from fastapi import HTTPException, BackgroundTasks from fastapi import HTTPException, BackgroundTasks
from sqlalchemy import select from sqlalchemy import select
from typing import Optional
from pydantic import BaseModel, Field, model_validator from pydantic import BaseModel, Field, model_validator
from background_jobs.send_email import send_email from background_jobs.send_email import send_email
from database.models import User from database.models import User
+1 -4
View File
@@ -4,8 +4,6 @@ from fastapi import BackgroundTasks, Depends, Security
from fastapi_jwt import JwtAuthorizationCredentials from fastapi_jwt import JwtAuthorizationCredentials
from sqlalchemy import select from sqlalchemy import select
from strawberry.fastapi import BaseContext from strawberry.fastapi import BaseContext
from logger import log
from database import async_session, models from database import async_session, models
from jwt import access_security from jwt import access_security
@@ -18,12 +16,11 @@ class GraphQLContext(BaseContext):
jwt_auth_credentials: JwtAuthorizationCredentials jwt_auth_credentials: JwtAuthorizationCredentials
background_tasks: BackgroundTasks background_tasks: BackgroundTasks
async def setup_graphql_context(credentials: JwtAuthorizationCredentials = Security(access_security)): async def setup_graphql_context(credentials: JwtAuthorizationCredentials = Security(access_security)):
user_id = credentials['id'] if credentials else None user_id = credentials['id'] if credentials else None
organization_ids = set() organization_ids = set()
log.error(user_id)
if user_id: if user_id:
async with async_session() as db: async with async_session() as db:
organization_ids = set((await db.scalars( organization_ids = set((await db.scalars(
+4 -2
View File
@@ -1,4 +1,5 @@
import strawberry import strawberry
from strawberry import Info
from .helpers.filters import get_filters from .helpers.filters import get_filters
from .helpers.pagination import PaginationWindow from .helpers.pagination import PaginationWindow
from .resolvers.aircraft import AircraftMutationResolver, AircraftQueryResolver from .resolvers.aircraft import AircraftMutationResolver, AircraftQueryResolver
@@ -11,10 +12,11 @@ from ..extensions.field.pagination import OffsetPagination
@strawberry.type @strawberry.type
class AircraftQueries: class AircraftQueries:
@strawberry.field(extensions=[OffsetPagination(item_type=Aircraft), AuthenticatedOnly()]) @strawberry.field(extensions=[OffsetPagination(item_type=Aircraft), AuthenticatedOnly()])
async def aircrafts(root, info) -> PaginationWindow[Aircraft]: async def aircrafts(root, info: Info, search: str | None = None) -> PaginationWindow[Aircraft]:
return AircraftQueryResolver().get_query( return AircraftQueryResolver().get_query(
info.context.user_id, info.context.user_id,
organization_ids=info.context.organization_ids organization_ids=info.context.organization_ids,
search=search
) )
@strawberry.field(extensions=[AllowPublicAccess()]) @strawberry.field(extensions=[AllowPublicAccess()])
+3 -1
View File
@@ -15,6 +15,7 @@ class FlightQueries:
async def flights( async def flights(
root, info, root, info,
username: str | None = None, username: str | None = None,
search: str | None = None,
event_id: int | None = None, event_id: int | None = None,
public: bool | None = False, public: bool | None = False,
copilot_id: int | None = None, copilot_id: int | None = None,
@@ -28,7 +29,8 @@ class FlightQueries:
only_public=public, only_public=public,
copilot_id=copilot_id, copilot_id=copilot_id,
aircraft_id=aircraft_id, aircraft_id=aircraft_id,
point_of_interest_id=point_of_interest_id point_of_interest_id=point_of_interest_id,
search=search
) )
@strawberry.field(extensions=[AllowPublicAccess()]) @strawberry.field(extensions=[AllowPublicAccess()])
+5 -3
View File
@@ -1,17 +1,19 @@
import strawberry import strawberry
from strawberry.types import Info from strawberry.types import Info
from graphql_schema.entities.helpers.filters import get_detail_filters from graphql_schema.entities.helpers.filters import get_detail_filters
from graphql_schema.entities.helpers.pagination import PaginationWindow
from graphql_schema.entities.resolvers.flight_plan import FlightPlanMutationResolver, FlightPlanQueryResolver from graphql_schema.entities.resolvers.flight_plan import FlightPlanMutationResolver, FlightPlanQueryResolver
from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput
from graphql_schema.entities.types.types import FlightPlan from graphql_schema.entities.types.types import FlightPlan
from graphql_schema.extensions.field.auth import AuthenticatedOnly, AllowPublicAccess from graphql_schema.extensions.field.auth import AuthenticatedOnly, AllowPublicAccess
from graphql_schema.extensions.field.pagination import OffsetPagination
@strawberry.type @strawberry.type
class FlightPlanQueries: class FlightPlanQueries:
@strawberry.field(extensions=[AuthenticatedOnly()]) @strawberry.field(extensions=[OffsetPagination(item_type=FlightPlan), AuthenticatedOnly()])
async def flight_plans(root, info: Info) -> list[FlightPlan]: async def flight_plans(root, info: Info, search: str | None = None) -> PaginationWindow[FlightPlan]:
return await FlightPlanQueryResolver().get_list(info.context.user_id) return FlightPlanQueryResolver().get_query(info.context.user_id, search=search)
@strawberry.field(extensions=[AllowPublicAccess()]) @strawberry.field(extensions=[AllowPublicAccess()])
async def flight_plan( async def flight_plan(
@@ -1,6 +1,4 @@
from operator import or_ from sqlalchemy import and_, or_
from typing import Set, Optional
from sqlalchemy import and_
from database import models from database import models
from database.transaction import get_session from database.transaction import get_session
from graphql_schema.context import GraphQLContext from graphql_schema.context import GraphQLContext
@@ -19,26 +17,33 @@ class AircraftQueryResolver(BaseQueryResolver):
user_id: int | None = None, user_id: int | None = None,
object_id: int | None = None, object_id: int | None = None,
order_by: list | None = None, order_by: list | None = None,
organization_ids: Optional[Set[int]] = None, organization_ids: set[int] | None = None,
*args, *args,
**kwargs, **kwargs,
): ):
filters = [] filters = []
search = {}
if kwargs.get("call_sign"): if kwargs.get("call_sign"):
filters.append(models.Aircraft.call_sign == kwargs['call_sign']) filters.append(models.Aircraft.call_sign == kwargs['call_sign'])
if kwargs.get("search"):
search['search'] = kwargs.pop("search", None)
query = super().get_query( query = super().get_query(
object_id=object_id, object_id=object_id,
only_my=False, only_my=False,
only_public=kwargs.get("only_public", False), only_public=kwargs.get("only_public", False),
order_by=order_by, order_by=order_by,
filters=filters, filters=filters,
**search
) )
if kwargs.get("search"):
search = kwargs["search"]
query = query.filter(
or_(
models.Aircraft.call_sign.contains(search),
models.Aircraft.manufacturer.contains(search),
models.Aircraft.model.contains(search),
)
)
if organization_ids: if organization_ids:
query = ( query = (
query.filter( query.filter(
@@ -70,6 +70,14 @@ class FlightQueryResolver(BaseQueryResolver):
) )
) )
if kwargs.get("search"):
search = kwargs["search"]
query = (
query.filter(
models.Flight.name.contains(search)
)
)
if kwargs.get('username'): if kwargs.get('username'):
query = ( query = (
query.join(models.Flight.created_by) query.join(models.Flight.created_by)
@@ -42,6 +42,12 @@ class FlightPlanQueryResolver(BaseQueryResolver):
.filter(models.User.public_username == kwargs['username']) .filter(models.User.public_username == kwargs['username'])
) )
if kwargs.get("search"):
search = kwargs["search"]
query = (
query.filter(models.FlightPlan.name.contains(search))
)
return query return query