Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/GetIABooksActivity.py
diff options
context:
space:
mode:
authorJames Simmons <jim@olpc.simmons>2009-06-27 16:47:45 (GMT)
committer James Simmons <jim@olpc.simmons>2009-06-27 16:47:45 (GMT)
commit5cb8ccc3e7e95f8d5fc54cdc1cd7a57ebee5e56d (patch)
treeb0ab9ca2ec8bffbf69c788d1c1816f0ebb0a19ef /GetIABooksActivity.py
parent98f46fa446098a1cf45ae7dd7c2c3656a7c5a7b3 (diff)
modified: GetIABooksActivity.py
Implement basic book lookup function.
Diffstat (limited to 'GetIABooksActivity.py')
-rwxr-xr-xGetIABooksActivity.py180
1 files changed, 103 insertions, 77 deletions
diff --git a/GetIABooksActivity.py b/GetIABooksActivity.py
index 2ec8386..d8eb708 100755
--- a/GetIABooksActivity.py
+++ b/GetIABooksActivity.py
@@ -19,16 +19,15 @@ import os
import logging
import tempfile
import time
-import zipfile
import pygtk
import gtk
import string
+import csv
+import urllib
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.menuitem import MenuItem
from sugar.graphics.toolcombobox import ToolComboBox
from sugar.graphics.combobox import ComboBox
-from sugar.graphics.toggletoolbutton import ToggleToolButton
-from sugar.graphics import style
from sugar import profile
from sugar.activity import activity
from sugar import network
@@ -39,11 +38,19 @@ import pango
import dbus
import gobject
-_TOOLBAR_READ = 2
-_TOOLBAR_BOOKS = 3
-COLUMN_TITLE = 0
-COLUMN_AUTHOR = 1
-COLUMN_PATH = 2
+_TOOLBAR_BOOKS = 1
+COLUMN_CREATOR = 0
+COLUMN_DESCRIPTION=1
+COLUMN_FORMAT = 2
+COLUMN_IDENTIFIER = 3
+COLUMN_LANGUAGE = 4
+COLUMN_PUBLICDATE= 5
+COLUMN_PUBLISHER = 6
+COLUMN_SUBJECT = 7
+COLUMN_TITLE = 8
+COLUMN_VOLUME = 9
+COLUMN_TITLE_TRUNC = 10
+COLUMN_CREATOR_TRUNC = 11
_logger = logging.getLogger('get-ia-books-activity')
@@ -56,7 +63,6 @@ class BooksToolbar(gtk.Toolbar):
self._search_entry = gtk.Entry()
self._search_entry.connect('activate', self._search_entry_activate_cb)
- self._search_entry.connect("key_press_event", self.keypress_cb)
width = int(gtk.gdk.screen_width() / 2)
self._search_entry.set_size_request(width, -1)
@@ -80,20 +86,12 @@ class BooksToolbar(gtk.Toolbar):
def _search_entry_activate_cb(self, entry):
self.activity.find_books(entry.props.text)
- self._hide_results.props.sensitive = True
def _get_book_cb(self, button):
self.activity.get_book()
def _enable_button(self, state):
self._download.props.sensitive = state
-
- def keypress_cb(self, widget, event):
- keyname = gtk.gdk.keyval_name(event.keyval)
- if keyname == 'Escape':
- self.activity.list_scroller.hide()
- self._hide_results.props.sensitive = False
- return True
class ReadHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler):
"""HTTP Request Handler for transferring document while collaborating.
@@ -107,19 +105,6 @@ class ReadHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler):
"""Return the filepath to the shared document."""
return self.server.filepath
-
-class ReadHTTPServer(network.GlibTCPServer):
- """HTTP Server for transferring document while collaborating."""
- def __init__(self, server_address, filepath):
- """Set up the GlibTCPServer with the ReadHTTPRequestHandler.
-
- filepath -- path to shared document to be served.
- """
- self.filepath = filepath
- network.GlibTCPServer.__init__(self, server_address,
- ReadHTTPRequestHandler)
-
-
class ReadURLDownloader(network.GlibURLDownloader):
"""URLDownloader that provides content-length and content-type."""
@@ -163,28 +148,40 @@ class GetIABooksActivity(activity.Activity):
self.scrolled.add(self.textview)
self.textview.show()
self.scrolled.show()
- v_adjustment = self.scrolled.get_vadjustment()
- self.clipboard = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="CLIPBOARD")
- self.page = 0
- self.textview.grab_focus()
- self.ls = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
+ self._download_content_length = 0
+ self._download_content_type = None
+
+ self.ls = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, \
+ gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, \
+ gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
tv = gtk.TreeView(self.ls)
tv.set_rules_hint(True)
tv.set_search_column(COLUMN_TITLE)
selection = tv.get_selection()
selection.set_mode(gtk.SELECTION_SINGLE)
selection.connect("changed", self.selection_cb)
+
renderer = gtk.CellRendererText()
- col = gtk.TreeViewColumn('Title', renderer, text=COLUMN_TITLE)
+ col = gtk.TreeViewColumn(_('Title'), renderer, text=COLUMN_TITLE_TRUNC)
col.set_sort_column_id(COLUMN_TITLE)
tv.append_column(col)
renderer = gtk.CellRendererText()
- col = gtk.TreeViewColumn('Author', renderer, text=COLUMN_AUTHOR)
- col.set_sort_column_id(COLUMN_AUTHOR)
+ col = gtk.TreeViewColumn(_('Volume'), renderer, text=COLUMN_VOLUME)
+ col.set_sort_column_id(COLUMN_VOLUME)
+ tv.append_column(col)
+
+ renderer = gtk.CellRendererText()
+ col = gtk.TreeViewColumn(_('Author'), renderer, text=COLUMN_CREATOR_TRUNC)
+ col.set_sort_column_id(COLUMN_CREATOR)
tv.append_column(col)
+ renderer = gtk.CellRendererText()
+ col = gtk.TreeViewColumn(_('Language'), renderer, text=COLUMN_LANGUAGE)
+ col.set_sort_column_id(COLUMN_LANGUAGE)
+ tv.append_column(col)
+
self.list_scroller = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)
self.list_scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.list_scroller.add(tv)
@@ -197,12 +194,6 @@ class GetIABooksActivity(activity.Activity):
vbox.show()
self.list_scroller.show()
- textbuffer = self.textview.get_buffer()
- self.tag = textbuffer.create_tag()
- self.tag.set_property('weight', pango.WEIGHT_BOLD)
- self.tag.set_property( 'foreground', "white")
- self.tag.set_property( 'background', "black")
-
# Status of temp file used for write_file:
self._tempfile = None
self.toolbox.set_current_toolbar(_TOOLBAR_BOOKS)
@@ -214,14 +205,12 @@ class GetIABooksActivity(activity.Activity):
if sel:
model, iter = sel
self.selected_title = model.get_value(iter,COLUMN_TITLE)
- self.selected_author = model.get_value(iter,COLUMN_AUTHOR)
- self.selected_path = model.get_value(iter,COLUMN_PATH)
+ self.selected_author = model.get_value(iter,COLUMN_CREATOR)
+ self.selected_identifier = model.get_value(iter,COLUMN_IDENTIFIER)
self._books_toolbar._enable_button(True)
def find_books(self, search_text):
self._books_toolbar._enable_button(False)
- self.list_scroller.hide()
- self.list_scroller_visible = False
self.book_selected = False
self.ls.clear()
search_tuple = search_text.lower().split()
@@ -229,27 +218,15 @@ class GetIABooksActivity(activity.Activity):
self._alert(_('Error'), _('You must enter at least one search word.'))
self._books_toolbar._search_entry.grab_focus()
return
- f = open('bookcatalog.txt', 'r')
- while f:
- line = unicode(f.readline(), "iso-8859-1")
- if not line:
- break
- line_lower = line.lower()
- i = 0
- words_found = 0
- while i < len(search_tuple):
- text_index = line_lower.find(search_tuple[i])
- if text_index > -1:
- words_found = words_found + 1
- i = i + 1
- if words_found == len(search_tuple):
- iter = self.ls.append()
- book_tuple = line.split('|')
- self.ls.set(iter, COLUMN_TITLE, book_tuple[0], COLUMN_AUTHOR, book_tuple[1], COLUMN_PATH, book_tuple[2].rstrip())
- f.close()
- self.list_scroller.show()
- self.list_scroller_visible = True
-
+ FL = urllib.quote('fl[]')
+ SORT = urllib.quote('sort[]')
+ search_url = 'http://www.archive.org/advancedsearch.php?q=' + \
+ urllib.quote('(' + search_text.lower() + ') AND format:(DJVU)')
+ search_url += '&' + FL + '=creator&' + FL + '=description&' + FL + '=format&' + FL + '=identifier&' + FL + '=language'
+ search_url += '&' + FL + '=publicdate&' + FL + '=publisher&' + FL + '=subject&' + FL + '=title&' + FL + '=volume'
+ search_url += '&' + SORT + '=title&' + SORT + '&' + SORT + '=&rows=500&save=yes&fmt=csv&xmlsearch=Search'
+ gobject.idle_add(self.download_csv, search_url)
+
def get_book(self):
self._books_toolbar._enable_button(False)
if self.selected_path.startswith('PGA'):
@@ -259,20 +236,69 @@ class GetIABooksActivity(activity.Activity):
else:
gobject.idle_add(self.download_book, "http://www.gutenberg.org/dirs" + self.selected_path + "-8.zip", self._get_iso_book_result_cb)
- def download_book(self, url, result_cb):
- print "get book from", url
+ def download_csv(self, url):
+ print "get csv from", url
path = os.path.join(self.get_activity_root(), 'instance',
- 'tmp%i' % time.time())
+ 'tmp%i.csv' % time.time())
+ print 'path=', path
getter = ReadURLDownloader(url)
- getter.connect("finished", result_cb)
- getter.connect("progress", self._get_book_progress_cb)
- getter.connect("error", self._get_book_error_cb)
+ getter.connect("finished", self._get_csv_result_cb)
+ getter.connect("progress", self._get_csv_progress_cb)
+ getter.connect("error", self._get_csv_error_cb)
_logger.debug("Starting download to %s...", path)
try:
getter.start(path)
except:
- self._alert(_('Error'), _('Connection timed out for ') + self.selected_title)
+ self._alert(_('Error'), _('Connection timed out for CSV: ') + url)
- self._download_content_length = getter.get_content_length()
self._download_content_type = getter.get_content_type()
+
+ def _get_csv_progress_cb(self, getter, bytes_downloaded):
+ if self._download_content_length > 0:
+ _logger.debug("Downloaded %u of %u bytes...",
+ bytes_downloaded, self._download_content_length)
+ else:
+ _logger.debug("Downloaded %u bytes...",
+ bytes_downloaded)
+
+ def _get_csv_error_cb(self, getter, err):
+ _logger.debug("Error getting CSV: %s", err)
+ self._alert(_('Error'), _('Error getting CSV') )
+ self._download_content_length = 0
+ self._download_content_type = None
+
+ def _get_csv_result_cb(self, getter, tempfile, suggested_name):
+ print 'Content type:', self._download_content_type
+ if self._download_content_type.startswith('text/html'):
+ # got an error page instead
+ self._get_csv_error_cb(getter, 'HTTP Error')
+ return
+ self.process_downloaded_csv(tempfile, suggested_name)
+
+ def process_downloaded_csv(self, tempfile, suggested_name):
+ reader = csv.reader(open(tempfile, 'rb'))
+ reader.next() # skip the first header row.
+ for row in reader:
+ iter = self.ls.append()
+ self.ls.set(iter, 0, row[0], 1, row[1], 2, row[2], 3, row[3], 4, row[4], 5, row[5], \
+ 6, row[6], 7, row[7], 8, row[8], 9, row[9], \
+ COLUMN_TITLE_TRUNC, self.truncate(row[COLUMN_TITLE], 75), \
+ COLUMN_CREATOR_TRUNC, self.truncate(row[COLUMN_CREATOR], 40))
+
+ def truncate(self, str, length):
+ if len(str) > length:
+ return str[0:length-1] + '...'
+ else:
+ return str
+
+ def _alert(self, title, text=None):
+ alert = NotifyAlert(timeout=20)
+ alert.props.title = title
+ alert.props.msg = text
+ self.add_alert(alert)
+ alert.connect('response', self._alert_cancel_cb)
+ alert.show()
+
+ def _alert_cancel_cb(self, alert, response_id):
+ self.remove_alert(alert)
self.textview.grab_focus()