Mercurial > hg > Feedworm
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()