[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}"><-- 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 --></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