view backend/sqlalchemy/FeedUpdater.py @ 192:9d422fa90096

optimize marking feed entries as read: do not round trip to the database if the entry was already marked as read
author dirk
date Wed, 21 Sep 2011 13:23:25 +0200
parents f4708d38419c
children bb3c851b18b1
line wrap: on
line source


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

log = logging.getLogger("FeedUpdater")

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

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

    def __init__(self, preferences, session):
        AbstractFeedUpdater.__init__(self, preferences)
        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()