def test_filter_chain(ctx): from melk.util.dibject import Dibject, dibjectify from melkman.filters import NewsItemFilterFactory, ACCEPT_ITEM, REJECT_ITEM filter_factory = NewsItemFilterFactory(ctx.component_manager) chain = [ {'op': 'match_author', 'config': {'values': ['fred']}, 'action': 'reject'}, {'op': 'and', 'config': { 'filters': [ {'op': 'match_author', 'config': {'values': ['barney']}}, {'op': 'match_field', 'config': {'field': 'foo', 'values': ['bar']}}]}, 'action': 'accept'}, {'op': 'match_field', 'config': {'field': 'foo', 'values': ['bar']}, 'action': 'reject'}, {'op': 'match_all', 'config': {}, 'action': 'accept'} ] chain = [dibjectify(x) for x in chain] chain = filter_factory.create_chain(chain) assert chain(dummy_news_item({'author': 'fred'})) == REJECT_ITEM assert chain(dummy_news_item({})) == ACCEPT_ITEM assert chain(dummy_news_item({'details': {'foo': 'bar'}})) == REJECT_ITEM assert chain(dummy_news_item({'author': 'barney', 'details': {'foo': 'bar'}})) == ACCEPT_ITEM
def _filtered_update(composite, news_items, ctx): from melkman.filters import NewsItemFilterFactory, ACCEPT_ITEM, REJECT_ITEM filter_factory = NewsItemFilterFactory(ctx.component_manager) filt = filter_factory.create_chain(composite.filters) accepts = [] rejects = [] for item in news_items: result = filt(item) if result == ACCEPT_ITEM: accepts.append(item) else: if result != REJECT_ITEM: log.warn('Unsupported filter action: %s -- rejecting' % result) rejects.append(item) updated_items = 0 for item in accepts: if composite.add_news_item(item): updated_items += 1 if len(rejects) > 0: reject_bucket = composite.get_rejected(ctx.db) if reject_bucket is not None: for item in rejects: reject_bucket.add_news_item(item) log.info("filtered update to %s accepted %d (%d new), rejected %d" % (composite.id, len(accepts), updated_items, len(rejects))) return updated_items