Implemented "mark all as read".
[straw.git] / straw / ItemManager.py
blob918b26c3de4dd113a17fecfbb2876584159b308b
1 from error import debug
2 from gobject import GObject, SIGNAL_RUN_FIRST
3 from model import Feed, Item, Category
4 from storage import DAO, Storage
5 import FeedManager
6 import Queue
7 import gobject
8 import threading
10 _storage_path = None
11 model_data = None
12 calls = Queue.Queue()
14 class ServiceThread(threading.Thread):
15 def run(self):
16 global calls
18 while 1:
19 call = calls.get()
21 if not call:
22 break
24 result = call[0](call[1][0])
25 gobject.idle_add(call[2], result)
27 serviceThread = ServiceThread()
28 serviceThread.start()
30 def init():
31 fm = _get_instance()
32 fm.init_storage(_storage_path)
34 def setup(storage_path = None):
35 global _storage_path
36 _storage_path = storage_path
38 def shutdown():
39 calls.put(None)
40 serviceThread.join()
42 def get_feed_items(id):
43 im = _get_instance()
44 return im.get_feed_items(id)
46 def get_category_items(id, callback):
47 global calls
49 im = _get_instance()
50 calls.put_nowait((im.get_category_items, (id,), callback))
51 #print calls.get_nowait()
52 #return im.get_category_items(id)
53 return []
55 def feed_item_exists(item):
56 im = _get_instance()
57 return im.feed_item_exists(item)
59 class ItemManager(GObject):
60 __gsignals__ = {
61 "item-added" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)),
62 "feed-added" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)),
63 "category-added" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)),
64 "update-all-done" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())
67 def __init__(self):
68 GObject.__init__(self)
70 self.storage = None
72 def init_storage(self, path):
73 self.storage = Storage(path)
74 self.dao = DAO(self.storage)
76 def get_category_items(self, id):
77 category = FeedManager.lookup_category(id)
79 if not category:
80 return None
82 in_str = ", ".join([str(feed.id) for feed in FeedManager.get_children_feeds(id)])
84 query = "SELECT id, title, feed_id, is_read, link, pub_date FROM items WHERE feed_id IN(%s) ORDER BY pub_date DESC" % in_str
85 #query = "SELECT id, title, feed_id, is_read, link, pub_date FROM items WHERE feed_id IN(%s) ORDER BY pub_date DESC" % in_str# LIMIT %d OFFSET %d" % (in_str, size, start)
86 #query = "SELECT id, title, feed_id, is_read, link, pub_date FROM items ORDER BY pub_date DESC"# LIMIT %d OFFSET %d" % (in_str, size, start)
88 items = self.dao.get(Item, query = query)
90 for item in items:
91 feed = FeedManager.lookup_feed(item.feed_id)
92 item.feed = feed
93 item.connect("is-read-changed", feed.on_is_read_changed)
94 item.connect("is-read-changed", self.on_item_is_read_changed)
96 return items
98 def get_feed_items(self, id):
99 feed = FeedManager.lookup_feed(id)
100 feed.items = self.dao.get(Item, " WHERE feed_id = %d ORDER BY pub_date DESC" % feed.id)
102 for item in feed.items:
103 item.feed = feed
104 item.connect("is-read-changed", feed.on_is_read_changed)
105 item.connect("is-read-changed", self.on_item_is_read_changed)
107 return feed.items
109 def feed_item_exists(self, item):
110 result = self.dao.get(Item, sql = " WHERE feed_id = ? AND title = ?", params = (str(item.feed_id), str(item.title),))
111 return len(result) > 0
113 def on_item_is_read_changed(self, obj, is_read):
114 self.dao.save(obj)
116 _instance = None
118 def _get_instance():
119 global _instance
120 if not _instance:
121 _instance = ItemManager()
122 return _instance