./bin/dbagg.py 3: Convert to use with mktap (see ./doc/howto/listings/TwistedQuotes/quotetap.py) 4: Use Twisted's logging 5: Think about using PyObjC to wrap all of this in an OS X app 6: Consider embedding WebKit in a Cocoa window as all-in-one browser/aggregator (see: http://cocoadevcentral.com/articles/000077.php) ./bin/migrate_data.py 3: Need a real migration tool ./htdocs/bysources.rpy 4: Number of items shown as per-source pref 5: Implement source priorities in sorting ./htdocs/bysources_bayes.rpy 16: Consider iframe/css driven on-demand display of archived items 17: Display sources without new items, provide drill-down to archived items 18: Make Bayesian scores a part of a plugin, think about plugin contributions to item display 20: Think about factory scheme for item/source models for iterators, to allow plugin hooks 35: Use Twisted logging 38: Figure out how to access main_app cleanly without importing __main__ 42: Abstract iterator counting away so that this doesn't need a DB connection 44: Bayes classifier belongs in a plugin 120: Handle limit and offset for sources 140: Needs to be an option whether shown/visited items are hidden ./htdocs/export_sources.rpy 7: Get OPML export working, along with other methods. ./htdocs/items.rpy 8: Consider iframe/css driven on-demand display of archived items 9: Display sources without new items, provide drill-down to archived items 10: Make Bayesian scores a part of a plugin, think about plugin contributions to item display 123: Needs to be an option whether shown/visited items are hidden ./htdocs/manage_sources.rpy 8: Need pop-up version of quick subscribing 9: Need various sorting options on list of feeds ./htdocs/track_item.rpy 6: Need to access main_app without importing __main_ ./lib/dbagg/__init__.py 8: humpCase all method names from underscore_style 9: All source files need CVS tags and license info 10: Need to start thinking about user preferences and UI for it 11: Abstract all SQL used in other modules as collection and item methods. 12: Work on making multiuser 18: Separate out RSS-specific code into a subclass 19: Multiple alternate source-type item classes ./lib/dbagg/plugin/__init__.py 5: Build a NotificationCenter app service 6: Need to identify points of integration, events worth building pub/sub for. 7: Source management activity (add, remove, update) 8: Item activity (new, remove, read) 9: General events (scan started, web view requested, timer elapsed) ./lib/dbagg/scan.py 13: Scraper-style sources 14: Atom/Echo/Pie sources 15: Handle items of different source formats 34: Random minute within-hour scheduling? 35: Obey skipHours and skipDays elements in RSS 62: No magic numbers in updateSchedule! 63: '7 days' should be a preference, as should min period of '24 hours' 75: Need to abstract this away into data access 126: Obey robots.txt! 127: Embed id / blog URL into User Agent string 128: Use last-modified and ETag headers 129: Timeout on source downloaders, give up after awhile to free up downloader. 130: Follow HTTP behavior guidelines (http://diveintomark.org/tests/client/http/) 131: Purge/archive old items no longer offered in current source 139: Source scanner shouldn't need a database connection (abstract!) 142: Classifier code belongs in a plugin 151: DownloaderFactory, able to be used in monitoring overall download progress 171: Shuffling sucks, but need some way of varying order of source scan 208: Separate out source parsing, item handling into other classes 209: Handle different source formats 213: Update channel data from source 236: Classifier stuff belongs in a plugin 262: BAYES (BELONGS IN PLUGIN) ./lib/dbagg/storage/__init__.py 5: Use either SQLObject or Twisted Enterprise Row Objects for abstraction (http://twisted.sourceforge.net/TwistedDocs-1.0.7/howto/row.xhtml) 6: Move some metadata into core schema (ie. sources.last_updated, items.active) 7: MySQL storage 8: ZODB storage 9: DBM storage 10: Gadfly storage ./lib/dbagg/storage/mysql.py 6: Just a cut-n-paste of sqlite.py, make usable.