From e160cc5fea3d6dd94b13a2784c623359b9771502 Mon Sep 17 00:00:00 2001 From: vikynoah Date: Wed, 9 Apr 2025 14:00:30 +0200 Subject: [PATCH] feat: Response filter async (#47) * fix: get_object alter for async response filter * fix: Alter async response * feat: Decorator for schema out --- creyPY/fastapi/crud.py | 6 +++--- creyPY/fastapi/schemas/__init__.py | 1 + creyPY/fastapi/schemas/schema_optional.py | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 creyPY/fastapi/schemas/schema_optional.py diff --git a/creyPY/fastapi/crud.py b/creyPY/fastapi/crud.py index c22d54f..1f43a7f 100644 --- a/creyPY/fastapi/crud.py +++ b/creyPY/fastapi/crud.py @@ -54,20 +54,20 @@ def get_object_or_404( query = select(*selected_columns).where(getattr(db_class, lookup_column) == id) result = await db.execute(query) row = result.first() - + if row is None: raise HTTPException(status_code=404, detail="The object does not exist.") if hasattr(row, "_mapping"): obj_dict = dict(row._mapping) else: - obj_dict = {column.key: getattr(row, column.key) for column in selected_columns} + obj_dict = {column.key: getattr(row, column.key) + for column in selected_columns} else: query = select(db_class).where(getattr(db_class, lookup_column) == id) result = await db.execute(query) row = result.scalar_one_or_none() if row is None: raise HTTPException(status_code=404, detail="The object does not exist.") - obj_dict = row if expunge: await db.expunge(obj_dict) diff --git a/creyPY/fastapi/schemas/__init__.py b/creyPY/fastapi/schemas/__init__.py index ff7cad8..dedd76e 100644 --- a/creyPY/fastapi/schemas/__init__.py +++ b/creyPY/fastapi/schemas/__init__.py @@ -1,2 +1,3 @@ from .base import * # noqa from .response_schema import * #noqa +from .schema_optional import * #noqa diff --git a/creyPY/fastapi/schemas/schema_optional.py b/creyPY/fastapi/schemas/schema_optional.py new file mode 100644 index 0000000..171278a --- /dev/null +++ b/creyPY/fastapi/schemas/schema_optional.py @@ -0,0 +1,19 @@ +from typing import Optional, Type, Union, get_args, get_origin, get_type_hints + +from pydantic import BaseModel, create_model + + +def optional_fields(cls: Type[BaseModel]) -> Type[BaseModel]: + fields = {} + for name, hint in get_type_hints(cls).items(): + if name.startswith("_"): + continue + + if get_origin(hint) is not Union or type(None) not in get_args(hint): + hint = Optional[hint] + + fields[name] = (hint, None) + + new_model = create_model(cls.__name__, __base__=cls, **fields) + + return new_model