def apply_pagination(self, query: Query, page: Optional[int], page_size: Optional[int]) -> Query: if page and page_size: query = query.offset(page * page_size) if page_size: query = query.limit(page_size) return query
def _filter_multi_query( self, query: Query, filtration: schemas.FilterData) -> tuple[int, list[ModelType]]: for col_name, (filter_type, filter_value) in filtration.data.items(): column = getattr(self.model, col_name) if filter_type == schemas.FilterType.VALUE: query = query.filter(column == filter_value) elif filter_type == schemas.FilterType.DATETIME: start_date, end_date = filter_value if start_date is not None: query = query.filter(column >= filter_value) if end_date is not None: query = query.filter(column <= filter_value) elif filter_type == schemas.FilterType.ENUM: query = query.filter(column in filter_value) query = query.order_by( self.model.created if filtration.sort is None else getattr(self.model, filtration.sort.column ) if filtration.sort.direction != schemas.SortType. ASC else getattr(self.model, filtration.sort.column).desc()) return ( query.count(), query.offset(filtration.offset).limit(filtration.limit).all(), )
def offset(self, offset): return Query.offset(self.private(), offset)