[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