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)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java在二维数组中获取所有值的组合   java如何在Heroku上运行Flyway迁移?   当Tomcat作为windows服务启动时,其他计算机无法使用java Tomcat应用程序   java SPNEGO获取用户详细信息   java多线程SaxParser解析多个xml文件   如何将十六进制字符串转换为字节。JAVA   java Android:如何在MapBox中添加自定义标记?   java如何从Android广播UDP数据包?   java驱动程序。executeScript()返回简单javascript的NullPointerException   java我们如何在网站上从系统上传文件?   java在JTextArea中剪切和粘贴   java PrimeFacesRequestContext。getCurrentInstance()。为SelectOne菜单重置   java在安卓中动态存储运行时变量   java如何检测“文本内容中发现无效字符”   Java数据结构:错误“无法访问LinkedList”   java合并排序(根据频率排序单词)   java为什么/如何将整数设置为1使while循环工作?   java Maven编译器插件抱怨“未找到SLF4J提供程序”   jakarta ee java锁定文件   java Hibernate会话。update()与update查询?