[Zope3-checkins] CVS: Zope3/src/zope/app/browser/index/text - __init__.py:1.2 configure.zcml:1.2 control.pt:1.2 control.py:1.2

Jim Fulton jim@zope.com
Wed, 25 Dec 2002 09:14:05 -0500


Update of /cvs-repository/Zope3/src/zope/app/browser/index/text
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/browser/index/text

Added Files:
	__init__.py configure.zcml control.pt control.py 
Log Message:
Grand renaming:

- Renamed most files (especially python modules) to lower case.

- Moved views and interfaces into separate hierarchies within each
  project, where each top-level directory under the zope package
  is a separate project.

- Moved everything to src from lib/python.

  lib/python will eventually go away. I need access to the cvs
  repository to make this happen, however.

There are probably some bits that are broken. All tests pass
and zope runs, but I haven't tried everything. There are a number
of cleanups I'll work on tomorrow.



=== Zope3/src/zope/app/browser/index/text/__init__.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/index/text/__init__.py	Wed Dec 25 09:12:33 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.


=== Zope3/src/zope/app/browser/index/text/configure.zcml 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/index/text/configure.zcml	Wed Dec 25 09:12:33 2002
@@ -0,0 +1,28 @@
+<zopeConfigure
+   xmlns='http://namespaces.zope.org/zope'
+   xmlns:browser='http://namespaces.zope.org/browser'
+>
+
+  <browser:menuItem
+    menu="add_component"
+    for="zope.app.interfaces.container.IAdding"
+    action="zope.app.index.text.factory"
+    title="Text Index"
+    description="An index to support full-text search"
+    />
+
+  <browser:defaultView
+    for="zope.textindex.textindexinterfaces.IStatistics"
+    name="control.html" />
+
+  <browser:view
+    for="zope.textindex.textindexinterfaces.IStatistics"
+    permission="zope.ManageServices"
+    name="control.html"
+    factory=".control.ControlView">
+
+    <browser:page name="index.html" template="control.pt" />
+
+  </browser:view>
+
+</zopeConfigure>


=== Zope3/src/zope/app/browser/index/text/control.pt 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/index/text/control.pt	Wed Dec 25 09:12:33 2002
@@ -0,0 +1,92 @@
+<html metal:use-macro="views/standard_macros/page">
+
+  <head>
+    <title>TextIndex Control Page</title>
+  </head>
+
+  <body>
+
+  <div metal:fill-slot="body">
+
+    <h1><br>TextIndex</h1>
+
+    <p class="form-help">
+        This page lets you control a text index, which is used to
+        provide a full-text searching facility.  The search box here is
+        only for debugging.  Subscription status: A "subscribed" index
+        will update itself whenever objects are added, deleted or
+        modified; an "unsubscribed" index will retain the indexing
+        information but not update itself further.
+    </p>
+
+    <span tal:condition="request/callSubscribe|nothing" tal:omit-tag="">
+        <span tal:define="dummy context/subscribe" tal:omit-tag=""/>
+        Successfully subscribed.
+    </span>
+    <span tal:condition="request/callUnsubscribe|nothing" tal:omit-tag="">
+        <span tal:define="dummy context/unsubscribe" tal:omit-tag=""/>
+        Successfully unsubscribed.
+    </span>
+
+    <div>
+        Documents: <span tal:replace="context/documentCount" />
+    </div>
+
+    <div>
+        Words: <span tal:replace="context/wordCount" />
+    </div>
+
+    <form method="POST">
+       <span tal:condition="context/isSubscribed" tal:omit-tag="">
+           Subscription state: ON
+           <input type="submit" value="Unsubscribe" name="callUnsubscribe" />
+       </span>
+       <span tal:condition="not:context/isSubscribed" tal:omit-tag="">
+           Subscription state: OFF
+           <input type="submit" value="Subscribe" name="callSubscribe" />
+       </span>
+       <input type="hidden" name="queryText" value=""
+              tal:attributes="value request/queryText|nothing" />
+    </form>
+
+    <form method="GET">
+        <input type="text" name="queryText" value=""
+               tal:attributes="value request/queryText|nothing" />
+        <input type="submit" value="Query" />
+    </form>
+
+    <div tal:condition="request/queryText|nothing" tal:omit-tag="">
+        <div tal:define="result view/query" tal:omit-tag="">
+	    <div tal:condition="not:result/total">
+	        No hits.  Please try another query.
+	    </div>
+	    <div tal:condition="result/total">
+		<div tal:content="
+		string:Hits ${result/first}-${result/last} of ${result/total}:"
+		/>
+		<div tal:repeat="info result/results">
+	            title=<span tal:replace="info/title" />;
+		    url=<a href="location"
+		            tal:attributes="href info/location"
+                            tal:content="info/location">url</a>;
+		    score=<span tal:replace="info/scoreLabel" />
+		</div>
+	    </div>
+	    <span tal:condition="exists:result/prev">
+                <a href="next"
+                   tal:attributes="href
+                       string:?queryText=${request/queryText}&start=${view/prevBatch}">&lt;-- PREVIOUS BATCH</a>
+	    </span>
+	    <span tal:condition="exists:result/next">
+                <a href="next"
+                   tal:attributes="href
+                       string:?queryText=${request/queryText}&start=${view/nextBatch}">NEXT BATCH --&gt;</a>
+	    </span>
+        </div>
+    </div>
+
+  </div>
+
+  </body>
+
+</html>


