Example #1
0
def _update_feed(feed, content, context, method):
    """
    feed - RemoteFeed instance
    updates feed and returns a list of new/updated NewsItems
    
    no changes are pushed to the database.
    """
        
    try:
        fp = parse_feed(content, feed.url)
    except:
        feed.record_update_info(success=False, updates=0,
                            reason='Feed could not be parsed',
                            method=method)
        import traceback
        log.error("unable to parse feed %s: %s" % (feed.url, traceback.format_exc()))
        return []

    updated_items = _find_updates(feed, fp)

    # update feed metadata
    feed.feed_info = deepcopy(fp.feed)
    feed.title = fp.feed.get('title', '')
    
    # add item to RemoteFeed, gather ids
    iids = []
    traces = {}
    for item in updated_items:
        trace = item_trace(item)
        traces[item.melk_id] = trace
        ref = {'item_id': item.melk_id}
        ref.update(trace)
        feed.add_news_item(ref)
    feed.record_update_info(success=True, updates=len(updated_items), method=method)

    # grab any existing entries (need revisions to push update)...
    save_items = {}
    for r in context.db.view('_all_docs', keys=traces.keys(), include_docs=True).rows:
        if 'doc' in r:
            save_items[r.key] = NewsItem.wrap(r.doc)

    for item in updated_items:
        iid = item.melk_id
        trace = traces[iid]
        
        news_item = save_items.get(iid, None)
        if news_item is None:
            # if it is a new entry, create it
            news_item = NewsItem(iid, **trace)
            save_items[item.melk_id] = news_item
        else:
            # otherwise, just update fields
            for k, v in trace.items():
                setattr(news_item, k, v)
        news_item.details = item

    return save_items
Example #2
0
def melk_ids_in(content, url):
    from melkman.parse import parse_feed
    fp = parse_feed(content, url)
    return [x.melk_id for x in fp.entries]