from abc import ABC, abstractmethod from atlas_um.helpers.filtering import QueryFiltering from atlas_um.helpers.ordering import QueryOrdering from atlas_um.helpers.pagination import APIQueryPagination class BaseAPIFacade(ABC): """ Base interface to deal with list-like data in list endpoints. """ def __eq__(self, other): try: return self.items == other.items except AttributeError: return False @property @abstractmethod def items(self): pass @property @abstractmethod def limit(self): pass @property @abstractmethod def offset(self): pass @property @abstractmethod def count(self): pass @property @abstractmethod def previous(self): pass @property @abstractmethod def next(self): pass class APIQueryFacade(BaseAPIFacade): """ Helper class to apply filtering, ordering and pagination to query, used in API views. """ query_filtering_class = QueryFiltering query_ordering_class = QueryOrdering query_pagination_class = APIQueryPagination def __init__( self, query, allowed_fields=None, filter_string="", fields_mapping=None, limit=None, offset=None, ): self._allowed_fields = allowed_fields self._filter_string = filter_string self._fields_mapping = fields_mapping self._limit = limit self._offset = offset self._query_filtering = self.query_filtering_class( query, allowed_fields=self._allowed_fields, filter_string=self._filter_string, fields_mapping=self._fields_mapping, ) self._query_ordering = self.query_ordering_class( self._query_filtering.query, allowed_fields=self._allowed_fields, order_string=self._filter_string, fields_mapping=self._fields_mapping, ) self._query_pagination = self.query_pagination_class( self._query_ordering.query, self._limit, self._offset ) @property def query(self): return self._query_pagination.query @property def items(self): return self._query_pagination.items @property def limit(self): return self._query_pagination.limit @property def offset(self): return self._query_pagination.offset @property def count(self): return self._query_pagination.count @property def previous(self): return self._query_pagination.previous @property def next(self): return self._query_pagination.next