=== Zope3/src/zope/app/browser/index/text/control.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:05 2002
+++ Zope3/src/zope/app/browser/index/text/control.py	Wed Dec 25 09:12:33 2002
@@ -0,0 +1,98 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Control view for the text index.
+
+XXX longer description goes here.
+
+$Id$
+"""
+
+from __future__ import generators
+
+from zope.component import getService, queryAdapter
+from zope.exceptions import NotFoundError
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.publisher.browser import BrowserView
+
+from zope.app.traversing import locationAsUnicode
+from zope.app.interfaces.dublincore import IZopeDublinCore
+from zope.app.interfaces.index.text.interfaces import IQueryView
+
+class ControlView(BrowserView):
+
+    __implements__ = BrowserView.__implements__, IQueryView
+
+    default_start = 0 # Don't change -- always start at first batch
+    default_count = 2 # Default batch size -- tune as you please
+
+    def __init__(self, context, request):
+        super(ControlView, self).__init__(context, request)
+        self.hub = getService(context, "ObjectHub")
+
+    def nextBatch(self):
+        start = int(self.request.get('start', self.default_start))
+        count = int(self.request.get('count', self.default_count))
+        return start + count
+
+    def prevBatch(self):
+        start = int(self.request.get('start', self.default_start))
+        count = int(self.request.get('count', self.default_count))
+        return start - count
+
+    def query(self, start=None):
+        queryText = self.request.get('queryText', '')
+        if start is None:
+            start = int(self.request.get('start', self.default_start))
+        count = int(self.request.get('count', self.default_count))
+        results, total = self.context.query(queryText, start, count)
+        nresults = len(results)
+        first = start + 1
+        last = first + len(results) - 1
+        result = {
+            'results': list(self._resultIterator(results)),
+            'nresults': nresults,
+            'first': first,
+            'last': last,
+            'total': total,
+            }
+        if start > 0:
+            prev = max(0, start - count)
+            result['prev'] = prev
+        if last < total:
+            next = start + count
+            result['next'] = next
+        return result
+
+    def _resultIterator(self, results):
+        for hubid, score in results:
+            yield self._cookInfo(hubid, score)
+
+    def _cookInfo(self, hubid, score):
+        location = locationAsUnicode(self.hub.getLocation(hubid))
+        scoreLabel = "%.1f%%" % (100.0 * score)
+        result = {
+            'location': location,
+            'score': score,
+            'scoreLabel': scoreLabel,
+            }
+        try:
+            object = self.hub.getObject(hubid)
+        except NotFoundError:
+            pass
+        else:
+            dc = queryAdapter(object, IZopeDublinCore, context=self.context)
+            if dc is not None:
+                title = dc.title
+                result['title'] = title
+        return result