view custom_search/fields.py @ 989:2908859c2fe4

Smilies now use relative links. This is for upcoming switch to SSL. Currently we do not need absolute URLs for smilies. If this changes we can add it later.
author Brian Neal <bgneal@gmail.com>
date Thu, 29 Oct 2015 20:54:34 -0500
parents cf9918328c64
children
line wrap: on
line source
"""Custom Haystack SearchFields."""

import haystack.fields


class MaxTermSizeCharField(haystack.fields.CharField):
    """A CharField that discards large terms when preparing the search index.

    Some backends (e.g. Xapian) throw errors when terms are bigger than some
    limit. This field omits the terms over a limit when preparing the data for
    the search index.

    The keyword argument max_term_size sets the maximum size of a whitespace
    delimited word/term. Terms over this size are not indexed. The default value
    is 64.
    """
    DEFAULT_MAX_TERM_SIZE = 64

    def __init__(self, *args, **kwargs):
        self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE)
        super(MaxTermSizeCharField, self).__init__(*args, **kwargs)

    def prepare(self, obj):
        text = super(MaxTermSizeCharField, self).prepare(obj)
        if text is None or self.max_term_size is None:
            return text

        terms = (term for term in text.split() if len(term) <= self.max_term_size)
        return u' '.join(terms)