diff options
author | James Simmons <jim@olpc.simmons> | 2009-06-27 16:47:45 (GMT) |
---|---|---|
committer | James Simmons <jim@olpc.simmons> | 2009-06-27 16:47:45 (GMT) |
commit | 5cb8ccc3e7e95f8d5fc54cdc1cd7a57ebee5e56d (patch) | |
tree | b0ab9ca2ec8bffbf69c788d1c1816f0ebb0a19ef /GetIABooksActivity.py | |
parent | 98f46fa446098a1cf45ae7dd7c2c3656a7c5a7b3 (diff) |
modified: GetIABooksActivity.py
Implement basic book lookup function.
Diffstat (limited to 'GetIABooksActivity.py')
-rwxr-xr-x | GetIABooksActivity.py | 180 |
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() |