annotate 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
rev   line source
bgneal@943 1 """Custom Haystack SearchFields."""
bgneal@943 2
bgneal@943 3 import haystack.fields
bgneal@943 4
bgneal@943 5
bgneal@943 6 class MaxTermSizeCharField(haystack.fields.CharField):
bgneal@943 7 """A CharField that discards large terms when preparing the search index.
bgneal@943 8
bgneal@943 9 Some backends (e.g. Xapian) throw errors when terms are bigger than some
bgneal@943 10 limit. This field omits the terms over a limit when preparing the data for
bgneal@943 11 the search index.
bgneal@943 12
bgneal@943 13 The keyword argument max_term_size sets the maximum size of a whitespace
bgneal@943 14 delimited word/term. Terms over this size are not indexed. The default value
bgneal@943 15 is 64.
bgneal@943 16 """
bgneal@943 17 DEFAULT_MAX_TERM_SIZE = 64
bgneal@943 18
bgneal@943 19 def __init__(self, *args, **kwargs):
bgneal@943 20 self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE)
bgneal@943 21 super(MaxTermSizeCharField, self).__init__(*args, **kwargs)
bgneal@943 22
bgneal@943 23 def prepare(self, obj):
bgneal@943 24 text = super(MaxTermSizeCharField, self).prepare(obj)
bgneal@943 25 if text is None or self.max_term_size is None:
bgneal@943 26 return text
bgneal@943 27
bgneal@943 28 terms = (term for term in text.split() if len(term) <= self.max_term_size)
bgneal@943 29 return u' '.join(terms)