[документация]class GlobalFilters:
"""Класс для хранения обработчиков конечной выборки.
"""
handlers = {}
[документация] @classmethod
def append(cls, filter_type, handler):
"""Для указанного типа фильтра добавляет функцию - обработчик.
Attributes:
filter_type: тип, наличие которого проверяется в переданных
аргументах метода апи. Если соответствие найдено, то
запускается каждый обработчик из ``GlobalFilters.handlers``
handler: указатель на функцию типа ``func(items, filter)``
"""
cls.handlers[filter_type] = cls.handlers.get(filter_type, [])
cls.handlers[filter_type].append(handler)
[документация]def api_filters_method(function):
"""Декоратор. Выполняет запуск всех фильтров влияющих на конечную выборку.
Должен декорировать только методы класса типа ``BaseApi``.
"""
def handle_items(self, **kwargs):
kwargs['filters'] = kwargs.get('filters', self.filters_default)
# TODO: проверять что не был передан второй фильтр из одной и той же
# категории
# добавляем отсутствующие фильтры
kwargs['filters'] = self.add_filters_default(kwargs['filters'])
# вызываем декорируемую функцию api
result_items = function(self, **kwargs)
# вызываем необходимые обработчики для переданных фильтров
for filter in kwargs['filters']:
for filter_type, handlers in GlobalFilters.handlers.items():
if filter is filter_type or \
type(filter) is filter_type:
for func in handlers:
result_items = func(result_items, filter,
kwargs['filters'])
# ограничиваем количество возвращаемых значений
return result_items[:int(kwargs.get('limit', 999))]
return handle_items