#!/usr/bin/python import os os.environ['DJANGO_SETTINGS_MODULE']='web.settings' from web.library.models import * from gdata.books.service import BookService #from dibbler_snippet import ConfirmMenu #from xml.dom import minidom #from xml.sax.saxutils import unescape import xml.parsers.expat import readline import re exit_commands = ['exit', 'abort', 'quit', 'bye', 'eat flaming death', 'q'] def get_book_loop(): service = BookService(source='Programvareverkstedet - Worblehat - 0.1a ') while True: indata = raw_input('Enter ISBN number> ') if indata in exit_commands: break feed = service.search_by_keyword('isbn='+indata) if feed.entry: if len(feed.entry) == 1: print "Found one book: "+feed.entry[0].dc_title[0].text build_book(feed.entry[0], indata) else: print "Found multiple books: " for i in range(len(feed.entry)): #entry in feed.entry: print "%d: %s" % (i, # build_authors(feed.entry[i].to_dict())[0], feed.entry[i].dc_title[0].text) bookno = (int)(raw_input("Which book do you want? [0-%d] " % (len(feed.entry) - 1))) build_book(feed.entry[bookno], indata) else: print "No items found" def found_item(entry, indata): print "Found: "+entry.dc_title[0].text build_book(entry, indata) def build_book(entry, indata=False): dic = entry.to_dict() book = {} book['action'] = 'new-book' book['title'] = entry.dc_title[0].text if len(entry.dc_title) > 0: book['subtitle'] = ''.join(map(lambda x: x.text, entry.dc_title[1:])) isbn = find_isbn(dic['identifiers']) if isbn: book['isbn'] = isbn elif indata: if len(indata) == 13: book['isbn'] = indata else: print "No ISBN found" return False book['description'] = find_description(dic) if 'date' in dic: book['published_year'] = int(dic['date'][:4]) if 'publishers' in dic: book['publisher'] = ','.join(dic['publishers']) book['num_pages'] = find_page_number(dic) book['persons'] = {} book['persons']['author'] = build_authors(dic) book['references'] = {} book['references']['google'] = dic['preview'] keys_to_add = ['edition', 'series', 'category', 'thumbnail', 'picture'] for key in keys_to_add: set_value(book, dic, key) return book def set_value(book, dic, key): if key in dic: book[key] = dic[key] else: book[key] = '' def find_description(dic): if 'description' in dic: return unescape(dic['description']) else: return "" def find_page_number(dic): if 'format' in dic: for item in dic['format']: if 'pages' in item: return int(re.findall(r'[0-9]+',item)[0]) return None else: return None def find_isbn(identifiers): for pair in identifiers: if pair[0] =='ISBN' and len(pair[1])==13: return pair[1] return False def build_authors(dictionary): if 'authors' in dictionary: author_list = [] for author in dictionary['authors']: author_list.append(get_or_create_author(author)) return author_list else: print "No authors found" return [] def get_or_create_author(author_name): print "Processing author: ", author_name names = author_name.split() first = ' '.join(names[:-1]) last = names[-1] candidates = Person.objects.filter(first_name__contains=names[0],last_name=last) selected = select_from_list(candidates, attributes=['first_name','last_name'], item_name='author') if selected: return selected else: print "No author found, creating author" newid = ''.join([i[0] for i in names]).lower() print newid while True: existing = Person.objects.filter(id=newid) if len(existing)==0: return Person(first_name=first, last_name=last, id=newid) newid = raw_input("Another authour found with same intials, please suggest an id> ") #Cargo-cult coded function to unescape special XML characters def select_from_list(list, attributes=False, item_name=""): if len(list) == 0: print "No candidate %sfound" %(item_name+' ') return None elif len(list) == 1: if attributes: answer = raw_input(str("Found one %s: %s. Use this? [y]/n> " %(item_name,' '.join([eval("list[0]."+attribute) for attribute in attributes])))) else: answer = raw_input(str("Found one %s: %s. Use this? [y]/n> " %(item_name,list[0]))) if answer in ['yes', 'y', '']: return list[0] else: return None else: print "several candidates found" return None def unescape(s): want_unicode = False if isinstance(s, unicode): s = s.encode("utf-8") want_unicode = True # the rest of this assumes that `s` is UTF-8 list = [] # create and initialize a parser object p = xml.parsers.expat.ParserCreate("utf-8") p.buffer_text = True p.returns_unicode = want_unicode p.CharacterDataHandler = list.append # parse the data wrapped in a dummy element # (needed so the "document" is well-formed) p.Parse("", 0) p.Parse(s, 0) p.Parse("", 1) # join the extracted strings and return es = "" if want_unicode: es = u"" return es.join(list) get_book_loop()