Beispiel #1
0
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
Beispiel #2
0
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