跳转到主要内容

为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 (9.8 kB 查看散列)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面