[Checkins] SVN: Sandbox/luciano/kirbi/src/kirbi/ added isbn search
and auto redirect to single result
Luciano Ramalho
luciano at ramalho.org
Mon Jul 23 02:10:27 EDT 2007
Log message for revision 78289:
added isbn search and auto redirect to single result
Changed:
U Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_fetch.py
A Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_parse.py
U Sandbox/luciano/kirbi/src/kirbi/isbn.py
U Sandbox/luciano/kirbi/src/kirbi/pac.py
-=-
Modified: Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_fetch.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_fetch.py 2007-07-23 05:27:12 UTC (rev 78288)
+++ Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_fetch.py 2007-07-23 06:10:27 UTC (rev 78289)
@@ -2,7 +2,6 @@
import httplib2
from urllib import quote
-from lxml import etree
from StringIO import StringIO
from time import sleep
@@ -18,7 +17,6 @@
class AmazonECS(object):
- xml_namespace = """http://webservices.amazon.com/AWSECommerceService/2005-10-05"""
base_url = """http://ecs.amazonaws.com/onca/xml"""
def __init__(self, AWSAccessKeyId, AssociateTag=None):
@@ -42,12 +40,6 @@
self.tree = etree.parse(StringIO(content))
return resp, content
- def buildQPath(path, ns):
- """build a path with fully qualified tags"""
- ns = '{%s}' % ns
- parts = path.split('/')
- return ns+('/'+ns).join(parts)
-
def itemLookup(self,itemId,response='ItemAttributes'):
params = { 'Operation':'ItemLookup',
'ItemId':itemId,
@@ -56,10 +48,6 @@
url = self.buildURL(**params)
return self.getFile(url)[1]
- def findAll(self,path):
- pass
-
-
if __name__=='__main__':
from amazon_config import ACCESS_KEY_ID, ASSOCIATE_TAG
Added: Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_parse.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_parse.py (rev 0)
+++ Sandbox/luciano/kirbi/src/kirbi/fetch/amazon_parse.py 2007-07-23 06:10:27 UTC (rev 78289)
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+import httplib2
+from urllib import quote
+from lxml import etree
+from StringIO import StringIO
+from time import sleep
+
+"""
+NOTE: 0333647289 is a valid ISBN which generates a AWS.InvalidParameterValue
+ from Amazon.com with message: "0333647289 is not a valid value for ItemId"
+ The book is Virtual History: Alternatives and Counterfactuals
+ by Niall Ferguson (Editor)
+ Amazon.com does not have it but Amazon.co.uk does and
+ Google query "isbn 0333647289" also found it here:
+ http://www.alibris.com/search/search.cfm?qwork=7055972
+"""
+
+class AmazonECS(object):
+
+ xml_namespace = """http://webservices.amazon.com/AWSECommerceService/2005-10-05"""
+ base_url = """http://ecs.amazonaws.com/onca/xml"""
+
+ def __init__(self, AWSAccessKeyId, AssociateTag=None):
+ self.base_params = { 'Service':'AWSECommerceService',
+ 'AWSAccessKeyId':AWSAccessKeyId, }
+ if AssociateTag:
+ self.base_params['AssociateTag'] = AssociateTag
+ self.httpcli = httplib2.Http('.cache')
+
+ def buildURL(self, **kw):
+ query = []
+ kw.update(self.base_params)
+ for key, val in kw.items():
+ query.append('%s=%s' % (key,quote(val)))
+ return self.base_url + '?' + '&'.join(query)
+
+ def getFile(self, url):
+ # Amazon.com ECS agreement imposes a limit of one request per second
+ sleep(1)
+ resp, content = self.httpcli.request(url, 'GET')
+ self.tree = etree.parse(StringIO(content))
+ return resp, content
+
+ def buildQPath(path, ns):
+ """build a path with fully qualified tags"""
+ ns = '{%s}' % ns
+ parts = path.split('/')
+ return ns+('/'+ns).join(parts)
+
+ def itemLookup(self,itemId,response='ItemAttributes'):
+ params = { 'Operation':'ItemLookup',
+ 'ItemId':itemId,
+ 'ResponseGroup':response
+ }
+ url = self.buildURL(**params)
+ return self.getFile(url)[1]
+
+ def findAll(self,path):
+ pass
+
+
+if __name__=='__main__':
+ from amazon_config import ACCESS_KEY_ID, ASSOCIATE_TAG
+
+ ecs = AmazonECS(ACCESS_KEY_ID, ASSOCIATE_TAG)
+ alice = '0393048470'
+ gof = '0201633612'
+ awpr = '0977616630'
+ oss = '1565925823'
+ dup = '0141000511'
+ print ecs.itemLookup(oss)
+
+
+
Modified: Sandbox/luciano/kirbi/src/kirbi/isbn.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/isbn.py 2007-07-23 05:27:12 UTC (rev 78288)
+++ Sandbox/luciano/kirbi/src/kirbi/isbn.py 2007-07-23 06:10:27 UTC (rev 78289)
@@ -84,7 +84,8 @@
if len(digits) != 10:
raise ValueError, '%s is not a valid ISBN-10'
else:
- return '978' + digits[:-1] + checksumEAN(digits)
+ digits = '978' + digits[:-1]
+ return digits + checksumEAN(digits)
# Note: ISBN group identifiers related to languages
# http://www.isbn-international.org/en/identifiers/allidentifiers.html
Modified: Sandbox/luciano/kirbi/src/kirbi/pac.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/pac.py 2007-07-23 05:27:12 UTC (rev 78288)
+++ Sandbox/luciano/kirbi/src/kirbi/pac.py 2007-07-23 06:10:27 UTC (rev 78289)
@@ -4,6 +4,7 @@
from zope.app.container.interfaces import INameChooser
from zope.interface import implements
from operator import attrgetter
+from isbn import isValidISBN, isValidISBN10, convertISBN10toISBN13, filterDigits
from zope.app.catalog.interfaces import ICatalog
from zope.component import getUtility, queryUtility
@@ -24,7 +25,6 @@
class Index(grok.View):
def update(self, query=None):
-
if not query:
# XXX: if the query is empty, return all books; this should change
# to some limited default search criteria or none at all
@@ -33,11 +33,17 @@
self.demo_link = True # flag to display Import demo collection
self.results_title = 'All items'
else:
+ query = query.strip()
catalog = getUtility(ICatalog)
if query.startswith(u'cr:'):
query = query[3:].strip().lower()
set_query = {'any_of': [query]}
results = catalog.searchResults(creatorsSet=set_query)
+ elif isValidISBN(query):
+ isbn = filterDigits(query)
+ if len(isbn) == 10:
+ isbn = convertISBN10toISBN13(isbn)
+ results = catalog.searchResults(isbn13=(isbn,isbn))
else:
results = catalog.searchResults(searchableText=query)
# Note: to sort the results, we must cast the result iterable
@@ -49,6 +55,7 @@
elif len(results) == 1:
qty = u'I'
s = u''
+ self.redirect(self.url(results[0])+'/details')
else:
qty = u'%s i' % len(results)
s = u's'
More information about the Checkins
mailing list