为Grok应用程序提供目录搜索工具
项目描述
dolmen.app.search 提供了在Grok应用程序内部搜索对象的组件。
搜索器
dolmen.app.search 引入了一个新的组件:ISearcher。该组件用于使用搜索词搜索和返回一组对象。
提供的API是
>>> from dolmen.app.search.interfaces import ISearchAPI >>> interfaceDescription(ISearchAPI) ISearcher: A component dedicated to search ICatalogSearcher: A specialized ISearcher querying a catalog
测试环境
为了测试我们的搜索器,我们需要一个至少有一个索引的操作应用。
我们准备导入
>>> import grok >>> from grok import index >>> from zope.index.text.interfaces import ISearchableText >>> from zope.interface import Interface >>> from zope.schema import TextLine
我们创建一个将被编目化的模型
>>> class IRipper(Interface): ... """A serial killer. ... """ ... searchabletext = TextLine(title=u"Name of the ripper") >>> class Ripper(grok.Model): ... grok.implements(IRipper) ... ... def __init__(self, searchabletext): ... self.searchabletext = searchabletext
我们创建一个Grok应用程序,它将成为我们的站点管理器
>>> class Backstreet(grok.Container, grok.Application): ... """A dark alley. ... """ >>> grok.testing.grok_component('application', Backstreet) True
我们定义一个将成为我们搜索基础的索引
>>> class RipperIndexes(grok.Indexes): ... grok.site(Backstreet) ... grok.context(IRipper) ... searchabletext = index.Text() >>> grok.testing.grok_component('indexes', RipperIndexes) True
现在我们持久化我们的应用程序并将其设置为默认站点
>>> from zope.site.hooks import setSite >>> app = Backstreet() >>> root = getRootFolder() >>> root['berner_street'] = app >>> setSite(app)
Grok应用程序已创建目录
>>> from zope.component import getUtility >>> from zope.catalog.interfaces import ICatalog >>> catalog = getUtility(ICatalog) >>> catalog <zope.catalog.catalog.Catalog object at ...>
我们的索引在这里
>>> catalog['searchabletext'] <zope.catalog.text.TextIndex object at ...> >>> catalog['searchabletext'].documentCount() 0
索引
目录已准备好。现在,如果我们创建内容并持久化它,编目机制将为我们完成工作。
>>> jack = Ripper(u"Jack the knife") >>> grok.notify(grok.ObjectCreatedEvent(jack)) >>> app['jack'] = jack >>> catalog['searchabletext'].documentCount() 1
可搜索文本已设置。这就是我们在网站编目中编目的内容。
>>> jack.searchabletext u'Jack the knife'
搜索
ISearcher可以用作工具。dolmen.app.search提供了一个ICatalogSearcher的默认实现。该组件用于查询网站编目。
>>> from dolmen.app.search import ICatalogSearcher >>> searcher = getUtility(ICatalogSearcher, "searcher.sitecatalog") >>> searcher <dolmen.app.search.searchers.SiteCatalogSearcher object at ...> >>> searcher.catalog == catalog True
ICatalogSearcher的搜索方法接收一个搜索词和索引名称。默认情况下,它使用searchabletext索引。
>>> result = searcher.search(term="Jack") >>> result <dolmen.app.search.sets.PermissionAwareResultSet instance at ...> >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
如果我们提供一个不存在的索引名称,将引发错误。
>>> result = searcher.search(term="Jack", index="non-existing") Traceback (most recent call last): ... ValueError: Index 'non-existing' does not exist
通配符
在搜索文本索引时,可以提供通配符。
>>> result = searcher.search("Ja") >>> list(result) [] >>> result = searcher.search("Ja*") >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
权限
默认情况下,我们的搜索器会检查结果集对象的zope.View权限。我们可以明确提供另一个权限。
>>> result = searcher.search("knife", permission="i-do-not-exist") >>> list(result) []
可以使用grok.Permision类代替字符串。
>>> from dolmen.app.security import CanViewContent >>> result = searcher.search("knife", permission=CanViewContent) >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
如果权限设置为None,则不进行检查。
>>> result = searcher.search("knife", permission=None) >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
视图和视窗
dolmen.app.search附带两个浏览器组件。一个搜索表单视窗和一个结果页面。
搜索视窗
搜索视窗被注册以显示搜索表单输入。为了测试视窗的输出,我们需要一个视图。
>>> class GasLamp(grok.View): ... """A view where the air's cold and damp ... """ ... grok.context(IRipper) >>> grok.testing.grok_component('view', GasLamp) True
我们获取视图以渲染视窗。
>>> from zope.publisher.browser import TestRequest >>> from zope.component import getMultiAdapter >>> request = TestRequest() >>> view = getMultiAdapter((jack, request), name="gaslamp")
Search视窗已注册用于dolmen.app.layout.Top管理器。我们构建这个管理器。
>>> from dolmen.app.layout import Top >>> manager = Top(jack, request, view)
现在我们可以调用、更新和渲染搜索视窗。
>>> from dolmen.app.search.browser import Search >>> search = Search(jack, request, view, manager) >>> search.update() >>> print search.render() <form id="searchbox" method="post" action="http://127.0.0.1/berner_street/search.result"> <input type="text" autocomplete="off" name="search_term" id="search-widget" value="" /> <input type="submit" name="search_button" id="search-button" title="Search" alt="Search" value="Search" /> </form>
结果页面
视窗将数据发送到search.result视图。该视图从请求中获取search_term,查询ICatalogSearcher并显示结果。
>>> request = TestRequest(form = {'search_term': 'jack'}) >>> results = getMultiAdapter((jack, request), name="search.result") >>> results <dolmen.app.search.browser.Results object at ...> >>> results.update() >>> print results.content() <div class="search-result"> <div class="search-header"> <h1>Search</h1> <h3>Found 1 results for jack</h3> </div> <dl class="search-results content-listing"> <dt> <a href="http://127.0.0.1/berner_street/jack" title="jack"> <span>jack</span> </a> </dt> </dl> </div>
变更日志
0.4 (2010-11-05)
该软件包现在适用于Grok 1.2。
图标现在使用“icon”视图,而不是“contenttype_icon”视图。
已审查并精简了依赖项。
0.3.1 (2010-07-24)
0.3版本因缺少本地化目录而损坏。
0.3 (2010-07-24)
添加了法语翻译。
0.2.2 (2009-01-08)
声明所有依赖项并进行一些清理。
为搜索视窗要求dolmen.content.View权限。
0.2.1 (2009-12-01)
删除了所有zope.app.*的导入,以使用intid和编目。现在使用新软件包。这使得dolmen.app.search与grok1.1a2兼容。
0.2 (2009-12-01)
修改了导入以使其与grok 1.1(ztk 1.0)兼容。
0.1 (2009-11-08)
初始发布
项目详情
dolmen.app.search-0.4.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4e45c2dc65070276859bc87fa1e26eae492a9221794ec6251ed862ec86d9f03c |
|
MD5 | 9bd72d96af1a7577c0e1a65e286157a3 |
|
BLAKE2b-256 | ca4c233e4384afeaeb0d02fc8b5ec0174104cda9d8bf4692c21bb93104e7b395 |