"""
FastaAPI utilities for ESORM
"""
from typing import Union, List, Dict
import inspect
import io
import tokenize
from enum import Enum
from fastapi import Response
from .model import Pagination, Sort
from .utils import camel_case
_max_page_size = 10000
__all__ = [
'make_dep_pagination',
'make_dep_sort',
'set_max_page_size',
]
#
# Pagination and sort dependencies
#
[docs]def set_max_page_size(max_page_size: int):
"""
Set the maximum page size for queries
:param max_page_size: The maximum page size
:return: None
"""
global _max_page_size
_max_page_size = max_page_size
[docs]def make_dep_sort(**kwargs: Union[List[Dict[str, dict]], Dict[str, any]]) -> callable:
"""
Create a sort dependency with sort definitions
:param kwargs: Sort definitions
:return: Sort dependency
"""
assert len(kwargs) > 0, "At least one sort field is required"
# Get the name of the function where this function is called
frame = inspect.currentframe().f_back
module_name = inspect.getmodule(frame).__name__
source_code = inspect.getsource(frame)
tokens = list(tokenize.tokenize(io.BytesIO(source_code.encode('utf-8')).readline))
function_name = ""
for i, token in enumerate(tokens):
if token.type == tokenize.NAME and token.string == "def" and token.start[0] <= frame.f_lineno:
function_name = tokens[i + 1].string
elif token.type == tokenize.NAME and token.string == "def" and token.start[0] > frame.f_lineno:
break
assert function_name, "Cannot find function name!"
fqdn = f"{module_name}.{function_name}"
# Create a new enum class for sort fields
sort_enum = Enum('SortEnum' + camel_case(fqdn.replace('.', '_'), True),
{k: k for k in kwargs.keys()})
async def _dep_sort(_sort: sort_enum = None) -> Sort:
"""
Sort dependency
:param _sort: Sort JSON string
:return: Sort object
"""
return Sort(sort=kwargs[_sort.name] if _sort else None)
return _dep_sort