diff --git a/layerindex/simplesearch.py b/layerindex/simplesearch.py deleted file mode 100644 index 3b2a530..0000000 --- a/layerindex/simplesearch.py +++ /dev/null @@ -1,39 +0,0 @@ -# Borrowed from http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap -# Copyright 2011 Julien Phalip. All Rights Reserved. - -import re -from django.db.models import Q - -def normalize_query(query_string, - findterms=re.compile(r'"([^"]+)"|(\S+)').findall, - normspace=re.compile(r'\s{2,}').sub): - ''' Splits the query string in invidual keywords, getting rid of unecessary spaces - and grouping quoted words together. - Example: - - >>> normalize_query(' some random words "with quotes " and spaces') - ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] - - ''' - return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] - -def get_query(query_string, search_fields): - ''' Returns a query, that is a combination of Q objects. That combination - aims to search keywords within a model by testing the given search fields. - - ''' - query = None # Query to search for every search term - terms = normalize_query(query_string) - for term in terms: - or_query = None # Query to search for a given term in each field - for field_name in search_fields: - q = Q(**{"%s__icontains" % field_name: term}) - if or_query is None: - or_query = q - else: - or_query = or_query | q - if query is None: - query = or_query - else: - query = query & or_query - return query diff --git a/layerindex/utils.py b/layerindex/utils.py index e5df54c..c691964 100644 --- a/layerindex/utils.py +++ b/layerindex/utils.py @@ -537,3 +537,23 @@ class ProgressReader(): if self.logger is not None: self.logger.warning('Failed to read progress: %s' % str(e)) return result + +def string_to_query(querystr, fieldnames): + # Inspired by http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap + # (reimplemented a bit more simply) + from django.db.models import Q + keywords = [item for item in re.split(r"\s|\"(.*)?\"|'.*?'", querystr) if item] + query = None + for keyword in keywords: + fquery = None + for fieldname in fieldnames: + q = Q(**{'%s__icontains' % fieldname: keyword}) + if fquery is None: + fquery = q + else: + fquery = fquery | q + if query is None: + query = fquery + else: + query = query & fquery + return query diff --git a/layerindex/views.py b/layerindex/views.py index 42ce123..ddf6741 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -57,7 +57,7 @@ from layerindex.models import (BBAppend, BBClass, Branch, ClassicRecipe, UserProfile, PatchDisposition) -from . import simplesearch, tasks, utils +from . import tasks, utils def edit_layernote_view(request, template_name, slug, pk=None): layeritem = get_object_or_404(LayerItem, name=slug) @@ -495,13 +495,13 @@ class RecipeSearchView(ListView): qs0 = recipes_preferred_count(qs0) # Then keyword somewhere in the name - entry_query = simplesearch.get_query(query_string, ['pn']) + entry_query = utils.string_to_query(query_string, ['pn']) qs1 = init_qs.filter(entry_query).order_by(*order_by) if preferred: qs1 = recipes_preferred_count(qs1) # Then keyword somewhere in summary or description - entry_query = simplesearch.get_query(query_string, ['description', 'summary']) + entry_query = utils.string_to_query(query_string, ['description', 'summary']) qs2 = init_qs.filter(entry_query).order_by(*order_by) if preferred: qs2 = recipes_preferred_count(qs2) @@ -765,7 +765,7 @@ class MachineSearchView(ListView): query_string = "" init_qs = Machine.objects.filter(layerbranch__branch__name=self.kwargs['branch']) if query_string.strip(): - entry_query = simplesearch.get_query(query_string, ['name', 'description']) + entry_query = utils.string_to_query(query_string, ['name', 'description']) return init_qs.filter(entry_query).order_by('name', 'layerbranch__layer') else: if 'q' in self.request.GET: @@ -817,7 +817,7 @@ class DistroSearchView(ListView): query_string = "" init_qs = Distro.objects.filter(layerbranch__branch__name=self.kwargs['branch']) if query_string.strip(): - entry_query = simplesearch.get_query(query_string, ['name', 'description']) + entry_query = utils.string_to_query(query_string, ['name', 'description']) return init_qs.filter(entry_query).order_by('name', 'layerbranch__layer') if 'q' in self.request.GET: @@ -845,7 +845,7 @@ class ClassSearchView(ListView): query_string = "" init_qs = BBClass.objects.filter(layerbranch__branch__name=self.kwargs['branch']) if query_string.strip(): - entry_query = simplesearch.get_query(query_string, ['name']) + entry_query = utils.string_to_query(query_string, ['name']) return init_qs.filter(entry_query).order_by('name', 'layerbranch__layer') if 'q' in self.request.GET: