3 Provides a module for managing feeds
5 __copyright__
= "Copyright (c) 2002-2005 Free Software Foundation, Inc."
7 Straw is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
12 Straw is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA. """
27 class Feed(object, Event
.SignalEmitter
):
28 "A Feed object stores information set by user about a RSS feed."
34 __slots__
= ('_title', '_location', '_username', '_password', '_parsed',
35 '__save_fields', '_items', '_slots',
36 '_id', '_channel_description',
37 '_channel_title', '_channel_link', '_channel_copyright',
38 'channel_lbd', 'channel_editor', 'channel_webmaster',
39 'channel_creator', '_previous_etag',
40 '_error', '_process_status', 'router', 'sticky', '_parent',
41 '_items_stored', '_poll_freq', '_last_poll', '_n_items_unrea')
43 __save_fields
= (('_title', ""), ('_location', ""), ('_username', ""),
44 ('_password', ""), ('_id', ""),
45 ('_channel_description', ""), ('_channel_title', ""),
46 ('_channel_link', ""), ('_channel_copyright', ""),
47 ('channel_creator', ""),
48 ('_previous_etag', ""), ('_error', None),
49 ('_items_stored', DEFAULT
),
50 ('_poll_freq', DEFAULT
),
52 ('_n_items_unread', 0))
55 # use one of the factory functions below instead of this directly
56 def __init__(self
, title
="", location
="", username
="", password
=""):
57 Event
.SignalEmitter
.__init
__(self
)
58 self
.initialize_slots(Event
.FeedInfoUpdatedSignal
,
59 #Event.FeedUnreadChangedSignal,
60 #Event.FeedNumOfItemsStoredChangedSignal,
61 #Event.FeedPollFrequencyChangedSignal,
62 Event
.FeedLastPollChangedSignal
,
63 Event
.FeedStatusChangedSignal
,
64 Event
.FeedErrorStatusChangedSignal
,
65 Event
.FeedPolledSignal
,
67 Event
.ItemsAddedSignal
,
69 Event
.ItemStickySignal
,
70 Event
.ItemDeletedSignal
,
71 Event
.AllItemsReadSignal
,
72 Event
.RefreshFeedDisplaySignal
)
75 self
._channel
_description
= ""
76 self
._channel
_title
= ""
77 self
._channel
_link
= ""
78 self
._channel
_copyright
= ""
79 self
.channel_lbd
= None
80 self
.channel_editor
= ""
81 self
.channel_webmaster
= ""
82 self
.channel_creator
= ""
83 self
._location
= location
84 self
._username
= username
85 self
._password
= password
87 self
._items
= FeedItems
.FeedItems(self
)
88 self
._previous
_etag
= None
90 self
._process
_status
= self
.STATUS_IDLE
91 self
.router
= FeedDataRouter
.FeedDataRouter(self
)
93 self
._items
_stored
= Feed
.DEFAULT
94 self
._poll
_freq
= Feed
.DEFAULT
96 self
._n
_items
_unread
= 0
100 return "Feed '%s' from %s" % (self
._title
, self
._location
)
108 doc
= "A ParsedSummary object generated from the summary file"
111 def fset(self
, parsed
):
112 self
._parsed
= parsed
113 return property(**locals())
117 doc
= "The title of this Feed (as defined by user)"
123 def fset(self
, title
):
124 if self
._title
!= title
:
126 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
127 return property(**locals())
131 doc
= "A tuple of location, username, password"
133 return (self
._location
, self
._username
, self
._password
)
134 def fset(self
, (location
,username
,password
)):
135 self
._location
= location
136 self
._username
= username
137 self
._password
= password
138 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
139 return property(**locals())
145 return self
._location
146 def fset(self
, location
):
147 if self
._location
!= location
:
148 self
._location
= location
149 self
.emit_signal(Event
.FeedInfoUpdateSignal(self
))
150 return property(**locals())
157 if self
._channel
_title
:
158 text
= self
._channel
_title
161 changed
= self
._channel
_title
!= t
162 self
._channel
_title
= t
164 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
165 return property(**locals())
168 def channel_description():
172 if self
._channel
_description
:
173 text
= self
._channel
_description
176 changed
= self
._channel
_description
!= t
177 self
._channel
_description
= t
179 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
180 return property(**locals())
186 return self
._channel
_link
188 changed
= self
._channel
_link
!= t
189 self
._channel
_link
= t
191 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
192 return property(**locals())
195 def channel_copyright():
198 return self
._channel
_copyright
200 changed
= self
._channel
_copyright
!= t
201 self
._channel
_copyright
= t
203 self
.emit_signal(Event
.FeedInfoUpdatedSignal(self
))
204 return property(**locals())
207 def number_of_items_stored():
210 return self
._items
_stored
211 def fset(self
, num
=None):
212 if self
._items
_stored
!= num
:
213 self
._items
_stored
= num
214 self
.emit_signal(Event
.FeedNumOfItemsStoredChangedSignal(self
))
215 return property(**locals())
218 def poll_frequency():
221 return self
._poll
_freq
222 def fset(self
, freq
):
223 if self
._poll
_freq
!= freq
:
224 self
._poll
_freq
= freq
225 self
.emit_signal(Event
.FeedPollFrequencyChangedSignal(self
))
226 return property(**locals())
232 return self
._last
_poll
233 def fset(self
, time
):
234 if self
._last
_poll
!= time
:
235 self
._last
_poll
= time
236 self
.emit_signal(Event
.FeedLastPollChangedSignal(self
))
237 return property(**locals())
240 def n_items_unread():
243 return self
._n
_items
_unread
245 if self
._n
_items
_unread
!= n
:
246 self
._n
_items
_unread
= n
247 self
.emit_signal(Event
.FeedUnreadChangedSignal(self
))
248 return property(**locals())
254 return self
._previous
_etag
255 def fset(self
, etag
):
256 self
._previous
_etag
= etag
257 return property(**locals())
264 def fset(self
, error
):
265 if self
._error
!= error
:
267 self
.emit_signal(Event
.FeedErrorStatusChangedSignal(self
))
268 return property(**locals())
271 def process_status():
274 return self
._process
_status
275 def fset(self
, status
):
276 if status
!= self
._process
_status
:
277 self
._process
_status
= status
278 self
.emit_signal(Event
.FeedStatusChangedSignal(self
))
279 return property(**locals())
286 def fset(self
, parent
):
287 self
._parent
= parent
288 return property(**locals())
291 def next_refresh(self
):
292 """ return the feed's next refresh (time)"""
294 if self
._poll
_freq
== self
.DEFAULT
:
295 increment
= Config
.get_instance().poll_frequency
297 increment
= self
._poll
_freq
299 nr
= self
.last_poll
+ increment
304 for f
, default
in self
.__save
_fields
:
305 fl
[f
] = self
.__getattribute
__(f
)
308 def undump(self
, dict):
309 for f
, default
in self
.__save
_fields
:
310 self
.__setattr
__(f
, dict.get(f
, default
))
314 self
.emit_signal(Event
.FeedPolledSignal(self
))
316 def signal_new_items(self
, items
):
317 self
.emit_signal(Event
.NewItemsSignal(self
, items
))
319 def signal_added_items(self
, items
):
320 self
.emit_signal(Event
.ItemsAddedSignal(self
, items
))
322 def signal_deleted_item(self
, item
):
323 self
.emit_signal(Event
.ItemDeletedSignal(self
, item
))
325 def signal_refresh_display(self
):
326 self
.emit_signal(Event
.RefreshFeedDisplaySignal(self
))
328 def signal_all_items_read(self
, items
):
329 self
.emit_signal(Event
.AllItemsReadSignal(self
, items
))
331 def forward_signal(self
, signal
):
332 self
.emit_signal(signal
)
334 def add_items(self
, items
):
335 return self
._items
.add_items(items
)
337 def restore_items(self
, items
):
338 return self
._items
.restore_items(items
)
340 def delete_all_items(self
):
341 self
.signal_deleted_item(self
.items
)
343 def get_item_index(self
, item
):
344 return self
._items
.get_item_index(item
)
348 return self
._items
.get_items()
351 def number_of_unread(self
):
352 return self
._n
_items
_unread
355 def number_of_items(self
):
356 return self
._items
.number_of_items
358 def mark_all_read(self
):
359 return self
._items
.mark_all_read()
361 def load_contents(self
):
362 return self
._items
.load()
364 def unload_contents(self
):
368 def create_new_feed(klass
, title
, location
="", username
="", password
=""):
371 f
._location
= location
372 f
._id
= Config
.get_instance().next_feed_id_seq()
373 f
._username
= username
374 f
._password
= password
378 def create_empty_feed(klass
):