view backend/sqlalchemy/SqlAlchemyBackend.py @ 150:babe14449162

the entries for the selected feeds had to be set onto the item delegate so had access to the selected feed entry. Keep the list in one place only (the model) and access it from the item delegate.
author Dirk Olmes <dirk@xanthippe.ping.de>
date Sat, 27 Aug 2011 06:43:28 +0200
parents 8ec20377bcb0
children bca9341dc67f
line wrap: on
line source


from Feed import Feed
from FeedEntry import FeedEntry
from Preferences import Preferences
from datetime import datetime, timedelta
from sqlalchemy.orm import joinedload
from sqlalchemy.sql import and_
import Database
import FeedUpdater
import Mapping
import logging
import util

class SqlAlchemyBackend(object):
    '''
    Backend that uses sqlalchemy for persistence
    '''

    def __init__(self):
        self._initLogging()
        self.session = Database.createSession()
        self.prefs = Preferences(self.session)
        self.updater = None

    def _initLogging(self):
        logging.getLogger("sqlalchemy.orm").setLevel(logging.WARN)

        sqlalchemyLogLevel = logging.ERROR
        if util.databaseLoggingEnabled():
            sqlalchemyLogLevel = logging.INFO
        logging.getLogger("sqlalchemy").setLevel(sqlalchemyLogLevel)

    def preferences(self):
        return self.prefs

    def getFeeds(self):
        if self.preferences().showOnlyUnreadFeeds():
            return self._getUnreadFeeds()
        else:
            return Feed.all(self.session)

    def _getUnreadFeeds(self):
        query = self.session.query(FeedEntry).filter(FeedEntry.read == 0)
        queryWithOptions = query.options(joinedload("feed"))
        result = queryWithOptions.all()
        return self._collectFeeds(result)

    def _collectFeeds(self, feedEntries):
        feeds = [entry.feed for entry in feedEntries]
        uniqueFeeds = set(feeds)
        return list(uniqueFeeds)

    def toggleRead(self, feedEntry):
        feedEntry.toggleRead()
        self.session.commit()

    def markAllEntriesRead(self, feed):
        feed.markAllEntriesRead()
        self.session.commit()

    def createFeed(self, url):
        try:
            FeedUpdater.createNewFeed(url, self.session)
            self.session.commit()
        except AttributeError as ae:
            self.session.rollback()
            raise ae

    def updateFeed(self, feed, changes):
        feed.takeChangesFrom(changes)
        feed.incrementNextUpdateDate()
        self.session.commit()

    def deleteFeed(self, feed):
        self.session.delete(feed)
        self.session.commit()

    def entriesForFeed(self, feed, hideReadEntries):
        return feed.entriesSortedByUpdateDate(hideReadEntries)

    def markFeedEntriesAsRead(self, entries):
        for entry in entries:
            entry.markRead()
        self.session.commit()

    def updateAllFeeds(self):
        FeedUpdater.updateAllFeeds(self.session)
        self.session.commit()

    def expireFeedEntries(self):
        logger = logging.getLogger("feedupdater")
        expireDate = self._calculateExpireDate()
        logger.info("expiring entries older than " + str(expireDate))
        feedEntry = Mapping.feedEntryTable
        deleteStatement = feedEntry.delete().where(
            and_(feedEntry.c.create_timestamp < expireDate, feedEntry.c.read == 1)
        )
        deleteStatement.execute()
        self.session.commit()

    def _calculateExpireDate(self):
        now = datetime.now()
        daysToKeepFeedEntries = self.prefs.daysToKeepFeedEntries()
        delta = timedelta(days=daysToKeepFeedEntries)
        return now - delta

    def dispose(self):
        # save all uncommitted state, just in case
        self.session.commit()
        self.session.close()