为horea资源规划系统提供搜索功能

horae.search的Python项目详细描述


简介

horae.search提供了horea的搜索功能 实现ajax驱动的全文搜索的资源规划系统 以及可插入的高级搜索表单。此外,它还实现了 基于所提供的实现的受限特殊Query实现 通过hurry.query仅 返回允许用户查看的结果。

用法

有几种方法可以扩展和调整搜索行为 通过注册特殊适配器生成表单和结果。以下可能性 可用于从horae.search.search.SearchMixin进行子分类的任何视图。

扩展高级搜索表单

高级搜索表单可以通过注册命名的多适配器进行扩展 实现horae.search.interfaces.IAdvancedSearchFieldProvider 调整contextrequest。例如,如果有人 要在自定义目录中添加新的TextLine字段搜索 实现方式如下:

import grok

from zope import interface
from zope import schema
from zope.publisher.interfaces.browser import IBrowserRequest

from hurry import query

from horae.search import interfaces

class SampleAdvancedSearchFieldProvider(grok.MultiAdapter):
    grok.adapts(interface.Interface, IBrowserRequest)
    grok.implements(interfaces.IAdvancedSearchFieldProvider)
    grok.name('sampleadvancedfieldprovider')

    def __init__(self, context, request):
        self.context = context
        self.request = request

    def fields(self):
        """ Returns a list of fields to be added to the form
        """
        return [
            schema.TextLine(
                __name__ = 'sample_text_line',
                title = u'Sample text line'
            )
        ]

    def query(self, **data):
        """ Returns a list of queries
        """
        queries = []
        if 'sample_text_line' in data:
            queries.append(query.Text(('samplecatalog', 'text'),
                                      data['sample_text_line']))
        return queries

调整默认排序

默认情况下,搜索结果按目录中的特殊整数索引排序。 这个整数可以通过注册一个名为 horae.search.interfaces.ISortingProvider并调整对象的排序 应该改成。例如,如果一个人想移动每一张有 设置在搜索结果底部的特殊属性 会是这样的:

from horae.ticketing.interfaces import ITicket

class SampleSortingProvider(grok.Adapter):
    grok.context(ITicket)
    grok.implements(interfaces.ISortingProvider)
    grok.name('samplesortingprovider')

    def add(self):
        """ Returns an integer to be added to the sorting
        """
        return 0

    def adjust(self, sorting):
        """ Adjusts the sorting after all providers sorting
            where added and returns the adjusted sorting
        """
        if (self.context.get_property('my_special_property', None) is not None):
            return 0
        return sorting

更改默认排序

如上所述,搜索结果的默认排序是一个特殊的整数索引 在目录里。这可以通过注册实现 horae.search.interfaces.IDefaultSortingProvider并调整 搜索视图或搜索视图以及所需的上下文。示例实现 更改高级搜索结果的默认排序如下:

from horae.search import search

class SampleDefaultSortingProvider(grok.Adapter):
    grok.context(search.AdvancedSearch)
    grok.implements(interfaces.IDefaultSortingProvider)

    def sort_field(self):
        """ The index used to sort
        """
        return ('samplecatalog', 'sorting')

    def reverse(self):
        """ Whether to reverse the sort order
        """
        return False

添加列

通过注册命名适配器,可以向结果表添加新列 实现horae.search.interfaces.IColumnProvider以适应所需的context。 下面是在horae.search.search中找到的示例实现 显示对象是否已完成的列:

class CompleteColumnProvider(grok.Adapter):
    """ Column provider adding the complete column
    """
    grok.implements(interfaces.IColumnProvider)
    grok.context(interface.Interface)
    grok.name('horae.search.column.complete')

    name = 'complete'
    title = _(u'Completed')
    sortable = None
    insert_after = '*'

    def __init__(self, context):
        self.context = context

    def filterable(self):
        """ Returns a vocabulary for filtering the column or
            None if no filtering is available
        """
        return vocabulary.SimpleVocabulary([
            vocabulary.SimpleTerm(0, 'no', _p(u'No')),
            vocabulary.SimpleTerm(1, 'yes', _p(u'Yes'))
        ])

    def factory(self, object, request):
        """ Returns the value to be displayed for the given object
        """
        return (IComplete(object, lambda: False)() and _p(u'Yes') or _p(u'No'))

    def cache_key(self, key, *args, **kwargs):
        """ Modifies the cache key if needed and returns it
        """
        return key + parents_modification_cache_key(self.context)

添加行css类

最后但不是最不重要的一个可以通过注册将自定义css类添加到行中 实现^{tt13}的命名适配器$ 调整所需的context。添加css类的示例实现 special如果票证有一个特殊的属性集,则如下所示:

class SampleRowClassProvider(grok.Adapter):
    grok.context(ITicket)
    grok.implements(interfaces.IRowClassProvider)

    def classes(self):
        """ Returns a list of CSS classes to be set on the row
        """
        if (self.context.get_property('my_special_property', None) is not None):
            return ['special']
        return []

更改日志

1.0a1(2012-01-16)

  • 初始版本

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

推荐PyPI第三方库


热门话题
Java UDP十六进制数据按分隔符分割?   java将字符串与列表中的值进行比较<Integer>   在java中向新列表添加/复制对象   java MySQL语法错误异常   java如何在附加到文件时关闭JavaFX FileChooser的覆盖警告?   多线程如何在java中处理具有CompletableFuture的列表?   JAXWS项目的java重命名现在找不到WSDL   javascript翻译从哪里来?Javaservlet、tomcat和ExtJs Sencha应用程序   if语句如何向代码中添加工作if?JAVA   java如何确定需要哪些JAR?   在jPanel java netbeans上运行非常简单的swing视频播放器   swing Java jTable changeSelection,然后突出显示新选定的行   基于参数的java Spring Boot JPA本机查询非空检查   java从预使用图中删除节点   java BufferOverflowException在不同组件的画布中绘制时   尝试使用jersey在rest上发送pojo类对象作为响应时发生java内部服务器错误   java类集合如何将列表/集合转换为同步对象?通过什么机制?   java JOOX自动关闭XML标记   Java是按另一个具有不同对象的列表对列表进行排序的最佳方法   Hibernate读取XML时发生java错误