view backend/sqlalchemy/FeedUpdater.py @ 160:86f828096aaf

Do not fetch and parse the feed twice when creating a new one. Pass the parsed info into the update method instead to reuse.
author dirk
date Mon, 29 Aug 2011 03:07:50 +0200
parents 74217db92993
children a3c945ce434c
line wrap: on
line source


from backend.AbstractFeedUpdater import AbstractFeedUpdater, FeedUpdateException
from datetime import datetime
from Feed import Feed
from FeedEntry import FeedEntry
import feedparser
import logging

log = logging.getLogger("FeedUpdater")

def updateAllFeeds(session):
    allFeeds = findFeedsToUpdate(session)
    for feed in allFeeds:
        try:
            FeedUpdater(session, feed).update()
        except FeedUpdateException, fue:
            log.warn("problems while updating feed " + feed.rss_url + ": " + str(fue))
        session.commit()

def findFeedsToUpdate(session):
    return session.query(Feed).filter(Feed.next_update < datetime.now())

def createNewFeed(url, session):
    # when updating to python3 see http://code.google.com/p/feedparser/issues/detail?id=260
    result = feedparser.parse(url)
    if result.has_key("title"):
        title = result["feed"].title
    else:
        title = url
    newFeed = Feed(title, url)
    session.add(newFeed)

    FeedUpdater(session, newFeed).update(result)


class FeedUpdater(AbstractFeedUpdater):
    def __init__(self, session, feed):
        AbstractFeedUpdater.__init__(self, feed)
        self.session = session

    def _processEntry(self, entry):
        feedEntry = FeedEntry.findById(entry.id, self.session)
        if feedEntry is None:
            self._createFeedEntry(entry)

    def _createFeedEntry(self, entry):
        new = FeedEntry.create(entry)
        new.feed = self.feed
        self.session.add(new)
        log.info("new feed entry: " + entry.title)

    def _incrementFeedUpdateDate(self):
        self.feed.incrementNextUpdateDate()