patch #5884: Allow option to sort feeds by update time and unread articles (Nelson)
authorYves Marcoz <yves@marcoz.org>
Tue, 15 Jun 2010 03:08:24 +0000 (20:08 -0700)
committerYves Marcoz <yves@marcoz.org>
Tue, 15 Jun 2010 03:08:24 +0000 (20:08 -0700)
src/FeedingIt.py
src/config.py
src/rss.py

index 2a373ed..6ade723 100644 (file)
@@ -55,6 +55,8 @@ timeout = 5
 setdefaulttimeout(timeout)
 del timeout
 
+import xml.sax
+
 LIST_ICON_SIZE = 32
 LIST_ICON_BORDER = 10
 
@@ -1053,27 +1055,48 @@ class FeedingIt:
                 gtk.ICON_LOOKUP_USE_BUILTIN)
 
         self.feedItems.clear()
+        feedInfo = {}
+        count = 0
         for key in self.listing.getListOfFeeds():
             unreadItems = self.listing.getFeedNumberOfUnreadItems(key)
             if unreadItems > 0 or not self.config.getHideReadFeeds():
+                count=count+1
                 title = self.listing.getFeedTitle(key)
                 updateTime = self.listing.getFeedUpdateTime(key)
-                
+                updateStamp = self.listing.getFeedUpdateStamp(key)
                 subtitle = '%s / %d unread items' % (updateTime, unreadItems)
+                feedInfo[key] = [count, unreadItems, updateStamp, title, subtitle, updateTime];
+
+        order = self.config.getFeedSortOrder();
+        if   order == "Most unread":
+            keyorder = sorted(feedInfo, key = lambda k: feedInfo[k][1], reverse=True)
+        elif order == "Least unread":
+            keyorder = sorted(feedInfo, key = lambda k: feedInfo[k][1])
+        elif order == "Most recent":
+            keyorder = sorted(feedInfo, key = lambda k: feedInfo[k][2], reverse=True)
+        elif order == "Least recent":
+            keyorder = sorted(feedInfo, key = lambda k: feedInfo[k][2])
+        else: # order == "Manual" or invalid value...
+            keyorder = sorted(feedInfo, key = lambda k: feedInfo[k][0])
+        
+        for key in keyorder:
+            unreadItems = feedInfo[key][1]
+            title = xml.sax.saxutils.escape(feedInfo[key][3])
+            subtitle = feedInfo[key][4]
+            updateTime = feedInfo[key][5]
+            if unreadItems:
+                markup = FEED_TEMPLATE_UNREAD % (title, subtitle)
+            else:
+                markup = FEED_TEMPLATE % (title, subtitle)
     
-                if unreadItems:
-                    markup = FEED_TEMPLATE_UNREAD % (title, subtitle)
-                else:
-                    markup = FEED_TEMPLATE % (title, subtitle)
-    
-                try:
-                    icon_filename = self.listing.getFavicon(key)
-                    pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_filename, \
-                            LIST_ICON_SIZE, LIST_ICON_SIZE)
-                except:
-                    pixbuf = default_pixbuf
+            try:
+                icon_filename = self.listing.getFavicon(key)
+                pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_filename, \
+                                               LIST_ICON_SIZE, LIST_ICON_SIZE)
+            except:
+                pixbuf = default_pixbuf
     
-                self.feedItems.append((pixbuf, markup, key))
+            self.feedItems.append((pixbuf, markup, key))
 
     def on_feedList_row_activated(self, treeview, path, column):
         model = treeview.get_model()
index 251c868..5497b9e 100644 (file)
@@ -33,9 +33,9 @@ from urllib2 import ProxyHandler
 VERSION = "0.6.1"
 
 section = "FeedingIt"
-ranges = { "updateInterval":[0.5, 1, 2, 4, 12, 24], "expiry":[24, 48, 72], "fontSize":range(12,24), "orientation":["Automatic", "Landscape", "Portrait"], "artFontSize":[10, 12, 14, 16, 18, 20]}
-titles = {"updateInterval":"Auto-update interval", "expiry":"Delete articles", "fontSize":"List font size", "orientation":"Display orientation", "artFontSize":"Article font size"}
-subtitles = {"updateInterval":"Every %s hours", "expiry":"After %s hours", "fontSize":"%s pixels", "orientation":"%s", "artFontSize":"%s pixels"}
+ranges = { "updateInterval":[0.5, 1, 2, 4, 12, 24], "expiry":[24, 48, 72], "fontSize":range(12,24), "orientation":["Automatic", "Landscape", "Portrait"], "artFontSize":[10, 12, 14, 16, 18, 20], "feedsort":["Manual", "Most unread", "Least unread", "Most recent", "Least recent"] }
+titles = {"updateInterval":"Auto-update interval", "expiry":"Delete articles", "fontSize":"List font size", "orientation":"Display orientation", "artFontSize":"Article font size","feedsort":"Feed sort order"}
+subtitles = {"updateInterval":"Every %s hours", "expiry":"After %s hours", "fontSize":"%s pixels", "orientation":"%s", "artFontSize":"%s pixels", "feedsort":"%s"}
 
 class Config():
     def __init__(self, parent, configFilename):
