[Checkins] SVN: Sandbox/luciano/kirbi/src/kirbi/ title search implemented in the public catalog

Luciano Ramalho luciano at ramalho.org
Sun Jul 8 18:14:57 EDT 2007


Log message for revision 77634:
  title search implemented in the public catalog
  

Changed:
  U   Sandbox/luciano/kirbi/src/kirbi/app.py
  U   Sandbox/luciano/kirbi/src/kirbi/app_templates/index.pt
  U   Sandbox/luciano/kirbi/src/kirbi/app_templates/master.pt
  U   Sandbox/luciano/kirbi/src/kirbi/book.py
  U   Sandbox/luciano/kirbi/src/kirbi/book_templates/details.pt
  U   Sandbox/luciano/kirbi/src/kirbi/pac.py
  U   Sandbox/luciano/kirbi/src/kirbi/pac_templates/index.pt
  U   Sandbox/luciano/kirbi/src/kirbi/static/master.css

-=-
Modified: Sandbox/luciano/kirbi/src/kirbi/app.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/app.py	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/app.py	2007-07-08 22:14:57 UTC (rev 77634)
@@ -1,7 +1,7 @@
 import grok
+from grok import index
 from kirbi.pac import Pac
 from kirbi.book import Book
-from grok import index
 from zope.interface import Interface
 
 class Kirbi(grok.Application, grok.Container):
@@ -21,4 +21,5 @@
     isbn13 = index.Field()
     
 class Master(grok.View):
-    grok.context(Interface)
\ No newline at end of file
+    """ The master page template macro """
+    grok.context(Interface)

Modified: Sandbox/luciano/kirbi/src/kirbi/app_templates/index.pt
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/app_templates/index.pt	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/app_templates/index.pt	2007-07-08 22:14:57 UTC (rev 77634)
@@ -3,11 +3,12 @@
    <title metal:fill-slot="title">Main</title>
 </head>
 <body>
-  <div metal:fill-slot="body">
-	
-	<p><a tal:attributes="href python:view.url('pac')">
-		Book Catalog
-	</a></p>
+  <span metal:fill-slot="content_title">Main</span>      
+
+  <div metal:fill-slot="content">
+
+  Main page stuff will be here.
+  
   </div>	
 </body>
 </html>

Modified: Sandbox/luciano/kirbi/src/kirbi/app_templates/master.pt
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/app_templates/master.pt	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/app_templates/master.pt	2007-07-08 22:14:57 UTC (rev 77634)
@@ -28,10 +28,22 @@
         <li><a tal:attributes="href python:view.application_url()">leases</a></li>
     </ul>
   </div>
-  <div class="body">
   <div metal:define-slot="body">
-    Your content here...
+    <div class="content_menu">
+      <span metal:define-slot="content_menu">
+        <span class="content_title">
+            <span metal:define-slot="content_title">
+            Content title
+            </span>
+        </span>
+        <span metal:define-slot="content_actions" />
+      </span>
+    </div>
+    <div class="content">
+      <div metal:define-slot="content">
+        Your content here...
+      </div>
+    </div>
   </div>
-  </div>
 </body>
 </html>

Modified: Sandbox/luciano/kirbi/src/kirbi/book.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/book.py	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/book.py	2007-07-08 22:14:57 UTC (rev 77634)
@@ -179,6 +179,8 @@
     
     sub_title = property(getSubTitle)
 
+    def creatorsLine(self):
+        return '; '.join(self.creators)
 
 class Edit(grok.EditForm):
     pass
@@ -198,9 +200,6 @@
         self.sub_title = self.context.sub_title
         self.isbn13 = self.context.isbn13
         
