grok应用程序的目录搜索实用程序
dolmen.app.search的Python项目详细描述
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应用程序,它将是out site manager:
>>> 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
索引< EH3>
目录准备好了。现在,如果我们创建一个内容并持久化它,那么 编目机制将为我们做这项工作:
>>> 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的搜索方法使用一个搜索项和 索引的名称。默认情况下,它使用可搜索文本索引:
>>> 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 ...>]
权限
默认情况下,我们的搜索者检查 结果集的对象。我们可以提供另一个许可 明确:
>>> result = searcher.search("knife", permission="i-do-not-exist") >>> list(result) []
可以使用grok.permission类来代替字符串:
>>> from dolmen.app.security import CanViewContent >>> result = searcher.search("knife", permission=CanViewContent) >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
如果权限设置为“无”,则不检查任何内容:
>>> result = searcher.search("knife", permission=None) >>> list(result) [<dolmen.app.search.tests.Ripper object at ...>]
视图和Viewlet
dolmen.app.search带有两个浏览器组件。搜索表单 viewlet和结果页。
搜索视图let
已注册搜索viewlet以显示搜索表单输入。在 为了测试viewlet的输出,我们需要一个视图:
>>> class GasLamp(grok.View): ... """A view where the air's cold and damp ... """ ... grok.context(IRipper) >>> grok.testing.grok_component('view', GasLamp) True
我们得到要渲染viewlet的视图:
>>> from zope.publisher.browser import TestRequest >>> from zope.component import getMultiAdapter >>> request = TestRequest() >>> view = getMultiAdapter((jack, request), name="gaslamp")
searchviewlet注册到dolmen.app.layout.top 经理。我们构建这个管理器:
>>> from dolmen.app.layout import Top >>> manager = Top(jack, request, view)
我们现在可以调用、更新和呈现搜索视图let:
>>> 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>
结果页
viewlet将数据发布到search.result视图。这个视图 从请求中获取搜索项,查询 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)
- 由于缺少locales目录,0.3版本被破坏。
0.3(2010-07-24)
- 增加了法语翻译。
0.2.2(2009-01-08)
- 声明所有依赖项并进行一些清理。
- 搜索Viewlet需要dolmen.content.view权限。
0.2.1(2009-12-01)
- 已从zope.app.*中删除IntID和Catalog的所有导入。现在使用 新的包裹。这使得dolmen.app.search与 格罗克1.1a2。
0.2(2009-12-01)
- 莫迪菲修改了导入,使其与Grok1.1(ZTK1.0)兼容
0.1(2009-11-08)
- 初始版本