@@ -90,6 +90,7 @@ class Config():
         add_setting('fontSize')
         add_setting('artFontSize')
         add_setting('orientation')
+        add_setting('feedsort')
         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
         button.set_label("Hide read feeds")
         button.set_active(self.config["hidereadfeeds"])
@@ -199,6 +200,10 @@ class Config():
         except:
             self.config["hidereadfeeds"] = False
             self.config["hidereadarticles"] = False
+        try:
+            self.config["feedsort"] = configParser.get(section, "feedsort")
+        except:
+            self.config["feedsort"] = "Manual"
         
     def saveConfig(self):
         configParser = RawConfigParser()
@@ -213,6 +218,7 @@ class Config():
         configParser.set(section, 'proxy', str(self.config["proxy"]))
         configParser.set(section, 'hidereadfeeds', str(self.config["hidereadfeeds"]))
         configParser.set(section, 'hidereadarticles', str(self.config["hidereadarticles"]))
+        configParser.set(section, 'feedsort', str(self.config["feedsort"]))
 
         # Writing our configuration file
         file = open(self.configFilename, 'wb')
@@ -264,3 +270,5 @@ class Config():
         return self.config["hidereadfeeds"]
     def getHideReadArticles(self):
         return self.config["hidereadarticles"]
+    def getFeedSortOrder(self):
+        return self.config["feedsort"]
index b27c9a5..27794e8 100644 (file)
@@ -70,6 +70,7 @@ class Feed:
         self.url = url
         self.countUnread = 0
         self.updateTime = "Never"
+        self.updateStamp = 0
         self.uniqueId = uniqueId
         self.etag = None
         self.modified = None
@@ -251,6 +252,7 @@ class Feed:
            del tmp
            self.countUnread = tmpUnread
            self.updateTime = time.asctime()
+           self.updateStamp = currentTime
            self.saveFeed(configdir)
            from glob import glob
            from os import stat
@@ -341,6 +343,13 @@ class Feed:
     def getUpdateTime(self):
         return self.updateTime
     
+    def getUpdateStamp(self):
+        try:
+            return self.updateStamp
+        except:
+            self.updateStamp = 0
+            return self.updateStamp
+
     def getEntries(self):
         return self.entries
     
@@ -475,6 +484,7 @@ class ArchivedArticles(Feed):
             #        if currentTime - entry["time"] > 2*expiry:
             #            self.removeEntry(id)
         self.updateTime = time.asctime()
+        self.updateStamp = time.time()
         self.saveFeed(configdir)
         
     def purgeReadArticles(self):
@@ -568,12 +578,14 @@ class Listing:
             feed.updateFeed(self.configdir, expiryTime, proxy, imageCache)
             self.listOfFeeds[key]["unread"] = feed.getNumberOfUnreadItems()
             self.listOfFeeds[key]["updateTime"] = feed.getUpdateTime()
+            self.listOfFeeds[key]["updateStamp"] = feed.getUpdateStamp()
             
     def updateFeed(self, key, expiryTime=24, proxy=None, imageCache=False):
         feed = self.getFeed(key)
         feed.updateFeed(self.configdir, expiryTime, proxy, imageCache)
         self.listOfFeeds[key]["unread"] = feed.getNumberOfUnreadItems()
         self.listOfFeeds[key]["updateTime"] = feed.getUpdateTime()
+        self.listOfFeeds[key]["updateStamp"] = feed.getUpdateStamp()
         
     def editFeed(self, key, title, url):
         self.listOfFeeds[key]["title"] = title
@@ -607,6 +619,12 @@ class Listing:
             self.listOfFeeds[key]["updateTime"] = "Never"
         return self.listOfFeeds[key]["updateTime"]
     
+    def getFeedUpdateStamp(self, key):
+        #print self.listOfFeeds.has_key(key)
+        if not self.listOfFeeds[key].has_key("updateStamp"):
+            self.listOfFeeds[key]["updateStamp"] = 0
+        return self.listOfFeeds[key]["updateStamp"]
+
     def getFeedNumberOfUnreadItems(self, key):
         if not self.listOfFeeds[key].has_key("unread"):
             self.listOfFeeds[key]["unread"] = 0