-    def creatorsLine(self):
-        return '; '.join(self.context.creators)
-
     def coverUrl(self):
         cover_name = 'covers/medium/'+self.context.__name__+'.jpg'
         return self.static.get(cover_name,

Modified: Sandbox/luciano/kirbi/src/kirbi/book_templates/details.pt
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/book_templates/details.pt	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/book_templates/details.pt	2007-07-08 22:14:57 UTC (rev 77634)
@@ -5,17 +5,25 @@
     </title>
 </head>
 <body>
-  <div metal:fill-slot="body">
+  <span metal:fill-slot="content_title">Book details</span>      
+  <span metal:fill-slot="content_actions">
+    <form class="search" tal:attributes="action python:view.url('edit')">
+        <input type="submit" name="submit" value="edit">
+    </form>
+  </span>  
 
+
+  <div metal:fill-slot="content">
+
     <div class="details">
-    <img id="cover" tal:attributes="src view/coverUrl">
+    <img class="cover" tal:attributes="src view/coverUrl">
 
     <h1 tal:content="view/main_title">Main Title</h1>
     <h2 tal:content="view/sub_title">sub-title</h2>
 
     <table>
         <tr><th>Creators</th>
-            <td tal:content="view/creatorsLine">Joe Doe</td>
+            <td tal:content="context/creatorsLine">Joe Doe</td>
         </tr>
         <tr><th>ISBN-13</th>
             <td tal:content="view/isbn13">9780123456789</td>
@@ -34,10 +42,8 @@
         </tr>
     </table>
 
-    <p><a tal:attributes="href python:view.url('edit')">
-            Edit
-    </a></p>
-    </div>
-  </div>
+    </div><!-- /details -->
+
+  </div><!-- /content -->
   </body>
 </html>

Modified: Sandbox/luciano/kirbi/src/kirbi/pac.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/pac.py	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/pac.py	2007-07-08 22:14:57 UTC (rev 77634)
@@ -5,6 +5,9 @@
 from zope.interface import implements
 from operator import attrgetter
 
+from zope.app.catalog.interfaces import ICatalog
+from zope.component import getUtility, queryUtility
+
 class Pac(grok.Container):
     """ Pac (public access catalog)
 
@@ -19,9 +22,31 @@
     """
 
 class Index(grok.View):
-    def sortedList(self):
-        return sorted(self.context.values(), key=attrgetter('filing_title'))
+    
+    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
+            results = self.context.values()
+            self.results_title = 'All %s books' % len(results)
+        else:
+            catalog = getUtility(ICatalog)
+            # Note: to sort the results, we must cast the result iterable
+            # to a list, which can be very expensive
+            results = list(catalog.searchResults(title=query))
+            if len(results) == 0:
+                qty = 'No t'
+                s = 's'
+            elif len(results) == 1:
+                qty = 'T'
+                s = ''
+            else:
+                qty = '%s t' % len(results)
+                s = 's'
+            self.results_title = '%sitle%s matching "%s"' % (qty, s, query)
 
+        self.results = sorted(results, key=attrgetter('filing_title'))
+        
     def coverUrl(self, name):
         cover_name = 'covers/medium/'+name+'.jpg'
         return self.static.get(cover_name,

Modified: Sandbox/luciano/kirbi/src/kirbi/pac_templates/index.pt
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/pac_templates/index.pt	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/pac_templates/index.pt	2007-07-08 22:14:57 UTC (rev 77634)
@@ -3,25 +3,46 @@
     <title metal:fill-slot="title">
         Public Catalog
     </title>
+    <script metal:fill-slot="headers" type="text/javascript">
+        function setfocus() { document.forms[0].query.focus() }
+    </script>
+
 </head>
 <body>
-  <div metal:fill-slot="body">
-    <h1>Public Catalog</h1>
+  <span metal:fill-slot="content_title">Collective catalog</span>      
+  <span metal:fill-slot="content_actions">
+    <form class="search" action=".">
+        <input type="text" name="query">
+        <input type="submit" name="submit" value="search">
+    </form>
+  </span>  
+  <div metal:fill-slot="content">
 
+    <h3 tal:content="view/results_title">999 items matched the query</h3>
+    <table tal:condition="view/results">
+        <tr tal:repeat="item view/results">
+            <th align="right" tal:content="repeat/item/number" />
+            <td align="center">
+                <img class="cover"
+                     tal:attributes="src python:view.coverUrl(item.__name__)"
+                     height="53" />
+            </td>
+            <td>
+                <dl>
+                    <dt><a tal:attributes="href python:view.url(item)+'/details'"
+                        tal:content="item/filing_title">title goes here</a>
+                    </dt>
+                    <dd tal:content="item/creatorsLine">
+                    </dd>
+                </dl>            
+            </td>
+        </tr>
+    </table>
+
     <p><a tal:attributes="href python:view.url('addbook')">
             Add Book
     </a></p>
 
-    <table>
-        <tr tal:repeat="item view/sortedList">
-            <td align="right" tal:content="repeat/item/number" />
-            <td align="center"><img tal:attributes="src python:view.coverUrl(item.__name__)" height="53" /></td>
-            <td><a tal:attributes="href python:view.url(item)+'/details'"
-                    tal:content="item/filing_title">title goes here</a>
-            </td>
-        </tr>
-    </table>
-
   </div>
 </body>
 </html>

Modified: Sandbox/luciano/kirbi/src/kirbi/static/master.css
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/static/master.css	2007-07-08 18:52:04 UTC (rev 77633)
+++ Sandbox/luciano/kirbi/src/kirbi/static/master.css	2007-07-08 22:14:57 UTC (rev 77634)
@@ -1,6 +1,19 @@
 body {
     margin: 0px;
 }
+
+a:link {
+    color: #3030a8;
+    text-decoration: none;
+}
+a:visited {
+    color: #6060a8;
+    text-decoration: none;
+}
+a:hover {
+    text-decoration: underline;
+}
+
 div.top {
     background-color: #6060a8;
     width: 100%;
@@ -29,31 +42,53 @@
     padding-bottom: 1px;
     border-bottom: 1px solid yellow;
 }
-h1, h2, h3, dt {
+h1, h2, h3, dt, .content_title {
     font-family: sans-serif;
     font-weight: bold;
 }
+
 h1 { font-size: 16pt; }
-h2 { font-size: 13pt; }
-h3 { font-size: 11pt; }
-dt, th { font-size: 10pt; }
+h2, .content_title { font-size: 14pt; }
+h3 {
+    font-size: 12pt;
+    color: gray;
+}
+dt { font-size: 12pt; }
+th { font-size: 10pt; }
+dd { font-size: 11pt; }
 
-div.body {
+div.content_menu {
+    background-color: lightgray;
+    padding-left: 10px;
+    padding-bottom: 3px;
+    margin-top: 1px;
+}
+
+div.content {
     margin: 20px;
 }
 
-.details img#cover {
+form.search {
+    display: inline;
+    position: absolute;
+    right: 10px;
+}
+
+img.cover {
+    border: 1px solid lightgray;
+    margin-right: 10px;
+}
+
+.details img.cover {
     margin-left: 5px;
-    margin-right: 20px;
     float: left;
-    border: 1px solid lightgray;
 }
 
 .details h1, h2, h3, dt {
     font-family: sans-serif;
     font-weight: bold;
 }
-.details th {
+th {
     font-family: sans-serif;
     font-weight: bold;
     font-size: 10pt;



More information about the Checkins mailing list