Source code for openapi.pagination.search

from dataclasses import dataclass
from typing import Sequence

from openapi.data.fields import str_field
from openapi.utils import docjoin

from .pagination import from_filters_and_dataclass


class SearchVisitor:
    def apply_search(self, search: str, search_fields: Sequence[str]) -> None:
        raise NotImplementedError


@dataclass
class Search:
    @classmethod
    def create_search(cls, data: dict) -> "Search":
        return cls()

    def apply(self, visitor: SearchVisitor) -> None:
        pass


[docs]def searchable(*searchable_fields) -> type: """Create a dataclass with `search_fields` class attribute and `search` field. The search field is a set of field which can be used for searching and it is used internally by the library, while the `search` field is the query string passed in the url. :param searchable_fields: fields which can be used for searching """ fields = docjoin(searchable_fields) @dataclass class Searchable(Search): search_fields = frozenset(searchable_fields) search: str = str_field( description=( "Search query string. " f"The search is performed on {fields} fields." ) ) @classmethod def create_search(cls, data: dict) -> "Searchable": return from_filters_and_dataclass(Searchable, data) def apply(self, visitor: SearchVisitor) -> None: visitor.apply_search(self.search, self.search_fields) return Searchable