def get_search_results(self, request, queryset, search_term): search_term = replace(search_term) # FIXME: What follows is a copy of the original get_search_results. # It is a workaround to https://code.djangoproject.com/ticket/26184 # Remove when fixed. def construct_search(field_name): if field_name.startswith('^'): return "%s__istartswith" % field_name[1:] elif field_name.startswith('='): return "%s__iexact" % field_name[1:] elif field_name.startswith('@'): return "%s__search" % field_name[1:] else: return "%s__icontains" % field_name use_distinct = False search_fields = self.get_search_fields(request) if search_fields and search_term: orm_lookups = [construct_search(str(search_field)) for search_field in search_fields] for bit in search_term.split(): or_queries = [Q(**{orm_lookup: bit}) for orm_lookup in orm_lookups] queryset = queryset.filter(reduce(operator.or_, or_queries)) if not use_distinct: for search_spec in orm_lookups: if lookup_needs_distinct(self.opts, search_spec): use_distinct = True break return queryset, use_distinct
def autocomplete_search(request, q, model=None, max_results=5): q = replace(q) sqs = SearchQuerySet() if model is None: unified_index = get_haystack_unified_index() models = unified_index.get_indexed_models() models = [model for model in models if 'content_auto' in unified_index.get_index(model).fields] sqs = sqs.models(*models) else: sqs = sqs.models(model) sqs = filter_published(sqs, request) sqs = sqs.autocomplete(content_auto=q)[:max_results] return list(result_iterator(sqs))
def get_search_results(self, request, queryset, search_term): search_term = replace(search_term) # FIXME: What follows is a copy of the original get_search_results. # It is a workaround to https://code.djangoproject.com/ticket/26184 # Remove when fixed. def construct_search(field_name): if field_name.startswith('^'): return "%s__istartswith" % field_name[1:] elif field_name.startswith('='): return "%s__iexact" % field_name[1:] elif field_name.startswith('@'): return "%s__search" % field_name[1:] else: return "%s__icontains" % field_name use_distinct = False search_fields = self.get_search_fields(request) if search_fields and search_term: orm_lookups = [ construct_search(str(search_field)) for search_field in search_fields ] for bit in search_term.split(): or_queries = [ Q(**{orm_lookup: bit}) for orm_lookup in orm_lookups ] queryset = queryset.filter(reduce(operator.or_, or_queries)) if not use_distinct: for search_spec in orm_lookups: if lookup_needs_distinct(self.opts, search_spec): use_distinct = True break return queryset, use_distinct
def build_form(self, form_kwargs=None): self.request.GET = GET = self.request.GET.copy() GET['q'] = replace(GET.get('q', '')) return super(CustomSearchView, self).build_form(form_kwargs)
def autocomplete_term_adjust(term): return replace(term)
def clean_transcription(self): return sanitize_html(replace(self.cleaned_data['transcription']))
def get_field_settable_value(new_v): if is_str(new_v): return replace(smart_text(new_v)) return new_v
def search_in_model(model, q, max_results): q = replace(q) sqs = SearchQuerySet().models(model) sqs = sqs.autocomplete(content_auto=q).boost(q + "*", 10)[:max_results] q = q.lower() return [r.object for r in sqs if q in r.get_stored_fields()["content_auto"].lower()]